From d9536374d075f252f56ff0303feda617258e71e8 Mon Sep 17 00:00:00 2001 From: Aakash Singh Date: Tue, 13 Jun 2023 17:05:05 +0530 Subject: [PATCH] Convert partial indexes to unique constraints and remove dependency Fixes #1355 --- .../migrations/0001_initial_squashed.py | 46 ------------ .../migrations/0002_auto_20230613_1657.py | 72 +++++++++++++++++++ care/facility/models/facility.py | 17 +++-- care/facility/models/inventory.py | 17 +++-- care/facility/models/patient.py | 9 ++- .../users/migrations/0001_initial_squashed.py | 10 --- .../migrations/0003_auto_20230613_1657.py | 24 +++++++ care/users/models.py | 9 ++- pyproject.toml | 1 - requirements/base.txt | 1 - 10 files changed, 126 insertions(+), 80 deletions(-) create mode 100644 care/facility/migrations/0002_auto_20230613_1657.py create mode 100644 care/users/migrations/0003_auto_20230613_1657.py diff --git a/care/facility/migrations/0001_initial_squashed.py b/care/facility/migrations/0001_initial_squashed.py index ff4d9b890e..b5ae3f80de 100644 --- a/care/facility/migrations/0001_initial_squashed.py +++ b/care/facility/migrations/0001_initial_squashed.py @@ -9,7 +9,6 @@ import django.utils.timezone import fernet_fields.fields import multiselectfield.db.fields -import partial_index import simple_history.models from django.conf import settings from django.db import migrations, models @@ -6968,15 +6967,6 @@ class Migration(migrations.Migration): fields=["-created_date"], name="facility_in_created_ea2255_idx" ), ), - migrations.AddIndex( - model_name="hospitaldoctors", - index=partial_index.PartialIndex( - fields=["facility", "area"], - name="facility_ho_facilit_ec08f4_partial", - unique=True, - where=partial_index.PQ(deleted=False), - ), - ), migrations.AlterUniqueTogether( name="facilityuser", unique_together={("facility", "user")}, @@ -7019,24 +7009,6 @@ class Migration(migrations.Migration): name="cons_facilitylocalgovtbody_only_one_null", ), ), - migrations.AddIndex( - model_name="facilityinventorysummary", - index=partial_index.PartialIndex( - fields=["facility", "item"], - name="facility_fa_facilit_ff33b8_partial", - unique=True, - where=partial_index.PQ(deleted=False), - ), - ), - migrations.AddIndex( - model_name="facilityinventoryminquantity", - index=partial_index.PartialIndex( - fields=["facility", "item"], - name="facility_fa_facilit_a9eb9a_partial", - unique=True, - where=partial_index.PQ(deleted=False), - ), - ), migrations.AddIndex( model_name="facilityinventoryburnrate", index=models.Index( @@ -7047,15 +7019,6 @@ class Migration(migrations.Migration): name="facilityinventoryburnrate", unique_together={("facility", "item")}, ), - migrations.AddIndex( - model_name="facilitycapacity", - index=partial_index.PartialIndex( - fields=["facility", "room_type"], - name="facility_fa_facilit_ec2b0e_partial", - unique=True, - where=partial_index.PQ(deleted=False), - ), - ), migrations.AddIndex( model_name="districtscopedsummary", index=models.Index( @@ -7079,15 +7042,6 @@ class Migration(migrations.Migration): name="facility_di_created_45003b_idx", ), ), - migrations.AddIndex( - model_name="disease", - index=partial_index.PartialIndex( - fields=["patient", "disease"], - name="facility_di_patient_640ef7_partial", - unique=True, - where=partial_index.PQ(deleted=False), - ), - ), migrations.AddConstraint( model_name="asset", constraint=models.UniqueConstraint( diff --git a/care/facility/migrations/0002_auto_20230613_1657.py b/care/facility/migrations/0002_auto_20230613_1657.py new file mode 100644 index 0000000000..33794c0aa2 --- /dev/null +++ b/care/facility/migrations/0002_auto_20230613_1657.py @@ -0,0 +1,72 @@ +# Generated by Django 2.2.11 on 2023-06-13 11:27 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("facility", "0001_initial_squashed"), + ] + + operations = [ + migrations.RunSQL( + sql="DROP INDEX IF EXISTS facility_di_patient_640ef7_partial", + reverse_sql=migrations.RunSQL.noop, + ), + migrations.RunSQL( + sql="DROP INDEX IF EXISTS facility_fa_facilit_ec2b0e_partial", + reverse_sql=migrations.RunSQL.noop, + ), + migrations.RunSQL( + sql="DROP INDEX IF EXISTS facility_fa_facilit_a9eb9a_partial", + reverse_sql=migrations.RunSQL.noop, + ), + migrations.RunSQL( + sql="DROP INDEX IF EXISTS facility_fa_facilit_ff33b8_partial", + reverse_sql=migrations.RunSQL.noop, + ), + migrations.RunSQL( + sql="DROP INDEX IF EXISTS facility_ho_facilit_ec08f4_partial", + reverse_sql=migrations.RunSQL.noop, + ), + migrations.AddConstraint( + model_name="disease", + constraint=models.UniqueConstraint( + condition=models.Q(deleted=False), + fields=("patient", "disease"), + name="unique_patient_disease", + ), + ), + migrations.AddConstraint( + model_name="facilitycapacity", + constraint=models.UniqueConstraint( + condition=models.Q(deleted=False), + fields=("facility", "room_type"), + name="unique_facility_room_type", + ), + ), + migrations.AddConstraint( + model_name="facilityinventoryminquantity", + constraint=models.UniqueConstraint( + condition=models.Q(deleted=False), + fields=("facility", "item"), + name="unique_facility_item_min_quantity", + ), + ), + migrations.AddConstraint( + model_name="facilityinventorysummary", + constraint=models.UniqueConstraint( + condition=models.Q(deleted=False), + fields=("facility", "item"), + name="unique_facility_item_summary", + ), + ), + migrations.AddConstraint( + model_name="hospitaldoctors", + constraint=models.UniqueConstraint( + condition=models.Q(deleted=False), + fields=("facility", "area"), + name="unique_facility_doctor", + ), + ), + ] diff --git a/care/facility/models/facility.py b/care/facility/models/facility.py index 476612f9d1..a407be8a63 100644 --- a/care/facility/models/facility.py +++ b/care/facility/models/facility.py @@ -3,7 +3,6 @@ from django.core.validators import MinValueValidator from django.db import models from multiselectfield import MultiSelectField -from partial_index import PQ, PartialIndex from simple_history.models import HistoricalRecords from care.facility.models import FacilityBaseModel, phone_number_regex, reverse_choices @@ -269,9 +268,11 @@ def __str__(self): return str(self.facility) + str(self.count) class Meta: - indexes = [ - PartialIndex( - fields=["facility", "area"], unique=True, where=PQ(deleted=False) + constraints = [ + models.UniqueConstraint( + fields=["facility", "area"], + condition=models.Q(deleted=False), + name="unique_facility_doctor", ) ] @@ -294,9 +295,11 @@ class FacilityCapacity(FacilityBaseModel, FacilityRelatedPermissionMixin): history = HistoricalRecords() class Meta: - indexes = [ - PartialIndex( - fields=["facility", "room_type"], unique=True, where=PQ(deleted=False) + constraints = [ + models.UniqueConstraint( + fields=["facility", "room_type"], + condition=models.Q(deleted=False), + name="unique_facility_room_type", ) ] verbose_name_plural = "Facility Capacities" diff --git a/care/facility/models/inventory.py b/care/facility/models/inventory.py index 5719019d13..934b0128f4 100644 --- a/care/facility/models/inventory.py +++ b/care/facility/models/inventory.py @@ -1,7 +1,6 @@ from django.contrib.auth import get_user_model from django.db import models from django.db.models import Index -from partial_index import PQ, PartialIndex from care.facility.models import FacilityBaseModel from care.facility.models.mixins.permissions.facility import ( @@ -138,9 +137,11 @@ class FacilityInventorySummary(FacilityBaseModel, FacilityRelatedPermissionMixin is_low = models.BooleanField(default=False) class Meta: - indexes = [ - PartialIndex( - fields=["facility", "item"], unique=True, where=PQ(deleted=False) + constraints = [ + models.UniqueConstraint( + fields=["facility", "item"], + condition=models.Q(deleted=False), + name="unique_facility_item_summary", ) ] @@ -159,9 +160,11 @@ class FacilityInventoryMinQuantity(FacilityBaseModel, FacilityRelatedPermissionM min_quantity = models.FloatField(default=0) class Meta: - indexes = [ - PartialIndex( - fields=["facility", "item"], unique=True, where=PQ(deleted=False) + constraints = [ + models.UniqueConstraint( + fields=["facility", "item"], + condition=models.Q(deleted=False), + name="unique_facility_item_min_quantity", ) ] diff --git a/care/facility/models/patient.py b/care/facility/models/patient.py index 729bd4f8f5..045760a507 100644 --- a/care/facility/models/patient.py +++ b/care/facility/models/patient.py @@ -4,7 +4,6 @@ from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models from fernet_fields import EncryptedCharField, EncryptedIntegerField -from partial_index import PQ, PartialIndex from simple_history.models import HistoricalRecords from care.facility.models import ( @@ -697,11 +696,11 @@ class Disease(models.Model): objects = BaseManager() class Meta: - indexes = [ - PartialIndex( + constraints = [ + models.UniqueConstraint( fields=["patient", "disease"], - unique=True, - where=PQ(deleted=False), + condition=models.Q(deleted=False), + name="unique_patient_disease", ) ] diff --git a/care/users/migrations/0001_initial_squashed.py b/care/users/migrations/0001_initial_squashed.py index 163fede411..ec915df6ba 100644 --- a/care/users/migrations/0001_initial_squashed.py +++ b/care/users/migrations/0001_initial_squashed.py @@ -5,7 +5,6 @@ import django.core.validators import django.db.models.deletion import django.utils.timezone -import partial_index from django.conf import settings from django.db import migrations, models @@ -509,15 +508,6 @@ class Migration(migrations.Migration): to="users.Ward", ), ), - migrations.AddIndex( - model_name="userskill", - index=partial_index.PartialIndex( - fields=["skill", "user"], - name="users_users_skill_i_6ebc32_partial", - unique=True, - where=partial_index.PQ(deleted=False), - ), - ), migrations.AlterUniqueTogether( name="localbody", unique_together={("district", "body_type", "name")}, diff --git a/care/users/migrations/0003_auto_20230613_1657.py b/care/users/migrations/0003_auto_20230613_1657.py new file mode 100644 index 0000000000..59932ae3bb --- /dev/null +++ b/care/users/migrations/0003_auto_20230613_1657.py @@ -0,0 +1,24 @@ +# Generated by Django 2.2.11 on 2023-06-13 11:27 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("users", "0002_auto_20230613_1622"), + ] + + operations = [ + migrations.RunSQL( + sql="DROP INDEX IF EXISTS users_users_skill_i_6ebc32_partial", + reverse_sql=migrations.RunSQL.noop, + ), + migrations.AddConstraint( + model_name="userskill", + constraint=models.UniqueConstraint( + condition=models.Q(deleted=False), + fields=("skill", "user"), + name="unique_user_skill", + ), + ), + ] diff --git a/care/users/models.py b/care/users/models.py index 166460aa0f..741609f016 100644 --- a/care/users/models.py +++ b/care/users/models.py @@ -6,7 +6,6 @@ from django.db import models from django.urls import reverse from django.utils.translation import ugettext_lazy as _ -from partial_index import PQ, PartialIndex from care.utils.models.base import BaseModel @@ -168,8 +167,12 @@ class UserSkill(BaseModel): skill = models.ForeignKey("Skill", on_delete=models.CASCADE, null=True, blank=True) class Meta: - indexes = [ - PartialIndex(fields=["skill", "user"], unique=True, where=PQ(deleted=False)) + constraints = [ + models.UniqueConstraint( + fields=["skill", "user"], + condition=models.Q(deleted=False), + name="unique_user_skill", + ) ] diff --git a/pyproject.toml b/pyproject.toml index 839b857557..a6ae114982 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,7 +44,6 @@ known_third_party = [ "jsonschema", "jwt", "multiselectfield", - "partial_index", "phonenumber_field", "phonenumbers", "pytz", diff --git a/requirements/base.txt b/requirements/base.txt index dabc29006d..cfc2428401 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -20,7 +20,6 @@ drf-yasg==1.17.1 # For Api Docs django-filter==2.4.0 drf-nested-routers==0.91 django-multiselectfield==0.1.12 # https://github.com/goinnn/django-multiselectfield -django-partial-index==0.6.0 # https://github.com/mattiaslinnap/django-partial-index/blob/master/README.md django-simple-history==2.8.0 # https://django-simple-history.readthedocs.io/en/latest/quick_start.html django-ratelimit==2.0.0 # Limiting Requests django-fernet-fields==0.6 # https://django-fernet-fields.readthedocs.io/en/latest/