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):
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):
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"])
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):
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):
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"]
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)
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)
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"])
274