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