Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2026
October
September
August
July
June
May
April
March
February
January
2025
December
November
October
September
August
July
June
May
April
March
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
List overview
Download
copr-devel
November 2012
----- 2026 -----
October 2026
September 2026
August 2026
July 2026
June 2026
May 2026
April 2026
March 2026
February 2026
January 2026
----- 2025 -----
December 2025
November 2025
October 2025
September 2025
August 2025
July 2025
June 2025
May 2025
April 2025
March 2025
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
copr-devel@lists.fedorahosted.org
4 participants
105 discussions
Start a n
N
ew thread
[copr] bkabrda-workspace: Reverse the logic for build state a bit for cases when the build start submission may get lost (ae1fd8f)
by bkabrda@fedorahosted.org
20 Nov '12
20 Nov '12
Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : bkabrda-workspace >--------------------------------------------------------------- commit ae1fd8f999b4ee68f90ed3eaa4f5d70456399ed3 Author: Bohuslav Kabrda <bkabrda(a)redhat.com> Date: Tue Nov 20 08:40:08 2012 +0100 Reverse the logic for build state a bit for cases when the build start submission may get lost >--------------------------------------------------------------- wsgi/coprs/models.py | 13 ++++++------- 1 files changed, 6 insertions(+), 7 deletions(-) diff --git a/wsgi/coprs/models.py b/wsgi/coprs/models.py index e58109f..b36315e 100644 --- a/wsgi/coprs/models.py +++ b/wsgi/coprs/models.py @@ -146,16 +146,15 @@ class Build(db.Model, Serializer): @property def state(self): + if self.status == 1: + return 'succeeded' + elif self.status == 0: + return 'failed' if self.canceled: return 'canceled' - if not self.started_on: - return 'pending' - if not self.ended_on: + if not self.ended_on and self.started_on: return 'running' - if self.status == 1: - return 'succeeded' - - return 'failed' + return 'pending' @property def cancelable(self):
1
0
0
0
[copr] bkabrda-workspace: Logic for copr permissions (08ae746)
by bkabrda@fedoraproject.org
19 Nov '12
19 Nov '12
Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : bkabrda-workspace >--------------------------------------------------------------- commit 08ae74604e58422cbae440ae3b0e5565375d5a25 Author: Bohuslav Kabrda <bkabrda(a)redhat.com> Date: Mon Nov 19 14:02:28 2012 +0100 Logic for copr permissions >--------------------------------------------------------------- wsgi/coprs/logic/coprs_logic.py | 16 ++++++++++++++++ wsgi/coprs/views/coprs_ns/coprs_general.py | 25 ++++++++++--------------- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/wsgi/coprs/logic/coprs_logic.py b/wsgi/coprs/logic/coprs_logic.py index e39347c..c2b967d 100644 --- a/wsgi/coprs/logic/coprs_logic.py +++ b/wsgi/coprs/logic/coprs_logic.py @@ -67,3 +67,19 @@ class CoprsLogic(object): 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}) + +class CoprsPermissionLogic(object): + @classmethod + def get(cls, user, copr, searched_user): + query = models.CoprPermission.query.filter(models.CoprPermission.copr == copr).\ + filter(models.CoprPermission.user == searched_user) + + return query + + @classmethod + def new(cls, user, copr_permission): + db.session.add(copr_permission) + + @classmethod + def delete(cls, user, copr_permission): + db.session.delete(copr_permission) diff --git a/wsgi/coprs/views/coprs_ns/coprs_general.py b/wsgi/coprs/views/coprs_ns/coprs_general.py index a4e34a6..077609e 100644 --- a/wsgi/coprs/views/coprs_ns/coprs_general.py +++ b/wsgi/coprs/views/coprs_ns/coprs_general.py @@ -126,24 +126,18 @@ def copr_update(username, coprname): @coprs_ns.route('/detail/<username>/<coprname>/apply_for_building', methods = ['POST']) @login_required def copr_apply_for_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(db.or_(models.CoprPermission.user == flask.g.user, models.CoprPermission.user == None)).\ - first() - copr = query[0] + copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first() + permission = coprs_logic.CoprsPermissionLogic.get(flask.g.user, copr, flask.g.user).first() + if not copr: return page_not_found('Copr with name {0} does not exist.'.format(name)) if copr.owner == flask.g.user: flask.flash('Owner cannot request permissions for his own copr.') - elif query[1]: + elif permission: flask.flash('You are already listed in permissions for Copr "{0}".'.format(copr.name)) else: perm = models.CoprPermission(user = flask.g.user, copr = copr, approved = False) - db.session.add(perm) + coprs_logic.CoprsPermissionLogic.new(flask.g.user, perm) db.session.commit() flask.flash('You have successfuly applied for building in Copr "{0}".'.format(copr.name)) @@ -153,15 +147,16 @@ 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 = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname, with_permissions = True) - copr = query.first() + copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first() + permission = coprs_logic.CoprsPermissionLogic.get(flask.g.user, copr, flask.g.user).first() + if not copr: return page_not_found('Copr with name {0} does not exist.'.format(name)) - if not query[1]: + if not permission: flask.flash('You are already not in permissions for Copr "{0}".'.format(copr.name)) else: - db.session.delete(query[1]) # TODO: do we really want to delete this, or just inactivate? + coprs_logic.CoprsPermissionLogic.delete(flask.g.user, permission) # TODO: do we really want to delete this, or just inactivate? db.session.commit() flask.flash('You have successfuly given up building in Copr "{0}".'.format(copr.name))
1
0
0
0
[copr] bkabrda-workspace: Use http basic auth for backend (fde6b4a)
by bkabrda@fedoraproject.org
19 Nov '12
19 Nov '12
Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : bkabrda-workspace >--------------------------------------------------------------- commit fde6b4a3b31948f7a22cc3403c566c0908951388 Author: Bohuslav Kabrda <bkabrda(a)redhat.com> Date: Mon Nov 19 13:35:01 2012 +0100 Use http basic auth for backend >--------------------------------------------------------------- wsgi/coprs/config.py | 2 +- wsgi/coprs/views/backend_ns/backend_general.py | 2 ++ wsgi/coprs/views/misc.py | 12 ++++++++++++ 3 files changed, 15 insertions(+), 1 deletions(-) diff --git a/wsgi/coprs/config.py b/wsgi/coprs/config.py index fcf29d3..e07f5d3 100644 --- a/wsgi/coprs/config.py +++ b/wsgi/coprs/config.py @@ -12,6 +12,7 @@ class Config(object): DATABASE = os.path.join(REPO_DIR, '../data/copr.db') OPENID_STORE = os.path.join(DATA_DIR, '../openid_store') SECRET_KEY = 'THISISNOTASECRETATALL' + BACKEND_PASSWORD = 'thisisbackend' # SQLAlchemy SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.abspath(DATABASE) @@ -26,7 +27,6 @@ class DevelopmentConfig(Config): class UnitTestConfig(Config): DATABASE = os.path.abspath('tests/data/copr.db') OPENID_STORE = os.path.abspath('tests/data/openid_store') - SECRET_KEY = 'THISISNOTASECRETATALL' # SQLAlchemy SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.abspath(DATABASE) diff --git a/wsgi/coprs/views/backend_ns/backend_general.py b/wsgi/coprs/views/backend_ns/backend_general.py index 0d20623..8765f0d 100644 --- a/wsgi/coprs/views/backend_ns/backend_general.py +++ b/wsgi/coprs/views/backend_ns/backend_general.py @@ -5,6 +5,7 @@ from coprs import models from coprs.logic import builds_logic +from coprs.views import misc from coprs.views.backend_ns import backend_ns @backend_ns.route('/waiting_builds/') @@ -18,6 +19,7 @@ def waiting_builds(): '__included_ids__': False}) for build in builds]}) @backend_ns.route('/update_builds/', methods = ['POST', 'PUT']) +(a)misc.backend_authenticated def update_builds(): build_ids = [] for build in flask.request.json['builds']: # first get ids of sent builds diff --git a/wsgi/coprs/views/misc.py b/wsgi/coprs/views/misc.py index 68b3995..224e8eb 100644 --- a/wsgi/coprs/views/misc.py +++ b/wsgi/coprs/views/misc.py @@ -4,6 +4,7 @@ import flask from flask.ext.openid import OpenID +from coprs import app from coprs import db from coprs import models from coprs import oid @@ -54,3 +55,14 @@ def login_required(f): return flask.redirect(flask.url_for('misc.login', next = flask.request.url)) return f(*args, **kwargs) return decorated_function + + +# backend authentication +def backend_authenticated(f): + @functools.wraps(f) + def decorated_function(*args, **kwargs): + auth = flask.request.authorization + if not auth or auth.password != app.config['BACKEND_PASSWORD']: + return 'You have to provide the correct password', 401 + return f(*args, **kwargs) + return decorated_function
1
0
0
0
[copr] bkabrda-workspace: Add status for builds, enable updating and displaying data submitted by backend (86b8246)
by bkabrda@fedoraproject.org
19 Nov '12
19 Nov '12
Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : bkabrda-workspace >--------------------------------------------------------------- commit 86b8246ae99070481e78eac9e86edacd8d99ea7d Author: Bohuslav Kabrda <bkabrda(a)redhat.com> Date: Mon Nov 19 13:19:30 2012 +0100 Add status for builds, enable updating and displaying data submitted by backend >--------------------------------------------------------------- ...b_setup.py => 2999fd4de2a7_initial_db_setup.py} | 9 +++++---- wsgi/coprs/logic/builds_logic.py | 5 +++-- wsgi/coprs/models.py | 6 +++++- wsgi/coprs/static/style.css | 6 +++++- wsgi/coprs/views/backend_ns/backend_general.py | 4 ++-- 5 files changed, 20 insertions(+), 10 deletions(-) diff --git a/wsgi/alembic/versions/17aef4202992_initial_db_setup.py b/wsgi/alembic/versions/2999fd4de2a7_initial_db_setup.py similarity index 93% rename from wsgi/alembic/versions/17aef4202992_initial_db_setup.py rename to wsgi/alembic/versions/2999fd4de2a7_initial_db_setup.py index 3d8ce25..8c0f24f 100644 --- a/wsgi/alembic/versions/17aef4202992_initial_db_setup.py +++ b/wsgi/alembic/versions/2999fd4de2a7_initial_db_setup.py @@ -1,13 +1,13 @@ -"""Initial db setup +"""Initial DB setup -Revision ID: 17aef4202992 +Revision ID: 2999fd4de2a7 Revises: None -Create Date: 2012-11-18 16:05:02.407902 +Create Date: 2012-11-19 13:09:17.167104 """ # revision identifiers, used by Alembic. -revision = '17aef4202992' +revision = '2999fd4de2a7' down_revision = None from alembic import op @@ -50,6 +50,7 @@ def upgrade(): sa.Column('started_on', sa.Integer(), nullable=True), sa.Column('ended_on', sa.Integer(), nullable=True), sa.Column('results', sa.Text(), nullable=True), + sa.Column('status', sa.Integer(), nullable=True), sa.Column('memory_reqs', sa.Integer(), nullable=True), sa.Column('timeout', sa.Integer(), nullable=True), sa.Column('user_id', sa.Integer(), nullable=True), diff --git a/wsgi/coprs/logic/builds_logic.py b/wsgi/coprs/logic/builds_logic.py index 2eb6302..f0d297d 100644 --- a/wsgi/coprs/logic/builds_logic.py +++ b/wsgi/coprs/logic/builds_logic.py @@ -45,6 +45,7 @@ class BuildsLogic(object): order_by(models.Build.submitted_on.asc()) return query + @classmethod def get_by_ids(cls, user, ids): return models.Build.query.filter(models.Build.id.in_(ids)) @@ -58,10 +59,10 @@ class BuildsLogic(object): db.session.add(build) @classmethod - def update_from_dict(cls, user, build, upd_dict): + def update_state_from_dict(cls, user, build, upd_dict): for attr in ['results', 'started_on', 'ended_on', 'status']: value = upd_dict.get(attr, None) - if value: + if value != None: setattr(build, attr, value) db.session.add(build) diff --git a/wsgi/coprs/models.py b/wsgi/coprs/models.py index 1061678..e58109f 100644 --- a/wsgi/coprs/models.py +++ b/wsgi/coprs/models.py @@ -134,6 +134,7 @@ class Build(db.Model, Serializer): started_on = db.Column(db.Integer) ended_on = db.Column(db.Integer) results = db.Column(db.Text) + status = db.Column(db.Integer) memory_reqs = db.Column(db.Integer, default = constants.DEFAULT_BUILD_MEMORY) timeout = db.Column(db.Integer, default = constants.DEFAULT_BUILD_TIMEOUT) @@ -151,7 +152,10 @@ class Build(db.Model, Serializer): return 'pending' if not self.ended_on: return 'running' - return 'finished' + if self.status == 1: + return 'succeeded' + + return 'failed' @property def cancelable(self): diff --git a/wsgi/coprs/static/style.css b/wsgi/coprs/static/style.css index df2fdfe..7e31251 100644 --- a/wsgi/coprs/static/style.css +++ b/wsgi/coprs/static/style.css @@ -91,10 +91,14 @@ tr.build-running { color: #FF6600; } -tr.build-finished { +tr.build-succeeded { color: #22DD22; } +tr.build-failed { + color: #DD2222; +} + tr.build-canceled { color: #CDC90C; } diff --git a/wsgi/coprs/views/backend_ns/backend_general.py b/wsgi/coprs/views/backend_ns/backend_general.py index cc85ca8..0d20623 100644 --- a/wsgi/coprs/views/backend_ns/backend_general.py +++ b/wsgi/coprs/views/backend_ns/backend_general.py @@ -31,8 +31,8 @@ def update_builds(): existing[build.id] = build for build in flask.request.json['builds']: # actually update existing builds - builds_logic.BuildsLogic.update_from_dict(None, existing[build['id']], build) + builds_logic.BuildsLogic.update_state_from_dict(None, existing[build['id']], build) db.session.commit() - return json.dumps({'updated_builds': len(existing)}) + return flask.json.dumps({'updated_builds': len(existing)})
1
0
0
0
[copr] bkabrda-workspace: Enable updating builds by backend (e6960cb)
by bkabrda@fedoraproject.org
19 Nov '12
19 Nov '12
Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : bkabrda-workspace >--------------------------------------------------------------- commit e6960cb537873a59c0de1ccfef3e753bd3db33fb Author: Bohuslav Kabrda <bkabrda(a)redhat.com> Date: Mon Nov 19 13:01:03 2012 +0100 Enable updating builds by backend >--------------------------------------------------------------- wsgi/coprs/logic/builds_logic.py | 11 +++++++++++ wsgi/coprs/views/backend_ns/backend_general.py | 20 ++++++++++++++++++++ 2 files changed, 31 insertions(+), 0 deletions(-) diff --git a/wsgi/coprs/logic/builds_logic.py b/wsgi/coprs/logic/builds_logic.py index 35c2c9d..2eb6302 100644 --- a/wsgi/coprs/logic/builds_logic.py +++ b/wsgi/coprs/logic/builds_logic.py @@ -45,6 +45,8 @@ class BuildsLogic(object): order_by(models.Build.submitted_on.asc()) return query + def get_by_ids(cls, user, ids): + return models.Build.query.filter(models.Build.id.in_(ids)) @classmethod def new(cls, user, build, copr, check_authorized = True): @@ -56,6 +58,15 @@ class BuildsLogic(object): db.session.add(build) @classmethod + def update_from_dict(cls, user, build, upd_dict): + for attr in ['results', 'started_on', 'ended_on', 'status']: + value = upd_dict.get(attr, None) + if value: + setattr(build, attr, value) + + 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.') diff --git a/wsgi/coprs/views/backend_ns/backend_general.py b/wsgi/coprs/views/backend_ns/backend_general.py index 7b92e56..cc85ca8 100644 --- a/wsgi/coprs/views/backend_ns/backend_general.py +++ b/wsgi/coprs/views/backend_ns/backend_general.py @@ -16,3 +16,23 @@ def waiting_builds(): '__columns_except__': ['chroots', 'repos'], '__included_ids__': False}, '__included_ids__': False}) for build in builds]}) + +(a)backend_ns.route('/update_builds/', methods = ['POST', 'PUT']) +def update_builds(): + build_ids = [] + for build in flask.request.json['builds']: # first get ids of sent builds + build_ids.append(build['id']) + + if not build_ids: + return json.dumps({'warning': 'No parsed builds'}) + + existing = {} # create a dict of existing builds {build.id: build, ...} + for build in builds_logic.BuildsLogic.get_by_ids(None, build_ids).all(): + existing[build.id] = build + + for build in flask.request.json['builds']: # actually update existing builds + builds_logic.BuildsLogic.update_from_dict(None, existing[build['id']], build) + + db.session.commit() + + return json.dumps({'updated_builds': len(existing)})
1
0
0
0
[copr] bkabrda-workspace: Extract logic from waiting builds (1fcb1a3)
by bkabrda@fedorahosted.org
19 Nov '12
19 Nov '12
Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : bkabrda-workspace >--------------------------------------------------------------- commit 1fcb1a3a18e5ad471cbe285430531f158d8ed9fa Author: Bohuslav Kabrda <bkabrda(a)redhat.com> Date: Mon Nov 19 11:44:06 2012 +0100 Extract logic from waiting builds >--------------------------------------------------------------- wsgi/coprs/logic/builds_logic.py | 13 +++++++++++++ wsgi/coprs/views/backend_ns/backend_general.py | 11 ++++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/wsgi/coprs/logic/builds_logic.py b/wsgi/coprs/logic/builds_logic.py index 07831c2..35c2c9d 100644 --- a/wsgi/coprs/logic/builds_logic.py +++ b/wsgi/coprs/logic/builds_logic.py @@ -34,6 +34,19 @@ class BuildsLogic(object): return query @classmethod + def get_waiting_builds(cls, user): + # this has very different goal then get_multiple, so implement it alone + query = models.Build.query.join(models.Build.copr).\ + join(models.User).\ + options(db.contains_eager(models.Build.copr)).\ + options(db.contains_eager('copr.owner')).\ + filter(models.Build.started_on == None).\ + filter(models.Build.canceled != True).\ + order_by(models.Build.submitted_on.asc()) + return query + + + @classmethod def new(cls, user, build, copr, check_authorized = True): if check_authorized: if not user.can_build_in(copr): diff --git a/wsgi/coprs/views/backend_ns/backend_general.py b/wsgi/coprs/views/backend_ns/backend_general.py index 01e4829..7b92e56 100644 --- a/wsgi/coprs/views/backend_ns/backend_general.py +++ b/wsgi/coprs/views/backend_ns/backend_general.py @@ -3,18 +3,15 @@ import flask from coprs import db from coprs import models +from coprs.logic import builds_logic + from coprs.views.backend_ns import backend_ns @backend_ns.route('/waiting_builds/') def waiting_builds(): - query = db.session.query(models.Build, models.Copr, models.User).\ - join(models.Build.copr).\ - join(models.Copr.owner).\ - filter(models.Build.started_on == None).\ - filter(models.Build.canceled != True).\ - order_by(models.Build.submitted_on.asc())[0:10] + query = builds_logic.BuildsLogic.get_waiting_builds(None) - builds = map(lambda x: x[0], query) + builds = query[0:10] return flask.jsonify({'builds': [build.to_dict(options = {'copr': {'owner': {'__columns_except__': ['openid_name', 'proven'] }, '__columns_except__': ['chroots', 'repos'], '__included_ids__': False},
1
0
0
0
[copr] bkabrda-workspace: Restructured the app to be more consistent (a8b23b8)
by bkabrda@fedoraproject.org
19 Nov '12
19 Nov '12
Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : bkabrda-workspace >--------------------------------------------------------------- commit a8b23b8a1b61bbc5c501ca9b1a348bd3ad6ea6d2 Author: Bohuslav Kabrda <bkabrda(a)redhat.com> Date: Mon Nov 19 10:23:23 2012 +0100 Restructured the app to be more consistent >--------------------------------------------------------------- wsgi/coprs/__init__.py | 14 ++++++++------ wsgi/coprs/views/backend_ns/__init__.py | 3 +++ .../backend_general.py} | 4 ++-- wsgi/coprs/views/coprs_ns/__init__.py | 3 +++ .../views/coprs_ns/{builds.py => coprs_builds.py} | 2 +- .../coprs_ns/{general.py => coprs_general.py} | 6 ++---- 6 files changed, 19 insertions(+), 13 deletions(-) diff --git a/wsgi/coprs/__init__.py b/wsgi/coprs/__init__.py index 690ef09..b921968 100644 --- a/wsgi/coprs/__init__.py +++ b/wsgi/coprs/__init__.py @@ -32,15 +32,17 @@ def page_not_found(message): import coprs.models import coprs.filters -from coprs.views.coprs_ns import builds # this uses coprs_ns blueprint -from coprs.views.coprs_ns import general +from coprs.views import coprs_ns +from coprs.views.coprs_ns import coprs_builds +from coprs.views.coprs_ns import coprs_general +from coprs.views import backend_ns +from coprs.views.backend_ns import backend_general from coprs.views import misc -from coprs.views import waiting_builds -app.register_blueprint(general.coprs_ns) +app.register_blueprint(coprs_ns.coprs_ns) app.register_blueprint(misc.misc) -app.register_blueprint(waiting_builds.waiting_builds_ns) +app.register_blueprint(backend_ns.backend_ns) @app.route("/") def start(): - return general.coprs_show() + return coprs_general.coprs_show() diff --git a/wsgi/coprs/views/backend_ns/__init__.py b/wsgi/coprs/views/backend_ns/__init__.py new file mode 100644 index 0000000..7386bd5 --- /dev/null +++ b/wsgi/coprs/views/backend_ns/__init__.py @@ -0,0 +1,3 @@ +import flask + +backend_ns = flask.Blueprint('backend_ns', __name__, url_prefix = '/backend') diff --git a/wsgi/coprs/views/waiting_builds.py b/wsgi/coprs/views/backend_ns/backend_general.py similarity index 88% rename from wsgi/coprs/views/waiting_builds.py rename to wsgi/coprs/views/backend_ns/backend_general.py index a748168..01e4829 100644 --- a/wsgi/coprs/views/waiting_builds.py +++ b/wsgi/coprs/views/backend_ns/backend_general.py @@ -3,9 +3,9 @@ import flask from coprs import db from coprs import models -waiting_builds_ns = flask.Blueprint('waiting_builds', __name__, url_prefix = '/waiting_builds') +from coprs.views.backend_ns import backend_ns -(a)waiting_builds_ns.route('/') +(a)backend_ns.route('/waiting_builds/') def waiting_builds(): query = db.session.query(models.Build, models.Copr, models.User).\ join(models.Build.copr).\ diff --git a/wsgi/coprs/views/coprs_ns/__init__.py b/wsgi/coprs/views/coprs_ns/__init__.py index e69de29..03a1fe1 100644 --- a/wsgi/coprs/views/coprs_ns/__init__.py +++ b/wsgi/coprs/views/coprs_ns/__init__.py @@ -0,0 +1,3 @@ +import flask + +coprs_ns = flask.Blueprint('coprs_ns', __name__, url_prefix = '/coprs') diff --git a/wsgi/coprs/views/coprs_ns/builds.py b/wsgi/coprs/views/coprs_ns/coprs_builds.py similarity index 98% rename from wsgi/coprs/views/coprs_ns/builds.py rename to wsgi/coprs/views/coprs_ns/coprs_builds.py index d5e00cd..1f1ac53 100644 --- a/wsgi/coprs/views/coprs_ns/builds.py +++ b/wsgi/coprs/views/coprs_ns/coprs_builds.py @@ -12,7 +12,7 @@ from coprs.logic import builds_logic from coprs.logic import coprs_logic from coprs.views.misc import login_required -from coprs.views.coprs_ns.general import coprs_ns +from coprs.views.coprs_ns import coprs_ns @coprs_ns.route('/detail/<username>/<coprname>/builds/', defaults = {'page': 1}) @coprs_ns.route('/detail/<username>/<coprname>/builds/<int:page>/') diff --git a/wsgi/coprs/views/coprs_ns/general.py b/wsgi/coprs/views/coprs_ns/coprs_general.py similarity index 98% rename from wsgi/coprs/views/coprs_ns/general.py rename to wsgi/coprs/views/coprs_ns/coprs_general.py index c4a0fbb..a4e34a6 100644 --- a/wsgi/coprs/views/coprs_ns/general.py +++ b/wsgi/coprs/views/coprs_ns/coprs_general.py @@ -7,11 +7,9 @@ from coprs import models from coprs.views.misc import login_required -from coprs.logic import coprs_logic +from coprs.views.coprs_ns import coprs_ns -coprs_ns = flask.Blueprint('coprs_ns', - __name__, - url_prefix = '/coprs') +from coprs.logic import coprs_logic @coprs_ns.route('/', defaults = {'page': 1}) @coprs_ns.route('/<int:page>/')
1
0
0
0
[copr] bkabrda-workspace: Keep commits in views (ffa1793)
by bkabrda@fedorahosted.org
19 Nov '12
19 Nov '12
Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : bkabrda-workspace >--------------------------------------------------------------- commit ffa17939b2a414227889435ef2d4b6882383d544 Author: Bohuslav Kabrda <bkabrda(a)redhat.com> Date: Mon Nov 19 10:04:40 2012 +0100 Keep commits in views >--------------------------------------------------------------- wsgi/coprs/logic/coprs_logic.py | 2 -- wsgi/coprs/views/coprs_ns/general.py | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/wsgi/coprs/logic/coprs_logic.py b/wsgi/coprs/logic/coprs_logic.py index f4ee668..e39347c 100644 --- a/wsgi/coprs/logic/coprs_logic.py +++ b/wsgi/coprs/logic/coprs_logic.py @@ -49,14 +49,12 @@ class CoprsLogic(object): 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): diff --git a/wsgi/coprs/views/coprs_ns/general.py b/wsgi/coprs/views/coprs_ns/general.py index 4ed669e..c4a0fbb 100644 --- a/wsgi/coprs/views/coprs_ns/general.py +++ b/wsgi/coprs/views/coprs_ns/general.py @@ -62,6 +62,7 @@ def copr_new(): repos = form.repos.data.replace('\n', ' '), owner = flask.g.user) coprs_logic.CoprsLogic.new(flask.g.user, copr, check_for_duplicates = False) # form validation checks for duplicates + db.session.commit() flask.flash('New entry was successfully posted') return flask.redirect(flask.url_for('coprs_ns.coprs_show')) @@ -117,6 +118,7 @@ def copr_update(username, coprname): copr.repos = form.repos.data.replace('\n', ' ') coprs_logic.CoprsLogic.update(flask.g.user, copr, check_for_duplicates = False) # form validation checks for duplicates + db.session.commit() flask.flash('Copr was updated successfully.') return flask.redirect(flask.url_for('coprs_ns.copr_detail', username = username, coprname = form.name.data)) else:
1
0
0
0
[copr] bkabrda-workspace: Transfer the builds logic into separate file (5c0f58a)
by bkabrda@fedoraproject.org
19 Nov '12
19 Nov '12
Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : bkabrda-workspace >--------------------------------------------------------------- commit 5c0f58a895a4e4cae84c6c457a778e0fcded28c9 Author: Bohuslav Kabrda <bkabrda(a)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')
1
0
0
0
[copr] bkabrda-workspace: Remove unneeded import (902b5ec)
by bkabrda@fedorahosted.org
19 Nov '12
19 Nov '12
Repository :
http://git.fedorahosted.org/cgit/copr.git
On branch : bkabrda-workspace >--------------------------------------------------------------- commit 902b5ec3c29ce730b5346916b78c5f0f8b952a42 Author: Bohuslav Kabrda <bkabrda(a)redhat.com> Date: Mon Nov 19 08:43:50 2012 +0100 Remove unneeded import >--------------------------------------------------------------- wsgi/coprs/logic/coprs_logic.py | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/wsgi/coprs/logic/coprs_logic.py b/wsgi/coprs/logic/coprs_logic.py index 6b639ba..436621f 100644 --- a/wsgi/coprs/logic/coprs_logic.py +++ b/wsgi/coprs/logic/coprs_logic.py @@ -1,5 +1,3 @@ -import flask - from coprs import db from coprs import exceptions from coprs import models
1
0
0
0
← Newer
1
...
4
5
6
7
8
9
10
11
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
Results per page:
10
25
50
100
200