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