diff --git a/apps/cases/migrations/0001_initial.py b/apps/cases/migrations/0001_initial.py index fb5b76c99705555b2ebea1aed3105013c56297d1..092ed458a3c1248220cd14dcd95eb62483ac7ca6 100644 --- a/apps/cases/migrations/0001_initial.py +++ b/apps/cases/migrations/0001_initial.py @@ -1,3 +1,5 @@ +# Generated by Django 3.0.1 on 2020-03-04 22:17 + from django.db import migrations, models import django.db.models.deletion import uuid @@ -38,54 +40,7 @@ class Migration(migrations.Migration): options={ "verbose_name_plural": "case subjects", "db_table": "case_subject", - }, - ), - migrations.CreateModel( - name="InvestigationCase", - fields=[ - ( - "revision_id", - models.UUIDField( - default=uuid.uuid4, - editable=False, - primary_key=True, - serialize=False, - ), - ), - ("case_id", models.UUIDField(default=uuid.uuid4)), - ("case_relation", models.CharField(blank=True, max_length=128)), - ("medical_symptoms", models.TextField(default="{}")), - ("risk_factors", models.TextField(default="{}")), - ("is_referral_needed", models.BooleanField(db_index=True)), - ( - "medical_facility_reference", - models.CharField(blank=True, max_length=128), - ), - ("deleted_at", models.DateTimeField(blank=True, null=True)), - ("created_at", models.DateTimeField(auto_now_add=True)), - ("is_active", models.BooleanField(db_index=True, default=True)), - ( - "author", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.DO_NOTHING, - related_name="investigation_case", - to="accounts.Account", - ), - ), - ( - "case_subject", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="investigation_case", - to="cases.CaseSubject", - ), - ), - ], - options={ - "verbose_name_plural": "investigation cases", - "db_table": "investigation_case", + "ordering": ["-created_at"], }, ), migrations.CreateModel( @@ -101,6 +56,7 @@ class Migration(migrations.Migration): ), ), ("case_id", models.UUIDField(default=uuid.uuid4)), + ("case_subject_id", models.UUIDField(blank=True, null=True)), ("outcome", models.CharField(max_length=256)), ("deleted_at", models.DateTimeField(blank=True, null=True)), ("created_at", models.DateTimeField(auto_now_add=True)), @@ -115,18 +71,11 @@ class Migration(migrations.Migration): to="accounts.Account", ), ), - ( - "case_subject", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="positive_case", - to="cases.CaseSubject", - ), - ), ], options={ "verbose_name_plural": "positive cases", "db_table": "positive_case", + "ordering": ["-created_at"], }, ), migrations.CreateModel( @@ -142,6 +91,8 @@ class Migration(migrations.Migration): ), ), ("case_id", models.UUIDField(default=uuid.uuid4)), + ("investigation_case_id", models.UUIDField(blank=True, null=True)), + ("positive_case_id", models.UUIDField(blank=True, null=True)), ( "is_referred", models.BooleanField(blank=True, db_index=True, null=True), @@ -171,41 +122,54 @@ class Migration(migrations.Migration): to="accounts.Account", ), ), + ], + options={ + "verbose_name_plural": "monitoring cases", + "db_table": "monitoring_case", + "ordering": ["-created_at"], + }, + ), + migrations.CreateModel( + name="InvestigationCase", + fields=[ ( - "investigation_case", - models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="investigation_monitoring_case", - to="cases.InvestigationCase", + "revision_id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, ), ), + ("case_id", models.UUIDField(default=uuid.uuid4)), + ("case_subject_id", models.UUIDField(blank=True, null=True)), + ("reference_case_id", models.UUIDField(blank=True, null=True)), + ("case_relation", models.CharField(blank=True, max_length=128)), + ("medical_symptoms", models.TextField(default="{}")), + ("risk_factors", models.TextField(default="{}")), + ("is_referral_needed", models.BooleanField(db_index=True)), + ( + "medical_facility_reference", + models.CharField(blank=True, max_length=128), + ), + ("deleted_at", models.DateTimeField(blank=True, null=True)), + ("created_at", models.DateTimeField(auto_now_add=True)), + ("is_active", models.BooleanField(db_index=True, default=True)), ( - "positive_case", + "author", models.ForeignKey( blank=True, null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="positive_monitoring_case", - to="cases.PositiveCase", + on_delete=django.db.models.deletion.DO_NOTHING, + related_name="investigation_case", + to="accounts.Account", ), ), ], options={ - "verbose_name_plural": "monitoring cases", - "db_table": "monitoring_case", + "verbose_name_plural": "investigation cases", + "db_table": "investigation_case", + "ordering": ["-created_at"], }, ), - migrations.AddField( - model_name="investigationcase", - name="reference_case", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="investigation_case", - to="cases.PositiveCase", - ), - ), ] diff --git a/apps/cases/models.py b/apps/cases/models.py index 8e42cdc6d6303ecc06d0e2ecb4434ae222b797eb..c95528055ade6e503d193a367ee121ae1a23b888 100644 --- a/apps/cases/models.py +++ b/apps/cases/models.py @@ -26,20 +26,19 @@ class CaseSubject(models.Model): class Meta: db_table = "case_subject" verbose_name_plural = "case subjects" + ordering = ["-created_at"] def delete(self): if self.deleted_at is None: self.is_active = False - self.deleted_at = datetime.now(tz=pytz.UTC) + self.deleted_at = datetime.now(tz=pytz.timezone("Asia/Jakarta")) self.save() class PositiveCase(models.Model): revision_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) case_id = models.UUIDField(default=uuid.uuid4) - case_subject = models.ForeignKey( - CaseSubject, on_delete=models.CASCADE, related_name="positive_case" - ) + case_subject_id = models.UUIDField(blank=True, null=True) outcome = models.CharField(max_length=256) author = models.ForeignKey( Account, @@ -57,27 +56,26 @@ class PositiveCase(models.Model): class Meta: db_table = "positive_case" verbose_name_plural = "positive cases" + ordering = ["-created_at"] def delete(self): if self.deleted_at is None: self.is_active = False - self.deleted_at = datetime.now(tz=pytz.UTC) + self.deleted_at = datetime.now(tz=pytz.timezone("Asia/Jakarta")) self.save() + @property + def case_subject(self): + return CaseSubject.objects.filter( + is_active=True, deleted_at__isnull=True, subject_id=self.case_subject_id + ).first() + class InvestigationCase(models.Model): revision_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) case_id = models.UUIDField(default=uuid.uuid4) - case_subject = models.ForeignKey( - CaseSubject, on_delete=models.CASCADE, related_name="investigation_case" - ) - reference_case = models.ForeignKey( - PositiveCase, - blank=True, - null=True, - on_delete=models.CASCADE, - related_name="investigation_case", - ) + case_subject_id = models.UUIDField(blank=True, null=True) + reference_case_id = models.UUIDField(blank=True, null=True) case_relation = models.CharField(max_length=128, blank=True) medical_symptoms = models.TextField(default="{}") risk_factors = models.TextField(default="{}") @@ -99,31 +97,32 @@ class InvestigationCase(models.Model): class Meta: db_table = "investigation_case" verbose_name_plural = "investigation cases" + ordering = ["-created_at"] def delete(self): if self.deleted_at is None: self.is_active = False - self.deleted_at = datetime.now(tz=pytz.UTC) + self.deleted_at = datetime.now(tz=pytz.timezone("Asia/Jakarta")) self.save() + @property + def reference_case(self): + return PositiveCase.objects.filter( + is_active=True, deleted_at__isnull=True, case_id=self.reference_case_id + ).first() + + @property + def case_subject(self): + return CaseSubject.objects.filter( + is_active=True, deleted_at__isnull=True, subject_id=self.case_subject_id + ).first() + class MonitoringCase(models.Model): revision_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) case_id = models.UUIDField(default=uuid.uuid4) - investigation_case = models.ForeignKey( - InvestigationCase, - blank=True, - null=True, - on_delete=models.CASCADE, - related_name="investigation_monitoring_case", - ) - positive_case = models.ForeignKey( - PositiveCase, - blank=True, - null=True, - on_delete=models.CASCADE, - related_name="positive_monitoring_case", - ) + investigation_case_id = models.UUIDField(blank=True, null=True) + positive_case_id = models.UUIDField(blank=True, null=True) is_referred = models.BooleanField(blank=True, null=True, db_index=True) is_checked = models.BooleanField(blank=True, null=True, db_index=True) checking_date = models.DateField(blank=True, null=True) @@ -147,6 +146,7 @@ class MonitoringCase(models.Model): class Meta: db_table = "monitoring_case" verbose_name_plural = "monitoring cases" + ordering = ["-created_at"] def save(self, *args, **kwargs): self.clean() @@ -155,7 +155,7 @@ class MonitoringCase(models.Model): def clean(self): super(MonitoringCase, self).clean() - reference_cases = [self.positive_case, self.investigation_case] + reference_cases = [self.positive_case_id, self.investigation_case_id] if sum([case is not None for case in reference_cases]) > 1: raise ValidationError( "Monitoring Case should refer to only 1 type of case (Investigation|Positive)" @@ -164,5 +164,17 @@ class MonitoringCase(models.Model): def delete(self): if self.deleted_at is None: self.is_active = False - self.deleted_at = datetime.now(tz=pytz.UTC) + self.deleted_at = datetime.now(tz=pytz.timezone("Asia/Jakarta")) self.save() + + @property + def investigation_case(self): + return InvestigationCase.objects.filter( + is_active=True, deleted_at__isnull=True, case_id=self.investigation_case_id + ).first() + + @property + def positive_case(self): + return PositiveCase.objects.filter( + is_active=True, deleted_at__isnull=True, case_id=self.positive_case_id + ).first() diff --git a/apps/cases/serializers.py b/apps/cases/serializers.py index 1fc692091e0eec8ae9e22e72a0714be2c739f81a..f671a6be58c256af8efd5b4c24371776f778cbc5 100644 --- a/apps/cases/serializers.py +++ b/apps/cases/serializers.py @@ -8,6 +8,8 @@ from apps.cases.models import ( class CaseSubjectSerializer(serializers.ModelSerializer): + is_active = serializers.BooleanField(read_only=True) + class Meta: model = CaseSubject fields = [ @@ -19,29 +21,71 @@ class CaseSubjectSerializer(serializers.ModelSerializer): "address", "district", "sub_district", + "is_active", ] -class InvestigationCaseSummarySerializer(serializers.ModelSerializer): - case_subject = CaseSubjectSerializer(read_only=True) +class PositiveCaseSerializer(serializers.ModelSerializer): + is_active = serializers.BooleanField(read_only=True) class Meta: - model = InvestigationCase + model = PositiveCase + fields = [ + "revision_id", + "case_id", + "case_subject_id", + "outcome", + "author", + "is_active", + ] + + +class PositiveCaseSummarySerializer(serializers.ModelSerializer): + case_subject = serializers.SerializerMethodField() + is_active = serializers.BooleanField(read_only=True) + + class Meta: + model = PositiveCase fields = [ "revision_id", "case_id", "case_subject", - "reference_case", + "outcome", + "author", + "is_active", + ] + + def get_case_subject(self, instance): + case_subject = instance.case_subject + if case_subject: + return CaseSubjectSerializer(case_subject).data + + +class InvestigationCaseSerializer(serializers.ModelSerializer): + is_active = serializers.BooleanField(read_only=True) + + class Meta: + model = InvestigationCase + fields = [ + "revision_id", + "case_id", + "case_subject_id", + "reference_case_id", "case_relation", "medical_symptoms", "risk_factors", "is_referral_needed", "medical_facility_reference", "author", + "is_active", ] -class InvestigationCaseSerializer(serializers.ModelSerializer): +class InvestigationCaseSummarySerializer(serializers.ModelSerializer): + case_subject = serializers.SerializerMethodField() + reference_case = serializers.SerializerMethodField() + is_active = serializers.BooleanField(read_only=True) + class Meta: model = InvestigationCase fields = [ @@ -55,17 +99,30 @@ class InvestigationCaseSerializer(serializers.ModelSerializer): "is_referral_needed", "medical_facility_reference", "author", + "is_active", ] + def get_case_subject(self, instance): + case_subject = instance.case_subject + if case_subject: + return CaseSubjectSerializer(case_subject).data + + def get_reference_case(self, instance): + reference_case = instance.reference_case + if reference_case: + return PositiveCaseSerializer(reference_case).data + + +class MonitoringCaseSerializer(serializers.ModelSerializer): + is_active = serializers.BooleanField(read_only=True) -class MonitoringCaseSummarySerializer(serializers.ModelSerializer): class Meta: model = MonitoringCase fields = [ "revision_id", "case_id", - "investigation_case", - "positive_case", + "investigation_case_id", + "positive_case_id", "is_referred", "is_checked", "is_regularly_treated", @@ -73,30 +130,38 @@ class MonitoringCaseSummarySerializer(serializers.ModelSerializer): "treatment_end_date", "outcome", "author", + "is_active", ] -class PositiveCaseSummarySerializer(serializers.ModelSerializer): - case_subject = CaseSubjectSerializer(read_only=True) +class MonitoringCaseSummarySerializer(serializers.ModelSerializer): + investigation_case = serializers.SerializerMethodField() + positive_case = serializers.SerializerMethodField() + is_active = serializers.BooleanField(read_only=True) class Meta: - model = PositiveCase + model = MonitoringCase fields = [ "revision_id", "case_id", - "case_subject", + "investigation_case", + "positive_case", + "is_referred", + "is_checked", + "is_regularly_treated", + "treatment_start_date", + "treatment_end_date", "outcome", "author", + "is_active", ] + def get_investigation_case(self, instance): + investigation_case = instance.investigation_case + if investigation_case: + return InvestigationCaseSerializer(investigation_case).data -class PositiveCaseSerializer(serializers.ModelSerializer): - class Meta: - model = PositiveCase - fields = [ - "revision_id", - "case_id", - "case_subject", - "outcome", - "author", - ] + def get_positive_case(self, instance): + positive_case = instance.positive_case + if positive_case: + return PositiveCaseSerializer(positive_case).data diff --git a/apps/cases/tests/test_units/test_case_subjects.py b/apps/cases/tests/test_units/test_case_subjects.py index a0a4ee5cb6053db409a90d98cdc68369340719d3..640fb373470c95a63da99e3a3a9f4897528db1fe 100644 --- a/apps/cases/tests/test_units/test_case_subjects.py +++ b/apps/cases/tests/test_units/test_case_subjects.py @@ -12,7 +12,7 @@ class CaseSubjectViewTest(TestCase): def setUp(self): self.case_subject_1 = CaseSubjectFactory(is_active=True) self.case_subject_2 = CaseSubjectFactory( - is_active=True, deleted_at=datetime.now(tz=pytz.UTC) + is_active=True, deleted_at=datetime.now(tz=pytz.timezone("Asia/Jakarta")) ) self.case_subject_3 = CaseSubjectFactory(is_active=False) @@ -192,10 +192,6 @@ class CaseSubjectViewTest(TestCase): self.assertEqual(current_deleted_count, prev_deleted_count + 1) def test_delete_inactive_case_subject_fails(self): - url = ( - "/cases/case-subjects/" - + str(self.case_subject_3.revision_id) - + "/" - ) + url = "/cases/case-subjects/" + str(self.case_subject_3.revision_id) + "/" response = self.client.delete(url) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) diff --git a/apps/cases/tests/test_units/test_investigation_cases.py b/apps/cases/tests/test_units/test_investigation_cases.py index 30d4ad0ada70c22a52101ed72137da371202444d..a550ca24742cb1477aa86d818f23740e36abbfd5 100644 --- a/apps/cases/tests/test_units/test_investigation_cases.py +++ b/apps/cases/tests/test_units/test_investigation_cases.py @@ -31,7 +31,7 @@ class InvestigationCaseViewTest(TestCase): author=self.author, case_subject_id=self.case_subject.subject_id, reference_case_id=self.reference_case.case_id, - deleted_at=datetime.now(tz=pytz.UTC), + deleted_at=datetime.now(tz=pytz.timezone("Asia/Jakarta")), ) self.other_inactive_case = InvestigationCaseFactory( author=self.author, @@ -149,9 +149,13 @@ class InvestigationCaseViewTest(TestCase): current_active_investigation_case_revision_count, prev_active_investigation_case_revision_count, ) - + def test_edit_inactive_investigation_case_fails(self): - url = "/cases/investigation-cases/" + str(self.other_inactive_case.revision_id) + "/" + url = ( + "/cases/investigation-cases/" + + str(self.other_inactive_case.revision_id) + + "/" + ) data = { "case_subject_id": str(self.other_inactive_case.case_subject_id), "reference_case_id": str(self.reference_case.case_id), @@ -167,7 +171,6 @@ class InvestigationCaseViewTest(TestCase): ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - def test_edit_investigation_case_fails_with_incomplete_data(self): url = "/cases/investigation-cases/" + str(self.case.revision_id) + "/" diff --git a/apps/cases/tests/test_units/test_monitoring_cases.py b/apps/cases/tests/test_units/test_monitoring_cases.py index faba464f4ee3a2a1cdef49ab2c879cf3946f1f1f..274122ff20da815b56607bde48f29e991a7274e2 100644 --- a/apps/cases/tests/test_units/test_monitoring_cases.py +++ b/apps/cases/tests/test_units/test_monitoring_cases.py @@ -38,13 +38,14 @@ class MonitoringCaseViewTest(TestCase): self.other_deleted_case = MonitoringCaseFactory( author=self.author, positive_case_id=self.positive_case.case_id, - deleted_at=datetime.now(tz=pytz.UTC), + deleted_at=datetime.now(tz=pytz.timezone("Asia/Jakarta")), ) self.other_inactive_case = MonitoringCaseFactory( - author=self.author, positive_case_id=self.positive_case.case_id, is_active=False, + author=self.author, + positive_case_id=self.positive_case.case_id, + is_active=False, ) - def test_list_monitoring_cases_success(self): url = "/cases/monitoring-cases/" @@ -121,9 +122,11 @@ class MonitoringCaseViewTest(TestCase): current_active_monitoring_case_revision_count, prev_active_monitoring_case_revision_count, ) - + def test_edit_inactive_monitoring_case_fails(self): - url = "/cases/monitoring-cases/" + str(self.other_inactive_case.revision_id) + "/" + url = ( + "/cases/monitoring-cases/" + str(self.other_inactive_case.revision_id) + "/" + ) data = { "positive_case_id": str(self.positive_case.revision_id), @@ -163,9 +166,7 @@ class MonitoringCaseViewTest(TestCase): def test_delete_inactive_monitoring_case_fails(self): url = ( - "/cases/monitoring-cases/" - + str(self.other_inactive_case.revision_id) - + "/" + "/cases/monitoring-cases/" + str(self.other_inactive_case.revision_id) + "/" ) response = self.client.delete(url) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) diff --git a/apps/cases/tests/test_units/test_positive_cases.py b/apps/cases/tests/test_units/test_positive_cases.py index c4b0d11ea4bea243c685d248ee26d23a0faf2472..07008548d5219e7b8aa036787a4663567e13317e 100644 --- a/apps/cases/tests/test_units/test_positive_cases.py +++ b/apps/cases/tests/test_units/test_positive_cases.py @@ -22,10 +22,12 @@ class PositiveCaseViewTest(TestCase): self.other_deleted_case = PositiveCaseFactory( author=self.author, case_subject_id=self.case_subject.subject_id, - deleted_at=datetime.now(tz=pytz.UTC), + deleted_at=datetime.now(tz=pytz.timezone("Asia/Jakarta")), ) self.other_inactive_case = PositiveCaseFactory( - author=self.author, case_subject_id=self.case_subject.subject_id, is_active=False, + author=self.author, + case_subject_id=self.case_subject.subject_id, + is_active=False, ) def test_list_positive_cases_success(self): @@ -129,7 +131,6 @@ class PositiveCaseViewTest(TestCase): ) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) - def test_edit_positive_case_fails_with_incomplete_data(self): url = "/cases/positive-cases/" + str(self.case.revision_id) + "/" @@ -169,10 +170,6 @@ class PositiveCaseViewTest(TestCase): ) def test_delete_inactive_positive_case_fails(self): - url = ( - "/cases/positive-cases/" - + str(self.other_inactive_case.revision_id) - + "/" - ) + url = "/cases/positive-cases/" + str(self.other_inactive_case.revision_id) + "/" response = self.client.delete(url) self.assertEqual(response.status_code, status.HTTP_404_NOT_FOUND) diff --git a/apps/cases/views.py b/apps/cases/views.py index d6f09840bcf637dd812cb12f9fff09fc33c4d279..99338aabc061b62290e668d1721f34be6fd2f9df 100644 --- a/apps/cases/views.py +++ b/apps/cases/views.py @@ -16,18 +16,18 @@ from apps.cases.serializers import ( InvestigationCaseSummarySerializer, InvestigationCaseSerializer, MonitoringCaseSummarySerializer, + MonitoringCaseSerializer, PositiveCaseSummarySerializer, PositiveCaseSerializer, ) class CaseSubjectViewSet(viewsets.ViewSet): - queryset = CaseSubject.objects.active_revisions() serializer_class = CaseSubjectSerializer + queryset = CaseSubject.objects.active_revisions() def list(self, request): - queryset = self.queryset - serializer = self.serializer_class(queryset, many=True) + serializer = self.serializer_class(self.queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) def retrieve(self, request, pk=None): @@ -38,7 +38,7 @@ class CaseSubjectViewSet(viewsets.ViewSet): def create(self, request): serializer = self.serializer_class(data=request.data) serializer.is_valid(raise_exception=True) - CaseSubject.objects.create(**serializer.validated_data) + serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED,) def update(self, request, pk=None): @@ -52,12 +52,10 @@ class CaseSubjectViewSet(viewsets.ViewSet): subject_id=previous_instance.subject_id, is_active=True, ) - previous_instance.is_active = False previous_instance.save() update_serializer = self.serializer_class(instance=new_instance) - return Response(update_serializer.data, status=status.HTTP_200_OK) def destroy(self, request, pk=None): @@ -68,13 +66,10 @@ class CaseSubjectViewSet(viewsets.ViewSet): class InvestigationCaseViewSet(viewsets.ViewSet): - queryset = InvestigationCase.objects.active_revisions().select_related( - "case_subject" - ) + queryset = InvestigationCase.objects.active_revisions() def list(self, request): - queryset = self.queryset - serializer = InvestigationCaseSummarySerializer(queryset, many=True) + serializer = InvestigationCaseSummarySerializer(self.queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) def retrieve(self, request, pk=None): @@ -111,30 +106,26 @@ class InvestigationCaseViewSet(viewsets.ViewSet): class MonitoringCaseViewSet(viewsets.ViewSet): - queryset = MonitoringCase.objects.active_revisions().select_related( - "positive_case", "investigation_case", - ) - serializer_class = MonitoringCaseSummarySerializer + queryset = MonitoringCase.objects.active_revisions() def list(self, request): - queryset = self.queryset - serializer = self.serializer_class(queryset, many=True) + serializer = MonitoringCaseSummarySerializer(self.queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) def retrieve(self, request, pk=None): instance = get_object_or_404(self.queryset, pk=pk) - serializer = self.serializer_class(instance) + serializer = MonitoringCaseSummarySerializer(instance) return Response(serializer.data, status=status.HTTP_200_OK) def create(self, request): - serializer = self.serializer_class(data=request.data) + serializer = MonitoringCaseSerializer(data=request.data) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED,) def update(self, request, pk=None): previous_instance = get_object_or_404(self.queryset, pk=pk) - serializer = self.serializer_class(previous_instance, data=request.data) + serializer = MonitoringCaseSerializer(previous_instance, data=request.data) serializer.is_valid(raise_exception=True) serializer_data = serializer.validated_data @@ -145,7 +136,7 @@ class MonitoringCaseViewSet(viewsets.ViewSet): previous_instance.is_active = False previous_instance.save() - update_serializer = self.serializer_class(instance=new_instance) + update_serializer = MonitoringCaseSummarySerializer(instance=new_instance) return Response(update_serializer.data, status=status.HTTP_200_OK) def destroy(self, request, pk=None): @@ -156,11 +147,10 @@ class MonitoringCaseViewSet(viewsets.ViewSet): class PositiveCaseViewSet(viewsets.ViewSet): - queryset = PositiveCase.objects.active_revisions().select_related("case_subject") + queryset = PositiveCase.objects.active_revisions() def list(self, request): - queryset = self.queryset - serializer = PositiveCaseSummarySerializer(queryset, many=True) + serializer = PositiveCaseSummarySerializer(self.queryset, many=True) return Response(serializer.data, status=status.HTTP_200_OK) def retrieve(self, request, pk=None): @@ -183,7 +173,6 @@ class PositiveCaseViewSet(viewsets.ViewSet): is_active=True, **serializer.validated_data, ) - previous_instance.is_active = False previous_instance.save() diff --git a/apps/commons/managers.py b/apps/commons/managers.py index d9b778a35f2e0d31fd153170f00c7aab546d4d38..9a9d212039d15f64f07d687c84e6524f4e41fa7f 100644 --- a/apps/commons/managers.py +++ b/apps/commons/managers.py @@ -2,16 +2,18 @@ from django.db import models class SoftObjectManager(models.Manager): - def all(self, with_deleted=False): - queryset = self.get_queryset() + def get_queryset(self, with_deleted=False): if with_deleted: - return queryset - return queryset.filter(deleted_at__isnull=True) + return super().get_queryset() + return super().get_queryset().filter(deleted_at__isnull=True) + + def all(self, with_deleted=False): + return self.get_queryset(with_deleted=with_deleted) def deleted(self): - queryset = self.get_queryset() + queryset = self.get_queryset(with_deleted=True) return queryset.filter(deleted_at__isnull=False) def active_revisions(self): queryset = self.get_queryset() - return queryset.filter(deleted_at__isnull=True, is_active=True) + return queryset.filter(is_active=True) diff --git a/project/settings.py b/project/settings.py index 5c64c72445c286cca8e209fb1d19583b28ce33b1..1432f0cd4a31b71cef0b6a4aba57c6b0c58de4fb 100644 --- a/project/settings.py +++ b/project/settings.py @@ -127,7 +127,7 @@ REST_FRAMEWORK = { LANGUAGE_CODE = "en-us" -TIME_ZONE = "UTC" +TIME_ZONE = "Asia/Jakarta" USE_I18N = True