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   
  3  from coprs.exceptions import ( 
  4          BadRequest, 
  5          ObjectNotFound, 
  6          NoPackageSourceException 
  7  ) 
  8  from coprs.views.misc import api_login_required 
  9  from coprs import db, models, forms 
 10  from coprs.views.apiv3_ns import apiv3_ns 
 11  from coprs.logic.packages_logic import PackagesLogic 
 12   
 13  # @TODO if we need to do this on several places, we should figure a better way to do it 
 14  from coprs.views.apiv3_ns.apiv3_builds import to_dict as build_to_dict 
 15   
 16  # @TODO Don't import things from APIv1 
 17  from coprs.views.api_ns.api_general import process_package_add_or_edit 
 18   
 19  from . import query_params, pagination, get_copr, ListPaginator, GET, POST, PUT, DELETE 
 20  from .json2form import get_form_compatible_data 
21 22 -def to_dict(package, with_latest_build=False, with_latest_succeeded_build=False):
23 source_dict = package.source_json_dict 24 if "srpm_build_method" in source_dict: 25 source_dict["source_build_method"] = source_dict.pop("srpm_build_method") 26 27 latest = None 28 if with_latest_build: 29 latest = package.last_build() 30 latest = build_to_dict(latest) if latest else None 31 32 latest_succeeded = None 33 if with_latest_succeeded_build: 34 latest_succeeded = package.last_build(successful=True) 35 latest_succeeded = build_to_dict(latest_succeeded) if latest_succeeded else None 36 37 return { 38 "id": package.id, 39 "name": package.name, 40 "projectname": package.copr.name, 41 "ownername": package.copr.owner_name, 42 "source_type": package.source_type_text, 43 "source_dict": source_dict, 44 "auto_rebuild": package.webhook_rebuild, 45 "builds": { 46 "latest": latest, 47 "latest_succeeded": latest_succeeded, 48 } 49 }
50
51 52 -def rename_fields(input):
53 replace = { 54 "is_background": "background", 55 "memory_limit": "memory_reqs", 56 "source_build_method": "srpm_build_method", 57 "script_builddeps": "builddeps", 58 "script_resultdir": "resultdir", 59 "script_chroot": "chroot", 60 } 61 output = input.copy() 62 for from_name, to_name in replace.items(): 63 if from_name not in output: 64 continue 65 output[to_name] = output.pop(from_name) 66 return output
67
68 69 -def get_arg_to_bool(argument):
70 """ 71 Through GET, we send requests like '/?with_latest_build=True', so the 72 argument is passed down as "string". But by default, as function argument, 73 the value may be boolean, too. 74 """ 75 if not argument: 76 return argument 77 if argument in [True, "True", "true", 1, "1"]: 78 return True 79 return False
80
81 82 @apiv3_ns.route("/package", methods=GET) 83 @query_params() 84 -def get_package(ownername, projectname, packagename, 85 with_latest_build=False, with_latest_succeeded_build=False):
86 with_latest_build = get_arg_to_bool(with_latest_build) 87 with_latest_succeeded_build = get_arg_to_bool(with_latest_succeeded_build) 88 89 copr = get_copr(ownername, projectname) 90 try: 91 package = PackagesLogic.get(copr.main_dir.id, packagename)[0] 92 except IndexError: 93 raise ObjectNotFound("No package with name {name} in copr {copr}".format(name=packagename, copr=copr.name)) 94 return flask.jsonify(to_dict(package, with_latest_build, with_latest_succeeded_build))
95
96 97 @apiv3_ns.route("/package/list/", methods=GET) 98 @pagination() 99 @query_params() 100 -def get_package_list(ownername, projectname, with_latest_build=False, 101 with_latest_succeeded_build=False, **kwargs):
102 103 with_latest_build = get_arg_to_bool(with_latest_build) 104 with_latest_succeeded_build = get_arg_to_bool(with_latest_succeeded_build) 105 106 copr = get_copr(ownername, projectname) 107 packages = PackagesLogic.get_packages_with_latest_builds_for_dir(copr.main_dir.id, small_build=False) 108 paginator = ListPaginator(packages, models.Package, **kwargs) 109 110 packages = paginator.map(lambda x: to_dict(x, with_latest_build, with_latest_succeeded_build)) 111 return flask.jsonify(items=packages, meta=paginator.meta)
112
113 114 @apiv3_ns.route("/package/add/<ownername>/<projectname>/<package_name>/<source_type_text>", methods=POST) 115 @api_login_required 116 -def package_add(ownername, projectname, package_name, source_type_text):
117 copr = get_copr(ownername, projectname) 118 data = rename_fields(get_form_compatible_data(preserve=["python_versions"])) 119 process_package_add_or_edit(copr, source_type_text, data=data) 120 package = PackagesLogic.get(copr.main_dir.id, package_name).first() 121 return flask.jsonify(to_dict(package))
122
123 124 @apiv3_ns.route("/package/edit/<ownername>/<projectname>/<package_name>/<source_type_text>", methods=PUT) 125 @api_login_required 126 -def package_edit(ownername, projectname, package_name, source_type_text=None):
127 copr = get_copr(ownername, projectname) 128 data = rename_fields(get_form_compatible_data(preserve=["python_versions"])) 129 try: 130 package = PackagesLogic.get(copr.main_dir.id, package_name)[0] 131 source_type_text = source_type_text or package.source_type_text 132 except IndexError: 133 raise ObjectNotFound("Package {name} does not exists in copr {copr}." 134 .format(name=package_name, copr=copr.full_name)) 135 136 process_package_add_or_edit(copr, source_type_text, package=package, data=data) 137 return flask.jsonify(to_dict(package))
138
139 140 @apiv3_ns.route("/package/reset", methods=PUT) 141 @api_login_required 142 -def package_reset():
143 copr = get_copr() 144 form = forms.BasePackageForm() 145 try: 146 package = PackagesLogic.get(copr.main_dir.id, form.package_name.data)[0] 147 except IndexError: 148 raise ObjectNotFound("No package with name {name} in copr {copr}" 149 .format(name=form.package_name.data, copr=copr.name)) 150 151 PackagesLogic.reset_package(flask.g.user, package) 152 db.session.commit() 153 return flask.jsonify(to_dict(package))
154
155 156 @apiv3_ns.route("/package/build", methods=POST) 157 @api_login_required 158 -def package_build():
159 copr = get_copr() 160 data = rename_fields(get_form_compatible_data(preserve=["python_versions"])) 161 form = forms.RebuildPackageFactory.create_form_cls(copr.active_chroots)(data, meta={'csrf': False}) 162 try: 163 package = PackagesLogic.get(copr.main_dir.id, form.package_name.data)[0] 164 except IndexError: 165 raise ObjectNotFound("No package with name {name} in copr {copr}" 166 .format(name=form.package_name.data, copr=copr.name)) 167 if form.validate_on_submit(): 168 buildopts = {k: v for k, v in form.data.items() if k in data} 169 try: 170 build = PackagesLogic.build_package( 171 flask.g.user, copr, package, form.selected_chroots, 172 copr_dirname=form.project_dirname.data, **buildopts) 173 except NoPackageSourceException as e: 174 raise BadRequest(str(e)) 175 db.session.commit() 176 else: 177 raise BadRequest(form.errors) 178 return flask.jsonify(build_to_dict(build))
179
180 181 @apiv3_ns.route("/package/delete", methods=DELETE) 182 @api_login_required 183 -def package_delete():
184 copr = get_copr() 185 form = forms.BasePackageForm() 186 try: 187 package = PackagesLogic.get(copr.main_dir.id, form.package_name.data)[0] 188 except IndexError: 189 raise ObjectNotFound("No package with name {name} in copr {copr}" 190 .format(name=form.package_name.data, copr=copr.name)) 191 192 PackagesLogic.delete_package(flask.g.user, package) 193 db.session.commit() 194 return flask.jsonify(to_dict(package))
195