From b98b0cec1d23b3e9fc104e9cc49edb8cabbc1a9a Mon Sep 17 00:00:00 2001 From: Tobias Macey Date: Mon, 20 Oct 2025 12:09:13 -0400 Subject: [PATCH] fix: Convert UUIDField columns to uuid type for MariaDB Converts UUIDField columns from char(32) to uuid type for MariaDB Django 5 compatibility. This migration converts 19 UUIDFields across 2 apps: - enterprise_data: 18 fields - enterprise_data_roles: 1 field See: https://docs.djangoproject.com/en/5.2/releases/5.0/#migrating-uuidfield --- enterprise_data/__init__.py | 2 +- .../0049_mariadb_uuid_conversion.py | 83 +++++++++++++++++++ .../0008_mariadb_uuid_conversion.py | 44 ++++++++++ 3 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 enterprise_data/migrations/0049_mariadb_uuid_conversion.py create mode 100644 enterprise_data_roles/migrations/0008_mariadb_uuid_conversion.py diff --git a/enterprise_data/__init__.py b/enterprise_data/__init__.py index 5e722855..b8471194 100644 --- a/enterprise_data/__init__.py +++ b/enterprise_data/__init__.py @@ -2,4 +2,4 @@ Enterprise data api application. This Django app exposes API endpoints used by enterprises. """ -__version__ = "10.21.8" +__version__ = "10.21.9" diff --git a/enterprise_data/migrations/0049_mariadb_uuid_conversion.py b/enterprise_data/migrations/0049_mariadb_uuid_conversion.py new file mode 100644 index 00000000..6b5a4836 --- /dev/null +++ b/enterprise_data/migrations/0049_mariadb_uuid_conversion.py @@ -0,0 +1,83 @@ +# Generated migration for MariaDB UUID field conversion (Django 5.2) +""" +Migration to convert UUIDField from char(32) to uuid type for MariaDB compatibility. +""" + +from django.db import migrations + + +def apply_mariadb_migration(apps, schema_editor): + connection = schema_editor.connection + if connection.vendor != 'mysql': + return + with connection.cursor() as cursor: + cursor.execute("SELECT VERSION()") + version = cursor.fetchone()[0] + if 'mariadb' not in version.lower(): + return + with connection.cursor() as cursor: + # EnterpriseEnrollment + cursor.execute("ALTER TABLE enterprise_data_enterpriseenrollment MODIFY enterprise_customer_uuid uuid NOT NULL") + cursor.execute("ALTER TABLE enterprise_data_enterpriseenrollment MODIFY budget_id uuid NULL") + cursor.execute("ALTER TABLE enterprise_data_enterpriseenrollment MODIFY subscription_license_uuid uuid NULL") + cursor.execute("ALTER TABLE enterprise_data_enterpriseenrollment MODIFY enterprise_group_uuid uuid NULL") + # EnterpriseUser + cursor.execute("ALTER TABLE enterprise_data_enterpriseuser MODIFY enterprise_customer_uuid uuid NOT NULL") + # EnterpriseOffer + cursor.execute("ALTER TABLE enterprise_data_enterpriseoffer MODIFY enterprise_customer_uuid uuid NOT NULL") + cursor.execute("ALTER TABLE enterprise_data_enterpriseoffer MODIFY enterprise_id uuid NOT NULL") + # EnterpriseBudget + cursor.execute("ALTER TABLE enterprise_data_enterprisebudget MODIFY enterprise_customer_uuid uuid NOT NULL") + # EnterpriseSubsidyBudget + cursor.execute("ALTER TABLE enterprise_data_enterprisesubsidybudget MODIFY subsidy_access_policy_uuid uuid NOT NULL") + cursor.execute("ALTER TABLE enterprise_data_enterprisesubsidybudget MODIFY subsidy_uuid uuid NOT NULL") + cursor.execute("ALTER TABLE enterprise_data_enterprisesubsidybudget MODIFY enterprise_customer_uuid uuid NOT NULL") + # EnterpriseLearner + cursor.execute("ALTER TABLE enterprise_data_enterpriselearner MODIFY enterprise_customer_id uuid NULL") + cursor.execute("ALTER TABLE enterprise_data_enterpriselearner MODIFY enterprise_group_uuid uuid NULL") + cursor.execute("ALTER TABLE enterprise_data_enterpriselearner MODIFY enterprise_group_membership_uuid uuid NULL") + # EnterpriseSubsidyTransaction + cursor.execute("ALTER TABLE enterprise_data_enterprisesubsidytransaction MODIFY enterprise_id uuid NOT NULL") + cursor.execute("ALTER TABLE enterprise_data_enterprisesubsidytransaction MODIFY subsidy_transaction_id uuid NULL") + cursor.execute("ALTER TABLE enterprise_data_enterprisesubsidytransaction MODIFY enterprise_customer_uuid uuid NULL") + + +def reverse_mariadb_migration(apps, schema_editor): + connection = schema_editor.connection + if connection.vendor != 'mysql': + return + with connection.cursor() as cursor: + cursor.execute("SELECT VERSION()") + version = cursor.fetchone()[0] + if 'mariadb' not in version.lower(): + return + with connection.cursor() as cursor: + cursor.execute("ALTER TABLE enterprise_data_enterpriseenrollment MODIFY enterprise_customer_uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE enterprise_data_enterpriseenrollment MODIFY budget_id char(32) NULL") + cursor.execute("ALTER TABLE enterprise_data_enterpriseenrollment MODIFY subscription_license_uuid char(32) NULL") + cursor.execute("ALTER TABLE enterprise_data_enterpriseenrollment MODIFY enterprise_group_uuid char(32) NULL") + cursor.execute("ALTER TABLE enterprise_data_enterpriseuser MODIFY enterprise_customer_uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE enterprise_data_enterpriseoffer MODIFY enterprise_customer_uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE enterprise_data_enterpriseoffer MODIFY enterprise_id char(32) NOT NULL") + cursor.execute("ALTER TABLE enterprise_data_enterprisebudget MODIFY enterprise_customer_uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE enterprise_data_enterprisesubsidybudget MODIFY subsidy_access_policy_uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE enterprise_data_enterprisesubsidybudget MODIFY subsidy_uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE enterprise_data_enterprisesubsidybudget MODIFY enterprise_customer_uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE enterprise_data_enterpriselearner MODIFY enterprise_customer_id char(32) NULL") + cursor.execute("ALTER TABLE enterprise_data_enterpriselearner MODIFY enterprise_group_uuid char(32) NULL") + cursor.execute("ALTER TABLE enterprise_data_enterpriselearner MODIFY enterprise_group_membership_uuid char(32) NULL") + cursor.execute("ALTER TABLE enterprise_data_enterprisesubsidytransaction MODIFY enterprise_id char(32) NOT NULL") + cursor.execute("ALTER TABLE enterprise_data_enterprisesubsidytransaction MODIFY subsidy_transaction_id char(32) NULL") + cursor.execute("ALTER TABLE enterprise_data_enterprisesubsidytransaction MODIFY enterprise_customer_uuid char(32) NULL") + + +class Migration(migrations.Migration): + dependencies = [ + ('enterprise_data', '0048_alter_enterpriseexecedlcmoduleperformance_avg_after_lo_score_and_more'), + ] + operations = [ + migrations.RunPython( + code=apply_mariadb_migration, + reverse_code=reverse_mariadb_migration, + ), + ] diff --git a/enterprise_data_roles/migrations/0008_mariadb_uuid_conversion.py b/enterprise_data_roles/migrations/0008_mariadb_uuid_conversion.py new file mode 100644 index 00000000..55fc18f5 --- /dev/null +++ b/enterprise_data_roles/migrations/0008_mariadb_uuid_conversion.py @@ -0,0 +1,44 @@ +# Generated migration for MariaDB UUID field conversion (Django 5.2) +""" +Migration to convert UUIDField from char(32) to uuid type for MariaDB compatibility. +""" + +from django.db import migrations + + +def apply_mariadb_migration(apps, schema_editor): + connection = schema_editor.connection + if connection.vendor != 'mysql': + return + with connection.cursor() as cursor: + cursor.execute("SELECT VERSION()") + version = cursor.fetchone()[0] + if 'mariadb' not in version.lower(): + return + with connection.cursor() as cursor: + cursor.execute("ALTER TABLE enterprise_data_roles_enterprisedataroleassignment MODIFY enterprise_id uuid NULL") + + +def reverse_mariadb_migration(apps, schema_editor): + connection = schema_editor.connection + if connection.vendor != 'mysql': + return + with connection.cursor() as cursor: + cursor.execute("SELECT VERSION()") + version = cursor.fetchone()[0] + if 'mariadb' not in version.lower(): + return + with connection.cursor() as cursor: + cursor.execute("ALTER TABLE enterprise_data_roles_enterprisedataroleassignment MODIFY enterprise_id char(32) NULL") + + +class Migration(migrations.Migration): + dependencies = [ + ('enterprise_data_roles', '0007_enterprisedataroleassignment_applies_to_all_contexts'), + ] + operations = [ + migrations.RunPython( + code=apply_mariadb_migration, + reverse_code=reverse_mariadb_migration, + ), + ]