From fa80b2cee3de658f55e715dc42e354d243e6ebdc Mon Sep 17 00:00:00 2001 From: Vignesh Hari <14056798+vigneshhari@users.noreply.github.com> Date: Wed, 30 Oct 2024 14:30:31 +0530 Subject: [PATCH] Add Plug Config API (#2574) Co-authored-by: Aakash Singh --- .github/workflows/linter.yml | 6 +++- care/users/api/serializers/plug_config.py | 9 +++++ care/users/api/viewsets/plug_config.py | 44 +++++++++++++++++++++++ care/users/migrations/0020_plugconfig.py | 21 +++++++++++ care/users/models.py | 8 +++++ config/api_router.py | 4 +++ docker/dev.Dockerfile | 2 +- docker/prod.Dockerfile | 2 +- 8 files changed, 93 insertions(+), 3 deletions(-) create mode 100644 care/users/api/serializers/plug_config.py create mode 100644 care/users/api/viewsets/plug_config.py create mode 100644 care/users/migrations/0020_plugconfig.py diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index cbf322bd10..37d7c67fad 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -14,7 +14,11 @@ jobs: - uses: actions/checkout@v4 with: fetch-depth: 0 - - uses: actions/setup-python@v3 + + - uses: actions/setup-python@v5 + with: + python-version: "3.13" + - uses: pre-commit/action@v3.0.1 with: extra_args: --color=always --from-ref ${{ github.event.pull_request.base.sha }} --to-ref ${{ github.event.pull_request.head.sha }} diff --git a/care/users/api/serializers/plug_config.py b/care/users/api/serializers/plug_config.py new file mode 100644 index 0000000000..6ac59adb21 --- /dev/null +++ b/care/users/api/serializers/plug_config.py @@ -0,0 +1,9 @@ +from rest_framework import serializers + +from care.users.models import PlugConfig + + +class PLugConfigSerializer(serializers.ModelSerializer): + class Meta: + model = PlugConfig + exclude = ("id",) diff --git a/care/users/api/viewsets/plug_config.py b/care/users/api/viewsets/plug_config.py new file mode 100644 index 0000000000..40cae848a8 --- /dev/null +++ b/care/users/api/viewsets/plug_config.py @@ -0,0 +1,44 @@ +from django.core.cache import cache +from rest_framework.permissions import IsAdminUser +from rest_framework.response import Response +from rest_framework.viewsets import GenericViewSet, ModelViewSet + +from care.users.api.serializers.plug_config import PLugConfigSerializer +from care.users.models import PlugConfig + + +class PlugConfigViewset( + ModelViewSet, + GenericViewSet, +): + lookup_field = "slug" + serializer_class = PLugConfigSerializer + queryset = PlugConfig.objects.all().order_by("slug") + cache_key = "care_plug_viewset_list" + authentication_classes = [] + + def list(self, request, *args, **kwargs): + # Cache data and return + response = cache.get(self.cache_key) + if not response: + serializer = self.get_serializer(self.queryset, many=True) + response = serializer.data + cache.set(self.cache_key, response) + return Response({"configs": [response]}) + + def perform_create(self, serializer): + cache.delete(self.cache_key) + serializer.save() + + def perform_update(self, serializer): + cache.delete(self.cache_key) + serializer.save() + + def perform_destroy(self, instance): + cache.delete(self.cache_key) + instance.delete() + + def get_permissions(self): + if self.action in ["list", "retrieve"]: + return [] + return [IsAdminUser()] diff --git a/care/users/migrations/0020_plugconfig.py b/care/users/migrations/0020_plugconfig.py new file mode 100644 index 0000000000..8f0b3977a1 --- /dev/null +++ b/care/users/migrations/0020_plugconfig.py @@ -0,0 +1,21 @@ +# Generated by Django 5.1.1 on 2024-10-29 19:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0019_rename_doctor_qualification_user_qualification'), + ] + + operations = [ + migrations.CreateModel( + name='PlugConfig', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('slug', models.CharField(max_length=255, unique=True)), + ('meta', models.JSONField(default=dict)), + ], + ), + ] diff --git a/care/users/models.py b/care/users/models.py index 5f214871e0..bf0d47c284 100644 --- a/care/users/models.py +++ b/care/users/models.py @@ -443,6 +443,14 @@ def __str__(self): return self.facility.name +class PlugConfig(models.Model): + slug = models.CharField(max_length=255, unique=True) + meta = models.JSONField(default=dict) + + def __str__(self): + return self.slug + + class UserFlag(BaseFlag): user = models.ForeignKey(User, on_delete=models.CASCADE, null=False, blank=False) diff --git a/config/api_router.py b/config/api_router.py index 7e00754a00..94b18f61de 100644 --- a/config/api_router.py +++ b/config/api_router.py @@ -99,6 +99,7 @@ StateViewSet, WardViewSet, ) +from care.users.api.viewsets.plug_config import PlugConfigViewset from care.users.api.viewsets.skill import SkillViewSet from care.users.api.viewsets.users import UserViewSet from care.users.api.viewsets.userskill import UserSkillViewSet @@ -106,6 +107,9 @@ router = DefaultRouter() if settings.DEBUG else SimpleRouter() router.register("users", UserViewSet, basename="users") + +router.register("plug_config", PlugConfigViewset, basename="plug_configs") + user_nested_router = NestedSimpleRouter(router, r"users", lookup="users") user_nested_router.register("skill", UserSkillViewSet, basename="users-skill") diff --git a/docker/dev.Dockerfile b/docker/dev.Dockerfile index 473737e801..198f40d824 100644 --- a/docker/dev.Dockerfile +++ b/docker/dev.Dockerfile @@ -28,7 +28,7 @@ RUN ARCH=$(dpkg --print-architecture) && \ # use pipenv to manage virtualenv RUN python -m venv /venv -RUN pip install pipenv +RUN pip install pipenv==2024.2.0 COPY Pipfile Pipfile.lock ./ RUN pipenv install --system --categories "packages dev-packages" diff --git a/docker/prod.Dockerfile b/docker/prod.Dockerfile index 8e27664c36..2aef7be6d8 100644 --- a/docker/prod.Dockerfile +++ b/docker/prod.Dockerfile @@ -41,7 +41,7 @@ RUN ARCH=$(dpkg --print-architecture) && \ # use pipenv to manage virtualenv RUN python -m venv /venv -RUN pip install pipenv +RUN pip install pipenv==2024.2.0 COPY Pipfile Pipfile.lock $APP_HOME RUN pipenv sync --system --categories "packages"