[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
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):
11 years, 5 months
[copr] bkabrda-workspace: Logic for copr permissions (08ae746)
by bkabrda@fedoraproject.org
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))
11 years, 5 months
[copr] bkabrda-workspace: Use http basic auth for backend (fde6b4a)
by bkabrda@fedoraproject.org
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
11 years, 5 months
[copr] bkabrda-workspace: Add status for builds, enable updating and displaying data submitted by backend (86b8246)
by bkabrda@fedoraproject.org
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)})
11 years, 5 months
[copr] bkabrda-workspace: Enable updating builds by backend (e6960cb)
by bkabrda@fedoraproject.org
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)})
11 years, 5 months
[copr] bkabrda-workspace: Extract logic from waiting builds (1fcb1a3)
by bkabrda@fedorahosted.org
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},
11 years, 5 months
[copr] bkabrda-workspace: Restructured the app to be more consistent (a8b23b8)
by bkabrda@fedoraproject.org
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>/')
11 years, 5 months
[copr] bkabrda-workspace: Keep commits in views (ffa1793)
by bkabrda@fedorahosted.org
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:
11 years, 5 months
[copr] bkabrda-workspace: Transfer the builds logic into separate file (5c0f58a)
by bkabrda@fedoraproject.org
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')
11 years, 5 months
[copr] bkabrda-workspace: Remove unneeded import (902b5ec)
by bkabrda@fedorahosted.org
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
11 years, 5 months