1 import flask
2 from flask import request, render_template, stream_with_context
3
4 from copr_common.enums import StatusEnum
5 from coprs import app
6 from coprs import db
7 from coprs import forms
8 from coprs import helpers
9
10 from coprs.logic import builds_logic
11 from coprs.logic.builds_logic import BuildsLogic
12 from coprs.logic.complex_logic import ComplexLogic
13
14 from coprs.views.misc import (login_required, req_with_copr,
15 req_with_copr, send_build_icon)
16 from coprs.views.coprs_ns import coprs_ns
17
18 from coprs.exceptions import (ActionInProgressException,
19 InsufficientRightsException,
20 UnrepeatableBuildException)
28
29
30 @coprs_ns.route("/build/<int:build_id>/status_image.png")
31 -def copr_build_icon(build_id):
33
34
35
36
37 @coprs_ns.route("/<username>/<coprname>/build/<int:build_id>/")
38 @coprs_ns.route("/g/<group_name>/<coprname>/build/<int:build_id>/")
39 @req_with_copr
40 -def copr_build(copr, build_id):
42
47
48
49
50
51 @coprs_ns.route("/<username>/<coprname>/builds/")
52 @coprs_ns.route("/g/<group_name>/<coprname>/builds/")
53 @req_with_copr
54 -def copr_builds(copr):
56
71
72
73
74 @coprs_ns.route("/<username>/<coprname>/add_build/")
75 @coprs_ns.route("/g/<group_name>/<coprname>/add_build/")
76 @login_required
77 @req_with_copr
78 -def copr_add_build(copr, form=None):
81
88
89
90 @coprs_ns.route("/<username>/<coprname>/new_build/", methods=["POST"])
91 @coprs_ns.route("/g/<group_name>/<coprname>/new_build/", methods=["POST"])
92 @login_required
93 @req_with_copr
94 -def copr_new_build(copr):
99
102 def factory(**build_options):
103 pkgs = form.pkgs.data.split("\n")
104 for pkg in pkgs:
105 BuildsLogic.create_new_from_url(
106 flask.g.user, copr, pkg,
107 chroot_names=form.selected_chroots,
108 **build_options
109 )
110 for pkg in pkgs:
111 flask.flash("New build has been created: {}".format(pkg), "success")
112
113 form = forms.BuildFormUrlFactory(copr.active_chroots)()
114 return process_new_build(copr, form, factory, render_add_build,
115 add_view, url_on_success, msg_on_success=False)
116
117
118 -def process_new_build(copr, form, create_new_build_factory, add_function, add_view, url_on_success, msg_on_success=True):
119 if form.validate_on_submit():
120 build_options = {
121 "enable_net": form.enable_net.data,
122 "timeout": form.timeout.data,
123 }
124
125 try:
126 create_new_build_factory(**build_options)
127 db.session.commit()
128 except (ActionInProgressException, InsufficientRightsException, UnrepeatableBuildException) as e:
129 db.session.rollback()
130 flask.flash(str(e), "error")
131 else:
132 if msg_on_success:
133 flask.flash("New build has been created.", "success")
134
135 return flask.redirect(url_on_success)
136 else:
137 return add_function(copr, form, add_view)
138
139
140
141
142 @coprs_ns.route("/<username>/<coprname>/add_build_scm/")
143 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_scm/")
144 @login_required
145 @req_with_copr
146 -def copr_add_build_scm(copr, form=None):
149
156
157
158 @coprs_ns.route("/<username>/<coprname>/new_build_scm/", methods=["POST"])
159 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_scm/", methods=["POST"])
160 @login_required
161 @req_with_copr
162 -def copr_new_build_scm(copr):
166
182 form = forms.BuildFormScmFactory(copr.active_chroots)()
183 return process_new_build(copr, form, factory, render_add_build_scm, add_view, url_on_success)
184
185
186
187
188 @coprs_ns.route("/<username>/<coprname>/add_build_pypi/")
189 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_pypi/")
190 @login_required
191 @req_with_copr
192 -def copr_add_build_pypi(copr, form=None):
195
202
203
204 @coprs_ns.route("/<username>/<coprname>/new_build_pypi/", methods=["POST"])
205 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_pypi/", methods=["POST"])
206 @login_required
207 @req_with_copr
208 -def copr_new_build_pypi(copr):
212
226 form = forms.BuildFormPyPIFactory(copr.active_chroots)()
227 return process_new_build(copr, form, factory, render_add_build_pypi, add_view, url_on_success)
228
229
230
231
232 @coprs_ns.route("/<username>/<coprname>/add_build_rubygems/")
233 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_rubygems/")
234 @login_required
235 @req_with_copr
236 -def copr_add_build_rubygems(copr, form=None):
239
246
247
248 @coprs_ns.route("/<username>/<coprname>/new_build_rubygems/", methods=["POST"])
249 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_rubygems/", methods=["POST"])
250 @login_required
251 @req_with_copr
252 -def copr_new_build_rubygems(copr):
256
267 form = forms.BuildFormRubyGemsFactory(copr.active_chroots)()
268 return process_new_build(copr, form, factory, render_add_build_rubygems, add_view, url_on_success)
269
270
271
272 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_custom/", methods=["POST"])
273 @coprs_ns.route("/<username>/<coprname>/new_build_custom/", methods=["POST"])
274 @login_required
275 @req_with_copr
276 -def copr_new_build_custom(copr):
294
295 form = forms.BuildFormCustomFactory(copr.active_chroots)()
296
297 return process_new_build(copr, form, factory, render_add_build_custom,
298 view, url_on_success)
299
300
301
302 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_custom/")
303 @coprs_ns.route("/<username>/<coprname>/add_build_custom/")
304 @login_required
305 @req_with_copr
306 -def copr_add_build_custom(copr, form=None):
309
315
316
317
318
319 @coprs_ns.route("/<username>/<coprname>/add_build_upload/")
320 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_upload/")
321 @login_required
322 @req_with_copr
323 -def copr_add_build_upload(copr, form=None):
326
333
334
335 @coprs_ns.route("/<username>/<coprname>/new_build_upload/", methods=["POST"])
336 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_upload/", methods=["POST"])
337 @login_required
338 @req_with_copr
339 -def copr_new_build_upload(copr):
343
354 form = forms.BuildFormUploadFactory(copr.active_chroots)()
355 return process_new_build(copr, form, factory, render_add_build_upload, add_view, url_on_success)
356
357
358
359
360 @coprs_ns.route("/<username>/<coprname>/new_build_rebuild/<int:build_id>/", methods=["POST"])
361 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_rebuild/<int:build_id>/", methods=["POST"])
362 @login_required
363 @req_with_copr
364 -def copr_new_build_rebuild(copr, build_id):
368
378 form = forms.BuildFormRebuildFactory.create_form_cls(copr.active_chroots)()
379 return process_new_build(copr, form, factory, render_add_build, view, url_on_success)
380
381
382
383
384 @coprs_ns.route("/<username>/<coprname>/repeat_build/<int:build_id>/", methods=["GET", "POST"])
385 @coprs_ns.route("/g/<group_name>/<coprname>/repeat_build/<int:build_id>/", methods=["GET", "POST"])
386 @login_required
387 @req_with_copr
388 -def copr_repeat_build(copr, build_id):
390
393 build = ComplexLogic.get_build_safe(build_id)
394 if not flask.g.user.can_build_in(build.copr):
395 flask.flash("You are not allowed to repeat this build.")
396
397 if build.source_type == helpers.BuildSourceEnum('upload'):
398
399
400 available_chroots = build.chroots
401
402 else:
403
404
405 available_chroots = copr.active_chroots
406
407 form = forms.BuildFormRebuildFactory.create_form_cls(available_chroots)(
408 build_id=build_id, enable_net=build.enable_net)
409
410
411 for ch in available_chroots:
412 field = getattr(form, ch.name)
413 field.data = False
414 chroot_to_build = request.args.get("chroot")
415 app.logger.debug("got param chroot: {}".format(chroot_to_build))
416 if chroot_to_build:
417
418 if hasattr(form, chroot_to_build):
419 getattr(form, chroot_to_build).data = True
420 else:
421 build_chroot_names = set(ch.name for ch in build.chroots)
422 build_failed_chroot_names = set(ch.name for ch in build.get_chroots_by_status([
423 StatusEnum('failed'), StatusEnum('canceled'),
424 ]))
425 for ch in available_chroots:
426
427 if (ch.name not in build_chroot_names) or (ch.name in build_failed_chroot_names):
428 getattr(form, ch.name).data = True
429 return flask.render_template(
430 "coprs/detail/add_build/rebuild.html",
431 copr=copr, build=build, form=form)
432
445
446
447 @coprs_ns.route("/<username>/<coprname>/cancel_build/<int:build_id>/", methods=["POST"])
448 @coprs_ns.route("/g/<group_name>/<coprname>/cancel_build/<int:build_id>/", methods=["POST"])
449 @login_required
450 @req_with_copr
451 -def copr_cancel_build(copr, build_id):
455
456
457
458
459 @coprs_ns.route("/<username>/<coprname>/delete_build/<int:build_id>/",
460 methods=["POST"])
474
475
476
477 @coprs_ns.route("/<username>/<coprname>/delete_builds/", methods=["POST"])
478 @coprs_ns.route("/g/<group_name>/<coprname>/delete_builds/", methods=["POST"])
479 @login_required
480 @req_with_copr
481 -def copr_delete_builds(copr):
495