Package coprs :: Package views :: Package apiv3_ns :: Module apiv3_packages
[hide private]
[frames] | no frames]

Source Code for Module coprs.views.apiv3_ns.apiv3_packages

  1  import flask 
  2  from . import query_params, pagination, get_copr, Paginator, GET, POST, PUT, DELETE 
  3  from .json2form import get_form_compatible_data, get_input, without_empty_fields 
  4  from coprs.exceptions import (ObjectNotFound, BadRequest) 
  5  from coprs.views.misc import api_login_required 
  6  from coprs import db, models, forms 
  7  from coprs.views.apiv3_ns import apiv3_ns 
  8  from coprs.logic.packages_logic import PackagesLogic 
  9   
 10  # @TODO if we need to do this on several places, we should figure a better way to do it 
 11  from coprs.views.apiv3_ns.apiv3_builds import to_dict as build_to_dict 
 12   
 13  # @TODO Don't import things from APIv1 
 14  from coprs.views.api_ns.api_general import process_package_add_or_edit 
15 16 17 -def to_dict(package):
18 source_dict = package.source_json_dict 19 if "srpm_build_method" in source_dict: 20 source_dict["source_build_method"] = source_dict.pop("srpm_build_method") 21 return { 22 "id": package.id, 23 "name": package.name, 24 "projectname": package.copr.name, 25 "ownername": package.copr.owner_name, 26 "source_type": package.source_type_text, 27 "source_dict": source_dict, 28 "auto_rebuild": package.webhook_rebuild, 29 }
30
31 32 -def rename_fields(input):
33 replace = { 34 "is_background": "background", 35 "memory_limit": "memory_reqs", 36 "source_build_method": "srpm_build_method", 37 "script_builddeps": "builddeps", 38 "script_resultdir": "resultdir", 39 "script_chroot": "chroot", 40 } 41 output = input.copy() 42 for from_name, to_name in replace.items(): 43 if from_name not in output: 44 continue 45 output[to_name] = output.pop(from_name) 46 return output
47
48 49 @apiv3_ns.route("/package", methods=GET) 50 @query_params() 51 -def get_package(ownername, projectname, packagename):
52 copr = get_copr(ownername, projectname) 53 try: 54 package = PackagesLogic.get(copr.main_dir.id, packagename)[0] 55 except IndexError: 56 raise ObjectNotFound("No package with name {name} in copr {copr}".format(name=packagename, copr=copr.name)) 57 return flask.jsonify(to_dict(package))
58
59 60 @apiv3_ns.route("/package/list/", methods=GET) 61 @pagination() 62 @query_params() 63 -def get_package_list(ownername, projectname, **kwargs):
64 copr = get_copr(ownername, projectname) 65 paginator = Paginator(PackagesLogic.get_all(copr.main_dir.id), models.Package, **kwargs) 66 packages = paginator.map(to_dict) 67 return flask.jsonify(items=packages, meta=paginator.meta)
68
69 70 @apiv3_ns.route("/package/add/<ownername>/<projectname>/<package_name>/<source_type_text>", methods=POST) 71 @api_login_required 72 -def package_add(ownername, projectname, package_name, source_type_text):
73 copr = get_copr(ownername, projectname) 74 data = rename_fields(get_form_compatible_data(preserve=["python_versions"])) 75 process_package_add_or_edit(copr, source_type_text, data=data) 76 package = PackagesLogic.get(copr.main_dir.id, package_name).first() 77 return flask.jsonify(to_dict(package))
78
79 80 @apiv3_ns.route("/package/edit/<ownername>/<projectname>/<package_name>/<source_type_text>", methods=PUT) 81 @api_login_required 82 -def package_edit(ownername, projectname, package_name, source_type_text=None):
83 copr = get_copr(ownername, projectname) 84 data = rename_fields(get_form_compatible_data(preserve=["python_versions"])) 85 try: 86 package = PackagesLogic.get(copr.main_dir.id, package_name)[0] 87 source_type_text = source_type_text or package.source_type_text 88 except IndexError: 89 raise ObjectNotFound("Package {name} does not exists in copr {copr}." 90 .format(name=package_name, copr=copr.full_name)) 91 92 process_package_add_or_edit(copr, source_type_text, package=package, data=data) 93 return flask.jsonify(to_dict(package))
94
95 96 @apiv3_ns.route("/package/reset", methods=PUT) 97 @api_login_required 98 -def package_reset():
99 copr = get_copr() 100 form = forms.BasePackageForm() 101 try: 102 package = PackagesLogic.get(copr.main_dir.id, form.package_name.data)[0] 103 except IndexError: 104 raise ObjectNotFound("No package with name {name} in copr {copr}" 105 .format(name=form.package_name.data, copr=copr.name)) 106 107 PackagesLogic.reset_package(flask.g.user, package) 108 db.session.commit() 109 return flask.jsonify(to_dict(package))
110
111 112 @apiv3_ns.route("/package/build", methods=POST) 113 @api_login_required 114 -def package_build():
115 copr = get_copr() 116 data = rename_fields(get_form_compatible_data(preserve=["python_versions"])) 117 form = forms.RebuildPackageFactory.create_form_cls(copr.active_chroots)(data, meta={'csrf': False}) 118 try: 119 package = PackagesLogic.get(copr.main_dir.id, form.package_name.data)[0] 120 except IndexError: 121 raise ObjectNotFound("No package with name {name} in copr {copr}" 122 .format(name=form.package_name.data, copr=copr.name)) 123 if form.validate_on_submit(): 124 buildopts = {k: v for k, v in form.data.items() if k in data} 125 build = PackagesLogic.build_package(flask.g.user, copr, package, form.selected_chroots, 126 copr_dirname=form.project_dirname.data, **buildopts) 127 db.session.commit() 128 else: 129 raise BadRequest(form.errors) 130 return flask.jsonify(build_to_dict(build))
131
132 133 @apiv3_ns.route("/package/delete", methods=DELETE) 134 @api_login_required 135 -def package_delete():
136 copr = get_copr() 137 form = forms.BasePackageForm() 138 try: 139 package = PackagesLogic.get(copr.main_dir.id, form.package_name.data)[0] 140 except IndexError: 141 raise ObjectNotFound("No package with name {name} in copr {copr}" 142 .format(name=form.package_name.data, copr=copr.name)) 143 144 PackagesLogic.delete_package(flask.g.user, package) 145 db.session.commit() 146 return flask.jsonify(to_dict(package))
147