[copr] bkabrda-workspace: Huge load of changes that make the new permissions work (10ef19c)
bkabrda at fedorahosted.org
bkabrda at fedorahosted.org
Mon Nov 26 11:34:25 UTC 2012
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : bkabrda-workspace
>---------------------------------------------------------------
commit 10ef19cb5a0ea54d7a02b933257e2558b7c37315
Author: Bohuslav Kabrda <bkabrda at 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
+
+ at 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)
- at coprs_ns.route('/detail/<username>/<coprname>/apply_for_building/', methods = ['POST'])
+ at 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))
-
- at coprs_ns.route('/detail/<username>/<coprname>/give_up_building/', methods = ['POST'])
- at 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))
More information about the copr-devel
mailing list