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,)29 build = ComplexLogic.get_build_safe(build_id) 30 copr = build.copr 31 if copr.is_a_group_project: 32 return flask.redirect(url_for( 33 "coprs_ns.group_copr_build", 34 group_name=build.copr.group.name, 35 coprname=build.copr.name, 36 build_id=build_id)) 37 else: 38 return flask.redirect(url_for( 39 "coprs_ns.copr_build", 40 username=build.copr.user.name, 41 coprname=build.copr.name, 42 build_id=build_id))4344 45 ################################ Build detail ################################ 46 47 @coprs_ns.route("/<username>/<coprname>/build/<int:build_id>/") 48 @req_with_copr 49 -def copr_build(copr, build_id):5152 53 @coprs_ns.route("/g/<group_name>/<coprname>/build/<int:build_id>/") 54 @req_with_copr 55 -def group_copr_build(copr, build_id):5760 build = ComplexLogic.get_build_safe(build_id) 61 return render_template("coprs/detail/build.html", build=build, copr=copr)6263 64 ################################ Build table ################################ 65 66 @coprs_ns.route("/<username>/<coprname>/builds/") 67 @req_with_copr 68 -def copr_builds(copr):7071 72 @coprs_ns.route("/g/<group_name>/<coprname>/builds/") 73 @req_with_copr 74 -def group_copr_builds(copr):7679 builds_query = builds_logic.BuildsLogic.get_copr_builds_list(copr=copr) 80 return flask.Response(stream_with_context(helpers.stream_template("coprs/detail/builds.html", 81 copr=copr, 82 builds=list(builds_query))))8384 85 ################################ Url builds ################################ 86 87 @coprs_ns.route("/<username>/<coprname>/add_build/") 88 @login_required 89 @req_with_copr 90 -def copr_add_build(copr, form=None):9394 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):101104 if not form: 105 form = forms.BuildFormUrlFactory(copr.active_chroots)() 106 return flask.render_template("coprs/detail/add_build/url.html", 107 copr=copr, view=view, form=form)108 109 110 @coprs_ns.route("/<username>/<coprname>/new_build/", methods=["POST"])114 return process_new_build_url( 115 copr, 116 "coprs_ns.copr_new_build", 117 url_on_success=url_for("coprs_ns.copr_builds", 118 username=copr.user.username, coprname=copr.name) 119 )120 121 122 @coprs_ns.route("/g/<group_name>/<coprname>/new_build/", methods=["POST"])126 return process_new_build_url( 127 copr, 128 "coprs_ns.copr_new_build", 129 url_on_success=url_for("coprs_ns.group_copr_builds", 130 group_name=copr.group.name, coprname=copr.name) 131 )132135 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) 149150 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)171172 173 ################################ SCM-1 (Tito) builds ################################ 174 175 @coprs_ns.route("/<username>/<coprname>/add_build_tito/") 176 @login_required 177 @req_with_copr 178 -def copr_add_build_tito(copr, form=None):181182 183 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_tito/") 184 @login_required 185 @req_with_copr 186 -def group_copr_add_build_tito(copr, form=None):189192 if not form: 193 form = forms.BuildFormTitoFactory(copr.active_chroots)() 194 return flask.render_template("coprs/detail/add_build/tito.html", 195 copr=copr, form=form, view=view, package=package)196 197 198 @coprs_ns.route("/<username>/<coprname>/new_build_tito/", methods=["POST"])202 view = 'coprs_ns.copr_new_build_tito' 203 url_on_success = url_for("coprs_ns.copr_builds", 204 username=copr.user.username, coprname=copr.name) 205 return process_new_build_tito(copr, view, url_on_success)206 207 208 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_tito/", methods=["POST"])212 view = 'coprs_ns.copr_new_build_tito' 213 url_on_success = url_for("coprs_ns.group_copr_builds", 214 group_name=copr.group.name, coprname=copr.name) 215 return process_new_build_tito(copr, view, url_on_success)216219 def factory(**build_options): 220 BuildsLogic.create_new_from_tito( 221 flask.g.user, 222 copr, 223 form.git_url.data, 224 form.git_directory.data, 225 form.git_branch.data, 226 form.tito_test.data, 227 form.selected_chroots, 228 **build_options 229 )230 form = forms.BuildFormTitoFactory(copr.active_chroots)() 231 return process_new_build(copr, form, factory, render_add_build_tito, add_view, url_on_success) 232233 234 ################################ SCM-2 (Mock) builds ################################ 235 236 @coprs_ns.route("/<username>/<coprname>/add_build_mock/") 237 @login_required 238 @req_with_copr 239 -def copr_add_build_mock(copr, form=None):242243 244 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_mock/") 245 @login_required 246 @req_with_copr 247 -def group_copr_add_build_mock(copr, form=None):250253 if not form: 254 form = forms.BuildFormMockFactory(copr.active_chroots)() 255 return flask.render_template("coprs/detail/add_build/mock.html", 256 copr=copr, form=form, view=view, package=package)257 258 259 @coprs_ns.route("/<username>/<coprname>/new_build_mock/", methods=["POST"])263 view = 'coprs_ns.copr_new_build_mock' 264 url_on_success = url_for("coprs_ns.copr_builds", 265 username=copr.user.username, coprname=copr.name) 266 return process_new_build_mock(copr, view, url_on_success)267 268 269 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_mock/", methods=["POST"])273 view = 'coprs_ns.copr_new_build_mock' 274 url_on_success = url_for("coprs_ns.group_copr_builds", 275 group_name=copr.group.name, coprname=copr.name) 276 return process_new_build_mock(copr, view, url_on_success)277280 def factory(**build_options): 281 BuildsLogic.create_new_from_mock( 282 flask.g.user, 283 copr, 284 form.scm_type.data, 285 form.scm_url.data, 286 form.scm_branch.data, 287 form.scm_subdir.data, 288 form.spec.data, 289 form.selected_chroots, 290 **build_options 291 )292 form = forms.BuildFormMockFactory(copr.active_chroots)() 293 return process_new_build(copr, form, factory, render_add_build_mock, add_view, url_on_success) 294295 296 ################################ PyPI builds ################################ 297 298 @coprs_ns.route("/<username>/<coprname>/add_build_pypi/") 299 @login_required 300 @req_with_copr 301 -def copr_add_build_pypi(copr, form=None):304305 306 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_pypi/") 307 @login_required 308 @req_with_copr 309 -def group_copr_add_build_pypi(copr, form=None):312315 if not form: 316 form = forms.BuildFormPyPIFactory(copr.active_chroots)() 317 return flask.render_template("coprs/detail/add_build/pypi.html", 318 copr=copr, form=form, view=view, package=package)319 320 321 @coprs_ns.route("/<username>/<coprname>/new_build_pypi/", methods=["POST"])325 view = 'coprs_ns.copr_new_build_pypi' 326 url_on_success = url_for("coprs_ns.copr_builds", 327 username=copr.user.username, coprname=copr.name) 328 return process_new_build_pypi(copr, view, url_on_success)329 330 331 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_pypi/", methods=["POST"])335 view = 'coprs_ns.copr_new_build_pypi' 336 url_on_success = url_for("coprs_ns.group_copr_builds", 337 group_name=copr.group.name, coprname=copr.name) 338 return process_new_build_pypi(copr, view, url_on_success)339342 def factory(**build_options): 343 BuildsLogic.create_new_from_pypi( 344 flask.g.user, 345 copr, 346 form.pypi_package_name.data, 347 form.pypi_package_version.data, 348 form.python_versions.data, 349 form.selected_chroots, 350 **build_options 351 )352 form = forms.BuildFormPyPIFactory(copr.active_chroots)() 353 return process_new_build(copr, form, factory, render_add_build_pypi, add_view, url_on_success) 354355 356 ############################### RubyGems builds ############################### 357 358 @coprs_ns.route("/<username>/<coprname>/add_build_rubygems/") 359 @login_required 360 @req_with_copr 361 -def copr_add_build_rubygems(copr, form=None):364365 366 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_rubygems/") 367 @login_required 368 @req_with_copr 369 -def group_copr_add_build_rubygems(copr, form=None):372375 if not form: 376 form = forms.BuildFormRubyGemsFactory(copr.active_chroots)() 377 return flask.render_template("coprs/detail/add_build/rubygems.html", 378 copr=copr, form=form, view=view, package=package)379 380 381 @coprs_ns.route("/<username>/<coprname>/new_build_rubygems/", methods=["POST"])385 view = 'coprs_ns.copr_new_build_rubygems' 386 url_on_success = url_for("coprs_ns.copr_builds", 387 username=copr.user.username, coprname=copr.name) 388 return process_new_build_rubygems(copr, view, url_on_success)389 390 391 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_rubygems/", methods=["POST"])395 view = 'coprs_ns.copr_new_build_rubygems' 396 url_on_success = url_for("coprs_ns.group_copr_builds", 397 group_name=copr.group.name, coprname=copr.name) 398 return process_new_build_rubygems(copr, view, url_on_success)399402 def factory(**build_options): 403 BuildsLogic.create_new_from_rubygems( 404 flask.g.user, 405 copr, 406 form.gem_name.data, 407 form.selected_chroots, 408 **build_options 409 )410 form = forms.BuildFormRubyGemsFactory(copr.active_chroots)() 411 return process_new_build(copr, form, factory, render_add_build_rubygems, add_view, url_on_success) 412413 414 ################################ Upload builds ################################ 415 416 @coprs_ns.route("/<username>/<coprname>/add_build_upload/") 417 @login_required 418 @req_with_copr 419 -def copr_add_build_upload(copr, form=None):422423 424 @coprs_ns.route("/g/<group_name>/<coprname>/add_build_upload/") 425 @login_required 426 @req_with_copr 427 -def group_copr_add_build_upload(copr, form=None):430433 if not form: 434 form = forms.BuildFormUploadFactory(copr.active_chroots)() 435 return flask.render_template("coprs/detail/add_build/upload.html", 436 copr=copr, form=form, view=view)437 438 439 @coprs_ns.route("/<username>/<coprname>/new_build_upload/", methods=["POST"])443 view = 'coprs_ns.copr_new_build_upload' 444 url_on_success = url_for("coprs_ns.copr_builds", 445 username=copr.user.username, coprname=copr.name) 446 return process_new_build_upload(copr, view, url_on_success)447 448 449 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_upload/", methods=["POST"])453 view = 'coprs_ns.copr_new_build_upload' 454 url_on_success = url_for("coprs_ns.group_copr_builds", 455 group_name=copr.group.name, coprname=copr.name) 456 return process_new_build_upload(copr, view, url_on_success)457460 def factory(**build_options): 461 BuildsLogic.create_new_from_upload( 462 flask.g.user, copr, 463 f_uploader=lambda path: form.pkgs.data.save(path), 464 orig_filename=form.pkgs.data.filename, 465 chroot_names=form.selected_chroots, 466 **build_options 467 )468 form = forms.BuildFormUploadFactory(copr.active_chroots)() 469 return process_new_build(copr, form, factory, render_add_build_upload, add_view, url_on_success) 470 471 472 ################################ Builds rebuilds ################################ 473 474 @coprs_ns.route("/<username>/<coprname>/new_build_rebuild/<int:build_id>/", methods=["POST"])478 view='coprs_ns.copr_new_build' 479 url_on_success = url_for( 480 "coprs_ns.copr_builds", 481 username=copr.user.username, coprname=copr.name) 482 483 return process_rebuild(copr, build_id, view=view, url_on_success=url_on_success)484 485 486 @coprs_ns.route("/g/<group_name>/<coprname>/new_build_rebuild/<int:build_id>/", methods=["POST"])490 view='coprs_ns.copr_new_build' 491 url_on_success = url_for( 492 "coprs_ns.group_copr_builds", 493 group_name=copr.group.name, coprname=copr.name) 494 495 return process_rebuild(copr, build_id, view=view, url_on_success=url_on_success)496499 def factory(**build_options): 500 source_build = ComplexLogic.get_build_safe(build_id) 501 BuildsLogic.create_new_from_other_build( 502 flask.g.user, copr, source_build, 503 chroot_names=form.selected_chroots, 504 **build_options 505 )506 form = forms.BuildFormRebuildFactory.create_form_cls(copr.active_chroots)() 507 return process_new_build(copr, form, factory, render_add_build, view, url_on_success) 508 509 510 ################################ Repeat ################################ 511 512 @coprs_ns.route("/<username>/<coprname>/repeat_build/<int:build_id>/", 513 methods=["GET", "POST"]) 518 519 520 @coprs_ns.route("/g/<group_name>/<coprname>/repeat_build/<int:build_id>/", 521 methods=["GET", "POST"]) 526529 build = ComplexLogic.get_build_safe(build_id) 530 if not flask.g.user.can_build_in(build.copr): 531 flask.flash("You are not allowed to repeat this build.") 532 533 if build.source_type == helpers.BuildSourceEnum('upload'): 534 # If the original build's source is 'upload', we will show only the 535 # original build's chroots and skip import. 536 available_chroots = build.chroots 537 538 else: 539 # For all other sources, we will show all chroots enabled in the project 540 # and proceed with import. 541 available_chroots = copr.active_chroots 542 543 form = forms.BuildFormRebuildFactory.create_form_cls(available_chroots)( 544 build_id=build_id, enable_net=build.enable_net) 545 546 # remove all checkboxes by default 547 for ch in available_chroots: 548 field = getattr(form, ch.name) 549 field.data = False 550 chroot_to_build = request.args.get("chroot") 551 app.logger.debug("got param chroot: {}".format(chroot_to_build)) 552 if chroot_to_build: 553 # set single checkbox if chroot query arg was provided 554 if hasattr(form, chroot_to_build): 555 getattr(form, chroot_to_build).data = True 556 else: 557 build_chroot_names = set(ch.name for ch in build.chroots) 558 build_failed_chroot_names = set(ch.name for ch in build.get_chroots_by_status([ 559 helpers.StatusEnum('failed'), helpers.StatusEnum('canceled'), 560 ])) 561 for ch in available_chroots: 562 # check checkbox on all the chroots that have not been (successfully) built before 563 if (ch.name not in build_chroot_names) or (ch.name in build_failed_chroot_names): 564 getattr(form, ch.name).data = True 565 return flask.render_template( 566 "coprs/detail/add_build/rebuild.html", 567 copr=copr, build=build, form=form)568569 570 ################################ Cancel ################################ 571 572 -def process_cancel_build(build):573 try: 574 builds_logic.BuildsLogic.cancel_build(flask.g.user, build) 575 except InsufficientRightsException as e: 576 flask.flash(str(e), "error") 577 else: 578 db.session.commit() 579 flask.flash("Build {} has been canceled successfully.".format(build.id), "success") 580 return flask.redirect(helpers.url_for_copr_builds(build.copr))581 582 583 @coprs_ns.route("/<username>/<coprname>/cancel_build/<int:build_id>/", 584 methods=["POST"])587 # only the user who ran the build can cancel it 588 build = ComplexLogic.get_build_safe(build_id) 589 return process_cancel_build(build)590 591 592 @coprs_ns.route("/g/<group_name>/<coprname>/cancel_build/<int:build_id>/", 593 methods=["POST"]) 598 599 600 ################################ Delete ################################ 601 602 @coprs_ns.route("/<username>/<coprname>/delete_build/<int:build_id>/", 603 methods=["POST"])606 build = ComplexLogic.get_build_safe(build_id) 607 608 try: 609 builds_logic.BuildsLogic.delete_build(flask.g.user, build) 610 except (InsufficientRightsException, ActionInProgressException) as e: 611 flask.flash(str(e), "error") 612 else: 613 db.session.commit() 614 flask.flash("Build has been deleted successfully.", "success") 615 616 return flask.redirect(helpers.url_for_copr_builds(build.copr))617
Trees | Indices | Help |
---|
Generated by Epydoc 3.0.1 on Wed Aug 2 13:52:10 2017 | http://epydoc.sourceforge.net |