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