Package coprs :: Package views :: Package coprs_ns :: Module coprs_builds
[hide private]
[frames] | no frames]

Source Code for Module coprs.views.coprs_ns.coprs_builds

  1  import flask 
  2  import re 
  3   
  4  from coprs import db 
  5  from coprs import forms 
  6  from coprs import helpers 
  7   
  8  from coprs.logic import builds_logic 
  9  from coprs.logic import coprs_logic 
 10   
 11  from coprs.views.misc import login_required, page_not_found 
 12  from coprs.views.coprs_ns import coprs_ns 
 13   
 14  from coprs.exceptions import (ActionInProgressException, 
 15                                InsufficientRightsException) 
16 17 18 19 @coprs_ns.route("/build/<int:build_id>/") 20 -def copr_build_redirect(build_id):
21 build = builds_logic.BuildsLogic.get_by_id(build_id) 22 if not build: 23 return page_not_found( 24 "Build {0} does not exist.".format(str(build_id))) 25 26 return flask.redirect(flask.url_for("coprs_ns.copr_build", 27 username=build.copr.owner.name, 28 coprname=build.copr.name, 29 build_id=build_id))
30
31 32 @coprs_ns.route("/<username>/<coprname>/build/<int:build_id>/") 33 -def copr_build(username, coprname, build_id):
34 build = builds_logic.BuildsLogic.get_by_id(build_id) 35 copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first() 36 37 if not build: 38 return page_not_found( 39 "Build {0} does not exist.".format(str(build_id))) 40 41 if not copr: # but the build does 42 return flask.render_template("coprs/detail/build-no-project.html", 43 build=build, 44 username=username, 45 coprname=coprname) 46 47 return flask.render_template("coprs/detail/build.html", 48 build=build, 49 copr=copr)
50
51 52 @coprs_ns.route("/<username>/<coprname>/builds/", defaults={"page": 1}) 53 @coprs_ns.route("/<username>/<coprname>/builds/<int:page>/") 54 -def copr_builds(username, coprname, page=1):
55 copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first() 56 57 if not copr: 58 return page_not_found( 59 "Copr with name {0} does not exist.".format(coprname)) 60 61 builds_query = builds_logic.BuildsLogic.get_multiple( 62 flask.g.user, copr=copr) 63 64 paginator = helpers.Paginator( 65 builds_query, copr.build_count, page, per_page_override=20) 66 67 return flask.render_template("coprs/detail/builds.html", 68 copr=copr, 69 builds=paginator.sliced_query, 70 paginator=paginator)
71
72 73 @coprs_ns.route("/<username>/<coprname>/add_build/") 74 @login_required 75 -def copr_add_build(username, coprname, form=None):
76 copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first() 77 78 if not copr: 79 return page_not_found( 80 "Copr with name {0} does not exist.".format(coprname)) 81 82 if not form: 83 form = forms.BuildFormFactory.create_form_cls(copr.active_chroots)() 84 85 return flask.render_template("coprs/detail/add_build.html", 86 copr=copr, 87 form=form)
88
89 90 @coprs_ns.route("/<username>/<coprname>/new_build/", methods=["POST"]) 91 @login_required 92 -def copr_new_build(username, coprname):
93 copr = coprs_logic.CoprsLogic.get(flask.g.user, username, coprname).first() 94 if not copr: 95 return page_not_found( 96 "Project {0}/{1} does not exist.".format(username, coprname)) 97 98 form = forms.BuildFormFactory.create_form_cls(copr.active_chroots)() 99 100 if form.validate_on_submit(): 101 pkgs = form.pkgs.data.replace("\n", " ").split(" ") 102 103 # validate (and skip bad) urls 104 bad_urls = [] 105 for pkg in pkgs: 106 if not re.match("^.*\.src\.rpm$", pkg): 107 bad_urls.append(pkg) 108 flask.flash("Bad url: {0} (skipped)".format(pkg)) 109 for bad_url in bad_urls: 110 pkgs.remove(bad_url) 111 112 if not pkgs: 113 flask.flash("No builds submitted") 114 else: 115 # check which chroots we need 116 chroots = [] 117 for chroot in copr.active_chroots: 118 if chroot.name in form.selected_chroots: 119 chroots.append(chroot) 120 121 # build each package as a separate build 122 try: 123 for pkg in pkgs: 124 build = builds_logic.BuildsLogic.add( 125 user=flask.g.user, 126 pkgs=pkg, 127 copr=copr, 128 chroots=chroots) 129 130 if flask.g.user.proven: 131 build.memory_reqs = form.memory_reqs.data 132 build.timeout = form.timeout.data 133 134 except (ActionInProgressException, InsufficientRightsException) as e: 135 flask.flash(str(e)) 136 db.session.rollback() 137 else: 138 flask.flash("Build was added") 139 db.session.commit() 140 141 return flask.redirect(flask.url_for("coprs_ns.copr_builds", 142 username=username, 143 coprname=copr.name)) 144 else: 145 return copr_add_build(username=username, coprname=coprname, form=form)
146 147 148 @coprs_ns.route("/<username>/<coprname>/cancel_build/<int:build_id>/", 149 defaults={"page": 1}, 150 methods=["POST"]) 151 @coprs_ns.route("/<username>/<coprname>/cancel_build/<int:build_id>/<int:page>/", 152 methods=["POST"])
153 @login_required 154 -def copr_cancel_build(username, coprname, build_id, page=1):
155 # only the user who ran the build can cancel it 156 build = builds_logic.BuildsLogic.get(build_id).first() 157 if not build: 158 return page_not_found( 159 "Build with id {0} does not exist.".format(build_id)) 160 try: 161 builds_logic.BuildsLogic.cancel_build(flask.g.user, build) 162 except InsufficientRightsException as e: 163 flask.flash(str(e)) 164 else: 165 db.session.commit() 166 flask.flash("Build was canceled") 167 168 return flask.redirect(flask.url_for("coprs_ns.copr_builds", 169 username=username, 170 coprname=coprname, 171 page=page))
172 173 174 @coprs_ns.route("/<username>/<coprname>/repeat_build/<int:build_id>/", 175 defaults={"page": 1}, 176 methods=["GET", "POST"]) 177 @coprs_ns.route("/<username>/<coprname>/repeat_build/<int:build_id>/<int:page>/", 178 methods=["GET", "POST"])
179 @login_required 180 -def copr_repeat_build(username, coprname, build_id, page=1):
181 build = builds_logic.BuildsLogic.get(build_id).first() 182 copr = coprs_logic.CoprsLogic.get( 183 flask.g.user, username=username, coprname=coprname).first() 184 185 if not build: 186 return page_not_found( 187 "Build with id {0} does not exist.".format(build_id)) 188 189 if not copr: 190 return page_not_found( 191 "Copr {0}/{1} does not exist.".format(username, coprname)) 192 193 try: 194 builds_logic.BuildsLogic.add( 195 user=flask.g.user, 196 pkgs=build.pkgs, 197 copr=copr, 198 repos=copr.repos, 199 memory_reqs=build.memory_reqs, 200 timeout=build.timeout) 201 202 except (ActionInProgressException, InsufficientRightsException) as e: 203 db.session.rollback() 204 flask.flash(str(e)) 205 else: 206 db.session.commit() 207 flask.flash("Build was resubmitted") 208 209 return flask.redirect(flask.url_for("coprs_ns.copr_builds", 210 username=username, 211 coprname=coprname, 212 page=page))
213 214 215 @coprs_ns.route("/<username>/<coprname>/delete_build/<int:build_id>/", 216 defaults={"page": 1}, 217 methods=["POST"]) 218 @coprs_ns.route("/<username>/<coprname>/delete_build/<int:build_id>/<int:page>/", 219 methods=["POST"])
220 @login_required 221 -def copr_delete_build(username, coprname, build_id, page=1):
222 build = builds_logic.BuildsLogic.get(build_id).first() 223 if not build: 224 return page_not_found( 225 "Build with id {0} does not exist.".format(build_id)) 226 try: 227 builds_logic.BuildsLogic.delete_build(flask.g.user, build) 228 except (InsufficientRightsException, ActionInProgressException) as e: 229 flask.flash(str(e)) 230 else: 231 db.session.commit() 232 flask.flash("Build was deleted") 233 234 return flask.redirect(flask.url_for("coprs_ns.copr_builds", 235 username=username, coprname=coprname, 236 page=page))
237