[copr] bkabrda-workspace: Bulk of changes to have unique coprs only for each user, not across the whole system (will need some more fixing, probably doesn't work well, yet). (575d718)

bkabrda at fedorahosted.org bkabrda at fedorahosted.org
Fri Nov 16 12:16:44 UTC 2012


Repository : http://git.fedorahosted.org/cgit/copr.git

On branch  : bkabrda-workspace

>---------------------------------------------------------------

commit 575d7183cc7f3d5d17ec976a217f9da1bb57c786
Author: Slavek Kabrda <bkabrda at redhat.com>
Date:   Thu Nov 15 11:53:38 2012 +0100

    Bulk of changes to have unique coprs only for each user, not across the whole system (will need some more fixing, probably doesn't work well, yet).


>---------------------------------------------------------------

 wsgi/coprs/templates/coprs/_coprs_forms.html |    8 +-
 wsgi/coprs/templates/coprs/detail.html       |   10 +--
 wsgi/coprs/templates/coprs/edit.html         |    2 +-
 wsgi/coprs/templates/coprs/show.html         |    2 +-
 wsgi/coprs/templates/coprs/show_builds.html  |    2 +-
 wsgi/coprs/templates/layout.html             |    4 +-
 wsgi/coprs/views/coprs_ns/builds.py          |   33 +++++---
 wsgi/coprs/views/coprs_ns/general.py         |  107 ++++++++++++++++---------
 8 files changed, 101 insertions(+), 67 deletions(-)

diff --git a/wsgi/coprs/templates/coprs/_coprs_forms.html b/wsgi/coprs/templates/coprs/_coprs_forms.html
index 4979836..1786477 100644
--- a/wsgi/coprs/templates/coprs/_coprs_forms.html
+++ b/wsgi/coprs/templates/coprs/_coprs_forms.html
@@ -1,8 +1,8 @@
 {% from "_helpers.html" import render_field %}
 
-{% macro copr_form(form, view, name = None) %}
+{% macro copr_form(form, view, copr = None) %}
   {# if using for updating, we need to pass name to url_for, but otherwise we need to pass nothing #}
-  <form action="{% if name %}{{ url_for(view, name = name) }}{% else %}{{ url_for(view) }}{% endif %}" method=post class=add-entry>
+  <form action="{% if copr %}{{ url_for(view, username = copr.owner.name, coprname = copr.name) }}{% else %}{{ url_for(view) }}{% endif %}" method=post class=add-entry>
     <dl>
       {{ form.csrf_token }}
       {{ render_field(form.name) }}
@@ -31,7 +31,7 @@
 {% endmacro %}
 
 {% macro copr_build_form(form, view, copr) %}
-    <form action="{{ url_for(view, name = copr.name) }}" method=post class=add-entry>
+    <form action="{{ url_for(view, username = copr.owner.name, coprname = copr.name) }}" method=post class=add-entry>
       <dl>
         {{ form.csrf_token }}
         {{ render_field(form.pkgs, rows = 10, cols = 50) }}
@@ -49,7 +49,7 @@
 
 {% macro copr_build_cancel_form(build) %}
   {% if build.cancelable %}
-    <form action="{{ url_for('coprs_ns.copr_cancel_build', name = build.copr.name, build_id = build.id)}}">
+    <form action="{{ url_for('coprs_ns.copr_cancel_build', username = build.copr.owner.name, coprname = build.copr.name, build_id = build.id)}}">
       <input type=submit value=Cancel>
     </form>
   {% endif %}
diff --git a/wsgi/coprs/templates/coprs/detail.html b/wsgi/coprs/templates/coprs/detail.html
index d2db453..271c8f6 100644
--- a/wsgi/coprs/templates/coprs/detail.html
+++ b/wsgi/coprs/templates/coprs/detail.html
@@ -1,6 +1,6 @@
 {% extends "layout.html" %}
-{% block title %}{{ copr.name }} Copr{% endblock %}
-{% block header %}Information for Copr {{ copr.name }}{% endblock %}
+{% 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/_coprs_forms.html" import copr_build_form,
@@ -9,8 +9,6 @@
 					 copr_give_up_building with context %}
 
 {% block body %}
-  <h3>owner</h3>
-  {{ copr.owner.name }}
   <h3>chroots</h3>
   <ul class=chroots-list>
     {% for chroot in copr.chroots_list %}
@@ -41,12 +39,12 @@
     {% endif %}
   {% endif %}
   {% if g.user and g.user.id == copr.owner_id %}
-    <a href="{{ url_for('coprs_ns.copr_edit', name = copr.name) }}">Edit this Copr</a>
+    <a href="{{ url_for('coprs_ns.copr_edit', username = copr.owner.name, coprname = copr.name) }}">Edit this Copr</a>
   {% endif %}
   {% if copr.builds %}
     <h3>Latest 10 in this repo</h3>
     {{ builds_table(copr.builds) }}
-    <a href="{{ url_for('coprs_ns.copr_show_builds', name = copr.name) }}">Show all builds</a>
+    <a href="{{ url_for('coprs_ns.copr_show_builds', username = copr.owner.name, coprname = copr.name) }}">Show all builds</a>
   {% else %}
     <h3>No builds so far</h3>
   {% endif %}
diff --git a/wsgi/coprs/templates/coprs/edit.html b/wsgi/coprs/templates/coprs/edit.html
index c3c504f..62cc1bd 100644
--- a/wsgi/coprs/templates/coprs/edit.html
+++ b/wsgi/coprs/templates/coprs/edit.html
@@ -9,6 +9,6 @@
   <h3>Permissions</h3>
   {{ copr_permissions_form(permissions_form, copr, permissions) }}
   <h3>Other attributes</h3>
-  {{ copr_form(form, view = 'coprs_ns.copr_update', name = copr.name) }}
+  {{ copr_form(form, view = 'coprs_ns.copr_update', copr = copr) }}
 
 {% endblock %}
diff --git a/wsgi/coprs/templates/coprs/show.html b/wsgi/coprs/templates/coprs/show.html
index 5f5e34f..24e146d 100644
--- a/wsgi/coprs/templates/coprs/show.html
+++ b/wsgi/coprs/templates/coprs/show.html
@@ -6,7 +6,7 @@
   <a href={{ url_for('coprs_ns.copr_add') }}>Add a new Copr</a>
     {% for copr in coprs %}
       <div class=copr>
-        <h2><a href="{{ url_for('coprs_ns.copr_detail', name = copr.name) }}">{{ copr.name }}</a></h2>
+        <h2><a href="{{ url_for('coprs_ns.copr_detail', username = copr.owner.name, coprname = copr.name) }}">{{ copr.owner.name }}/{{ copr.name }}</a></h2>
         chroots: {{ copr.chroots_list|join(', ') }}<br>
         builds: {{ build_counts[loop.index0] }}<br>
         {% if copr.repos %}
diff --git a/wsgi/coprs/templates/coprs/show_builds.html b/wsgi/coprs/templates/coprs/show_builds.html
index e81b682..2432088 100644
--- a/wsgi/coprs/templates/coprs/show_builds.html
+++ b/wsgi/coprs/templates/coprs/show_builds.html
@@ -9,5 +9,5 @@
   <div class=pagination>
     {{ render_pagination(request, paginator) }}
   </div>
-  <a href="{{ url_for('coprs_ns.copr_detail', name = request.view_args['name']) }}">Back to Copr</a>
+  <a href="{{ url_for('coprs_ns.copr_detail', username = request.view_args['username'], coprname = request.view_args['coprname']) }}">Back to Copr</a>
 {% endblock %}
diff --git a/wsgi/coprs/templates/layout.html b/wsgi/coprs/templates/layout.html
index c05bd8e..a9c6c6b 100644
--- a/wsgi/coprs/templates/layout.html
+++ b/wsgi/coprs/templates/layout.html
@@ -10,8 +10,8 @@
   {% block menu %}
     <a href="{{ url_for('coprs_ns.coprs_show') }}">All Coprs</a>
     {% if g.user %}
-      <a href="{{ url_for('coprs_ns.coprs_by_owner', name = g.user.name) }}">Owned Coprs</a>
-      <a href="{{ url_for('coprs_ns.coprs_by_allowed', name = g.user.name) }}">Coprs I Can Build In</a>
+      <a href="{{ url_for('coprs_ns.coprs_by_owner', username = g.user.name) }}">Owned Coprs</a>
+      <a href="{{ url_for('coprs_ns.coprs_by_allowed', username = g.user.name) }}">Coprs I Can Build In</a>
       <a class=log-url href="{{ url_for('misc.logout') }}">Log out</a>
     {% else %}
       <a class=log-url href="{{ url_for('misc.login') }}">Log in</a>
diff --git a/wsgi/coprs/views/coprs_ns/builds.py b/wsgi/coprs/views/coprs_ns/builds.py
index 61f2555..db94b60 100644
--- a/wsgi/coprs/views/coprs_ns/builds.py
+++ b/wsgi/coprs/views/coprs_ns/builds.py
@@ -11,31 +11,38 @@ from coprs.views.misc import login_required
 
 from coprs.views.coprs_ns.general import coprs_ns
 
- at coprs_ns.route('/detail/<name>/builds/', defaults = {'page': 1})
- at coprs_ns.route('/detail/<name>/builds/<int:page>/')
-def copr_show_builds(name, page = 1):
+ at coprs_ns.route('/detail/<username>/<coprname>/builds/', defaults = {'page': 1})
+ at coprs_ns.route('/detail/<username>/<coprname>/builds/<int:page>/')
+def copr_show_builds(username, coprname, page = 1):
     query = models.Build.query.join(models.Copr.builds).\
+                               join(models.Copr.owner).\
                                options(db.contains_eager(models.Build.copr)).\
-                               filter(models.Copr.name == name).\
+                               filter(models.Copr.name == coprname).\
+                               filter(models.User.openid_name == models.User.openidize_name(username)).\
                                order_by(models.Build.submitted_on.desc())
 
     build_count = query.count()
     if build_count == 0: # no builds => we still need Copr
         copr = models.Copr.query.filter(models.Copr.name == name).first()
         if not copr: # hey, this Copr doesn't exist
-            return page_not_found('Copr with name {0} does not exist.'.format(name))
+            return page_not_found('Copr with name {0} does not exist.'.format(coprname))
 
     paginator = helpers.Paginator(query, build_count, page, per_page_override = 20)
     return flask.render_template('coprs/show_builds.html', builds = paginator.sliced_query, paginator = paginator)
 
 
- at coprs_ns.route('/detail/<name>/add_build/', methods = ["POST"])
+ at coprs_ns.route('/detail/<username>/<coprname>/add_build/', methods = ["POST"])
 @login_required
-def copr_add_build(name = None):
+def copr_add_build(username, coprname):
     form = forms.BuildForm()
-    copr = models.Copr.query.filter(models.Copr.name == name).first()
+    copr = models.Copr.query.\
+                       join(models.Copr.owner).\
+                       options(db.contains_eager(models.Copr.owner)).\
+                       filter(models.Copr.name == coprname).\
+                       filter(models.User.openid_name == models.User.openidize_name(username)).\
+                       first()
     if not copr: # hey, this Copr doesn't exist
-        return page_not_found('Copr with name {0} does not exist.'.format(name))
+        return page_not_found('Copr with name {0} does not exist.'.format(coprname))
 
     if form.validate_on_submit() and flask.g.user.can_build_in(copr):
         build = models.Build(pkgs = form.pkgs.data.replace('\n', ' '),
@@ -52,14 +59,14 @@ def copr_add_build(name = None):
         db.session.commit()
 
         flask.flash("Build was added")
-        return flask.redirect(flask.url_for('coprs_ns.copr_detail', name = copr.name))
+        return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = username, coprname = copr.name))
     else:
         return flask.render_template('coprs/detail.html', copr = copr, form = form)
 
 
- at coprs_ns.route('/detail/<name>/cancel_build/<int:build_id>/')
+ at coprs_ns.route('/detail/<username>/<coprname>/cancel_build/<int:build_id>/')
 @login_required
-def copr_cancel_build(name, build_id):
+def copr_cancel_build(username, coprname, build_id):
     # only the user who ran the build can cancel it
     build = models.Build.query.filter(models.Build.id == build_id).first()
     if not build: # hey, this Copr doesn't exist
@@ -71,4 +78,4 @@ def copr_cancel_build(name, build_id):
         db.session.commit()
         flask.flash('Build was canceled')
 
-    return flask.redirect(flask.url_for('coprs_ns.copr_detail', name = name))
+    return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = username, coprname = coprname))
diff --git a/wsgi/coprs/views/coprs_ns/general.py b/wsgi/coprs/views/coprs_ns/general.py
index ef90be3..a9a2860 100644
--- a/wsgi/coprs/views/coprs_ns/general.py
+++ b/wsgi/coprs/views/coprs_ns/general.py
@@ -15,7 +15,9 @@ coprs_ns = flask.Blueprint('coprs_ns',
 @coprs_ns.route('/<int:page>/')
 def coprs_show(page = 1):
     query = db.session.query(models.Copr, db.func.count(models.Build.id)).\
+                       join(models.Copr.owner).\
                        outerjoin(models.Copr.builds).\
+                       options(db.contains_eager(models.Copr.owner)).\
                        group_by(models.Copr.id)
     paginator = helpers.Paginator(query, query.count(), page)
 
@@ -26,13 +28,14 @@ def coprs_show(page = 1):
     return flask.render_template('coprs/show.html', coprs = coprs, build_counts = build_counts, paginator = paginator)
 
 
- at coprs_ns.route('/owned/<name>/', defaults = {'page': 1})
- at coprs_ns.route('/owned/<name>/<int:page>/')
-def coprs_by_owner(name = None, page = 1):
+ at coprs_ns.route('/owned/<username>/', defaults = {'page': 1})
+ at coprs_ns.route('/owned/<username>/<int:page>/')
+def coprs_by_owner(username = None, page = 1):
     query = db.session.query(models.Copr, db.func.count(models.Build.id)).\
                        join(models.Copr.owner).\
                        outerjoin(models.Copr.builds).\
-                       filter(models.User.openid_name == models.User.openidize_name(name)).\
+                       options(db.contains_eager(models.Copr.owner)).\
+                       filter(models.User.openid_name == models.User.openidize_name(username)).\
                        group_by(models.Copr.id)
     paginator = helpers.Paginator(query, query.count(), page)
 
@@ -43,14 +46,14 @@ def coprs_by_owner(name = None, page = 1):
     return flask.render_template('coprs/show.html', coprs = coprs, build_counts = build_counts, paginator = paginator)
 
 
- at coprs_ns.route('/allowed/<name>/', defaults = {'page': 1})
- at coprs_ns.route('/allowed/<name>/<int:page>/')
-def coprs_by_allowed(name = None, page = 1):
+ at coprs_ns.route('/allowed/<username>/', defaults = {'page': 1})
+ at coprs_ns.route('/allowed/<username>/<int:page>/')
+def coprs_by_allowed(username = None, page = 1):
     query = db.session.query(models.Copr, models.CoprPermission, models.User, db.func.count(models.Build.id)).\
                        outerjoin(models.Copr.builds).\
                        join(models.Copr.copr_permissions).\
                        join(models.CoprPermission.user).\
-                       filter(models.User.openid_name == models.User.openidize_name(name)).\
+                       filter(models.User.openid_name == models.User.openidize_name(username)).\
                        filter(models.CoprPermission.approved == True).\
                        group_by(models.Copr.id)
     paginator = helpers.Paginator(query, query.count(), page)
@@ -80,7 +83,7 @@ def copr_new():
                            chroots = ' '.join(form.chroots),
                            repos = form.repos.data.replace('\n', ' '),
                            owner = flask.g.user)
-
+        # TODO: verify that user doesn't already have a copr with this name
         db.session.add(copr)
         db.session.commit()
 
@@ -90,17 +93,18 @@ def copr_new():
         return flask.render_template('coprs/add.html', form = form)
 
 
- at coprs_ns.route('/detail/<name>/')
-def copr_detail(name = None):
+ at coprs_ns.route('/detail/<username>/<coprname>/')
+def copr_detail(username, coprname):
     form = forms.BuildForm()
     try: # query will raise an index error, if Copr doesn't exist
         copr = models.Copr.query.outerjoin(models.Copr.builds).\
                                  join(models.Copr.owner).\
                                  options(db.contains_eager(models.Copr.builds), db.contains_eager(models.Copr.owner)).\
-                                 filter(models.Copr.name == name).\
+                                 filter(models.Copr.name == coprname).\
+                                 filter(models.User.openid_name == models.User.openidize_name(username)).\
                                  order_by(models.Build.submitted_on.desc())[0:10][0] # we retrieved all builds, but we got one copr in a list...
     except IndexError:
-        return page_not_found('Copr with name {0} does not exist.'.format(name))
+        return page_not_found('Copr with name {0} does not exist.'.format(coprname))
     permissions = models.CoprPermission.query.join(models.CoprPermission.user).\
                                               options(db.contains_eager(models.CoprPermission.user)).\
                                               filter(models.CoprPermission.copr_id == copr.id).\
@@ -109,16 +113,19 @@ def copr_detail(name = None):
     return flask.render_template('coprs/detail.html', copr = copr, form = form, permissions = permissions)
 
 
- at coprs_ns.route('/edit/<name>/')
+ at coprs_ns.route('/detail/<username>/<coprname>/edit/')
 @login_required
-def copr_edit(name = None):
+def copr_edit(username, coprname):
     query = db.session.query(models.Copr, models.CoprPermission).\
                        outerjoin(models.CoprPermission).\
-                       filter(models.Copr.name == name).\
+                       outerjoin(models.Copr.owner).\
+                       options(db.contains_eager(models.Copr.owner)).\
+                       filter(models.Copr.name == coprname).\
+                       filter(models.User.openid_name == models.User.openidize_name(username)).\
                        all()
     copr = query[0][0]
     if not copr:
-        return page_not_found('Copr with name {0} does not exist.'.format(name))
+        return page_not_found('Copr with name {0} does not exist.'.format(coprname))
     form = forms.CoprForm(obj = copr)
 
     permissions = map(lambda x: x[1], query)
@@ -132,35 +139,49 @@ def copr_edit(name = None):
                                  permissions_form = permissions_form)
 
 
- at coprs_ns.route('/update/<name>/', methods = ['POST'])
+ at coprs_ns.route('/detail/<username>/<coprname>/update/', methods = ['POST'])
 @login_required
-def copr_update(name = None):
+def copr_update(username, coprname):
     form = forms.CoprForm()
-    copr = models.Copr.query.filter(models.Copr.name == name).first()
+    copr = models.Copr.query.\
+                       join(models.Copr.owner).\
+                       options(db.contains_eager(models.Copr.owner)).\
+                       filter(models.Copr.name == coprname).\
+                       filter(models.User.openid_name == models.User.openidize_name(username)).\
+                       first()
     # only owner can update a copr
     if flask.g.user != copr.owner:
         flask.flash('Only owners may update their Coprs.')
-        return flask.redirect(flask.url_for('coprs_ns.copr_detail', name = form.name.data))
+        return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = copr.owner.name, coprname = form.name.data))
 
     if form.validate_on_submit():
         # we don't change owner (yet)
-        updated = models.Copr.query.filter(models.Copr.name == name).\
-                                    update({'name': form.name.data,
-                                            'chroots': ' '.join(form.chroots),
-                                            'repos': form.repos.data.replace('\n', ' ')})
+        # TODO: verify that this user doesn't already have copr named like this
+        copr = models.Copr.query.join(models.Copr.owner).\
+                                 filter(models.Copr.name == coprname).\
+                                 filter(models.User.openid_name == models.User.openidize_name(username)).\
+                                 first()
+        copr.name = form.name.data
+        copr.chroots = ' '.join(form.chroots)
+        copr.repos = form.repos.data.replace('\n', ' ')
+
+        db.session.add(copr)
         db.session.commit()
         flask.flash('Copr was updated successfully.')
-        return flask.redirect(flask.url_for('coprs_ns.copr_detail', name = form.name.data))
+        return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = username, coprname = form.name.data))
     else:
         return flask.render_template('coprs/edit.html', copr = copr, form = form)
 
 
- at coprs_ns.route('/apply_for_building/<name>/', methods = ['POST'])
+ at coprs_ns.route('/detail/<username>/<coprname>/apply_for_building', methods = ['POST'])
 @login_required
-def copr_apply_for_building(name = None):
+def copr_apply_for_building(username, coprname):
     query = db.session.query(models.Copr, models.CoprPermission).\
+                       join(models.Copr.owner).\
                        outerjoin(models.CoprPermission).\
-                       filter(models.Copr.name == name).\
+                       options(db.contains_eager(models.Copr.owner)).\
+                       filter(models.Copr.name == coprname).\
+                       filter(models.User.openid_name == models.User.openidize_name(coprname)).\
                        filter(db.or_(models.CoprPermission.user == flask.g.user, models.CoprPermission.user == None)).\
                        first()
     copr = query[0]
@@ -176,15 +197,18 @@ def copr_apply_for_building(name = None):
         db.session.commit()
         flask.flash('You have successfuly applied for building in Copr "{0}".'.format(copr.name))
 
-    return flask.redirect(flask.url_for('coprs_ns.copr_detail', name = copr.name))
+    return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = copr.owner.name, coprname = copr.name))
 
 
- at coprs_ns.route('/give_up_building/<name>/', methods = ['POST'])
+ at coprs_ns.route('/detail/<username>/<coprname>/give_up_building/', methods = ['POST'])
 @login_required
-def copr_give_up_building(name = None):
+def copr_give_up_building(username, coprname):
     query = db.session.query(models.Copr, models.CoprPermission).\
+                       join(models.Copr.owner).\
                        outerjoin(models.CoprPermission).\
-                       filter(models.Copr.name == name).\
+                       options(db.contains_eager(models.Copr.owner)).\
+                       filter(models.Copr.name == coprname).\
+                       filter(models.User.openid_name == models.User.openidize_name(username)).\
                        filter(models.CoprPermission.user == flask.g.user).\
                        first()
     copr = query[0]
@@ -198,20 +222,25 @@ def copr_give_up_building(name = None):
         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', name = copr.name))
+    return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = copr.owner.name, coprname = copr.name))
 
 
- at coprs_ns.route('/update_permissions/<name>/', methods = ['POST'])
+ at coprs_ns.route('/detail/<username>/<coprname>/update_permissions/', methods = ['POST'])
 @login_required
-def copr_update_permissions(name = None): #TODO: optimize!
-    copr = models.Copr.query.filter(models.Copr.name == name).first()
+def copr_update_permissions(username, coprname): #TODO: optimize!
+    copr = models.Copr.query.\
+                       join(models.Copr.owner).\
+                       options(db.contains_eager(models.Copr.owner)).\
+                       filter(models.User.name == username).\
+                       filter(models.Copr.name == coprname).\
+                       first()
     permissions = models.CoprPermission.query.filter(models.CoprPermission.copr_id == copr.id).all()
     permissions_form = forms.DynamicPermissionsFormFactory.create_form_cls(permissions)()
 
     # only owner can update copr permissions
     if flask.g.user != copr.owner:
         flask.flash('Only owners may update their Coprs permissions.')
-        return flask.redirect(flask.url_for('coprs_ns.copr_detail', name = copr.name))
+        return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = copr.owner.name, coprname = copr.name))
 
     if permissions_form.validate_on_submit():
         # we don't change owner (yet)
@@ -221,6 +250,6 @@ def copr_update_permissions(name = None): #TODO: optimize!
                                         update({'approved': permissions_form['user_{0}'.format(perm.user_id)].data})
         db.session.commit()
         flask.flash('Copr permissions were updated successfully.')
-        return flask.redirect(flask.url_for('coprs_ns.copr_detail', name = copr.name))
+        return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = copr.owner.name, coprname = copr.name))
     else:
         return flask.render_template('coprs/edit.html', copr = copr, form = form)



More information about the copr-devel mailing list