From 51ba308103d14e3c571ce69dd4e39c6dd99a199c Mon Sep 17 00:00:00 2001 From: ray Date: Fri, 19 Apr 2024 16:42:47 -0700 Subject: [PATCH] DBC22-1906: added site settings to diable api endpints --- src/backend/apps/shared/admin.py | 10 +++++++++ .../apps/shared/migrations/0001_initial.py | 21 +++++++++++++++++++ .../apps/shared/migrations/__init__.py | 0 src/backend/apps/shared/models.py | 11 ++++++++++ src/backend/apps/shared/views.py | 7 +++++++ 5 files changed, 49 insertions(+) create mode 100644 src/backend/apps/shared/admin.py create mode 100644 src/backend/apps/shared/migrations/0001_initial.py create mode 100644 src/backend/apps/shared/migrations/__init__.py diff --git a/src/backend/apps/shared/admin.py b/src/backend/apps/shared/admin.py new file mode 100644 index 000000000..821ba2dcc --- /dev/null +++ b/src/backend/apps/shared/admin.py @@ -0,0 +1,10 @@ +from apps.shared.models import SiteSettings +from django.contrib import admin +from django.contrib.admin import ModelAdmin + + +class SiteSettingsAdmin(ModelAdmin): + readonly_fields = ('id', ) + + +admin.site.register(SiteSettings, SiteSettingsAdmin) diff --git a/src/backend/apps/shared/migrations/0001_initial.py b/src/backend/apps/shared/migrations/0001_initial.py new file mode 100644 index 000000000..d361d290c --- /dev/null +++ b/src/backend/apps/shared/migrations/0001_initial.py @@ -0,0 +1,21 @@ +# Generated by Django 4.2.3 on 2024-04-19 23:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='SiteSettings', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('disable_apis', models.BooleanField(default=False)), + ], + ), + ] diff --git a/src/backend/apps/shared/migrations/__init__.py b/src/backend/apps/shared/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/src/backend/apps/shared/models.py b/src/backend/apps/shared/models.py index 61b5a31c9..1e4ab3615 100644 --- a/src/backend/apps/shared/models.py +++ b/src/backend/apps/shared/models.py @@ -1,4 +1,5 @@ from django.contrib.gis.db import models +from django.core.exceptions import ValidationError class BaseModel(models.Model): @@ -7,3 +8,13 @@ class BaseModel(models.Model): class Meta: abstract = True + + +class SiteSettings(models.Model): + disable_apis = models.BooleanField(default=False) + + def save(self, *args, **kwargs): + if self.__class__.objects.exists() and not self.pk: + raise ValidationError(f"Only one instance of {self.__class__.__name__} allowed") + + super().save(*args, **kwargs) diff --git a/src/backend/apps/shared/views.py b/src/backend/apps/shared/views.py index d73619a9c..026b5b60e 100644 --- a/src/backend/apps/shared/views.py +++ b/src/backend/apps/shared/views.py @@ -3,7 +3,9 @@ import environ from apps.shared.enums import SUBJECT_CHOICES, SUBJECT_TITLE, CacheKey, CacheTimeout +from apps.shared.models import SiteSettings from django.core.cache import cache +from django.core.exceptions import ImproperlyConfigured from django.core.mail import send_mail from django.db import connection from django.urls import re_path @@ -81,6 +83,11 @@ def get_or_set_list_data(self): ) def list(self, request, *args, **kwargs): + site_settings = SiteSettings.objects.first() + if site_settings: + if site_settings.disable_apis: + raise ImproperlyConfigured("API endpoints disabled for testing") + return Response(self.get_or_set_list_data())