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):
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):
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):
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, 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):
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):
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, 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.id, package_name)[0]
206 except IndexError:
207 flask.flash("Package {package_name} does not exist in copr {copr}.".format(package_name, copr.full_name))
208 return flask.redirect(url_on_success)
209
210 try:
211 PackagesLogic.reset_package(flask.g.user, package)
212 db.session.commit()
213 except InsufficientRightsException as e:
214 flask.flash(str(e))
215 return flask.redirect(url_on_success)
216
217 flask.flash("Package default source successfully reset.")
218 return flask.redirect(url_on_success)
219
220 if form.validate_on_submit():
221 try:
222 if package_name:
223 package = PackagesLogic.get(copr.id, package_name)[0]
224 else:
225 package = PackagesLogic.add(flask.app.g.user, copr, form.package_name.data)
226
227 package.source_type = helpers.BuildSourceEnum(source_type_text)
228 package.webhook_rebuild = form.webhook_rebuild.data
229 package.source_json = form.source_json
230
231 db.session.add(package)
232 db.session.commit()
233 except (InsufficientRightsException, IndexError) as e:
234 db.session.rollback()
235 flask.flash(str(e), "error")
236 else:
237 flask.flash("Package successfully saved" if package_name else "New package has been created.")
238
239 return flask.redirect(url_on_success)
240
241 kwargs = {
242 "coprname": copr.name,
243 "package_name": package_name,
244 "source_type_text": source_type_text,
245 "form": form,
246 }
247
248 kwargs.update({"group_name": copr.group.name} if copr.is_a_group_project else {"username": copr.user.name})
249 return view_method(**kwargs)
250
251
252 @coprs_ns.route("/<username>/<coprname>/package/<int:package_id>/delete", methods=["POST"])
253 @coprs_ns.route("/g/<group_name>/<coprname>/package/<int:package_id>/delete", methods=["POST"])
254 @login_required
255 @req_with_copr
256 -def copr_delete_package(copr, package_id):
268