summaryrefslogtreecommitdiff
path: root/src/mailman/database/alembic/versions/3002bac0c25a_dmarc_attributes.py
blob: 03740c947570f4ef1682af2dbea52518faeee9f4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
"""dmarc_attributes

Revision ID: 3002bac0c25a
Revises: a46993b05703
Create Date: 2016-10-30 22:05:17.881880

"""

import sqlalchemy as sa

from alembic import op
from mailman.database.helpers import exists_in_db
from mailman.database.types import Enum, SAUnicode
from mailman.interfaces.mailinglist import DMARCModerationAction, FromIsList


# revision identifiers, used by Alembic.
revision = '3002bac0c25a'
down_revision = 'a46993b05703'


def upgrade():
    if not exists_in_db(op.get_bind(),
                        'mailinglist',
                        'dmarc_moderation_action'
                        ):
        # SQLite may not have removed it when downgrading.  It should be OK
        # to just test one.
        op.add_column('mailinglist', sa.Column(
            'dmarc_moderation_action',
            Enum(DMARCModerationAction),
            nullable=True))
        op.add_column('mailinglist', sa.Column(
            'dmarc_quarantine_moderation_action',
            sa.Boolean(),
            nullable=True))
        op.add_column('mailinglist', sa.Column(
            'dmarc_none_moderation_action',
            sa.Boolean(),
            nullable=True))
        op.add_column('mailinglist', sa.Column(
            'dmarc_moderation_notice',
            SAUnicode(),
            nullable=True))
        op.add_column('mailinglist', sa.Column(
            'dmarc_wrapped_message_text',
            SAUnicode(),
            nullable=True))
        op.add_column('mailinglist', sa.Column(
            'from_is_list',
            Enum(FromIsList),
            nullable=True))
    # Now migrate the data.  Don't import the table definition from the
    # models, it may break this migration when the model is updated in the
    # future (see the Alembic doc).
    mlist = sa.sql.table(
        'mailinglist',
        sa.sql.column('dmarc_moderation_action', Enum(DMARCModerationAction)),
        sa.sql.column('dmarc_quarantine_moderation_action', sa.Boolean()),
        sa.sql.column('dmarc_none_moderation_action', sa.Boolean()),
        sa.sql.column('dmarc_moderation_notice', SAUnicode()),
        sa.sql.column('dmarc_wrapped_message_text', SAUnicode()),
        sa.sql.column('from_is_list', Enum(FromIsList))
        )
    # These are all new attributes so just set defaults.
    op.execute(mlist.update().values(dict(
        dmarc_moderation_action=op.inline_literal(DMARCModerationAction.none),
        dmarc_quarantine_moderation_action=op.inline_literal(True),
        dmarc_none_moderation_action=op.inline_literal(False),
        dmarc_moderation_notice=op.inline_literal(''),
        dmarc_wrapped_message_text=op.inline_literal(''),
        from_is_list=op.inline_literal(FromIsList.none),
        )))


def downgrade():
    with op.batch_alter_table('mailinglist') as batch_op:
        batch_op.drop_column('dmarc_moderation_action')
        batch_op.drop_column('dmarc_quarantine_moderation_action')
        batch_op.drop_column('dmarc_none_moderation_action')
        batch_op.drop_column('dmarc_moderation_notice')
        batch_op.drop_column('dmarc_wrapped_message_text')
        batch_op.drop_column('from_is_list')