diff --git a/alembic/versions/644ef887bb6f_add_close_status.py b/alembic/versions/644ef887bb6f_add_close_status.py new file mode 100644 index 0000000..9a20a41 --- /dev/null +++ b/alembic/versions/644ef887bb6f_add_close_status.py @@ -0,0 +1,85 @@ +"""Add close status + +Revision ID: 644ef887bb6f +Revises: 368fd931cf7f +Create Date: 2016-10-04 15:38:41.908679 + +""" + +# revision identifiers, used by Alembic. +revision = '644ef887bb6f' +down_revision = '368fd931cf7f' + +from alembic import op +import sqlalchemy as sa + + +try: + from pagure.lib import model +except ImportError: + import sys + sys.path.insert(0, '.') + from pagure.lib import model + + +def upgrade(): + ''' Add the column _close_status to the table projects. + ''' + op.add_column( + 'projects', + sa.Column('_close_status', sa.Text, nullable=True) + ) + op.add_column( + 'issues', + sa.Column('close_status', sa.Text, nullable=True) + ) + + engine = op.get_bind() + Session = sa.orm.scoped_session(sa.orm.sessionmaker()) + Session.configure(bind=engine) + session = Session() + + # Update all the existing projects + statuses = ['Invalid', 'Insufficient data', 'Fixed', 'Duplicate'] + for project in session.query(model.Project).all(): + project.close_status = statuses + session.add(project) + session.commit() + + # Add the status 'Closed' for issues + ticket_stat = model.StatusIssue(status='Closed') + session.add(ticket_stat) + session.commit() + + # Remove the old status + op.execute('''DELETE FROM "status_issue" WHERE "status" NOT IN ('Open', 'Closed'); ''') + + # Set the close_status for all the closed tickets + op.execute('''UPDATE "issues" SET "close_status"=status where status != 'Open'; ''') + + # Mark all the tickets as closed + op.execute('''UPDATE "issues" SET status='Closed' where status != 'Open'; ''') + + +def downgrade(): + ''' Add the column _close_status to the table projects. + ''' + engine = op.get_bind() + Session = sa.orm.scoped_session(sa.orm.sessionmaker()) + Session.configure(bind=engine) + session = Session() + + statuses = ['Invalid', 'Insufficient data', 'Fixed', 'Duplicate'] + for status in statuses: + ticket_stat = model.StatusIssue(status=status) + session.add(ticket_stat) + session.commit() + + # Set the close_status for all the closed tickets + op.execute('''UPDATE "issues" SET status=close_status where status != 'Open'; ''') + + # Remove the old status + op.execute('''DELETE FROM "status_issue" WHERE status = 'Closed'; ''') + + op.drop_column('projects', '_close_status') + op.drop_column('issues', 'close_status') diff --git a/pagure/lib/model.py b/pagure/lib/model.py index 66bfe0b..7edf9bd 100644 --- a/pagure/lib/model.py +++ b/pagure/lib/model.py @@ -102,7 +102,7 @@ def create_default_status(session, acls=None): """ Insert the defaults status in the status tables. """ - statuses = ['Open', 'Invalid', 'Insufficient data', 'Fixed', 'Duplicate'] + statuses = ['Open', 'Closed'] for status in statuses: ticket_stat = StatusIssue(status=status) session.add(ticket_stat) @@ -320,6 +320,7 @@ class Project(BASE): _milestones = sa.Column(sa.Text, nullable=True) _reports = sa.Column(sa.Text, nullable=True) _notifications = sa.Column(sa.Text, nullable=True) + _close_status = sa.Column(sa.Text, nullable=True) date_created = sa.Column(sa.DateTime, nullable=False, default=datetime.datetime.utcnow) @@ -478,6 +479,23 @@ class Project(BASE): self._reports = json.dumps(reports) @property + def close_status(self): + """ Return the dict stored as string in the database as an actual + dict object. + """ + close_status = [] + + if self._close_status: + close_status = json.loads(self._close_status) + + return close_status + + @close_status.setter + def close_status(self, close_status): + ''' Ensures the different close status are properly saved. ''' + self._close_status = json.dumps(close_status) + + @property def open_requests(self): ''' Returns the number of open pull-requests for this project. ''' return BASE.metadata.bind.query( @@ -607,6 +625,7 @@ class Issue(BASE): private = sa.Column(sa.Boolean, nullable=False, default=False) priority = sa.Column(sa.Integer, nullable=True, default=None) milestone = sa.Column(sa.String(255), nullable=True, default=None) + close_status = sa.Column(sa.Text, nullable=True) date_created = sa.Column(sa.DateTime, nullable=False, default=datetime.datetime.utcnow)