Fix migration: use raw SQL for tables since existing models lack migrations

This commit is contained in:
usmannasir
2025-11-28 15:05:44 +05:00
parent 082c63bfa9
commit 3c16b934af
2 changed files with 51 additions and 66 deletions

View File

@@ -1,7 +1,7 @@
# Generated migration for email filtering features # 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 from django.db import migrations
import django.db.models.deletion
class Migration(migrations.Migration): class Migration(migrations.Migration):
@@ -12,69 +12,50 @@ class Migration(migrations.Migration):
] ]
operations = [ operations = [
migrations.CreateModel( migrations.RunSQL(
name='CatchAllEmail', sql="""
fields=[ CREATE TABLE IF NOT EXISTS `e_catchall` (
('domain', models.OneToOneField( `domain_id` varchar(50) NOT NULL PRIMARY KEY,
on_delete=django.db.models.deletion.CASCADE, `destination` varchar(255) NOT NULL,
primary_key=True, `enabled` tinyint(1) NOT NULL DEFAULT 1,
serialize=False, CONSTRAINT `fk_catchall_domain` FOREIGN KEY (`domain_id`) REFERENCES `e_domains` (`domain`) ON DELETE CASCADE
to='mailServer.Domains' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
)), """,
('destination', models.CharField(max_length=255)), reverse_sql="DROP TABLE IF EXISTS `e_catchall`;"
('enabled', models.BooleanField(default=True)),
],
options={
'db_table': 'e_catchall',
},
), ),
migrations.CreateModel( migrations.RunSQL(
name='EmailServerSettings', sql="""
fields=[ CREATE TABLE IF NOT EXISTS `e_server_settings` (
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
('plus_addressing_enabled', models.BooleanField(default=False)), `plus_addressing_enabled` tinyint(1) NOT NULL DEFAULT 0,
('plus_addressing_delimiter', models.CharField(default='+', max_length=1)), `plus_addressing_delimiter` varchar(1) NOT NULL DEFAULT '+'
], ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
options={ """,
'db_table': 'e_server_settings', reverse_sql="DROP TABLE IF EXISTS `e_server_settings`;"
},
), ),
migrations.CreateModel( migrations.RunSQL(
name='PlusAddressingOverride', sql="""
fields=[ CREATE TABLE IF NOT EXISTS `e_plus_override` (
('domain', models.OneToOneField( `domain_id` varchar(50) NOT NULL PRIMARY KEY,
on_delete=django.db.models.deletion.CASCADE, `enabled` tinyint(1) NOT NULL DEFAULT 1,
primary_key=True, CONSTRAINT `fk_plus_override_domain` FOREIGN KEY (`domain_id`) REFERENCES `e_domains` (`domain`) ON DELETE CASCADE
serialize=False, ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
to='mailServer.Domains' """,
)), reverse_sql="DROP TABLE IF EXISTS `e_plus_override`;"
('enabled', models.BooleanField(default=True)),
],
options={
'db_table': 'e_plus_override',
},
), ),
migrations.CreateModel( migrations.RunSQL(
name='PatternForwarding', sql="""
fields=[ CREATE TABLE IF NOT EXISTS `e_pattern_forwarding` (
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
('pattern', models.CharField(max_length=255)), `domain_id` varchar(50) NOT NULL,
('destination', models.CharField(max_length=255)), `pattern` varchar(255) NOT NULL,
('pattern_type', models.CharField( `destination` varchar(255) NOT NULL,
choices=[('wildcard', 'Wildcard'), ('regex', 'Regular Expression')], `pattern_type` varchar(20) NOT NULL DEFAULT 'wildcard',
default='wildcard', `priority` int(11) NOT NULL DEFAULT 100,
max_length=20 `enabled` tinyint(1) NOT NULL DEFAULT 1,
)), CONSTRAINT `fk_pattern_domain` FOREIGN KEY (`domain_id`) REFERENCES `e_domains` (`domain`) ON DELETE CASCADE
('priority', models.IntegerField(default=100)), ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
('enabled', models.BooleanField(default=True)), """,
('domain', models.ForeignKey( reverse_sql="DROP TABLE IF EXISTS `e_pattern_forwarding`;"
on_delete=django.db.models.deletion.CASCADE,
to='mailServer.Domains'
)),
],
options={
'db_table': 'e_pattern_forwarding',
'ordering': ['priority'],
},
), ),
] ]

View File

@@ -56,12 +56,13 @@ class Pipeprograms(models.Model):
class CatchAllEmail(models.Model): class CatchAllEmail(models.Model):
"""Stores catch-all email configuration per domain""" """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) destination = models.CharField(max_length=255)
enabled = models.BooleanField(default=True) enabled = models.BooleanField(default=True)
class Meta: class Meta:
db_table = 'e_catchall' db_table = 'e_catchall'
managed = False
class EmailServerSettings(models.Model): class EmailServerSettings(models.Model):
@@ -71,6 +72,7 @@ class EmailServerSettings(models.Model):
class Meta: class Meta:
db_table = 'e_server_settings' db_table = 'e_server_settings'
managed = False
@classmethod @classmethod
def get_settings(cls): def get_settings(cls):
@@ -80,11 +82,12 @@ class EmailServerSettings(models.Model):
class PlusAddressingOverride(models.Model): class PlusAddressingOverride(models.Model):
"""Per-domain plus-addressing override""" """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) enabled = models.BooleanField(default=True)
class Meta: class Meta:
db_table = 'e_plus_override' db_table = 'e_plus_override'
managed = False
class PatternForwarding(models.Model): class PatternForwarding(models.Model):
@@ -94,7 +97,7 @@ class PatternForwarding(models.Model):
('regex', 'Regular Expression'), ('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) pattern = models.CharField(max_length=255)
destination = models.CharField(max_length=255) destination = models.CharField(max_length=255)
pattern_type = models.CharField(max_length=20, choices=PATTERN_TYPES, default='wildcard') pattern_type = models.CharField(max_length=20, choices=PATTERN_TYPES, default='wildcard')
@@ -103,4 +106,5 @@ class PatternForwarding(models.Model):
class Meta: class Meta:
db_table = 'e_pattern_forwarding' db_table = 'e_pattern_forwarding'
managed = False
ordering = ['priority'] ordering = ['priority']