[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