Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : bkabrda-workspace
commit 10ef19cb5a0ea54d7a02b933257e2558b7c37315 Author: Bohuslav Kabrda bkabrda@redhat.com Date: Mon Nov 26 12:23:35 2012 +0100
Huge load of changes that make the new permissions work
wsgi/coprs/filters.py | 5 ++ wsgi/coprs/forms.py | 39 ++++++++++- wsgi/coprs/helpers.py | 10 ++- wsgi/coprs/models.py | 5 +- wsgi/coprs/templates/coprs/_coprs_forms.html | 30 ++++---- wsgi/coprs/templates/coprs/_permissions_table.html | 25 ++++++- wsgi/coprs/templates/coprs/detail.html | 27 +++----- wsgi/coprs/views/coprs_ns/coprs_general.py | 76 +++++++++++-------- 8 files changed, 144 insertions(+), 73 deletions(-)
diff --git a/wsgi/coprs/filters.py b/wsgi/coprs/filters.py index 7173b8a..b166bde 100644 --- a/wsgi/coprs/filters.py +++ b/wsgi/coprs/filters.py @@ -1,7 +1,12 @@ import time
from coprs import app +from coprs import helpers
@app.template_filter('date_from_secs') def date_from_secs(secs): return time.strftime('%m-%d-%y %H:%M:%S', time.gmtime(secs)) if secs else None + +@app.template_filter('perm_type_from_num') +def perm_type_from_num(num): + return helpers.PermissionEnum.key(num) diff --git a/wsgi/coprs/forms.py b/wsgi/coprs/forms.py index 4d061b9..8755a13 100644 --- a/wsgi/coprs/forms.py +++ b/wsgi/coprs/forms.py @@ -102,6 +102,34 @@ class BuildForm(wtf.Form): validators = [wtf.NumberRange(min = constants.MIN_BUILD_TIMEOUT, max = constants.MAX_BUILD_TIMEOUT)], default = constants.DEFAULT_BUILD_TIMEOUT)
+class PermissionsApplierFormFactory(object): + @staticmethod + def create_form_cls(permission = None): + class F(wtf.Form): + pass + + approved_num = helpers.PermissionEnum.num('Approved') + build_without = approved_num + admin_without = approved_num + + if permission: + if permission.copr_builder == approved_num: + build_without = None + + if permission.copr_admin == approved_num: + admin_without = None + + builder_choices = helpers.PermissionEnum.choices_list(build_without) + admin_choices = helpers.PermissionEnum.choices_list(admin_without) + + builder_default = permission.copr_builder if permission else helpers.PermissionEnum.num('No Action') + admin_default = permission.copr_admin if permission else helpers.PermissionEnum.num('No Action') + + setattr(F, 'copr_builder', wtf.SelectField('Copr Builder', choices = builder_choices, default = builder_default)) + setattr(F, 'copr_admin', wtf.SelectField('Copr Admin', choices = admin_choices, default = admin_default)) + + return F + class DynamicPermissionsFormFactory(object): """Creates a dynamic form for given set of copr permissions""" @staticmethod @@ -110,6 +138,15 @@ class DynamicPermissionsFormFactory(object): pass
for perm in permissions: - setattr(F, 'user_{0}'.format(perm.user.id), wtf.BooleanField(default = perm.copr_builder)) + copr_builder_default = False + if perm.copr_builder == helpers.PermissionEnum.num('Approved'): + copr_builder_default = True + + copr_admin_default = False + if perm.copr_admin == helpers.PermissionEnum.num('Approved'): + copr_admin_default = True + + setattr(F, 'copr_builder_{0}'.format(perm.user.id), wtf.BooleanField(default = copr_builder_default)) + setattr(F, 'copr_admin_{0}'.format(perm.user.id), wtf.BooleanField(default = copr_admin_default))
return F diff --git a/wsgi/coprs/helpers.py b/wsgi/coprs/helpers.py index c1fbe7a..6eae1e2 100644 --- a/wsgi/coprs/helpers.py +++ b/wsgi/coprs/helpers.py @@ -9,19 +9,23 @@ def chroots(): for arch in arches]
class PermissionEnum(object): - vals = {'No Permission': 0, 'Asked': 1, 'Approved': 2} + vals = {'No Action': 0, 'Request': 1, 'Approved': 2}
@classmethod def num(cls, key): - return vals.get(key, None) + return cls.vals.get(key, None)
@classmethod def key(cls, num): - for k, n in cls.vals: + for k, n in cls.vals.items(): if n == num: return k return None
+ @classmethod + def choices_list(cls, without = 2): + return [(n, k) for k, n in cls.vals.items() if n != without] + class Paginator(object): def __init__(self, query, total_count, page = 1, per_page_override = None, urls_count_override = None): self.query = query diff --git a/wsgi/coprs/models.py b/wsgi/coprs/models.py index 8e12799..63f5259 100644 --- a/wsgi/coprs/models.py +++ b/wsgi/coprs/models.py @@ -1,5 +1,6 @@ from coprs import constants from coprs import db +from coprs import helpers
class Serializer(object): def to_dict(self, options = {}): @@ -70,7 +71,7 @@ class User(db.Model, Serializer): can_build = False if copr.owner == self: can_build = True - if self.permissions_for_copr(copr) and self.permissions_for_copr(copr).copr_builder == True: + if self.permissions_for_copr(copr) and self.permissions_for_copr(copr).copr_builder == helpers.PermissionEnum.num('Approved'): can_build = True
return can_build @@ -79,7 +80,7 @@ class User(db.Model, Serializer): can_edit = False if copr.owner == self: can_edit = True - if self.permissions_for_copr(copr) and self.permissions_for_copr.copr_admin == True: + if self.permissions_for_copr(copr) and self.permissions_for_copr.copr_admin == helpers.PermissionEnum.num('Approved'): can_edit = True
return can_edit diff --git a/wsgi/coprs/templates/coprs/_coprs_forms.html b/wsgi/coprs/templates/coprs/_coprs_forms.html index 0031919..02c632e 100644 --- a/wsgi/coprs/templates/coprs/_coprs_forms.html +++ b/wsgi/coprs/templates/coprs/_coprs_forms.html @@ -20,9 +20,23 @@ <form action="{{ url_for('coprs_ns.copr_update_permissions', username = copr.owner.name, coprname = copr.name) }}" method=post> {{ form.csrf_token }} <table class=permissions-table> - <tr><th>Username</th><th>Allowed to build</th></tr> + <tr><th>Username</th><th>Is Builder</th><th>Is Admin</th></tr> {% for perm in permissions %} - <tr><td>{{ perm.user.name }}</td><td>{{ form['user_{0}'.format(perm.user.id)] }}</td></tr> + <tr> + <td>{{ perm.user.name }}</td> + <td> + {{ perm.copr_builder|perm_type_from_num }} + {% if perm.copr_builder != 0 %} + {{ form['copr_builder_{0}'.format(perm.user.id)] }} + {% endif %} + </td> + <td> + {{ perm.copr_admin|perm_type_from_num }} + {% if perm.copr_admin != 0 %} + {{ form['copr_admin_{0}'.format(perm.user.id)] }} + {% endif %} + </td> + </tr> {% endfor %} </table> <dd><input type=submit value=Save></dd> @@ -54,15 +68,3 @@ </form> {% endif %} {% endmacro %} - -{% macro copr_apply_for_building(copr) %} - <form action="{{ url_for('coprs_ns.copr_apply_for_building', username = copr.owner.name, coprname = copr.name) }}" method=post> - <input type=submit value="Apply for building"> - </form> -{% endmacro %} - -{% macro copr_give_up_building(copr) %} - <form action="{{ url_for('coprs_ns.copr_give_up_building', username = copr.owner.name, coprname = copr.name) }}" method=post> - <input type=submit value="Give up building"> - </form> -{% endmacro %} diff --git a/wsgi/coprs/templates/coprs/_permissions_table.html b/wsgi/coprs/templates/coprs/_permissions_table.html index dd93e86..8434f4b 100644 --- a/wsgi/coprs/templates/coprs/_permissions_table.html +++ b/wsgi/coprs/templates/coprs/_permissions_table.html @@ -1,10 +1,27 @@ -{% macro permissions_table(permissions) %} - {% if permissions %} +{% macro permissions_table(permissions, copr, permissions_applier_form) %} + {% if permissions or permissions_applier_form %} + {% if permissions_applier_form %} + <form action="{{ url_for('coprs_ns.copr_permissions_applier_change', username = copr.owner.name, coprname = copr.name)}}" method=post> + {{ permissions_applier_form.csrf_token }} + {% endif %} <table class=permissions-table> - <tr><th>Username</th><th>Allowed to build</th></tr> + <tr><th>Username</th><th>Is Builder</th><th>Is Admin</th></tr> {% for perm in permissions %} - <tr><td>{{ perm.user.name }}</td><td>{{ perm.copr_builder }}</td></tr> + {% if perm.user_id != g.user.id %} {# if user is logged in, only display his form, not a row #} + <tr><td>{{ perm.user.name }}</td><td>{{ perm.copr_builder|perm_type_from_num }}</td><td>{{ perm.copr_admin|perm_type_from_num }}</tr> + {% endif %} {% endfor %} + {% if permissions_applier_form %} + <tr> + <td>{{ g.user.name }}</td> + <td>{{ permissions_applier_form.copr_builder|safe }}</td> + <td>{{ permissions_applier_form.copr_admin|safe }}</td> + </tr> + {% endif %} </table> + {% if permissions_applier_form %} + <input type=submit value=Submit> + </form> + {% endif %} {% endif %} {% endmacro %} diff --git a/wsgi/coprs/templates/coprs/detail.html b/wsgi/coprs/templates/coprs/detail.html index 271c8f6..2eb1989 100644 --- a/wsgi/coprs/templates/coprs/detail.html +++ b/wsgi/coprs/templates/coprs/detail.html @@ -2,11 +2,9 @@ {% block title %}{{ copr.owner.name }}/{{ copr.name }} Copr{% endblock %} {% block header %}Information for Copr {{ copr.owner.name }}/{{ copr.name }}{% endblock %} {% from "coprs/_builds_table.html" import builds_table %} -{% from "coprs/_permissions_table.html" import permissions_table %} +{% from "coprs/_permissions_table.html" import permissions_table with context%} {% from "coprs/_coprs_forms.html" import copr_build_form, - copr_build_cancel_form, - copr_apply_for_building, - copr_give_up_building with context %} + copr_build_cancel_form with context %}
{% block body %} <h3>chroots</h3> @@ -24,19 +22,14 @@ </ul> {% endif %} <h3>Permissions</h3> - {{ permissions_table(permissions) }} - {% if g.user %} - {% if g.user != copr.owner %} - {% if g.user.permissions_for_copr(copr) %} - {{ copr_give_up_building(copr) }} - {% else %} - {{ copr_apply_for_building(copr) }} - {% endif %} - {% endif %} - {% if g.user.can_build_in(copr) %} - <h3>Build packages in this repo:</h3> - {{ copr_build_form(form, 'coprs_ns.copr_add_build', copr) }} - {% endif %} + {% if g.user.id == copr.owner_id %} + {{ permissions_table(permissions, copr, None) }} + {% else %} + {{ permissions_table(permissions, copr, permission_applier_form) }} + {% endif %} + {% if g.user and g.user.can_build_in(copr) %} + <h3>Build packages in this repo:</h3> + {{ copr_build_form(build_form, 'coprs_ns.copr_add_build', copr) }} {% endif %} {% if g.user and g.user.id == copr.owner_id %} <a href="{{ url_for('coprs_ns.copr_edit', username = copr.owner.name, coprname = copr.name) }}">Edit this Copr</a> diff --git a/wsgi/coprs/views/coprs_ns/coprs_general.py b/wsgi/coprs/views/coprs_ns/coprs_general.py index 34207f7..2adc495 100644 --- a/wsgi/coprs/views/coprs_ns/coprs_general.py +++ b/wsgi/coprs/views/coprs_ns/coprs_general.py @@ -70,7 +70,7 @@ def copr_new():
@coprs_ns.route('/detail/<username>/<coprname>/') def copr_detail(username, coprname): - form = forms.BuildForm() + build_form = forms.BuildForm() try: # query[0:10][0] will raise an index error, if Copr doesn't exist query = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname, with_builds = True) copr = query[0:10][0]# we retrieved all builds, but we got one copr in a list... @@ -78,7 +78,12 @@ def copr_detail(username, coprname): return page_not_found('Copr with name {0} does not exist.'.format(coprname))
permissions = coprs_logic.CoprsPermissionLogic.get_for_copr(flask.g.user, copr).all() - return flask.render_template('coprs/detail.html', copr = copr, form = form, permissions = permissions) + permission_applier_form = forms.PermissionsApplierFormFactory.create_form_cls(flask.g.user.permissions_for_copr(copr))() + return flask.render_template('coprs/detail.html', + copr = copr, + build_form = build_form, + permission_applier_form = permission_applier_form, + permissions = permissions)
@coprs_ns.route('/detail/<username>/<coprname>/edit/') @@ -125,46 +130,44 @@ def copr_update(username, coprname): return flask.render_template('coprs/edit.html', copr = copr, form = form)
-@coprs_ns.route('/detail/<username>/<coprname>/apply_for_building/', methods = ['POST']) +@coprs_ns.route('/detail/<username>/<coprname>/permissions_applier_change/', methods = ['POST']) @login_required -def copr_apply_for_building(username, coprname): +def copr_permissions_applier_change(username, coprname): copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first() permission = coprs_logic.CoprsPermissionLogic.get(flask.g.user, copr, flask.g.user).first() + applier_permissions_form = forms.PermissionsApplierFormFactory.create_form_cls()()
if not copr: return page_not_found('Copr with name {0} does not exist.'.format(name)) if copr.owner == flask.g.user: flask.flash('Owner cannot request permissions for his own copr.') - elif permission: - flask.flash('You are already listed in permissions for Copr "{0}".'.format(copr.name)) - else: - perm = models.CoprPermission(user = flask.g.user, copr = copr, copr_builder = False) - coprs_logic.CoprsPermissionLogic.new(flask.g.user, perm) - db.session.commit() - flask.flash('You have successfuly applied for building in Copr "{0}".'.format(copr.name)) + else: # TODO: pull this into logic + new_builder = int(applier_permissions_form.copr_builder.data) + new_admin = int(applier_permissions_form.copr_admin.data) + if permission: + approved_num = helpers.PermissionEnum.num('Approved') + prev_builder = permission.copr_builder + prev_admin = permission.copr_admin + # if we had Approved before, we can have it now, otherwise not + if new_builder == approved_num and prev_builder != new_builder or \ + new_admin == approved_num and prev_admin != new_admin: + flask.flash('User can't approve himself.') + else: + permission.copr_builder = new_builder + permission.copr_admin = new_admin + db.session.commit() + flask.flash('Successfuly updated your permissions in Copr "{0}".'.format(copr.name)) + else: + if new_builder == approved_num or new_admin == aproved_num: + flask.flash('User can't approve himself.') + else: + perm = models.CoprPermission(user = flask.g.user, copr = copr, copr_builder = new_builder, copr_admin = new_admin) + coprs_logic.CoprsPermissionLogic.new(flask.g.user, perm) + db.session.commit() + flask.flash('Successfuly applied for permissions in Copr "{0}".'.format(copr.name))
return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = copr.owner.name, coprname = copr.name))
- -@coprs_ns.route('/detail/<username>/<coprname>/give_up_building/', methods = ['POST']) -@login_required -def copr_give_up_building(username, coprname): - copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first() - permission = coprs_logic.CoprsPermissionLogic.get(flask.g.user, copr, flask.g.user).first() - - if not copr: - return page_not_found('Copr with name {0} does not exist.'.format(name)) - - if not permission: - flask.flash('You are already not in permissions for Copr "{0}".'.format(copr.name)) - else: - coprs_logic.CoprsPermissionLogic.delete(flask.g.user, permission) # TODO: do we really want to delete this, or just inactivate? - db.session.commit() - flask.flash('You have successfuly given up building in Copr "{0}".'.format(copr.name)) - - return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = copr.owner.name, coprname = copr.name)) - - @coprs_ns.route('/detail/<username>/<coprname>/update_permissions/', methods = ['POST']) @login_required def copr_update_permissions(username, coprname): @@ -181,9 +184,18 @@ def copr_update_permissions(username, coprname): if permissions_form.validate_on_submit(): # we don't change owner (yet) for perm in permissions: + copr_builder = helpers.PermissionEnum.num('Asked') + copr_admin = helpers.PermissionEnum.num('Asked') + if permissions_form['copr_builder_{0}'.format(perm.user_id)].data: + copr_builder = helpers.PermissionEnum.num('Approved') + if permissions_form['copr_admin_{0}'.format(perm.user_id)].data: + copr_admin = helpers.PermissionEnum.num('Approved') + + models.CoprPermission.query.filter(models.CoprPermission.copr_id == copr.id).\ filter(models.CoprPermission.user_id == perm.user_id).\ - update({'copr_builder': permissions_form['user_{0}'.format(perm.user_id)].data}) + update({'copr_builder': copr_builder, + 'copr_admin': copr_admin}) db.session.commit() flask.flash('Copr permissions were updated successfully.') return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = copr.owner.name, coprname = copr.name))
copr-devel@lists.fedorahosted.org