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):
66
67
68
69 @coprs_ns.route("/<username>/<coprname>/add_build/")
70 @coprs_ns.route("/g/<group_name>/<coprname>/add_build/")
71 @login_required
72 @req_with_copr
73 -def copr_add_build(copr, form=None):
76
83
84
85 @coprs_ns.route("/<username>/<coprname>/new_build/", methods=["POST"])
86 @coprs_ns.route("/g/<group_name>/<coprname>/new_build/", methods=["POST"])
87 @login_required
88 @req_with_copr
89 -def copr_new_build(copr):
94
97 def factory(**build_options):
98 pkgs = form.pkgs.data.split("\n")
99 for pkg in pkgs:
100 BuildsLogic.create_new_from_url(
101 flask.g.user, copr, pkg,
102 chroot_names=form.selected_chroots,
103 **build_options
104 )
105 for pkg in pkgs:
106 flask.flash("New build has been created: {}".format(pkg), "success")
107
108 form = forms.BuildFormUrlFactory(copr.active_chroots)()
109 return process_new_build(copr, form, factory, render_add_build,
110 add_view, url_on_success, msg_on_success=False)
111
112
113 -def process_new_build(copr, form, create_new_build_factory, add_function, add_view, url_on_success, msg_on_success=True):
114 if form.validate_on_submit():
115 build_options = {
116 "enable_net": form.enable_net.data,
117 "timeout": form.timeout.data,
118 }
119
120 try:
121 create_new_build_factory(**build_options)
122 db.session.commit()
123 except (ActionInProgressException, InsufficientRightsException, UnrepeatableBuildException) as e:
124 db.session.rollback()
125 flask.flash(str(e), "error")
126 else:
127 if msg_on_success:
128 flask.flash("New build has been created.", "success")
129
130 return flask.redirect(url_on_success)
131 else:
132 return add_function(copr, form, add_view)
133
134
135
136
137 @coprs_ns.route("/<username>/<coprname>/add_build_scm/")
138 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_scm/")
139 @login_required
140 @req_with_copr
141 -def copr_add_build_scm(copr, form=None):
144
151
152
153 @coprs_ns.route("/<username>/<coprname>/new_build_scm/", methods=["POST"])
154 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_scm/", methods=["POST"])
155 @login_required
156 @req_with_copr
157 -def copr_new_build_scm(copr):
161
177 form = forms.BuildFormScmFactory(copr.active_chroots)()
178 return process_new_build(copr, form, factory, render_add_build_scm, add_view, url_on_success)
179
180
181
182
183 @coprs_ns.route("/<username>/<coprname>/add_build_pypi/")
184 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_pypi/")
185 @login_required
186 @req_with_copr
187 -def copr_add_build_pypi(copr, form=None):
190
197
198
199 @coprs_ns.route("/<username>/<coprname>/new_build_pypi/", methods=["POST"])
200 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_pypi/", methods=["POST"])
201 @login_required
202 @req_with_copr
203 -def copr_new_build_pypi(copr):
207
221 form = forms.BuildFormPyPIFactory(copr.active_chroots)()
222 return process_new_build(copr, form, factory, render_add_build_pypi, add_view, url_on_success)
223
224
225
226
227 @coprs_ns.route("/<username>/<coprname>/add_build_rubygems/")
228 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_rubygems/")
229 @login_required
230 @req_with_copr
231 -def copr_add_build_rubygems(copr, form=None):
234
241
242
243 @coprs_ns.route("/<username>/<coprname>/new_build_rubygems/", methods=["POST"])
244 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_rubygems/", methods=["POST"])
245 @login_required
246 @req_with_copr
247 -def copr_new_build_rubygems(copr):
251
262 form = forms.BuildFormRubyGemsFactory(copr.active_chroots)()
263 return process_new_build(copr, form, factory, render_add_build_rubygems, add_view, url_on_success)
264
265
266
267 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_custom/", methods=["POST"])
268 @coprs_ns.route("/<username>/<coprname>/new_build_custom/", methods=["POST"])
269 @login_required
270 @req_with_copr
271 -def copr_new_build_custom(copr):
289
290 form = forms.BuildFormCustomFactory(copr.active_chroots)()
291
292 return process_new_build(copr, form, factory, render_add_build_custom,
293 view, url_on_success)
294
295
296
297 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_custom/")
298 @coprs_ns.route("/<username>/<coprname>/add_build_custom/")
299 @login_required
300 @req_with_copr
301 -def copr_add_build_custom(copr, form=None):
304
310
311
312
313
314 @coprs_ns.route("/<username>/<coprname>/add_build_upload/")
315 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_upload/")
316 @login_required
317 @req_with_copr
318 -def copr_add_build_upload(copr, form=None):
321
328
329
330 @coprs_ns.route("/<username>/<coprname>/new_build_upload/", methods=["POST"])
331 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_upload/", methods=["POST"])
332 @login_required
333 @req_with_copr
334 -def copr_new_build_upload(copr):
338
349 form = forms.BuildFormUploadFactory(copr.active_chroots)()
350 return process_new_build(copr, form, factory, render_add_build_upload, add_view, url_on_success)
351
352
353
354
355 @coprs_ns.route("/<username>/<coprname>/new_build_rebuild/<int:build_id>/", methods=["POST"])
356 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_rebuild/<int:build_id>/", methods=["POST"])
357 @login_required
358 @req_with_copr
359 -def copr_new_build_rebuild(copr, build_id):
363
373 form = forms.BuildFormRebuildFactory.create_form_cls(copr.active_chroots)()
374 return process_new_build(copr, form, factory, render_add_build, view, url_on_success)
375
376
377
378
379 @coprs_ns.route("/<username>/<coprname>/repeat_build/<int:build_id>/", methods=["GET", "POST"])
380 @coprs_ns.route("/g/<group_name>/<coprname>/repeat_build/<int:build_id>/", methods=["GET", "POST"])
381 @login_required
382 @req_with_copr
383 -def copr_repeat_build(copr, build_id):
385
388 build = ComplexLogic.get_build_safe(build_id)
389 if not flask.g.user.can_build_in(build.copr):
390 flask.flash("You are not allowed to repeat this build.")
391
392 if build.source_type == helpers.BuildSourceEnum('upload'):
393
394
395 available_chroots = build.chroots
396
397 else:
398
399
400 available_chroots = copr.active_chroots
401
402 form = forms.BuildFormRebuildFactory.create_form_cls(available_chroots)(
403 build_id=build_id, enable_net=build.enable_net)
404
405
406 for ch in available_chroots:
407 field = getattr(form, ch.name)
408 field.data = False
409 chroot_to_build = request.args.get("chroot")
410 app.logger.debug("got param chroot: {}".format(chroot_to_build))
411 if chroot_to_build:
412
413 if hasattr(form, chroot_to_build):
414 getattr(form, chroot_to_build).data = True
415 else:
416 build_chroot_names = set(ch.name for ch in build.chroots)
417 build_failed_chroot_names = set(ch.name for ch in build.get_chroots_by_status([
418 StatusEnum('failed'), StatusEnum('canceled'),
419 ]))
420 for ch in available_chroots:
421
422 if (ch.name not in build_chroot_names) or (ch.name in build_failed_chroot_names):
423 getattr(form, ch.name).data = True
424 return flask.render_template(
425 "coprs/detail/add_build/rebuild.html",
426 copr=copr, build=build, form=form)
427
440
441
442 @coprs_ns.route("/<username>/<coprname>/cancel_build/<int:build_id>/", methods=["POST"])
443 @coprs_ns.route("/g/<group_name>/<coprname>/cancel_build/<int:build_id>/", methods=["POST"])
444 @login_required
445 @req_with_copr
446 -def copr_cancel_build(copr, build_id):
450
451
452
453
454 @coprs_ns.route("/<username>/<coprname>/delete_build/<int:build_id>/",
455 methods=["POST"])
469
470
471
472 @coprs_ns.route("/<username>/<coprname>/delete_builds/", methods=["POST"])
473 @coprs_ns.route("/g/<group_name>/<coprname>/delete_builds/", methods=["POST"])
474 @login_required
475 @req_with_copr
476 -def copr_delete_builds(copr):
490