1 import flask
2 import sys
3 import time
4
5 from coprs import db
6 from coprs.logic import actions_logic
7 from coprs.logic import builds_logic
8
9 from coprs.views import misc
10 from coprs.views.backend_ns import backend_ns
11 from whoosh.index import LockError
16 """
17 Return list of waiting actions and builds.
18 """
19
20
21 actions_list = [action.to_dict(
22 options={'__columns_except__': ['result', 'message', 'ended_on']})
23 for action in actions_logic.ActionsLogic.get_waiting()
24 ]
25
26
27 builds_list = []
28
29 for build in builds_logic.BuildsLogic.get_waiting():
30 build_dict = build.to_dict(
31 options={'copr': {'owner': {},
32 '__columns_only__': ['id', 'name'],
33 '__included_ids__': False
34 },
35 '__included_ids__': False})
36
37
38
39 for chroot in build.chroots:
40 build_dict_copy = build_dict.copy()
41 build_dict_copy['chroot'] = chroot.name
42 build_dict_copy['buildroot_pkgs'] = build.copr.buildroot_pkgs(chroot)
43 builds_list.append(build_dict_copy)
44
45 return flask.jsonify({'actions': actions_list, 'builds': builds_list})
46
51 result = {}
52
53 for typ, logic_cls in [('actions', actions_logic.ActionsLogic),
54 ('builds', builds_logic.BuildsLogic)]:
55
56 if typ not in flask.request.json:
57 continue
58
59 to_update = {}
60 for obj in flask.request.json[typ]:
61 to_update[obj['id']] = obj
62
63 existing = {}
64 for obj in logic_cls.get_by_ids(to_update.keys()).all():
65 existing[obj.id] = obj
66
67 non_existing_ids = list(set(to_update.keys()) - set(existing.keys()))
68
69 for i, obj in existing.items():
70 logic_cls.update_state_from_dict(obj, to_update[i])
71
72 i = 5
73 exc_info = None
74 while i > 0:
75 try:
76 db.session.commit()
77 i = -100
78 except LockError:
79 i -= 1
80 exc_info = sys.exc_info()[2]
81 time.sleep(5)
82 if i != -100:
83 raise LockError, None, exc_info
84
85 result.update({'updated_{0}_ids'.format(typ): list(existing.keys()),
86 'non_existing_{0}_ids'.format(typ): non_existing_ids})
87
88 return flask.jsonify(result)
89