summaryrefslogtreecommitdiff
path: root/src/mailman/database/alembic/versions/7c5b39d1ecc4_workflow_steps.py
diff options
context:
space:
mode:
authorJ08nY2017-07-04 17:54:47 +0200
committerJ08nY2017-08-30 20:51:44 +0200
commit1e25ccd51424b1129b36acf7a6488cb2d272c8af (patch)
treeb9af4a3f49627e00a9314677d64084a0e49f5885 /src/mailman/database/alembic/versions/7c5b39d1ecc4_workflow_steps.py
parent057bc0704ab6d975e327c11cac204decfb478c4d (diff)
downloadmailman-1e25ccd51424b1129b36acf7a6488cb2d272c8af.tar.gz
mailman-1e25ccd51424b1129b36acf7a6488cb2d272c8af.tar.zst
mailman-1e25ccd51424b1129b36acf7a6488cb2d272c8af.zip
Diffstat (limited to 'src/mailman/database/alembic/versions/7c5b39d1ecc4_workflow_steps.py')
-rw-r--r--src/mailman/database/alembic/versions/7c5b39d1ecc4_workflow_steps.py90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/mailman/database/alembic/versions/7c5b39d1ecc4_workflow_steps.py b/src/mailman/database/alembic/versions/7c5b39d1ecc4_workflow_steps.py
new file mode 100644
index 000000000..c2daffd63
--- /dev/null
+++ b/src/mailman/database/alembic/versions/7c5b39d1ecc4_workflow_steps.py
@@ -0,0 +1,90 @@
+# Copyright (C) 2015-2017 by the Free Software Foundation, Inc.
+#
+# This file is part of GNU Mailman.
+#
+# GNU Mailman is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
+
+"""Save whole workflow stack in workflowstate.
+
+Revision ID: 7c5b39d1ecc4
+Revises: 4bd95c99b2e7
+Create Date: 2017-07-04 16:45:36.470746
+
+"""
+
+import json
+import sqlalchemy as sa
+
+from alembic import op
+from mailman.database.types import SAUnicode
+
+# revision identifiers, used by Alembic.
+revision = '7c5b39d1ecc4'
+down_revision = '4bd95c99b2e7'
+
+old_state_table = sa.sql.table(
+ 'workflowstate',
+ sa.sql.column('token', SAUnicode),
+ sa.sql.column('step', SAUnicode),
+ sa.sql.column('data', SAUnicode)
+ )
+new_state_table = sa.sql.table(
+ 'workflowstate',
+ sa.sql.column('token', SAUnicode),
+ sa.sql.column('steps', SAUnicode),
+ sa.sql.column('data', SAUnicode)
+ )
+
+
+def upgrade():
+ # Rename the column
+ with op.batch_alter_table('workflowstate') as batch_op:
+ batch_op.alter_column('step', new_column_name='steps',
+ existing_type=SAUnicode)
+
+ connection = op.get_bind()
+ for token, step, data in connection.execute(
+ new_state_table.select()).fetchall():
+ # Wrap the single step in a JSON array.
+ if step is not None:
+ new_steps = json.dumps([step])
+ else:
+ new_steps = '[]'
+ connection.execute(
+ new_state_table.update().where(
+ new_state_table.c.token == token).values(
+ steps=new_steps)
+ )
+
+
+def downgrade():
+ # Rename back the column
+ connection = op.get_bind()
+ with op.batch_alter_table('workflowstate') as batch_op:
+ batch_op.alter_column('steps', new_column_name='step',
+ existing_type=SAUnicode)
+
+ for token, steps, data in connection.execute(
+ old_state_table.select()).fetchall():
+ # Extract and save at least the last state.
+ step_stack = json.loads(steps)
+ if len(step_stack) == 0:
+ new_step = None
+ else:
+ new_step = step_stack.pop()
+ connection.execute(
+ old_state_table.update().where(
+ old_state_table.c.token == token).values(
+ step=new_step)
+ )