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):
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):
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):
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):
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):
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)
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)
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):
290