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)})