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