[copr] bkabrda-workspace: Transfer the builds logic into separate file (5c0f58a)
bkabrda at fedoraproject.org
bkabrda at fedoraproject.org
Mon Nov 19 08:58:48 UTC 2012
Repository : http://git.fedorahosted.org/cgit/copr.git
On branch : bkabrda-workspace
>---------------------------------------------------------------
commit 5c0f58a895a4e4cae84c6c457a778e0fcded28c9
Author: Bohuslav Kabrda <bkabrda at redhat.com>
Date: Mon Nov 19 09:58:37 2012 +0100
Transfer the builds logic into separate file
>---------------------------------------------------------------
wsgi/coprs/exceptions.py | 6 ++++
wsgi/coprs/logic/builds_logic.py | 49 +++++++++++++++++++++++++++++++++++
wsgi/coprs/logic/coprs_logic.py | 6 +---
wsgi/coprs/views/coprs_ns/builds.py | 46 +++++++++++++--------------------
4 files changed, 75 insertions(+), 32 deletions(-)
diff --git a/wsgi/coprs/exceptions.py b/wsgi/coprs/exceptions.py
index 5995fec..7b7fd5c 100644
--- a/wsgi/coprs/exceptions.py
+++ b/wsgi/coprs/exceptions.py
@@ -1,2 +1,8 @@
+class ArgumentMissingException(BaseException):
+ pass
+
class DuplicateCoprNameException(BaseException):
pass
+
+class InsufficientRightsException(BaseException):
+ pass
diff --git a/wsgi/coprs/logic/builds_logic.py b/wsgi/coprs/logic/builds_logic.py
new file mode 100644
index 0000000..07831c2
--- /dev/null
+++ b/wsgi/coprs/logic/builds_logic.py
@@ -0,0 +1,49 @@
+from coprs import db
+from coprs import exceptions
+from coprs import models
+
+from coprs.logic import coprs_logic
+
+class BuildsLogic(object):
+ @classmethod
+ def get(cls, user, build_id):
+ query = models.Build.query.filter(models.Build.id == build_id)
+ return query
+
+ @classmethod
+ def get_multiple(cls, user, **kwargs):
+ copr = kwargs.get('copr', None)
+ username = kwargs.get('username', None)
+ coprname = kwargs.get('coprname', None)
+
+ query = models.Build.query.order_by(models.Build.submitted_on.desc())
+
+ # if we get copr, query by its id
+ if copr:
+ query.filter(models.Build.copr == copr)
+ elif username and coprname:
+ query = query.join(models.Build.copr).\
+ options(db.contains_eager(models.Build.copr)).\
+ join(models.Copr.owner).\
+ filter(models.Copr.name == coprname).\
+ filter(models.User.openid_name == models.User.openidize_name(username)).\
+ order_by(models.Build.submitted_on.desc())
+ else:
+ raise exceptions.ArgumentMissingException('Must pass either copr or both coprname and username')
+
+ return query
+
+ @classmethod
+ def new(cls, user, build, copr, check_authorized = True):
+ if check_authorized:
+ if not user.can_build_in(copr):
+ raise exceptions.InsufficientRightsException('User {0} cannot build in copr {1}/{2}'.format(user.name, copr.owner.name, copr.name))
+
+ coprs_logic.CoprsLogic.increment_build_count(user, copr)
+ db.session.add(build)
+
+ @classmethod
+ def cancel_build(cls, user, build):
+ if build.user_id != user.id:
+ raise exceptions.InsufficientRightsException('You can only cancel your own builds.')
+ build.canceled = True
diff --git a/wsgi/coprs/logic/coprs_logic.py b/wsgi/coprs/logic/coprs_logic.py
index 436621f..f4ee668 100644
--- a/wsgi/coprs/logic/coprs_logic.py
+++ b/wsgi/coprs/logic/coprs_logic.py
@@ -66,8 +66,6 @@ class CoprsLogic(object):
return existing
@classmethod
- def increment_build_count(cls, user, owner, coprname): #TODO API of this method is different, maybe change?
- models.Copr.query.filter(models.Copr.name == coprname).\
- filter(models.Copr.owner_id == owner.id).\
+ def increment_build_count(cls, user, copr): # TODO API of this method is different, maybe change?
+ models.Copr.query.filter(models.Copr.id == copr.id).\
update({models.Copr.build_count: models.Copr.build_count + 1})
- db.session.commit()
diff --git a/wsgi/coprs/views/coprs_ns/builds.py b/wsgi/coprs/views/coprs_ns/builds.py
index 6464cfa..d5e00cd 100644
--- a/wsgi/coprs/views/coprs_ns/builds.py
+++ b/wsgi/coprs/views/coprs_ns/builds.py
@@ -3,10 +3,12 @@ import time
import flask
from coprs import db, page_not_found
+from coprs import exceptions
from coprs import forms
from coprs import helpers
from coprs import models
+from coprs.logic import builds_logic
from coprs.logic import coprs_logic
from coprs.views.misc import login_required
@@ -15,20 +17,14 @@ from coprs.views.coprs_ns.general import coprs_ns
@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 == 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(coprname))
-
- paginator = helpers.Paginator(query, build_count, page, per_page_override = 20)
+ copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first()
+
+ if not copr: # hey, this Copr doesn't exist
+ return page_not_found('Copr with name {0} does not exist.'.format(coprname))
+
+ builds_query = builds_logic.BuildsLogic.get_multiple(flask.g.user, copr = copr)
+
+ paginator = helpers.Paginator(builds_query, copr.build_count, page, per_page_override = 20)
return flask.render_template('coprs/show_builds.html', builds = paginator.sliced_query, paginator = paginator)
@@ -36,12 +32,7 @@ def copr_show_builds(username, coprname, page = 1):
@login_required
def copr_add_build(username, coprname):
form = forms.BuildForm()
- 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()
+ copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first()
if not copr: # hey, this Copr doesn't exist
return page_not_found('Copr with name {0} does not exist.'.format(coprname))
@@ -56,9 +47,7 @@ def copr_add_build(username, coprname):
build.memory_reqs = form.memory_reqs.data
build.timeout = form.timeout.data
- # increment copr build count (will be part of method logic/build_logic, so that it doesn't have to be done manually)
- coprs_logic.CoprsLogic.increment_build_count(flask.g.user, copr.owner, coprname)
- db.session.add(build)
+ builds_logic.BuildsLogic.new(flask.g.user, build, copr, check_authorized = False) # we're checking authorization above for now
db.session.commit()
flask.flash("Build was added")
@@ -71,13 +60,14 @@ def copr_add_build(username, coprname):
@login_required
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
+ build = builds_logic.BuildsLogic.get(flask.g.user, build_id).first()
+ if not build: # hey, this Build doesn't exist
return page_not_found('Build with id {0} does not exist.'.format(build_id))
- if build.user_id != flask.g.user.id:
- flask.flash('You can only cancel your own builds.')
+ try:
+ builds_logic.BuildsLogic.cancel_build(flask.g.user, build)
+ except exceptions.InsufficientRightsException as ex:
+ flask.flask(ex.message)
else:
- build.canceled = True
db.session.commit()
flask.flash('Build was canceled')
More information about the copr-devel
mailing list