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