From 824f7bcdffc07d28658c3a3ce5c4e91d398f5ca6 Mon Sep 17 00:00:00 2001 From: Tobias Macey Date: Mon, 20 Oct 2025 11:59:54 -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 25 UUIDFields across 4 apps: - content_assignments: 6 fields - core: 1 field - subsidy_access_policy: 7 fields - subsidy_request: 7 fields See: https://docs.djangoproject.com/en/5.2/releases/5.0/#migrating-uuidfield --- enterprise_access/__init__.py | 2 +- .../0024_mariadb_uuid_conversion.py | 54 ++++++++++++++++++ .../0005_mariadb_uuid_conversion.py | 44 +++++++++++++++ .../0030_mariadb_uuid_conversion.py | 56 +++++++++++++++++++ .../0022_mariadb_uuid_conversion.py | 56 +++++++++++++++++++ 5 files changed, 211 insertions(+), 1 deletion(-) create mode 100644 enterprise_access/apps/content_assignments/migrations/0024_mariadb_uuid_conversion.py create mode 100644 enterprise_access/apps/core/migrations/0005_mariadb_uuid_conversion.py create mode 100644 enterprise_access/apps/subsidy_access_policy/migrations/0030_mariadb_uuid_conversion.py create mode 100644 enterprise_access/apps/subsidy_request/migrations/0022_mariadb_uuid_conversion.py diff --git a/enterprise_access/__init__.py b/enterprise_access/__init__.py index 887ec1afa..ee279ae95 100644 --- a/enterprise_access/__init__.py +++ b/enterprise_access/__init__.py @@ -7,4 +7,4 @@ __all__ = ('celery_app',) -__version__ = '1.0.0' +__version__ = '1.0.1' diff --git a/enterprise_access/apps/content_assignments/migrations/0024_mariadb_uuid_conversion.py b/enterprise_access/apps/content_assignments/migrations/0024_mariadb_uuid_conversion.py new file mode 100644 index 000000000..ceb1a3730 --- /dev/null +++ b/enterprise_access/apps/content_assignments/migrations/0024_mariadb_uuid_conversion.py @@ -0,0 +1,54 @@ +# 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 content_assignments_assignment MODIFY uuid uuid NOT NULL") + cursor.execute("ALTER TABLE content_assignments_assignment MODIFY enterprise_customer_uuid uuid NOT NULL") + cursor.execute("ALTER TABLE content_assignments_learnercontentassignment MODIFY uuid uuid NOT NULL") + cursor.execute("ALTER TABLE content_assignments_learnercontentassignment MODIFY transaction_uuid uuid NULL") + cursor.execute("ALTER TABLE content_assignments_learnercontentassignment MODIFY allocation_batch_id uuid NULL") + cursor.execute("ALTER TABLE content_assignments_assignmentconfiguration MODIFY uuid uuid NOT 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 content_assignments_assignment MODIFY uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE content_assignments_assignment MODIFY enterprise_customer_uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE content_assignments_learnercontentassignment MODIFY uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE content_assignments_learnercontentassignment MODIFY transaction_uuid char(32) NULL") + cursor.execute("ALTER TABLE content_assignments_learnercontentassignment MODIFY allocation_batch_id char(32) NULL") + cursor.execute("ALTER TABLE content_assignments_assignmentconfiguration MODIFY uuid char(32) NOT NULL") + + +class Migration(migrations.Migration): + dependencies = [ + ('content_assignments', '0023_historicallearnercontentassignment_is_assigned_course_run_and_more'), + ] + operations = [ + migrations.RunPython( + code=apply_mariadb_migration, + reverse_code=reverse_mariadb_migration, + ), + ] diff --git a/enterprise_access/apps/core/migrations/0005_mariadb_uuid_conversion.py b/enterprise_access/apps/core/migrations/0005_mariadb_uuid_conversion.py new file mode 100644 index 000000000..d99880f6e --- /dev/null +++ b/enterprise_access/apps/core/migrations/0005_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 core_user 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 core_user MODIFY enterprise_customer_uuid char(32) NULL") + + +class Migration(migrations.Migration): + dependencies = [ + ('core', '0004_auth_user_indexes'), + ] + operations = [ + migrations.RunPython( + code=apply_mariadb_migration, + reverse_code=reverse_mariadb_migration, + ), + ] diff --git a/enterprise_access/apps/subsidy_access_policy/migrations/0030_mariadb_uuid_conversion.py b/enterprise_access/apps/subsidy_access_policy/migrations/0030_mariadb_uuid_conversion.py new file mode 100644 index 000000000..0e9a496b3 --- /dev/null +++ b/enterprise_access/apps/subsidy_access_policy/migrations/0030_mariadb_uuid_conversion.py @@ -0,0 +1,56 @@ +# 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 subsidy_access_policy_subsidyaccesspolicy MODIFY uuid uuid NOT NULL") + cursor.execute("ALTER TABLE subsidy_access_policy_subsidyaccesspolicy MODIFY enterprise_customer_uuid uuid NOT NULL") + cursor.execute("ALTER TABLE subsidy_access_policy_subsidyaccesspolicy MODIFY catalog_uuid uuid NOT NULL") + cursor.execute("ALTER TABLE subsidy_access_policy_subsidyaccesspolicy MODIFY subsidy_uuid uuid NOT NULL") + cursor.execute("ALTER TABLE subsidy_access_policy_groupassociation MODIFY enterprise_group_uuid uuid NOT NULL") + cursor.execute("ALTER TABLE subsidy_access_policy_subsidyaccesspolicyredemptioncount MODIFY uuid uuid NOT NULL") + cursor.execute("ALTER TABLE subsidy_access_policy_subsidyaccesspolicyredemptioncount MODIFY transaction_uuid uuid NOT 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 subsidy_access_policy_subsidyaccesspolicy MODIFY uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE subsidy_access_policy_subsidyaccesspolicy MODIFY enterprise_customer_uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE subsidy_access_policy_subsidyaccesspolicy MODIFY catalog_uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE subsidy_access_policy_subsidyaccesspolicy MODIFY subsidy_uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE subsidy_access_policy_groupassociation MODIFY enterprise_group_uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE subsidy_access_policy_subsidyaccesspolicyredemptioncount MODIFY uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE subsidy_access_policy_subsidyaccesspolicyredemptioncount MODIFY transaction_uuid char(32) NOT NULL") + + +class Migration(migrations.Migration): + dependencies = [ + ('subsidy_access_policy', '0029_historicalsubsidyaccesspolicy_learner_credit_request_config_and_more'), + ] + operations = [ + migrations.RunPython( + code=apply_mariadb_migration, + reverse_code=reverse_mariadb_migration, + ), + ] diff --git a/enterprise_access/apps/subsidy_request/migrations/0022_mariadb_uuid_conversion.py b/enterprise_access/apps/subsidy_request/migrations/0022_mariadb_uuid_conversion.py new file mode 100644 index 000000000..7e1fe71ba --- /dev/null +++ b/enterprise_access/apps/subsidy_request/migrations/0022_mariadb_uuid_conversion.py @@ -0,0 +1,56 @@ +# 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 subsidy_request_subsidyrequest MODIFY uuid uuid NOT NULL") + cursor.execute("ALTER TABLE subsidy_request_subsidyrequest MODIFY enterprise_customer_uuid uuid NOT NULL") + cursor.execute("ALTER TABLE subsidy_request_couponcoderequest MODIFY subscription_plan_uuid uuid NOT NULL") + cursor.execute("ALTER TABLE subsidy_request_couponcoderequest MODIFY license_uuid uuid NULL") + cursor.execute("ALTER TABLE subsidy_request_learnercreditrequest MODIFY enterprise_customer_uuid uuid NOT NULL") + cursor.execute("ALTER TABLE subsidy_request_learnercreditrequest MODIFY uuid uuid NOT NULL") + cursor.execute("ALTER TABLE subsidy_request_couponcoderequest MODIFY uuid uuid NOT 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 subsidy_request_subsidyrequest MODIFY uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE subsidy_request_subsidyrequest MODIFY enterprise_customer_uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE subsidy_request_couponcoderequest MODIFY subscription_plan_uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE subsidy_request_couponcoderequest MODIFY license_uuid char(32) NULL") + cursor.execute("ALTER TABLE subsidy_request_learnercreditrequest MODIFY enterprise_customer_uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE subsidy_request_learnercreditrequest MODIFY uuid char(32) NOT NULL") + cursor.execute("ALTER TABLE subsidy_request_couponcoderequest MODIFY uuid char(32) NOT NULL") + + +class Migration(migrations.Migration): + dependencies = [ + ('subsidy_request', '0021_alter_historicallearnercreditrequestactions_error_reason_and_more'), + ] + operations = [ + migrations.RunPython( + code=apply_mariadb_migration, + reverse_code=reverse_mariadb_migration, + ), + ]