[copr] bkabrda-workspace: Pull the app logic out from views into separate module (9a4f904)

bkabrda at fedoraproject.org bkabrda at fedoraproject.org
Mon Nov 19 07:03:05 UTC 2012


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

On branch  : bkabrda-workspace

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

commit 9a4f90459e08c0a3466f93f1fae9375d16fd646b
Author: Bohuslav Kabrda <bkabrda at redhat.com>
Date:   Mon Nov 19 07:59:27 2012 +0100

    Pull the app logic out from views into separate module


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

 wsgi/coprs/exceptions.py                |    2 +
 wsgi/coprs/forms.py                     |    8 +--
 wsgi/coprs/logic/.coprs_logic.py.swo    |  Bin 0 -> 12288 bytes
 wsgi/coprs/{views => logic}/__init__.py |    0
 wsgi/coprs/logic/coprs_logic.py         |   75 +++++++++++++++++++++
 wsgi/coprs/views/coprs_ns/builds.py     |    5 +-
 wsgi/coprs/views/coprs_ns/general.py    |  111 +++++++-----------------------
 7 files changed, 110 insertions(+), 91 deletions(-)

diff --git a/wsgi/coprs/exceptions.py b/wsgi/coprs/exceptions.py
new file mode 100644
index 0000000..5995fec
--- /dev/null
+++ b/wsgi/coprs/exceptions.py
@@ -0,0 +1,2 @@
+class DuplicateCoprNameException(BaseException):
+    pass
diff --git a/wsgi/coprs/forms.py b/wsgi/coprs/forms.py
index df2a10d..3d71c72 100644
--- a/wsgi/coprs/forms.py
+++ b/wsgi/coprs/forms.py
@@ -8,6 +8,7 @@ from flask.ext import wtf
 from coprs import constants
 from coprs import helpers
 from coprs import models
+from coprs.logic import coprs_logic
 
 class UrlListValidator(object):
     def __init__(self, message = None):
@@ -51,12 +52,9 @@ class CoprUniqueNameValidator(object):
         self.message = message
 
     def __call__(self, form, field):
-        existing = models.Copr.query.filter(models.Copr.name == field.data).\
-                                     filter(models.Copr.owner_id == flask.g.user.id)
-        if form.id.data:
-            existing = existing.filter(models.Copr.id != form.id.data)
+        existing = coprs_logic.CoprsLogic.exists_for_current_user(flask.g.user, field.data).first()
 
-        if existing.first():
+        if existing and str(existing.id) != form.id.data:
             raise wtf.ValidationError(self.message.format(field.data))
 
 
diff --git a/wsgi/coprs/logic/.coprs_logic.py.swo b/wsgi/coprs/logic/.coprs_logic.py.swo
new file mode 100644
index 0000000..b244106
Binary files /dev/null and b/wsgi/coprs/logic/.coprs_logic.py.swo differ
diff --git a/wsgi/coprs/views/__init__.py b/wsgi/coprs/logic/__init__.py
similarity index 100%
copy from wsgi/coprs/views/__init__.py
copy to wsgi/coprs/logic/__init__.py
diff --git a/wsgi/coprs/logic/coprs_logic.py b/wsgi/coprs/logic/coprs_logic.py
new file mode 100644
index 0000000..6b639ba
--- /dev/null
+++ b/wsgi/coprs/logic/coprs_logic.py
@@ -0,0 +1,75 @@
+import flask
+
+from coprs import db
+from coprs import exceptions
+from coprs import models
+
+class CoprsLogic(object):
+    """Used for manipulating Coprs. All methods accept user object as a first argument, as this may be needed in future."""
+    @classmethod
+    def get(cls, user, username, coprname, **kwargs):
+        with_builds = kwargs.get('with_builds', False)
+        with_permissions = kwargs.get('with_permissions', False)
+
+        query = db.session.query(models.Copr).\
+                           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))
+
+        if with_builds:
+            query = query.outerjoin(models.Copr.builds).\
+                          options(db.contains_eager(models.Copr.builds)).\
+                          order_by(models.Build.submitted_on.desc())
+
+        if with_permissions:
+            query = query.outerjoin(models.Copr.copr_permissions).\
+                          options(db.contains_eager(models.Copr.copr_permissions))
+
+        return query
+
+    @classmethod
+    def get_multiple(cls, user, **kwargs):
+        user_relation = kwargs.get('user_relation', None)
+        username = kwargs.get('username', None)
+
+        query = db.session.query(models.Copr).\
+                           join(models.Copr.owner).\
+                           options(db.contains_eager(models.Copr.owner))
+        if user_relation == 'owned':
+            query = query.filter(models.User.openid_name == models.User.openidize_name(username))
+        elif user_relation == 'allowed':
+            aliased_user = db.aliased(models.User)
+            query = query.join(models.CoprPermission, models.Copr.copr_permissions).\
+                          filter(models.CoprPermission.approved == True).\
+                          join(aliased_user, models.CoprPermission.user).\
+                          filter(aliased_user.openid_name == models.User.openidize_name(username))
+        return query
+
+    @classmethod
+    def new(cls, user, copr, check_for_duplicates = True):
+        if check_for_duplicates and cls.exists_for_current_user(user, copr.name):
+            raise exceptions.DuplicateCoprNameException
+        db.session.add(copr)
+        db.session.commit()
+
+    @classmethod
+    def update(cls, user, copr, check_for_duplicates = True):
+        if check_for_duplicates and cls.exists_for_current_user(user, copr.name):
+            raise exceptions.DuplicateCoprNameException
+        db.session.add(copr)
+        db.session.commit()
+
+    @classmethod
+    def exists_for_current_user(cls, user, coprname):
+        existing = models.Copr.query.filter(models.Copr.name == coprname).\
+                                     filter(models.Copr.owner_id == user.id)
+
+        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).\
+                          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 db94b60..6464cfa 100644
--- a/wsgi/coprs/views/coprs_ns/builds.py
+++ b/wsgi/coprs/views/coprs_ns/builds.py
@@ -7,8 +7,9 @@ from coprs import forms
 from coprs import helpers
 from coprs import models
 
-from coprs.views.misc import login_required
+from coprs.logic import coprs_logic
 
+from coprs.views.misc import login_required
 from coprs.views.coprs_ns.general import coprs_ns
 
 @coprs_ns.route('/detail/<username>/<coprname>/builds/', defaults = {'page': 1})
@@ -55,6 +56,8 @@ 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)
         db.session.commit()
 
diff --git a/wsgi/coprs/views/coprs_ns/general.py b/wsgi/coprs/views/coprs_ns/general.py
index 327a7eb..4ed669e 100644
--- a/wsgi/coprs/views/coprs_ns/general.py
+++ b/wsgi/coprs/views/coprs_ns/general.py
@@ -7,6 +7,8 @@ from coprs import models
 
 from coprs.views.misc import login_required
 
+from coprs.logic import coprs_logic
+
 coprs_ns = flask.Blueprint('coprs_ns',
                            __name__,
                            url_prefix = '/coprs')
@@ -14,55 +16,31 @@ coprs_ns = flask.Blueprint('coprs_ns',
 @coprs_ns.route('/', defaults = {'page': 1})
 @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)
+    query = coprs_logic.CoprsLogic.get_multiple(flask.g.user)
     paginator = helpers.Paginator(query, query.count(), page)
 
-    if paginator.sliced_query:
-        coprs, build_counts = zip(*paginator.sliced_query)
-    else:
-        coprs, build_counts = [], []
-    return flask.render_template('coprs/show.html', coprs = coprs, build_counts = build_counts, paginator = paginator)
+    coprs = paginator.sliced_query
+    return flask.render_template('coprs/show.html', coprs = coprs, paginator = paginator)
 
 
 @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).\
-                       options(db.contains_eager(models.Copr.owner)).\
-                       filter(models.User.openid_name == models.User.openidize_name(username)).\
-                       group_by(models.Copr.id)
+    query = coprs_logic.CoprsLogic.get_multiple(flask.g.user, user_relation = 'owned', username = username)
     paginator = helpers.Paginator(query, query.count(), page)
 
-    if paginator.sliced_query:
-        coprs, build_counts = zip(*paginator.sliced_query)
-    else:
-        coprs, build_counts = [], []
-    return flask.render_template('coprs/show.html', coprs = coprs, build_counts = build_counts, paginator = paginator)
+    coprs = paginator.sliced_query
+    return flask.render_template('coprs/show.html', coprs = coprs, paginator = paginator)
 
 
 @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(username)).\
-                       filter(models.CoprPermission.approved == True).\
-                       group_by(models.Copr.id)
+    query = coprs_logic.CoprsLogic.get_multiple(flask.g.user, user_relation = 'allowed', username = username)
     paginator = helpers.Paginator(query, query.count(), page)
 
-    if paginator.sliced_query:
-        coprs, build_counts = zip(*map(lambda x: (x[0], x[3]), paginator.sliced_query))
-    else:
-        coprs, build_counts = [], []
-    return flask.render_template('coprs/show.html', coprs = coprs, build_counts = build_counts, paginator = paginator)
+    coprs = paginator.sliced_query
+    return flask.render_template('coprs/show.html', coprs = coprs, paginator = paginator)
 
 
 @coprs_ns.route('/add/')
@@ -83,8 +61,7 @@ def copr_new():
                            chroots = ' '.join(form.chroots),
                            repos = form.repos.data.replace('\n', ' '),
                            owner = flask.g.user)
-        db.session.add(copr)
-        db.session.commit()
+        coprs_logic.CoprsLogic.new(flask.g.user, copr, check_for_duplicates = False) # form validation checks for duplicates
 
         flask.flash('New entry was successfully posted')
         return flask.redirect(flask.url_for('coprs_ns.coprs_show'))
@@ -95,40 +72,25 @@ def copr_new():
 @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 == 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...
+    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, with_permissions = True)
+        copr = query[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(coprname))
-    permissions = models.CoprPermission.query.join(models.CoprPermission.user).\
-                                              options(db.contains_eager(models.CoprPermission.user)).\
-                                              filter(models.CoprPermission.copr_id == copr.id).\
-                                              all()
 
-    return flask.render_template('coprs/detail.html', copr = copr, form = form, permissions = permissions)
+    return flask.render_template('coprs/detail.html', copr = copr, form = form, permissions = copr.copr_permissions)
 
 
 @coprs_ns.route('/detail/<username>/<coprname>/edit/')
 @login_required
 def copr_edit(username, coprname):
-    query = db.session.query(models.Copr, models.CoprPermission).\
-                       outerjoin(models.CoprPermission).\
-                       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]
+    query = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname, with_permissions = True)
+    copr = query.first()
     if not copr:
         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)
-    permissions = filter(lambda x: x, permissions) # throw away None away
+    permissions = copr.copr_permissions
     permissions_form = forms.DynamicPermissionsFormFactory.create_form_cls(permissions)()
 
     return flask.render_template('coprs/edit.html',
@@ -142,12 +104,7 @@ def copr_edit(username, coprname):
 @login_required
 def copr_update(username, coprname):
     form = forms.CoprForm()
-    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()
     # only owner can update a copr
     if flask.g.user != copr.owner:
         flask.flash('Only owners may update their Coprs.')
@@ -155,16 +112,11 @@ def copr_update(username, coprname):
 
     if form.validate_on_submit():
         # we don't change owner (yet)
-        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()
+        coprs_logic.CoprsLogic.update(flask.g.user, copr, check_for_duplicates = False) # form validation checks for duplicates
         flask.flash('Copr was updated successfully.')
         return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = username, coprname = form.name.data))
     else:
@@ -201,15 +153,8 @@ def copr_apply_for_building(username, coprname):
 @coprs_ns.route('/detail/<username>/<coprname>/give_up_building/', methods = ['POST'])
 @login_required
 def copr_give_up_building(username, coprname):
-    query = db.session.query(models.Copr, models.CoprPermission).\
-                       join(models.Copr.owner).\
-                       outerjoin(models.CoprPermission).\
-                       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]
+    query = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname, with_permissions = True)
+    copr = query.first()
     if not copr:
         return page_not_found('Copr with name {0} does not exist.'.format(name))
 
@@ -226,13 +171,9 @@ def copr_give_up_building(username, coprname):
 @coprs_ns.route('/detail/<username>/<coprname>/update_permissions/', methods = ['POST'])
 @login_required
 def copr_update_permissions(username, coprname):
-    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()
+    query = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname)
+    copr = query.first()
+    permissions = copr.copr_permissions
     permissions_form = forms.DynamicPermissionsFormFactory.create_form_cls(permissions)()
 
     # only owner can update copr permissions



More information about the copr-devel mailing list