From 2ce6e76d9dc539dc37aff4deee2e259fdcd9f964 Mon Sep 17 00:00:00 2001 From: Jake Moshenko Date: Fri, 13 Feb 2015 14:41:08 -0500 Subject: [PATCH] Add the required migration for time machine tag lifetimes. --- ...f_track_the_lifetime_start_and_end_for_.py | 36 ++++++++++++++++++ test/data/test.db | Bin 716800 -> 716800 bytes util/backfill_user_uuids.py | 6 +-- 3 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 data/migrations/versions/509d2857566f_track_the_lifetime_start_and_end_for_.py diff --git a/data/migrations/versions/509d2857566f_track_the_lifetime_start_and_end_for_.py b/data/migrations/versions/509d2857566f_track_the_lifetime_start_and_end_for_.py new file mode 100644 index 000000000..41d8bf3c2 --- /dev/null +++ b/data/migrations/versions/509d2857566f_track_the_lifetime_start_and_end_for_.py @@ -0,0 +1,36 @@ +"""Track the lifetime start and end for tags to allow the state of a repository to be rewound. + +Revision ID: 509d2857566f +Revises: 1d2d86d09fcd +Create Date: 2015-02-13 14:35:38.939049 + +""" + +# revision identifiers, used by Alembic. +revision = '509d2857566f' +down_revision = '1d2d86d09fcd' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(tables): + ### commands auto generated by Alembic - please adjust! ### + op.add_column('repositorytag', sa.Column('lifetime_end_ts', sa.Integer(), nullable=True)) + op.add_column('repositorytag', sa.Column('lifetime_start_ts', sa.Integer(), nullable=False)) + op.create_index('repositorytag_lifetime_end_ts', 'repositorytag', ['lifetime_end_ts'], unique=False) + op.drop_index('repositorytag_repository_id_name', table_name='repositorytag') + op.create_index('repositorytag_repository_id_name', 'repositorytag', ['repository_id', 'name'], unique=False) + op.add_column('user', sa.Column('removed_tag_expiration_s', sa.Integer(), nullable=False)) + ### end Alembic commands ### + + +def downgrade(tables): + ### commands auto generated by Alembic - please adjust! ### + op.drop_column('user', 'removed_tag_expiration_s') + op.drop_index('repositorytag_repository_id_name', table_name='repositorytag') + op.create_index('repositorytag_repository_id_name', 'repositorytag', ['repository_id', 'name'], unique=True) + op.drop_index('repositorytag_lifetime_end_ts', table_name='repositorytag') + op.drop_column('repositorytag', 'lifetime_start_ts') + op.drop_column('repositorytag', 'lifetime_end_ts') + ### end Alembic commands ### diff --git a/test/data/test.db b/test/data/test.db index 977469f56fe0382729a8d13a8f5407977a6c3f96..544a04df7883a870da360c61375b78f025fe2d0b 100644 GIT binary patch delta 7997 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 None).get() + User.select(User.id).where(User.uuid >> None).get() except User.DoesNotExist: has_missing_uuids = False @@ -39,9 +39,9 @@ def backfill_user_uuids(): for user_id in batch_user_ids: with app.config['DB_TRANSACTION_FACTORY'](db): try: - user = User.get(User.id == user_id) + user = User.select(User.id, User.uuid).where(User.id == user_id).get() user.uuid = str(uuid.uuid4()) - user.save() + user.save(only=[User.uuid]) except User.DoesNotExist: pass