1 import os
2 import flask
3 from werkzeug.datastructures import MultiDict
4 from . import get_copr, file_upload, query_params, pagination, Paginator, json2form, GET, POST, PUT, DELETE
5 from .json2form import get_form_compatible_data
6 from werkzeug import secure_filename
7 from copr_common.enums import StatusEnum
8 from coprs import db, forms, models
9 from coprs.exceptions import (BadRequest, AccessRestricted)
10 from coprs.views.misc import api_login_required
11 from coprs.views.apiv3_ns import apiv3_ns
12 from coprs.logic.complex_logic import ComplexLogic
13 from coprs.logic.builds_logic import BuildsLogic
17 return {
18 "id": build.id,
19 "state": build.state,
20 "projectname": build.copr.name,
21 "ownername": build.copr.owner_name,
22 "repo_url": build.copr.repo_url,
23 "source_package": {"name": build.package_name, "version": build.pkg_version, "url": build.srpm_url},
24 "submitted_on": build.submitted_on,
25 "started_on": build.min_started_on,
26 "ended_on": build.max_ended_on,
27 "submitter": build.user.name if build.user else None,
28 "chroots": [chroot.name for chroot in build.build_chroots],
29 "project_dirname": build.copr_dir.name,
30 }
31
41
51
54 replace = {
55 "source_build_method": "srpm_build_method",
56 }
57 output = input.copy()
58 for from_name, to_name in replace.items():
59 if from_name not in output:
60 continue
61 output[to_name] = output.pop(from_name)
62 return output
63
67
68
69 @apiv3_ns.route("/build/<int:build_id>/", methods=GET)
70 -def get_build(build_id):
73
74
75 @apiv3_ns.route("/build/list/", methods=GET)
76 @pagination()
77 @query_params()
78 -def get_build_list(ownername, projectname, packagename=None, status=None, **kwargs):
101
102
103 @apiv3_ns.route("/build/source-chroot/<int:build_id>/", methods=GET)
104 -def get_source_chroot(build_id):
107
113
114
115 @apiv3_ns.route("/build/cancel/<int:build_id>", methods=PUT)
116 @api_login_required
117 -def cancel_build(build_id):
122
123
124 @apiv3_ns.route("/build/create/url", methods=POST)
125 @api_login_required
126 -def create_from_url():
141 return process_creating_new_build(copr, form, create_new_build)
142
143
144 @apiv3_ns.route("/build/create/upload", methods=POST)
145 @api_login_required
146 @file_upload()
147 -def create_from_upload():
161 return process_creating_new_build(copr, form, create_new_build)
162
163
164 @apiv3_ns.route("/build/create/scm", methods=POST)
165 @api_login_required
166 -def create_from_scm():
167 copr = get_copr()
168 data = rename_fields(get_form_compatible_data())
169 form = forms.BuildFormScmFactory(copr.active_chroots)(data, meta={'csrf': False})
170
171 def create_new_build():
172 return BuildsLogic.create_new_from_scm(
173 flask.g.user,
174 copr,
175 scm_type=form.scm_type.data,
176 clone_url=form.clone_url.data,
177 committish=form.committish.data,
178 subdirectory=form.subdirectory.data,
179 spec=form.spec.data,
180 srpm_build_method=form.srpm_build_method.data,
181 chroot_names=form.selected_chroots,
182 background=form.background.data,
183 copr_dirname=form.project_dirname.data,
184 )
185 return process_creating_new_build(copr, form, create_new_build)
186
187
188 @apiv3_ns.route("/build/create/pypi", methods=POST)
189 @api_login_required
190 -def create_from_pypi():
191 copr = get_copr()
192 data = MultiDict(json2form.without_empty_fields(json2form.get_input()))
193 form = forms.BuildFormPyPIFactory(copr.active_chroots)(data, meta={'csrf': False})
194
195
196 if not form.python_versions.data:
197 form.python_versions.data = form.python_versions.default
198
199 def create_new_build():
200 return BuildsLogic.create_new_from_pypi(
201 flask.g.user,
202 copr,
203 form.pypi_package_name.data,
204 form.pypi_package_version.data,
205 form.spec_template.data,
206 form.python_versions.data,
207 form.selected_chroots,
208 background=form.background.data,
209 copr_dirname=form.project_dirname.data,
210 )
211 return process_creating_new_build(copr, form, create_new_build)
212
230 return process_creating_new_build(copr, form, create_new_build)
231
232
233 @apiv3_ns.route("/build/create/custom", methods=POST)
234 @api_login_required
235 -def create_from_custom():
236 copr = get_copr()
237 data = get_form_compatible_data()
238 form = forms.BuildFormCustomFactory(copr.active_chroots)(data, meta={'csrf': False})
239
240 def create_new_build():
241 return BuildsLogic.create_new_from_custom(
242 flask.g.user,
243 copr,
244 form.script.data,
245 form.chroot.data,
246 form.builddeps.data,
247 form.resultdir.data,
248 chroot_names=form.selected_chroots,
249 background=form.background.data,
250 copr_dirname=form.project_dirname.data,
251 )
252 return process_creating_new_build(copr, form, create_new_build)
253
272
273
274 @apiv3_ns.route("/build/delete/<int:build_id>", methods=DELETE)
275 @api_login_required
276 -def delete_build(build_id):
282