[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