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
# 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`;"
),
]

View File

@@ -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']