diff --git a/mailServer/migrations/0001_email_filtering_features.py b/mailServer/migrations/0001_email_filtering_features.py index c8b0784ef..4621970ee 100644 --- a/mailServer/migrations/0001_email_filtering_features.py +++ b/mailServer/migrations/0001_email_filtering_features.py @@ -1,7 +1,7 @@ # Generated migration for email filtering features +# Uses raw SQL since existing email models weren't created via Django migrations -from django.db import migrations, models -import django.db.models.deletion +from django.db import migrations class Migration(migrations.Migration): @@ -12,69 +12,50 @@ class Migration(migrations.Migration): ] operations = [ - migrations.CreateModel( - name='CatchAllEmail', - fields=[ - ('domain', models.OneToOneField( - on_delete=django.db.models.deletion.CASCADE, - primary_key=True, - serialize=False, - to='mailServer.Domains' - )), - ('destination', models.CharField(max_length=255)), - ('enabled', models.BooleanField(default=True)), - ], - options={ - 'db_table': 'e_catchall', - }, + migrations.RunSQL( + sql=""" + CREATE TABLE IF NOT EXISTS `e_catchall` ( + `domain_id` varchar(50) NOT NULL PRIMARY KEY, + `destination` varchar(255) NOT NULL, + `enabled` tinyint(1) NOT NULL DEFAULT 1, + CONSTRAINT `fk_catchall_domain` FOREIGN KEY (`domain_id`) REFERENCES `e_domains` (`domain`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + """, + reverse_sql="DROP TABLE IF EXISTS `e_catchall`;" ), - migrations.CreateModel( - name='EmailServerSettings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('plus_addressing_enabled', models.BooleanField(default=False)), - ('plus_addressing_delimiter', models.CharField(default='+', max_length=1)), - ], - options={ - 'db_table': 'e_server_settings', - }, + migrations.RunSQL( + sql=""" + CREATE TABLE IF NOT EXISTS `e_server_settings` ( + `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, + `plus_addressing_enabled` tinyint(1) NOT NULL DEFAULT 0, + `plus_addressing_delimiter` varchar(1) NOT NULL DEFAULT '+' + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + """, + reverse_sql="DROP TABLE IF EXISTS `e_server_settings`;" ), - migrations.CreateModel( - name='PlusAddressingOverride', - fields=[ - ('domain', models.OneToOneField( - on_delete=django.db.models.deletion.CASCADE, - primary_key=True, - serialize=False, - to='mailServer.Domains' - )), - ('enabled', models.BooleanField(default=True)), - ], - options={ - 'db_table': 'e_plus_override', - }, + migrations.RunSQL( + sql=""" + CREATE TABLE IF NOT EXISTS `e_plus_override` ( + `domain_id` varchar(50) NOT NULL PRIMARY KEY, + `enabled` tinyint(1) NOT NULL DEFAULT 1, + CONSTRAINT `fk_plus_override_domain` FOREIGN KEY (`domain_id`) REFERENCES `e_domains` (`domain`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + """, + reverse_sql="DROP TABLE IF EXISTS `e_plus_override`;" ), - migrations.CreateModel( - name='PatternForwarding', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('pattern', models.CharField(max_length=255)), - ('destination', models.CharField(max_length=255)), - ('pattern_type', models.CharField( - choices=[('wildcard', 'Wildcard'), ('regex', 'Regular Expression')], - default='wildcard', - max_length=20 - )), - ('priority', models.IntegerField(default=100)), - ('enabled', models.BooleanField(default=True)), - ('domain', models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to='mailServer.Domains' - )), - ], - options={ - 'db_table': 'e_pattern_forwarding', - 'ordering': ['priority'], - }, + migrations.RunSQL( + sql=""" + CREATE TABLE IF NOT EXISTS `e_pattern_forwarding` ( + `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, + `domain_id` varchar(50) NOT NULL, + `pattern` varchar(255) NOT NULL, + `destination` varchar(255) NOT NULL, + `pattern_type` varchar(20) NOT NULL DEFAULT 'wildcard', + `priority` int(11) NOT NULL DEFAULT 100, + `enabled` tinyint(1) NOT NULL DEFAULT 1, + CONSTRAINT `fk_pattern_domain` FOREIGN KEY (`domain_id`) REFERENCES `e_domains` (`domain`) ON DELETE CASCADE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + """, + reverse_sql="DROP TABLE IF EXISTS `e_pattern_forwarding`;" ), ] diff --git a/mailServer/models.py b/mailServer/models.py index 3f98b4676..46def115e 100644 --- a/mailServer/models.py +++ b/mailServer/models.py @@ -56,12 +56,13 @@ class Pipeprograms(models.Model): class CatchAllEmail(models.Model): """Stores catch-all email configuration per domain""" - domain = models.OneToOneField(Domains, on_delete=models.CASCADE, primary_key=True) + domain = models.OneToOneField(Domains, on_delete=models.CASCADE, primary_key=True, db_column='domain_id') destination = models.CharField(max_length=255) enabled = models.BooleanField(default=True) class Meta: db_table = 'e_catchall' + managed = False class EmailServerSettings(models.Model): @@ -71,6 +72,7 @@ class EmailServerSettings(models.Model): class Meta: db_table = 'e_server_settings' + managed = False @classmethod def get_settings(cls): @@ -80,11 +82,12 @@ class EmailServerSettings(models.Model): class PlusAddressingOverride(models.Model): """Per-domain plus-addressing override""" - domain = models.OneToOneField(Domains, on_delete=models.CASCADE, primary_key=True) + domain = models.OneToOneField(Domains, on_delete=models.CASCADE, primary_key=True, db_column='domain_id') enabled = models.BooleanField(default=True) class Meta: db_table = 'e_plus_override' + managed = False class PatternForwarding(models.Model): @@ -94,7 +97,7 @@ class PatternForwarding(models.Model): ('regex', 'Regular Expression'), ] - domain = models.ForeignKey(Domains, on_delete=models.CASCADE) + domain = models.ForeignKey(Domains, on_delete=models.CASCADE, db_column='domain_id') pattern = models.CharField(max_length=255) destination = models.CharField(max_length=255) pattern_type = models.CharField(max_length=20, choices=PATTERN_TYPES, default='wildcard') @@ -103,4 +106,5 @@ class PatternForwarding(models.Model): class Meta: db_table = 'e_pattern_forwarding' + managed = False ordering = ['priority'] \ No newline at end of file