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 db 
  7  from coprs import forms 
  8  from coprs import helpers 
  9  from coprs.models import Package, Build 
 10  from coprs.views.coprs_ns import coprs_ns 
 11  from coprs.views.coprs_ns.coprs_builds import render_add_build_tito, render_add_build_mock, render_add_build_pypi 
 12  from coprs.views.misc import login_required, page_not_found, req_with_copr, req_with_copr 
 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 packages_query = PackagesLogic.get_copr_packages_list(copr) 25 return flask.Response(stream_with_context(helpers.stream_template("coprs/detail/packages.html", 26 copr=copr, 27 packages=list(packages_query))))
28
29 @coprs_ns.route("/<username>/<coprname>/package/<package_name>/") 30 @coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/") 31 @req_with_copr 32 -def copr_package(copr, package_name):
33 package = ComplexLogic.get_package_safe(copr, package_name) 34 return flask.render_template("coprs/detail/package.html", package=package, copr=copr)
35
36 @coprs_ns.route("/<username>/<coprname>/package/<package_name>/status_image/last_build.png") 37 @coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/status_image/last_build.png") 38 @req_with_copr 39 -def copr_package_icon(copr, package_name):
40 try: 41 package = ComplexLogic.get_package_safe(copr, package_name) 42 except ObjectNotFound: 43 return send_file("static/status_images/bad_url.png", mimetype='image/png') 44 45 last_build = package.last_build() 46 if last_build: 47 if last_build.state in ["importing", "pending", "starting", "running"]: 48 return send_file("static/status_images/in_progress.png", mimetype='image/png') 49 50 if last_build.state in ["succeeded", "skipped"]: 51 return send_file("static/status_images/succeeded.png", mimetype='image/png') 52 53 if last_build.state == "failed": 54 return send_file("static/status_images/failed.png", mimetype='image/png') 55 56 else: 57 return send_file("static/status_images/unknown.png", mimetype='image/png')
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.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, 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, package_name) 100 data = package.source_json_dict 101 102 if package.source_type_text == "git_and_tito": 103 data["git_directory"] = data["git_dir"] # @FIXME workaround 104 form = forms.BuildFormTitoFactory 105 f = render_add_build_tito 106 view_suffix = "_tito" 107 elif package.source_type_text == "mock_scm": 108 form = forms.BuildFormMockFactory 109 f = render_add_build_mock 110 view_suffix = "_mock" 111 elif package.source_type_text == "pypi": 112 form = forms.BuildFormPyPIFactory 113 f = render_add_build_pypi 114 view_suffix = "_pypi" 115 else: 116 flask.flash("Package {} has not the default source which is required for rebuild. Please configure some source" 117 .format(package_name, copr.full_name)) 118 return flask.redirect(helpers.copr_url("coprs_ns.copr_edit_package", copr, package_name=package_name)) 119 120 form = form(copr.active_chroots)(data=data) 121 return f(copr, form, view="coprs_ns.copr_new_build" + view_suffix, package=package)
122
123 124 @coprs_ns.route("/<username>/<coprname>/package/add") 125 @coprs_ns.route("/<username>/<coprname>/package/add/<source_type_text>") 126 @coprs_ns.route("/g/<group_name>/<coprname>/package/add") 127 @coprs_ns.route("/g/<group_name>/<coprname>/package/add/<source_type_text>") 128 @login_required 129 @req_with_copr 130 -def copr_add_package(copr, source_type_text="git_and_tito", **kwargs):
131 form = { 132 "git_and_tito": forms.PackageFormTito(), 133 "mock_scm": forms.PackageFormMock(), 134 "pypi": forms.PackageFormPyPI(), 135 "rubygems": forms.PackageFormRubyGems(), 136 } 137 138 if "form" in kwargs: 139 form[source_type_text] = kwargs["form"] 140 141 return flask.render_template("coprs/detail/add_package.html", copr=copr, package=None, 142 source_type_text=source_type_text, view="coprs_ns.copr_new_package", 143 form_tito=form["git_and_tito"], form_mock=form["mock_scm"], form_pypi=form["pypi"], 144 form_rubygems=form["rubygems"])
145 146 147 @coprs_ns.route("/<username>/<coprname>/package/new/<source_type_text>", methods=["POST"]) 148 @coprs_ns.route("/g/<group_name>/<coprname>/package/new/<source_type_text>", methods=["POST"])
149 @login_required 150 @req_with_copr 151 -def copr_new_package(copr, source_type_text):
152 url_on_success = helpers.copr_url("coprs_ns.copr_packages", copr) 153 return process_save_package(copr, source_type_text, package_name=None, view="coprs_ns.copr_new_package", 154 view_method=copr_add_package, url_on_success=url_on_success)
155
156 157 @coprs_ns.route("/<username>/<coprname>/package/<package_name>/edit") 158 @coprs_ns.route("/<username>/<coprname>/package/<package_name>/edit/<source_type_text>") 159 @coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/edit") 160 @coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/edit/<source_type_text>") 161 @req_with_copr 162 -def copr_edit_package(copr, package_name, source_type_text=None, **kwargs):
163 package = ComplexLogic.get_package_safe(copr, package_name) 164 data = package.source_json_dict 165 data["webhook_rebuild"] = package.webhook_rebuild 166 167 if package.has_source_type_set and not source_type_text: 168 source_type_text = package.source_type_text 169 elif not source_type_text: 170 source_type_text = "git_and_tito" 171 172 form_classes = { 173 "git_and_tito": forms.PackageFormTito, 174 "mock_scm": forms.PackageFormMock, 175 "pypi": forms.PackageFormPyPI, 176 "rubygems": forms.PackageFormRubyGems, 177 } 178 form = {k: v(formdata=None) for k, v in form_classes.items()} 179 180 if "form" in kwargs: 181 form[source_type_text] = kwargs["form"] 182 elif package.has_source_type_set: 183 if package.source_type_text == "git_and_tito" and "git_dir" in data: 184 data["git_directory"] = data["git_dir"] # @FIXME workaround 185 form[package.source_type_text] = form_classes[package.source_type_text](data=data) 186 187 return flask.render_template("coprs/detail/edit_package.html", package=package, copr=copr, 188 source_type_text=source_type_text, view="coprs_ns.copr_edit_package", 189 form_tito=form["git_and_tito"], form_mock=form["mock_scm"], form_pypi=form["pypi"], 190 form_rubygems=form["rubygems"])
191 192 193 @coprs_ns.route("/<username>/<coprname>/package/<package_name>/edit/<source_type_text>", methods=["POST"]) 194 @coprs_ns.route("/g/<group_name>/<coprname>/package/<package_name>/edit/<source_type_text>", methods=["POST"])
195 @login_required 196 @req_with_copr 197 -def copr_edit_package_post(copr, package_name, source_type_text):
198 UsersLogic.raise_if_cant_build_in_copr( 199 flask.g.user, copr, "You don't have permissions to edit this package.") 200 201 url_on_success = helpers.copr_url("coprs_ns.copr_packages", copr) 202 return process_save_package(copr, source_type_text, package_name, view="coprs_ns.copr_edit_package", 203 view_method=copr_edit_package, url_on_success=url_on_success)
204
205 206 -def process_save_package(copr, source_type_text, package_name, view, view_method, url_on_success):
207 form = forms.get_package_form_cls_by_source_type_text(source_type_text)() 208 209 if "reset" in flask.request.form: 210 try: 211 package = PackagesLogic.get(copr.id, package_name)[0] 212 except IndexError: 213 flask.flash("Package {package_name} does not exist in copr {copr}.".format(package_name, copr.full_name)) 214 return flask.redirect(url_on_success) # should be url_on_fail 215 216 try: 217 PackagesLogic.reset_package(flask.g.user, package) 218 db.session.commit() 219 except InsufficientRightsException as e: 220 flask.flash(str(e)) 221 return flask.redirect(url_on_success) # should be url_on_fail 222 223 flask.flash("Package default source successfully reset.") 224 return flask.redirect(url_on_success) 225 226 if form.validate_on_submit(): 227 try: 228 if package_name: 229 package = PackagesLogic.get(copr.id, package_name)[0] 230 else: 231 package = PackagesLogic.add(flask.app.g.user, copr, form.package_name.data) 232 233 package.source_type = helpers.BuildSourceEnum(source_type_text) 234 package.webhook_rebuild = form.webhook_rebuild.data 235 package.source_json = form.source_json 236 237 db.session.add(package) 238 db.session.commit() 239 except (InsufficientRightsException, IndexError) as e: 240 db.session.rollback() 241 flask.flash(str(e), "error") 242 else: 243 flask.flash("Package successfully saved" if package_name else "New package has been created.") 244 245 return flask.redirect(url_on_success) 246 247 kwargs = { 248 "coprname": copr.name, 249 "package_name": package_name, 250 "source_type_text": source_type_text, 251 "form": form, 252 } 253 254 kwargs.update({"group_name": copr.group.name} if copr.is_a_group_project else {"username": copr.user.name}) 255 return view_method(**kwargs)
256 257 258 @coprs_ns.route("/<username>/<coprname>/package/<int:package_id>/delete", methods=["POST"]) 259 @coprs_ns.route("/g/<group_name>/<coprname>/package/<int:package_id>/delete", methods=["POST"])
260 @login_required 261 @req_with_copr 262 -def copr_delete_package(copr, package_id):
263 package = ComplexLogic.get_package_by_id_safe(package_id) 264 265 try: 266 PackagesLogic.delete_package(flask.g.user, package) 267 except (InsufficientRightsException, ActionInProgressException) as e: 268 flask.flash(str(e), "error") 269 else: 270 db.session.commit() 271 flask.flash("Package has been deleted successfully.", "success") 272 273 return flask.redirect(helpers.copr_url("coprs_ns.copr_packages", copr))
274