From a3e2abeff0b93e63e0dc50eb6499df7703369b40 Mon Sep 17 00:00:00 2001 From: Henry Cooksley Date: Tue, 30 Jul 2024 17:00:26 +0100 Subject: [PATCH 1/5] Add new UUID field to DenialReason --- .../migrations/0005_denialreason_uuid.py | 19 +++++++++++++++++++ api/staticdata/denial_reasons/models.py | 3 +++ 2 files changed, 22 insertions(+) create mode 100644 api/staticdata/denial_reasons/migrations/0005_denialreason_uuid.py diff --git a/api/staticdata/denial_reasons/migrations/0005_denialreason_uuid.py b/api/staticdata/denial_reasons/migrations/0005_denialreason_uuid.py new file mode 100644 index 0000000000..3dd0e3b66a --- /dev/null +++ b/api/staticdata/denial_reasons/migrations/0005_denialreason_uuid.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.14 on 2024-07-30 15:58 + +from django.db import migrations, models +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ("denial_reasons", "0004_denial_reasons_update"), + ] + + operations = [ + migrations.AddField( + model_name="denialreason", + name="uuid", + field=models.UUIDField(default=uuid.uuid4, editable=False), + ), + ] diff --git a/api/staticdata/denial_reasons/models.py b/api/staticdata/denial_reasons/models.py index 772691250b..3afc378acb 100644 --- a/api/staticdata/denial_reasons/models.py +++ b/api/staticdata/denial_reasons/models.py @@ -1,8 +1,11 @@ +import uuid + from django.db import models class DenialReason(models.Model): id = models.TextField(primary_key=True, editable=False) + uuid = models.UUIDField(primary_key=False, default=uuid.uuid4, editable=False) deprecated = models.BooleanField(default=False, null=False, blank=False) description = models.TextField(default="") display_value = models.TextField(default="") From 69a4a8292e8c8613226cc83798eb8ef79c42ec26 Mon Sep 17 00:00:00 2001 From: Henry Cooksley Date: Tue, 30 Jul 2024 17:03:16 +0100 Subject: [PATCH 2/5] Add data migration populate_uuid_field --- .../migrations/0006_populate_uuid_field.py | 19 ++++++++++++++++ .../tests/test_0006_populate_uuid_field.py | 22 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 api/staticdata/denial_reasons/migrations/0006_populate_uuid_field.py create mode 100644 api/staticdata/denial_reasons/migrations/tests/test_0006_populate_uuid_field.py diff --git a/api/staticdata/denial_reasons/migrations/0006_populate_uuid_field.py b/api/staticdata/denial_reasons/migrations/0006_populate_uuid_field.py new file mode 100644 index 0000000000..aeed2b9da8 --- /dev/null +++ b/api/staticdata/denial_reasons/migrations/0006_populate_uuid_field.py @@ -0,0 +1,19 @@ +import uuid +from django.db import migrations + + +def populate_uuid_field(apps, schema_editor): + DenialReason = apps.get_model("denial_reasons", "DenialReason") + for denial_reason in DenialReason.objects.all(): + denial_reason.uuid = uuid.uuid4() + denial_reason.save() + + +class Migration(migrations.Migration): + dependencies = [ + ("denial_reasons", "0005_denialreason_uuid"), + ] + + operations = [ + migrations.RunPython(populate_uuid_field, migrations.RunPython.noop), + ] diff --git a/api/staticdata/denial_reasons/migrations/tests/test_0006_populate_uuid_field.py b/api/staticdata/denial_reasons/migrations/tests/test_0006_populate_uuid_field.py new file mode 100644 index 0000000000..833dd26a9c --- /dev/null +++ b/api/staticdata/denial_reasons/migrations/tests/test_0006_populate_uuid_field.py @@ -0,0 +1,22 @@ +import pytest +import uuid + +from django_test_migrations.migrator import Migrator + + +@pytest.mark.django_db() +def test_populate_uuid_field(): + migrator = Migrator(database="default") + + old_state = migrator.apply_initial_migration(("denial_reasons", "0005_denialreason_uuid")) + + new_state = migrator.apply_tested_migration(("denial_reasons", "0006_populate_uuid_field")) + DenialReason = new_state.apps.get_model("denial_reasons", "DenialReason") + for denial_reason in DenialReason.objects.all(): + assert denial_reason.uuid is not None + assert type(denial_reason.uuid) is uuid.UUID + + # Assert there is a unique UUID for each DenialReason object + assert DenialReason.objects.all().count() == len( + set([denial_reason.uuid for denial_reason in DenialReason.objects.all()]) + ) From 03d8e28b4343867f1de3dd963c936cc91881af4e Mon Sep 17 00:00:00 2001 From: Henry Cooksley Date: Wed, 31 Jul 2024 17:07:33 +0100 Subject: [PATCH 3/5] Rewrite migration to use predefined UUIDs --- api/staticdata/denial_reasons/constants.py | 28 +++++++++++++++++++ .../migrations/0006_populate_uuid_field.py | 5 +++- .../tests/test_0006_populate_uuid_field.py | 10 ++++--- 3 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 api/staticdata/denial_reasons/constants.py diff --git a/api/staticdata/denial_reasons/constants.py b/api/staticdata/denial_reasons/constants.py new file mode 100644 index 0000000000..7ae9a504c4 --- /dev/null +++ b/api/staticdata/denial_reasons/constants.py @@ -0,0 +1,28 @@ +id_to_uuid_map = { + "1": "f8e2cd45-071b-4bf2-bc01-155d9c83c460", # /PS-IGNORE + "1a": "6e96160f-de24-4f3e-a2f7-056f96012efa", # /PS-IGNORE + "1b": "4a86755a-25c4-4b0d-8874-c337ecbd0d67", # /PS-IGNORE + "1c": "04a7314f-d2d0-480b-947b-4f9332749b32", # /PS-IGNORE + "1d": "c947c434-4987-4a26-9277-62ddd9048ae1", # /PS-IGNORE + "1e": "5d59ca98-a606-4b33-8a3b-252135da939a", # /PS-IGNORE + "1f": "06a0bc03-064d-47a8-9e88-26db89cdd224", # /PS-IGNORE + "2": "6b570188-634a-4aa7-91be-3f10c0dab2f8", # /PS-IGNORE + "2a": "815d0d95-448f-4514-a428-37bf9a6a4b9b", # /PS-IGNORE + "2b": "8335b8c0-643a-4a1b-9ca6-a2e5b65a57d8", # /PS-IGNORE + "2c": "03beb66a-7b46-4d84-9616-949045626ea6", # /PS-IGNORE + "3": "27cbd803-d2ac-4fed-af58-8990438ca3e0", # /PS-IGNORE + "4": "7205638b-8f9b-4260-bb27-0c41de2208ee", # /PS-IGNORE + "5": "73e063e8-ede0-43aa-b8c5-a9b7e546d67c", # /PS-IGNORE + "5a": "49203257-8fca-4f7f-9f86-b8a6fa1dfa58", # /PS-IGNORE + "5b": "aecd9fd0-287e-4b39-9f6a-4531a2e5848e", # /PS-IGNORE + "5c": "913d7cb9-f04d-488a-b68c-554c8bfe6711", # /PS-IGNORE + "6": "b6b0ce7c-8494-4c16-9dec-f2aa770d77ad", # /PS-IGNORE + "6a": "df28a06c-c2c6-4a07-bd7e-1959bee1e7a8", # /PS-IGNORE + "6b": "f45133c5-3695-4f12-a6c3-ae9897ce48d8", # /PS-IGNORE + "7": "ec3794dc-6387-4e8a-bec8-293f1598a710", # /PS-IGNORE + "8": "2674ef18-ff2b-4739-bde9-7b4a53e7aa49", # /PS-IGNORE + "IRAN": "56b8649f-59d7-4fdf-848a-488b0cb4d52e", # /PS-IGNORE + "MEND": "932fc377-3adb-4d2e-9eb6-0c19abdc0bc1", # /PS-IGNORE + "OF": "aa20a4be-5ee8-4de3-8cea-5a5ba9142ed4", # /PS-IGNORE + "WMD": "85411aed-22a6-46bf-b513-b901e1959c36", # /PS-IGNORE +} diff --git a/api/staticdata/denial_reasons/migrations/0006_populate_uuid_field.py b/api/staticdata/denial_reasons/migrations/0006_populate_uuid_field.py index aeed2b9da8..6a93bc9033 100644 --- a/api/staticdata/denial_reasons/migrations/0006_populate_uuid_field.py +++ b/api/staticdata/denial_reasons/migrations/0006_populate_uuid_field.py @@ -1,11 +1,14 @@ import uuid + from django.db import migrations +from api.staticdata.denial_reasons.constants import id_to_uuid_map + def populate_uuid_field(apps, schema_editor): DenialReason = apps.get_model("denial_reasons", "DenialReason") for denial_reason in DenialReason.objects.all(): - denial_reason.uuid = uuid.uuid4() + denial_reason.uuid = uuid.UUID(id_to_uuid_map[denial_reason.id]) denial_reason.save() diff --git a/api/staticdata/denial_reasons/migrations/tests/test_0006_populate_uuid_field.py b/api/staticdata/denial_reasons/migrations/tests/test_0006_populate_uuid_field.py index 833dd26a9c..cfef4cecaa 100644 --- a/api/staticdata/denial_reasons/migrations/tests/test_0006_populate_uuid_field.py +++ b/api/staticdata/denial_reasons/migrations/tests/test_0006_populate_uuid_field.py @@ -3,6 +3,8 @@ from django_test_migrations.migrator import Migrator +from api.staticdata.denial_reasons.constants import id_to_uuid_map + @pytest.mark.django_db() def test_populate_uuid_field(): @@ -15,8 +17,8 @@ def test_populate_uuid_field(): for denial_reason in DenialReason.objects.all(): assert denial_reason.uuid is not None assert type(denial_reason.uuid) is uuid.UUID + assert str(denial_reason.uuid) == id_to_uuid_map[denial_reason.id] - # Assert there is a unique UUID for each DenialReason object - assert DenialReason.objects.all().count() == len( - set([denial_reason.uuid for denial_reason in DenialReason.objects.all()]) - ) + expected_uuids = set(id_to_uuid_map.values()) + actual_uuids = set([str(denial_reason.uuid) for denial_reason in DenialReason.objects.all()]) + assert expected_uuids == actual_uuids From 9c5f7fbf9ea716fba2dc497e7805b5a037d67aa1 Mon Sep 17 00:00:00 2001 From: Henry Cooksley Date: Wed, 31 Jul 2024 17:18:26 +0100 Subject: [PATCH 4/5] Rename dict DENIAL_REASON_ID_TO_UUID_MAP --- api/staticdata/denial_reasons/constants.py | 2 +- .../denial_reasons/migrations/0006_populate_uuid_field.py | 4 ++-- .../migrations/tests/test_0006_populate_uuid_field.py | 6 +++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/api/staticdata/denial_reasons/constants.py b/api/staticdata/denial_reasons/constants.py index 7ae9a504c4..d56194231a 100644 --- a/api/staticdata/denial_reasons/constants.py +++ b/api/staticdata/denial_reasons/constants.py @@ -1,4 +1,4 @@ -id_to_uuid_map = { +DENIAL_REASON_ID_TO_UUID_MAP = { "1": "f8e2cd45-071b-4bf2-bc01-155d9c83c460", # /PS-IGNORE "1a": "6e96160f-de24-4f3e-a2f7-056f96012efa", # /PS-IGNORE "1b": "4a86755a-25c4-4b0d-8874-c337ecbd0d67", # /PS-IGNORE diff --git a/api/staticdata/denial_reasons/migrations/0006_populate_uuid_field.py b/api/staticdata/denial_reasons/migrations/0006_populate_uuid_field.py index 6a93bc9033..560b6a8131 100644 --- a/api/staticdata/denial_reasons/migrations/0006_populate_uuid_field.py +++ b/api/staticdata/denial_reasons/migrations/0006_populate_uuid_field.py @@ -2,13 +2,13 @@ from django.db import migrations -from api.staticdata.denial_reasons.constants import id_to_uuid_map +from api.staticdata.denial_reasons.constants import DENIAL_REASON_ID_TO_UUID_MAP def populate_uuid_field(apps, schema_editor): DenialReason = apps.get_model("denial_reasons", "DenialReason") for denial_reason in DenialReason.objects.all(): - denial_reason.uuid = uuid.UUID(id_to_uuid_map[denial_reason.id]) + denial_reason.uuid = uuid.UUID(DENIAL_REASON_ID_TO_UUID_MAP[denial_reason.id]) denial_reason.save() diff --git a/api/staticdata/denial_reasons/migrations/tests/test_0006_populate_uuid_field.py b/api/staticdata/denial_reasons/migrations/tests/test_0006_populate_uuid_field.py index cfef4cecaa..89694a6f78 100644 --- a/api/staticdata/denial_reasons/migrations/tests/test_0006_populate_uuid_field.py +++ b/api/staticdata/denial_reasons/migrations/tests/test_0006_populate_uuid_field.py @@ -3,7 +3,7 @@ from django_test_migrations.migrator import Migrator -from api.staticdata.denial_reasons.constants import id_to_uuid_map +from api.staticdata.denial_reasons.constants import DENIAL_REASON_ID_TO_UUID_MAP @pytest.mark.django_db() @@ -17,8 +17,8 @@ def test_populate_uuid_field(): for denial_reason in DenialReason.objects.all(): assert denial_reason.uuid is not None assert type(denial_reason.uuid) is uuid.UUID - assert str(denial_reason.uuid) == id_to_uuid_map[denial_reason.id] + assert str(denial_reason.uuid) == DENIAL_REASON_ID_TO_UUID_MAP[denial_reason.id] - expected_uuids = set(id_to_uuid_map.values()) + expected_uuids = set(DENIAL_REASON_ID_TO_UUID_MAP.values()) actual_uuids = set([str(denial_reason.uuid) for denial_reason in DenialReason.objects.all()]) assert expected_uuids == actual_uuids From 60433a704eda01c050e6e3879288176583687843 Mon Sep 17 00:00:00 2001 From: Henry Cooksley Date: Mon, 5 Aug 2024 11:38:06 +0100 Subject: [PATCH 5/5] Update seeddenialreasons --- api/staticdata/management/commands/seeddenialreasons.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/api/staticdata/management/commands/seeddenialreasons.py b/api/staticdata/management/commands/seeddenialreasons.py index 43362a24d9..7a5ee94278 100644 --- a/api/staticdata/management/commands/seeddenialreasons.py +++ b/api/staticdata/management/commands/seeddenialreasons.py @@ -1,9 +1,12 @@ +import uuid + from django.db import transaction from api.staticdata.denial_reasons.models import DenialReason from api.staticdata.management.SeedCommand import SeedCommand +from api.staticdata.denial_reasons.constants import DENIAL_REASON_ID_TO_UUID_MAP -DENIAL_REASONS_FILE = "lite_content/lite_api/denial_reasons.csv" +DENIAL_REASONS_FILE = "lite_content/lite_api/denial_reasons_update.csv" class Command(SeedCommand): @@ -21,6 +24,7 @@ def operation(self, *args, **options): filtered_csv = [ { "id": row["id"], + "uuid": uuid.UUID(DENIAL_REASON_ID_TO_UUID_MAP[row["id"]]), "display_value": row["display_value"], "deprecated": row["deprecated"], "description": row["description"],