[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