Package coprs :: Package rest_api :: Package resources :: Module project
[hide private]
[frames] | no frames]

Source Code for Module coprs.rest_api.resources.project

  1  from logging import getLogger 
  2   
  3  import flask 
  4  from flask import url_for, make_response 
  5  from flask_restful import Resource 
  6   
  7  from ... import db 
  8  from ...logic.builds_logic import BuildsLogic 
  9  from ...logic.complex_logic import ComplexLogic 
 10  from ...logic.helpers import slice_query 
 11  from ...logic.coprs_logic import CoprsLogic 
 12  from ...exceptions import ActionInProgressException, InsufficientRightsException 
 13   
 14  from ...exceptions import DuplicateException 
 15   
 16  from ..common import rest_api_auth_required, render_copr_chroot, render_build, render_project, get_project_safe 
 17  from ..schemas import ProjectSchema, ProjectCreateSchema 
 18  from ..exceptions import ObjectAlreadyExists, CannotProcessRequest, AccessForbidden 
 19  from ..util import mm_deserialize, get_request_parser, arg_bool 
 20   
 21  log = getLogger(__name__) 
22 23 24 -class ProjectListR(Resource):
25 26 @rest_api_auth_required
27 - def post(self):
28 """ 29 Creates new copr 30 """ 31 user = flask.g.user 32 req = mm_deserialize(ProjectCreateSchema(), flask.request.data.decode("utf-8")) 33 name = req.pop("name") 34 35 selected_chroots = req.pop("chroots", None) 36 37 group_name = req.pop("group", None) 38 if group_name: 39 group = ComplexLogic.get_group_by_name_safe(group_name) 40 else: 41 group = None 42 43 try: 44 project = CoprsLogic.add( 45 user=user, check_for_duplicates=True, 46 name=name, 47 selected_chroots=selected_chroots, 48 group=group, 49 **req 50 ) 51 52 db.session.commit() 53 except DuplicateException as error: 54 raise ObjectAlreadyExists(msg=str(error)) 55 56 resp = make_response("", 201) 57 resp.headers["Location"] = url_for(".projectr", project_id=project.id) 58 return resp
59
60 - def get(self):
61 parser = get_request_parser() 62 parser.add_argument('owner', type=str) 63 parser.add_argument('group', type=str) 64 parser.add_argument('name', type=str) 65 parser.add_argument('limit', type=int) 66 parser.add_argument('offset', type=int) 67 parser.add_argument('search_query', type=str) 68 69 req_args = parser.parse_args() 70 71 if req_args["search_query"]: 72 query = CoprsLogic.get_multiple_fulltext(req_args["search_query"]) 73 else: 74 query = CoprsLogic.get_multiple(flask.g.user) 75 76 query = CoprsLogic.set_query_order(query) 77 78 if req_args["owner"]: 79 query = CoprsLogic.filter_by_user_name(query, req_args["owner"]) 80 81 if req_args["group"]: 82 query = CoprsLogic.filter_by_group_name(query, req_args["group"]) 83 84 if req_args["name"]: 85 query = CoprsLogic.filter_by_name(query, req_args["name"]) 86 87 limit = 100 88 offset = 0 89 if req_args["limit"]: 90 limit = req_args["limit"] 91 if req_args["offset"]: 92 offset = req_args["offset"] 93 94 query = slice_query(query, limit, offset) 95 coprs_list = query.all() 96 97 result_dict = { 98 "_links": { 99 "self": {"href": url_for(".projectlistr", **req_args)} 100 }, 101 "projects": [render_project(copr) for copr in coprs_list], 102 } 103 104 return result_dict
105
106 107 -class ProjectR(Resource):
108 109 @rest_api_auth_required
110 - def delete(self, project_id):
111 project = get_project_safe(project_id) 112 113 try: 114 ComplexLogic.delete_copr(project) 115 db.session.commit() 116 except ActionInProgressException as err: 117 raise CannotProcessRequest(str(err)) 118 except InsufficientRightsException as err: 119 raise AccessForbidden(str(err)) 120 121 return None, 204
122
123 - def get(self, project_id):
124 parser = get_request_parser() 125 parser.add_argument('show_builds', type=arg_bool, default=False) 126 parser.add_argument('show_chroots', type=arg_bool, default=False) 127 req_args = parser.parse_args() 128 129 project = get_project_safe(project_id) 130 self_params = {} 131 if req_args["show_builds"]: 132 self_params["show_builds"] = req_args["show_builds"] 133 if req_args["show_chroots"]: 134 self_params["show_chroots"] = req_args["show_chroots"] 135 136 answer = render_project(project, self_params) 137 138 if req_args["show_builds"]: 139 answer["project_builds"] = [ 140 render_build(build) 141 for build in BuildsLogic.get_multiple_by_copr(project).all() 142 ] 143 144 if req_args["show_chroots"]: 145 answer["project_chroots"] = [ 146 render_copr_chroot(chroot) 147 for chroot in project.copr_chroots 148 ] 149 150 return answer
151 152 @rest_api_auth_required
153 - def put(self, project_id):
154 """ 155 Modifies project by replacement of provided fields 156 """ 157 project = get_project_safe(project_id) 158 159 project_dict = mm_deserialize(ProjectSchema(), flask.request.data.decode("utf-8")) 160 161 for k, v in project_dict.items(): 162 setattr(project, k, v) 163 164 try: 165 CoprsLogic.update(flask.g.user, project) 166 db.session.commit() 167 except InsufficientRightsException as err: 168 raise AccessForbidden(str(err)) 169 170 return "", 204
171