Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : bkabrda-workspace
---------------------------------------------------------------
commit 575d7183cc7f3d5d17ec976a217f9da1bb57c786
Author: Slavek Kabrda <bkabrda(a)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
-(a)coprs_ns.route('/detail/<name>/builds/', defaults = {'page': 1})
-@coprs_ns.route('/detail/<name>/builds/<int:page>/')
-def copr_show_builds(name, page = 1):
+@coprs_ns.route('/detail/<username>/<coprname>/builds/', defaults =
{'page': 1})
+@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)
-(a)coprs_ns.route('/detail/<name>/add_build/', methods = ["POST"])
+@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)
-@coprs_ns.route('/detail/<name>/cancel_build/<int:build_id>/')
+@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)
-(a)coprs_ns.route('/owned/<name>/', defaults = {'page': 1})
-@coprs_ns.route('/owned/<name>/<int:page>/')
-def coprs_by_owner(name = None, page = 1):
+(a)coprs_ns.route('/owned/<username>/', defaults = {'page': 1})
+@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)
-(a)coprs_ns.route('/allowed/<name>/', defaults = {'page': 1})
-@coprs_ns.route('/allowed/<name>/<int:page>/')
-def coprs_by_allowed(name = None, page = 1):
+(a)coprs_ns.route('/allowed/<username>/', defaults = {'page': 1})
+@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)
-(a)coprs_ns.route('/detail/<name>/')
-def copr_detail(name = None):
+(a)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)
-(a)coprs_ns.route('/edit/<name>/')
+@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)
-(a)coprs_ns.route('/update/<name>/', methods = ['POST'])
+@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)
-(a)coprs_ns.route('/apply_for_building/<name>/', methods = ['POST'])
+@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))
-(a)coprs_ns.route('/give_up_building/<name>/', methods = ['POST'])
+@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))
-(a)coprs_ns.route('/update_permissions/<name>/', methods = ['POST'])
+@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)