Trees | Indices | Help |
---|
|
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,)28 if copr.is_a_group_project: 29 return url_for("coprs_ns.group_copr_builds", 30 group_name=copr.group.name, coprname=copr.name) 31 else: 32 return url_for("coprs_ns.copr_builds", 33 username=copr.user.username, coprname=copr.name)3438 build = ComplexLogic.get_build_safe(build_id) 39 copr = build.copr 40 if copr.is_a_group_project: 41 return flask.redirect(url_for( 42 "coprs_ns.group_copr_build", 43 group_name=build.copr.group.name, 44 coprname=build.copr.name, 45 build_id=build_id)) 46 else: 47 return flask.redirect(url_for( 48 "coprs_ns.copr_build", 49 username=build.copr.user.name, 50 coprname=build.copr.name, 51 build_id=build_id))5253 54 ################################ Build detail ################################ 55 56 @coprs_ns.route("/<username>/<coprname>/build/<int:build_id>/") 57 @req_with_copr 58 -def copr_build(copr, build_id):6061 62 @coprs_ns.route("/g/<group_name>/<coprname>/build/<int:build_id>/") 63 @req_with_copr 64 -def group_copr_build(copr, build_id):6669 build = ComplexLogic.get_build_safe(build_id) 70 return render_template("coprs/detail/build.html", build=build, copr=copr)7172 73 ################################ Build table ################################ 74 75 @coprs_ns.route("/<username>/<coprname>/builds/") 76 @req_with_copr 77 -def copr_builds(copr):7980 81 @coprs_ns.route("/g/<group_name>/<coprname>/builds/") 82 @req_with_copr 83 -def group_copr_builds(copr):8588 builds_query = builds_logic.BuildsLogic.get_copr_builds_list(copr=copr) 89 return flask.Response(stream_with_context(helpers.stream_template("coprs/detail/builds.html", 90 copr=copr, 91 builds=list(builds_query))))9293 94 ################################ Url builds ################################ 95 96 @coprs_ns.route("/<username>/<coprname>/add_build/") 97 @login_required 98 @req_with_copr 99 -def copr_add_build(copr, form=None):102103 104 @coprs_ns.route("/g/<group_name>/<coprname>/add_build/") 105 @login_required 106 @req_with_copr 107 -def group_copr_add_build(copr, form=None):110113 if not form: 114 form = forms.BuildFormUrlFactory(copr.active_chroots)() 115 return flask.render_template("coprs/detail/add_build/url.html", 116 copr=copr, view=view, form=form)117 118 119 @coprs_ns.route("/<username>/<coprname>/new_build/", methods=["POST"])123 return process_new_build_url( 124 copr, 125 "coprs_ns.copr_new_build", 126 url_on_success=url_for("coprs_ns.copr_builds", 127 username=copr.user.username, coprname=copr.name) 128 )129 130 131 @coprs_ns.route("/g/<group_name>/<coprname>/new_build/", methods=["POST"])135 return process_new_build_url( 136 copr, 137 "coprs_ns.copr_new_build", 138 url_on_success=url_for("coprs_ns.group_copr_builds", 139 group_name=copr.group.name, coprname=copr.name) 140 )141144 def factory(**build_options): 145 pkgs = form.pkgs.data.split("\n") 146 for pkg in pkgs: 147 BuildsLogic.create_new_from_url( 148 flask.g.user, copr, pkg, 149 chroot_names=form.selected_chroots, 150 **build_options 151 ) 152 for pkg in pkgs: 153 flask.flash("New build has been created: {}".format(pkg), "success")154 155 form = forms.BuildFormUrlFactory(copr.active_chroots)() 156 return process_new_build(copr, form, factory, render_add_build, 157 add_view, url_on_success, msg_on_success=False) 158159 160 -def process_new_build(copr, form, create_new_build_factory, add_function, add_view, url_on_success, msg_on_success=True):161 if form.validate_on_submit(): 162 build_options = { 163 "enable_net": form.enable_net.data, 164 "timeout": form.timeout.data, 165 } 166 167 try: 168 create_new_build_factory(**build_options) 169 db.session.commit() 170 except (ActionInProgressException, InsufficientRightsException) as e: 171 db.session.rollback() 172 flask.flash(str(e), "error") 173 else: 174 if msg_on_success: 175 flask.flash("New build has been created.", "success") 176 177 return flask.redirect(url_on_success) 178 else: 179 return add_function(copr, form, add_view)180181 182 ################################ SCM-1 (Tito) builds ################################ 183 184 @coprs_ns.route("/<username>/<coprname>/add_build_tito/") 185 @login_required 186 @req_with_copr 187 -def copr_add_build_tito(copr, form=None):190191 192 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_tito/") 193 @login_required 194 @req_with_copr 195 -def group_copr_add_build_tito(copr, form=None):198201 if not form: 202 form = forms.BuildFormTitoFactory(copr.active_chroots)() 203 return flask.render_template("coprs/detail/add_build/tito.html", 204 copr=copr, form=form, view=view, package=package)205 206 207 @coprs_ns.route("/<username>/<coprname>/new_build_tito/", methods=["POST"])211 view = 'coprs_ns.copr_new_build_tito' 212 url_on_success = url_for("coprs_ns.copr_builds", 213 username=copr.user.username, coprname=copr.name) 214 return process_new_build_tito(copr, view, url_on_success)215 216 217 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_tito/", methods=["POST"])221 view = 'coprs_ns.copr_new_build_tito' 222 url_on_success = url_for("coprs_ns.group_copr_builds", 223 group_name=copr.group.name, coprname=copr.name) 224 return process_new_build_tito(copr, view, url_on_success)225228 def factory(**build_options): 229 BuildsLogic.create_new_from_tito( 230 flask.g.user, 231 copr, 232 form.git_url.data, 233 form.git_directory.data, 234 form.git_branch.data, 235 form.tito_test.data, 236 form.selected_chroots, 237 **build_options 238 )239 form = forms.BuildFormTitoFactory(copr.active_chroots)() 240 return process_new_build(copr, form, factory, render_add_build_tito, add_view, url_on_success) 241242 243 ################################ SCM-2 (Mock) builds ################################ 244 245 @coprs_ns.route("/<username>/<coprname>/add_build_mock/") 246 @login_required 247 @req_with_copr 248 -def copr_add_build_mock(copr, form=None):251252 253 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_mock/") 254 @login_required 255 @req_with_copr 256 -def group_copr_add_build_mock(copr, form=None):259262 if not form: 263 form = forms.BuildFormMockFactory(copr.active_chroots)() 264 return flask.render_template("coprs/detail/add_build/mock.html", 265 copr=copr, form=form, view=view, package=package)266 267 268 @coprs_ns.route("/<username>/<coprname>/new_build_mock/", methods=["POST"])272 view = 'coprs_ns.copr_new_build_mock' 273 url_on_success = url_for("coprs_ns.copr_builds", 274 username=copr.user.username, coprname=copr.name) 275 return process_new_build_mock(copr, view, url_on_success)276 277 278 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_mock/", methods=["POST"])282 view = 'coprs_ns.copr_new_build_mock' 283 url_on_success = url_for("coprs_ns.group_copr_builds", 284 group_name=copr.group.name, coprname=copr.name) 285 return process_new_build_mock(copr, view, url_on_success)286289 def factory(**build_options): 290 BuildsLogic.create_new_from_mock( 291 flask.g.user, 292 copr, 293 form.scm_type.data, 294 form.scm_url.data, 295 form.scm_branch.data, 296 form.scm_subdir.data, 297 form.spec.data, 298 form.selected_chroots, 299 **build_options 300 )301 form = forms.BuildFormMockFactory(copr.active_chroots)() 302 return process_new_build(copr, form, factory, render_add_build_mock, add_view, url_on_success) 303304 305 ################################ PyPI builds ################################ 306 307 @coprs_ns.route("/<username>/<coprname>/add_build_pypi/") 308 @login_required 309 @req_with_copr 310 -def copr_add_build_pypi(copr, form=None):313314 315 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_pypi/") 316 @login_required 317 @req_with_copr 318 -def group_copr_add_build_pypi(copr, form=None):321324 if not form: 325 form = forms.BuildFormPyPIFactory(copr.active_chroots)() 326 return flask.render_template("coprs/detail/add_build/pypi.html", 327 copr=copr, form=form, view=view, package=package)328 329 330 @coprs_ns.route("/<username>/<coprname>/new_build_pypi/", methods=["POST"])334 view = 'coprs_ns.copr_new_build_pypi' 335 url_on_success = url_for("coprs_ns.copr_builds", 336 username=copr.user.username, coprname=copr.name) 337 return process_new_build_pypi(copr, view, url_on_success)338 339 340 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_pypi/", methods=["POST"])344 view = 'coprs_ns.copr_new_build_pypi' 345 url_on_success = url_for("coprs_ns.group_copr_builds", 346 group_name=copr.group.name, coprname=copr.name) 347 return process_new_build_pypi(copr, view, url_on_success)348351 def factory(**build_options): 352 BuildsLogic.create_new_from_pypi( 353 flask.g.user, 354 copr, 355 form.pypi_package_name.data, 356 form.pypi_package_version.data, 357 form.python_versions.data, 358 form.selected_chroots, 359 **build_options 360 )361 form = forms.BuildFormPyPIFactory(copr.active_chroots)() 362 return process_new_build(copr, form, factory, render_add_build_pypi, add_view, url_on_success) 363364 365 ############################### RubyGems builds ############################### 366 367 @coprs_ns.route("/<username>/<coprname>/add_build_rubygems/") 368 @login_required 369 @req_with_copr 370 -def copr_add_build_rubygems(copr, form=None):373374 375 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_rubygems/") 376 @login_required 377 @req_with_copr 378 -def group_copr_add_build_rubygems(copr, form=None):381384 if not form: 385 form = forms.BuildFormRubyGemsFactory(copr.active_chroots)() 386 return flask.render_template("coprs/detail/add_build/rubygems.html", 387 copr=copr, form=form, view=view, package=package)388 389 390 @coprs_ns.route("/<username>/<coprname>/new_build_rubygems/", methods=["POST"])394 view = 'coprs_ns.copr_new_build_rubygems' 395 url_on_success = url_for("coprs_ns.copr_builds", 396 username=copr.user.username, coprname=copr.name) 397 return process_new_build_rubygems(copr, view, url_on_success)398 399 400 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_rubygems/", methods=["POST"])404 view = 'coprs_ns.copr_new_build_rubygems' 405 url_on_success = url_for("coprs_ns.group_copr_builds", 406 group_name=copr.group.name, coprname=copr.name) 407 return process_new_build_rubygems(copr, view, url_on_success)408411 def factory(**build_options): 412 BuildsLogic.create_new_from_rubygems( 413 flask.g.user, 414 copr, 415 form.gem_name.data, 416 form.selected_chroots, 417 **build_options 418 )419 form = forms.BuildFormRubyGemsFactory(copr.active_chroots)() 420 return process_new_build(copr, form, factory, render_add_build_rubygems, add_view, url_on_success) 421422 423 ################################ Upload builds ################################ 424 425 @coprs_ns.route("/<username>/<coprname>/add_build_upload/") 426 @login_required 427 @req_with_copr 428 -def copr_add_build_upload(copr, form=None):431432 433 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_upload/") 434 @login_required 435 @req_with_copr 436 -def group_copr_add_build_upload(copr, form=None):439442 if not form: 443 form = forms.BuildFormUploadFactory(copr.active_chroots)() 444 return flask.render_template("coprs/detail/add_build/upload.html", 445 copr=copr, form=form, view=view)446 447 448 @coprs_ns.route("/<username>/<coprname>/new_build_upload/", methods=["POST"])452 view = 'coprs_ns.copr_new_build_upload' 453 url_on_success = url_for("coprs_ns.copr_builds", 454 username=copr.user.username, coprname=copr.name) 455 return process_new_build_upload(copr, view, url_on_success)456 457 458 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_upload/", methods=["POST"])462 view = 'coprs_ns.copr_new_build_upload' 463 url_on_success = url_for("coprs_ns.group_copr_builds", 464 group_name=copr.group.name, coprname=copr.name) 465 return process_new_build_upload(copr, view, url_on_success)466469 def factory(**build_options): 470 BuildsLogic.create_new_from_upload( 471 flask.g.user, copr, 472 f_uploader=lambda path: form.pkgs.data.save(path), 473 orig_filename=form.pkgs.data.filename, 474 chroot_names=form.selected_chroots, 475 **build_options 476 )477 form = forms.BuildFormUploadFactory(copr.active_chroots)() 478 return process_new_build(copr, form, factory, render_add_build_upload, add_view, url_on_success) 479 480 481 ################################ Builds rebuilds ################################ 482 483 @coprs_ns.route("/<username>/<coprname>/new_build_rebuild/<int:build_id>/", methods=["POST"])487 view='coprs_ns.copr_new_build' 488 url_on_success = url_for( 489 "coprs_ns.copr_builds", 490 username=copr.user.username, coprname=copr.name) 491 492 return process_rebuild(copr, build_id, view=view, url_on_success=url_on_success)493 494 495 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_rebuild/<int:build_id>/", methods=["POST"])499 view='coprs_ns.copr_new_build' 500 url_on_success = url_for( 501 "coprs_ns.group_copr_builds", 502 group_name=copr.group.name, coprname=copr.name) 503 504 return process_rebuild(copr, build_id, view=view, url_on_success=url_on_success)505508 def factory(**build_options): 509 source_build = ComplexLogic.get_build_safe(build_id) 510 BuildsLogic.create_new_from_other_build( 511 flask.g.user, copr, source_build, 512 chroot_names=form.selected_chroots, 513 **build_options 514 )515 form = forms.BuildFormRebuildFactory.create_form_cls(copr.active_chroots)() 516 return process_new_build(copr, form, factory, render_add_build, view, url_on_success) 517 518 519 ################################ Repeat ################################ 520 521 @coprs_ns.route("/<username>/<coprname>/repeat_build/<int:build_id>/", 522 methods=["GET", "POST"]) 527 528 529 @coprs_ns.route("/g/<group_name>/<coprname>/repeat_build/<int:build_id>/", 530 methods=["GET", "POST"]) 535538 build = ComplexLogic.get_build_safe(build_id) 539 if not flask.g.user.can_build_in(build.copr): 540 flask.flash("You are not allowed to repeat this build.") 541 542 if build.source_type == helpers.BuildSourceEnum('upload'): 543 # If the original build's source is 'upload', we will show only the 544 # original build's chroots and skip import. 545 available_chroots = build.chroots 546 547 else: 548 # For all other sources, we will show all chroots enabled in the project 549 # and proceed with import. 550 available_chroots = copr.active_chroots 551 552 form = forms.BuildFormRebuildFactory.create_form_cls(available_chroots)( 553 build_id=build_id, enable_net=build.enable_net) 554 555 # remove all checkboxes by default 556 for ch in available_chroots: 557 field = getattr(form, ch.name) 558 field.data = False 559 chroot_to_build = request.args.get("chroot") 560 app.logger.debug("got param chroot: {}".format(chroot_to_build)) 561 if chroot_to_build: 562 # set single checkbox if chroot query arg was provided 563 if hasattr(form, chroot_to_build): 564 getattr(form, chroot_to_build).data = True 565 else: 566 build_chroot_names = set(ch.name for ch in build.chroots) 567 build_failed_chroot_names = set(ch.name for ch in build.get_chroots_by_status([ 568 helpers.StatusEnum('failed'), helpers.StatusEnum('canceled'), 569 ])) 570 for ch in available_chroots: 571 # check checkbox on all the chroots that have not been (successfully) built before 572 if (ch.name not in build_chroot_names) or (ch.name in build_failed_chroot_names): 573 getattr(form, ch.name).data = True 574 return flask.render_template( 575 "coprs/detail/add_build/rebuild.html", 576 copr=copr, build=build, form=form)577578 579 ################################ Cancel ################################ 580 581 -def process_cancel_build(build):582 try: 583 builds_logic.BuildsLogic.cancel_build(flask.g.user, build) 584 except InsufficientRightsException as e: 585 flask.flash(str(e), "error") 586 else: 587 db.session.commit() 588 flask.flash("Build {} has been canceled successfully.".format(build.id), "success") 589 return flask.redirect(url_for_copr_builds(build.copr))590 591 592 @coprs_ns.route("/<username>/<coprname>/cancel_build/<int:build_id>/", 593 methods=["POST"])596 # only the user who ran the build can cancel it 597 build = ComplexLogic.get_build_safe(build_id) 598 return process_cancel_build(build)599 600 601 @coprs_ns.route("/g/<group_name>/<coprname>/cancel_build/<int:build_id>/", 602 methods=["POST"]) 607 608 609 ################################ Delete ################################ 610 611 @coprs_ns.route("/<username>/<coprname>/delete_build/<int:build_id>/", 612 methods=["POST"])615 build = ComplexLogic.get_build_safe(build_id) 616 617 try: 618 builds_logic.BuildsLogic.delete_build(flask.g.user, build) 619 except (InsufficientRightsException, ActionInProgressException) as e: 620 flask.flash(str(e), "error") 621 else: 622 db.session.commit() 623 flask.flash("Build has been deleted successfully.", "success") 624 625 return flask.redirect(url_for_copr_builds(build.copr))626
Trees | Indices | Help |
---|
Generated by Epydoc 3.0.1 | http://epydoc.sourceforge.net |