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

Source Code for Module coprs.views.coprs_ns.coprs_packages

  1  import flask 
  2   
  3  from flask import stream_with_context 
  4  from flask import send_file 
  5  from coprs import app 
  6  from coprs import db 
  7  from coprs import forms 
  8  from coprs import helpers 
  9  from coprs.views.coprs_ns import coprs_ns 
 10  from coprs.views.coprs_ns.coprs_builds import ( 
 11      render_add_build_scm, 
 12      render_add_build_pypi, 
 13      render_add_build_custom, 
 14      render_add_build_distgit, 
 15  ) 
 16  from coprs.views.misc import login_required, req_with_copr, send_build_icon 
 17  from coprs.logic.complex_logic import ComplexLogic 
 18  from coprs.logic.packages_logic import PackagesLogic 
 19  from coprs.logic.users_logic import UsersLogic 
 20  from coprs.exceptions import (ActionInProgressException, ObjectNotFound, NoPackageSourceException, 
 21                                InsufficientRightsException, MalformedArgumentException) 
22 23 24 @coprs_ns.route("/<username>/<coprname>/packages/") 25 @coprs_ns.route("/g/<group_name>/<coprname>/packages/") 26 @req_with_copr 27 -def copr_packages(copr):
28 flashes = flask.session.pop('_flashes', []) 29 packages = PackagesLogic.get_packages_with_latest_builds_for_dir( 30 copr.main_dir.id) 31 response = flask.Response( 32 stream_with_context(helpers.stream_template( 33 "coprs/detail/packages.html", 34 copr=copr, 35 packages=packages, 36 flashes=flashes, 37 ))) 38 flask.session.pop('_flashes', []) 39 return response
40
41 @coprs_ns.route("/<username>/<coprname>/package/<package_name>/") 42 @coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/") 43 @req_with_copr 44 -def copr_package(copr, package_name):
45 package = ComplexLogic.get_package_safe(copr.main_dir, package_name) 46 return flask.render_template("coprs/detail/package.html", package=package, copr=copr)
47
48 @coprs_ns.route("/<username>/<coprname>/package/<package_name>/status_image/last_build.png") 49 @coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/status_image/last_build.png") 50 @req_with_copr 51 -def copr_package_icon(copr, package_name):
52 try: 53 package = ComplexLogic.get_package_safe(copr.main_dir, package_name) 54 except ObjectNotFound: 55 return send_file("static/status_images/bad_url.png", mimetype='image/png') 56 57 return send_build_icon(package.last_build())
58
59 60 @coprs_ns.route("/<username>/<coprname>/packages/rebuild-all/", methods=["GET", "POST"]) 61 @coprs_ns.route("/g/<group_name>/<coprname>/packages/rebuild-all/", methods=["GET", "POST"]) 62 @req_with_copr 63 -def copr_rebuild_all_packages(copr):
64 form = forms.RebuildAllPackagesFormFactory( 65 copr.active_chroots, [package.name for package in copr.main_dir.packages])() 66 67 if flask.request.method == "POST" and form.validate_on_submit(): 68 try: 69 packages = [] 70 for package_name in form.packages.data: 71 packages.append(ComplexLogic.get_package_safe(copr.main_dir, package_name)) 72 73 PackagesLogic.batch_build( 74 flask.g.user, 75 copr, 76 packages, 77 form.selected_chroots, 78 enable_net=form.enable_net.data) 79 80 except (ObjectNotFound, ActionInProgressException, NoPackageSourceException, \ 81 InsufficientRightsException, MalformedArgumentException) as e: 82 db.session.rollback() 83 flask.flash(str(e), "error") 84 else: 85 db.session.commit() 86 flask.flash("Batch build successfully started.", "success") 87 return flask.redirect(helpers.url_for_copr_builds(copr)) 88 89 return flask.render_template( 90 "coprs/detail/packages_rebuild_all.html", 91 view="coprs_ns.copr_rebuild_all_packages", 92 form=form, copr=copr)
93
94 95 @coprs_ns.route("/<username>/<coprname>/package/<package_name>/rebuild") 96 @coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/rebuild") 97 @req_with_copr 98 -def copr_rebuild_package(copr, package_name):
99 package = ComplexLogic.get_package_safe(copr.main_dir, package_name) 100 data = package.source_json_dict 101 102 if package.source_type_text == "scm": 103 form = forms.BuildFormScmFactory 104 f = render_add_build_scm 105 view_suffix = "_scm" 106 elif package.source_type_text == "pypi": 107 form = forms.BuildFormPyPIFactory 108 f = render_add_build_pypi 109 view_suffix = "_pypi" 110 elif package.source_type_text == "custom": 111 form = forms.BuildFormCustomFactory 112 f = render_add_build_custom 113 view_suffix = "_custom" 114 elif package.source_type_text == "distgit": 115 form = forms.BuildFormDistGitSimpleFactory 116 f = render_add_build_distgit 117 view_suffix = "_distgit" 118 data["package_name"] = package_name 119 else: 120 flask.flash( 121 # TODO: sync this with the API error NoPackageSourceException 122 "Package {} doesn't have the default source method set, but it is " 123 "required for the rebuild request. Please configure some source " 124 "method first".format(package_name)) 125 return flask.redirect(helpers.copr_url("coprs_ns.copr_edit_package", copr, package_name=package_name)) 126 127 form = form(copr.active_chroots, package)(data=data) 128 return f(copr, form, view="coprs_ns.copr_new_build" + view_suffix, package=package)
129
130 131 @coprs_ns.route("/<username>/<coprname>/package/add") 132 @coprs_ns.route("/<username>/<coprname>/package/add/<source_type_text>") 133 @coprs_ns.route("/g/<group_name>/<coprname>/package/add") 134 @coprs_ns.route("/g/<group_name>/<coprname>/package/add/<source_type_text>") 135 @login_required 136 @req_with_copr 137 -def copr_add_package(copr, source_type_text="scm", **kwargs):
138 form = { 139 "scm": forms.PackageFormScm(), 140 "pypi": forms.PackageFormPyPI(), 141 "rubygems": forms.PackageFormRubyGems(), 142 "custom": forms.PackageFormCustom(), 143 "distgit": forms.PackageFormDistGitSimple(), 144 } 145 146 if "form" in kwargs: 147 form[source_type_text] = kwargs["form"] 148 149 return flask.render_template("coprs/detail/add_package.html", copr=copr, package=None, 150 source_type_text=source_type_text, view="coprs_ns.copr_new_package", 151 form_scm=form["scm"], form_pypi=form["pypi"], 152 form_rubygems=form["rubygems"], 153 form_distgit=form['distgit'], 154 form_custom=form['custom'])
155
156 157 @coprs_ns.route("/<username>/<coprname>/package/new/<source_type_text>", methods=["POST"]) 158 @coprs_ns.route("/g/<group_name>/<coprname>/package/new/<source_type_text>", methods=["POST"]) 159 @login_required 160 @req_with_copr 161 -def copr_new_package(copr, source_type_text):
162 url_on_success = helpers.copr_url("coprs_ns.copr_packages", copr) 163 return process_save_package(copr, source_type_text, package_name=None, view="coprs_ns.copr_new_package", 164 view_method=copr_add_package, url_on_success=url_on_success)
165
166 167 @coprs_ns.route("/<username>/<coprname>/package/<package_name>/edit") 168 @coprs_ns.route("/<username>/<coprname>/package/<package_name>/edit/<source_type_text>") 169 @coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/edit") 170 @coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/edit/<source_type_text>") 171 @req_with_copr 172 -def copr_edit_package(copr, package_name, source_type_text=None, **kwargs):
173 package = ComplexLogic.get_package_safe(copr.main_dir, package_name) 174 data = package.source_json_dict 175 data["webhook_rebuild"] = package.webhook_rebuild 176 data["chroot_blacklist"] = package.chroot_blacklist_raw 177 data["max_builds"] = package.max_builds 178 179 if package.has_source_type_set and not source_type_text: 180 source_type_text = package.source_type_text 181 elif not source_type_text: 182 source_type_text = "scm" 183 184 form_classes = { 185 "scm": forms.PackageFormScm, 186 "pypi": forms.PackageFormPyPI, 187 "rubygems": forms.PackageFormRubyGems, 188 "custom": forms.PackageFormCustom, 189 "distgit": forms.PackageFormDistGitSimple, 190 } 191 form = {k: v(formdata=None) for k, v in form_classes.items()} 192 193 if "form" in kwargs: 194 form[source_type_text] = kwargs["form"] 195 elif package.has_source_type_set: 196 form[package.source_type_text] = form_classes[package.source_type_text](data=data) 197 198 return flask.render_template("coprs/detail/edit_package.html", package=package, copr=copr, 199 source_type_text=source_type_text, view="coprs_ns.copr_edit_package", 200 form_scm=form["scm"], form_pypi=form["pypi"], 201 form_rubygems=form["rubygems"], 202 form_distgit=form["distgit"], 203 form_custom=form['custom'])
204
205 206 @coprs_ns.route("/<username>/<coprname>/package/<package_name>/edit/<source_type_text>", methods=["POST"]) 207 @coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/edit/<source_type_text>", methods=["POST"]) 208 @login_required 209 @req_with_copr 210 -def copr_edit_package_post(copr, package_name, source_type_text):
211 UsersLogic.raise_if_cant_build_in_copr( 212 flask.g.user, copr, "You don't have permissions to edit this package.") 213 214 url_on_success = helpers.copr_url("coprs_ns.copr_packages", copr) 215 return process_save_package(copr, source_type_text, package_name, view="coprs_ns.copr_edit_package", 216 view_method=copr_edit_package, url_on_success=url_on_success)
217
218 219 -def process_save_package(copr, source_type_text, package_name, view, view_method, url_on_success):
220 form = forms.get_package_form_cls_by_source_type_text(source_type_text)() 221 222 if "reset" in flask.request.form: 223 try: 224 package = PackagesLogic.get(copr.main_dir.id, package_name)[0] 225 except IndexError: 226 flask.flash("Package {package_name} does not exist in copr_dir {copr_dir}." 227 .format(package_name, copr.main_dir.full_name)) 228 return flask.redirect(url_on_success) # should be url_on_fail 229 230 try: 231 PackagesLogic.reset_package(flask.g.user, package) 232 db.session.commit() 233 except InsufficientRightsException as e: 234 flask.flash(str(e)) 235 return flask.redirect(url_on_success) # should be url_on_fail 236 237 flask.flash("Package default source successfully reset.") 238 return flask.redirect(url_on_success) 239 240 if form.validate_on_submit(): 241 try: 242 if package_name: 243 package = PackagesLogic.get(copr.main_dir.id, package_name)[0] 244 else: 245 package = PackagesLogic.add(flask.app.g.user, copr.main_dir, form.package_name.data) 246 247 package.source_type = helpers.BuildSourceEnum(source_type_text) 248 package.webhook_rebuild = form.webhook_rebuild.data 249 package.source_json = form.source_json 250 package.chroot_blacklist_raw = form.chroot_blacklist.data 251 package.max_builds = form.max_builds.data 252 253 db.session.add(package) 254 db.session.commit() 255 except (InsufficientRightsException, IndexError) as e: 256 db.session.rollback() 257 flask.flash(str(e), "error") 258 else: 259 flask.flash("Package successfully saved" if package_name else "New package has been created.", "success") 260 261 return flask.redirect(url_on_success) 262 263 kwargs = { 264 "coprname": copr.name, 265 "package_name": package_name, 266 "source_type_text": source_type_text, 267 "form": form, 268 } 269 270 kwargs.update({"group_name": copr.group.name} if copr.is_a_group_project else {"username": copr.user.name}) 271 return view_method(**kwargs)
272
273 274 @coprs_ns.route("/<username>/<coprname>/package/<int:package_id>/delete", methods=["POST"]) 275 @coprs_ns.route("/g/<group_name>/<coprname>/package/<int:package_id>/delete", methods=["POST"]) 276 @login_required 277 @req_with_copr 278 -def copr_delete_package(copr, package_id):
279 package = ComplexLogic.get_package_by_id_safe(package_id) 280 281 try: 282 PackagesLogic.delete_package(flask.g.user, package) 283 except (InsufficientRightsException, ActionInProgressException) as e: 284 flask.flash(str(e), "error") 285 else: 286 db.session.commit() 287 flask.flash("Package has been deleted successfully.") 288 289 return flask.redirect(helpers.copr_url("coprs_ns.copr_packages", copr))
290