1 import flask
2 from flask import request, render_template, url_for, stream_with_context
3 import re
4 import os
5 import shutil
6 import tempfile
7
8 from werkzeug import secure_filename
9
10 from coprs import app
11 from coprs import db
12 from coprs import forms
13 from coprs import helpers
14
15 from coprs.logic import builds_logic
16 from coprs.logic import coprs_logic
17 from coprs.logic.builds_logic import BuildsLogic
18 from coprs.logic.complex_logic import ComplexLogic
19
20 from coprs.views.misc import login_required, page_not_found, req_with_copr, req_with_copr
21 from coprs.views.coprs_ns import coprs_ns
22
23 from coprs.exceptions import (ActionInProgressException,
24 InsufficientRightsException,)
43
44
45
46
47 @coprs_ns.route("/<username>/<coprname>/build/<int:build_id>/")
48 @req_with_copr
49 -def copr_build(copr, build_id):
51
52
53 @coprs_ns.route("/g/<group_name>/<coprname>/build/<int:build_id>/")
54 @req_with_copr
55 -def group_copr_build(copr, build_id):
57
62
63
64
65
66 @coprs_ns.route("/<username>/<coprname>/builds/")
67 @req_with_copr
68 -def copr_builds(copr):
70
71
72 @coprs_ns.route("/g/<group_name>/<coprname>/builds/")
73 @req_with_copr
74 -def group_copr_builds(copr):
76
83
84
85
86
87 @coprs_ns.route("/<username>/<coprname>/add_build/")
88 @login_required
89 @req_with_copr
90 -def copr_add_build(copr, form=None):
93
94
95 @coprs_ns.route("/g/<group_name>/<coprname>/add_build/")
96 @login_required
97 @req_with_copr
98 -def group_copr_add_build(copr, form=None):
101
108
109
110 @coprs_ns.route("/<username>/<coprname>/new_build/", methods=["POST"])
120
121
122 @coprs_ns.route("/g/<group_name>/<coprname>/new_build/", methods=["POST"])
132
135 def factory(**build_options):
136 pkgs = form.pkgs.data.split("\n")
137 for pkg in pkgs:
138 BuildsLogic.create_new_from_url(
139 flask.g.user, copr, pkg,
140 chroot_names=form.selected_chroots,
141 **build_options
142 )
143 for pkg in pkgs:
144 flask.flash("New build has been created: {}".format(pkg), "success")
145
146 form = forms.BuildFormUrlFactory(copr.active_chroots)()
147 return process_new_build(copr, form, factory, render_add_build,
148 add_view, url_on_success, msg_on_success=False)
149
150
151 -def process_new_build(copr, form, create_new_build_factory, add_function, add_view, url_on_success, msg_on_success=True):
152 if form.validate_on_submit():
153 build_options = {
154 "enable_net": form.enable_net.data,
155 "timeout": form.timeout.data,
156 }
157
158 try:
159 create_new_build_factory(**build_options)
160 db.session.commit()
161 except (ActionInProgressException, InsufficientRightsException) as e:
162 db.session.rollback()
163 flask.flash(str(e), "error")
164 else:
165 if msg_on_success:
166 flask.flash("New build has been created.", "success")
167
168 return flask.redirect(url_on_success)
169 else:
170 return add_function(copr, form, add_view)
171
172
173
174
175 @coprs_ns.route("/<username>/<coprname>/add_build_scm/")
176 @login_required
177 @req_with_copr
178 -def copr_add_build_scm(copr, form=None):
181
182
183 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_scm/")
184 @login_required
185 @req_with_copr
186 -def group_copr_add_build_scm(copr, form=None):
189
196
197
198 @coprs_ns.route("/<username>/<coprname>/new_build_scm/", methods=["POST"])
206
207
208 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_scm/", methods=["POST"])
216
232 form = forms.BuildFormScmFactory(copr.active_chroots)()
233 return process_new_build(copr, form, factory, render_add_build_scm, add_view, url_on_success)
234
235
236
237
238 @coprs_ns.route("/<username>/<coprname>/add_build_pypi/")
239 @login_required
240 @req_with_copr
241 -def copr_add_build_pypi(copr, form=None):
244
245
246 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_pypi/")
247 @login_required
248 @req_with_copr
249 -def group_copr_add_build_pypi(copr, form=None):
252
259
260
261 @coprs_ns.route("/<username>/<coprname>/new_build_pypi/", methods=["POST"])
269
270
271 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_pypi/", methods=["POST"])
279
292 form = forms.BuildFormPyPIFactory(copr.active_chroots)()
293 return process_new_build(copr, form, factory, render_add_build_pypi, add_view, url_on_success)
294
295
296
297
298 @coprs_ns.route("/<username>/<coprname>/add_build_rubygems/")
299 @login_required
300 @req_with_copr
301 -def copr_add_build_rubygems(copr, form=None):
304
305
306 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_rubygems/")
307 @login_required
308 @req_with_copr
309 -def group_copr_add_build_rubygems(copr, form=None):
312
319
320
321 @coprs_ns.route("/<username>/<coprname>/new_build_rubygems/", methods=["POST"])
329
330
331 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_rubygems/", methods=["POST"])
339
350 form = forms.BuildFormRubyGemsFactory(copr.active_chroots)()
351 return process_new_build(copr, form, factory, render_add_build_rubygems, add_view, url_on_success)
352
353
354
355
356 @coprs_ns.route("/<username>/<coprname>/add_build_upload/")
357 @login_required
358 @req_with_copr
359 -def copr_add_build_upload(copr, form=None):
362
363
364 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_upload/")
365 @login_required
366 @req_with_copr
367 -def group_copr_add_build_upload(copr, form=None):
370
377
378
379 @coprs_ns.route("/<username>/<coprname>/new_build_upload/", methods=["POST"])
387
388
389 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_upload/", methods=["POST"])
397
408 form = forms.BuildFormUploadFactory(copr.active_chroots)()
409 return process_new_build(copr, form, factory, render_add_build_upload, add_view, url_on_success)
410
411
412
413
414 @coprs_ns.route("/<username>/<coprname>/new_build_rebuild/<int:build_id>/", methods=["POST"])
424
425
426 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_rebuild/<int:build_id>/", methods=["POST"])
436
446 form = forms.BuildFormRebuildFactory.create_form_cls(copr.active_chroots)()
447 return process_new_build(copr, form, factory, render_add_build, view, url_on_success)
448
449
450
451
452 @coprs_ns.route("/<username>/<coprname>/repeat_build/<int:build_id>/",
453 methods=["GET", "POST"])
458
459
460 @coprs_ns.route("/g/<group_name>/<coprname>/repeat_build/<int:build_id>/",
461 methods=["GET", "POST"])
466
469 build = ComplexLogic.get_build_safe(build_id)
470 if not flask.g.user.can_build_in(build.copr):
471 flask.flash("You are not allowed to repeat this build.")
472
473 if build.source_type == helpers.BuildSourceEnum('upload'):
474
475
476 available_chroots = build.chroots
477
478 else:
479
480
481 available_chroots = copr.active_chroots
482
483 form = forms.BuildFormRebuildFactory.create_form_cls(available_chroots)(
484 build_id=build_id, enable_net=build.enable_net)
485
486
487 for ch in available_chroots:
488 field = getattr(form, ch.name)
489 field.data = False
490 chroot_to_build = request.args.get("chroot")
491 app.logger.debug("got param chroot: {}".format(chroot_to_build))
492 if chroot_to_build:
493
494 if hasattr(form, chroot_to_build):
495 getattr(form, chroot_to_build).data = True
496 else:
497 build_chroot_names = set(ch.name for ch in build.chroots)
498 build_failed_chroot_names = set(ch.name for ch in build.get_chroots_by_status([
499 helpers.StatusEnum('failed'), helpers.StatusEnum('canceled'),
500 ]))
501 for ch in available_chroots:
502
503 if (ch.name not in build_chroot_names) or (ch.name in build_failed_chroot_names):
504 getattr(form, ch.name).data = True
505 return flask.render_template(
506 "coprs/detail/add_build/rebuild.html",
507 copr=copr, build=build, form=form)
508
521
522
523 @coprs_ns.route("/<username>/<coprname>/cancel_build/<int:build_id>/",
524 methods=["POST"])
530
531
532 @coprs_ns.route("/g/<group_name>/<coprname>/cancel_build/<int:build_id>/",
533 methods=["POST"])
538
539
540
541
542 @coprs_ns.route("/<username>/<coprname>/delete_build/<int:build_id>/",
543 methods=["POST"])
557