From ed7e6e6d19e087a01e486dbfeae1766e876296d9 Mon Sep 17 00:00:00 2001 From: Vivek Anand Date: Sep 21 2017 10:26:38 +0000 Subject: Read only repo: Add migration script, lib methods Signed-off-by: Vivek Anand --- diff --git a/alembic/versions/3237fc64b306_read_only_mode_in_projects.py b/alembic/versions/3237fc64b306_read_only_mode_in_projects.py new file mode 100644 index 0000000..f59f8ee --- /dev/null +++ b/alembic/versions/3237fc64b306_read_only_mode_in_projects.py @@ -0,0 +1,39 @@ +"""Read Only mode in projects + +Revision ID: 3237fc64b306 +Revises: c34f4b09ef18 +Create Date: 2017-09-01 22:51:18.232541 + +""" + +# revision identifiers, used by Alembic. +revision = '3237fc64b306' +down_revision = 'c34f4b09ef18' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + ''' Add a column to mark a project read only ''' + op.add_column( + 'projects', + sa.Column( + 'read_only', + sa.Boolean, + default=True, + nullable=True, + ) + ) + op.execute(''' UPDATE projects SET read_only=False ''') + op.alter_column( + 'projects', + 'read_only', + nullable=False, + existing_nullable=True + ) + + +def downgrade(): + ''' Remove the read_only column from Projects ''' + op.drop_column('projects', 'read_only') diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index f7b8203..d450eee 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -977,6 +977,7 @@ def add_user_to_project( access_obj = get_obj_access(session, project, new_user_obj) access_obj.access = access project.date_modified = datetime.datetime.utcnow() + update_read_only_mode(session, project, read_only=True) session.add(access_obj) session.add(project) session.flush() @@ -1072,6 +1073,7 @@ def add_group_to_project( access_obj.access = access session.add(access_obj) project.date_modified = datetime.datetime.utcnow() + update_read_only_mode(session, project, read_only=True) session.add(project) session.flush() @@ -4488,3 +4490,21 @@ def has_starred(session, repo, user): if isinstance(stargazer_obj, model.Star): return True return False + + +def update_read_only_mode(session, repo, read_only=True): + ''' Remove the read only mode from the project + + :arg session: The session object to query the db with + :arg repo: model.Project object to mark/unmark read only + :arg read_only: True if project is to be made read only, + False otherwise + ''' + + if ( + not repo + or not isinstance(repo, model.Project) + or read_only not in [True, False]): + return + repo.read_only = read_only + session.add(repo) diff --git a/pagure/lib/model.py b/pagure/lib/model.py index fe1955e..fb3df1e 100644 --- a/pagure/lib/model.py +++ b/pagure/lib/model.py @@ -356,6 +356,7 @@ class Project(BASE): hook_token = sa.Column(sa.String(40), nullable=False, unique=True) avatar_email = sa.Column(sa.Text, nullable=True) is_fork = sa.Column(sa.Boolean, default=False, nullable=False) + read_only = sa.Column(sa.Boolean, default=True, nullable=False) parent_id = sa.Column( sa.Integer, sa.ForeignKey( diff --git a/pagure/lib/tasks.py b/pagure/lib/tasks.py index ef5f7b3..b95608a 100644 --- a/pagure/lib/tasks.py +++ b/pagure/lib/tasks.py @@ -23,6 +23,8 @@ import six import logging +from sqlalchemy.exc import SQLAlchemyError + import pagure from pagure import APP import pagure.lib @@ -102,6 +104,15 @@ def generate_gitolite_acls(namespace=None, name=None, user=None, group=None): 'Calling helper: %s with arg: project=%s, group=%s', helper, project, group_obj) helper.generate_acls(project=project, group=group_obj) + pagure.lib.update_read_only_mode( + session, project, read_only=False) + try: + session.commit() + _log.debug('Project %s is in Read Only Mode', project) + except SQLAlchemyError: + session.rollback() + _log.error( + 'Failed to unmark read_only for: %s project', project) session.remove() gc_clean()