def config(self, request): if request.method == 'OPTIONS': request.app.fire('on_preflight', request, methods=('GET', 'PATCH')) return request.response user = self.model.get_instance(request).obj resource = 'applications:%s:config' % user.application_id.hex with self.model.session(request) as session: session.add(user) if request.method == 'GET': Resource(resource, 'read')(request) result = user.application.config or {} else: form_class = get_form_class(request, 'application-config') Resource(resource, 'update')(request) data, files = request.data_and_files() form = form_class(request, data=data, files=files) if form.is_valid(exclude_missing=True): application = user.application result = application.config if result is None: result = {} application.config = result session.add(application) for key, value in form.cleaned_data.items(): if not value: result.pop(key, None) else: result[key] = value flag_modified(application, 'config') else: result = form.tojson() return self.json_response(request, result)
def member(self, request): if request.method == 'OPTIONS': request.app.fire('on_preflight', request) return request.response model = self.get_model(request) member = request.urlargs['member'] cache = request.cache with model.session(request) as session: cache.organisation = self._get_org(request, session, pop=2) cache.requester = self._get_requester(request, cache.organisation, session) try: cache.member = model.get_member(request, cache.organisation, member, session=session) except Http404: if request.method in POST_PUT: cache.member = None else: raise if request.method in GET_HEAD: Resource.rest(request, 'read')(request) data = model.member_tojson(request, cache.member) elif request.method in POST_PUT: data, _ = request.data_and_files() form = OrgMemberForm(request, data=data) if form.is_valid(): odm = request.app.odm() if cache.member is None: user_model = request.app.models['users'] user = user_model.get_instance(request, username=member, session=session) # Create member cache.member = odm.orgmember( user=user.obj, organisation=cache.organisation) for attr, value in form.cleaned_data.items(): setattr(cache.member, attr, value) session.add(cache.member) session.flush() data = model.member_tojson(request, cache.member) else: data = form.tojson() elif request.method == 'DELETE': Resource.rest(request, 'delete')(request) self._owner_count(request, cache.member, session) session.delete(cache.member) request.response.status_code = 204 return request.response return self.json_response(request, data)
def _get_org(self, request, session, pop=0): model = self.get_model(request) org = self.get_instance( request, session=session, check_permission=Resource.rest(request, 'read', model.fields(), pop=pop) ) request.cache.organisation = org return org
def _get_org(self, request, session, pop=0): model = self.get_model(request) org = self.get_instance(request, session=session, check_permission=Resource.rest(request, 'read', model.fields(), pop=pop)) request.cache.organisation = org return org
def get(self, request): '''Get a list of models ''' model = self.get_model(request) data = self.get_list(request, check_permission=Resource.rest(request, 'read', model.fields(), list=True)) return self.json_response(request, data)
def get_links(self, request): data = self.get_list( request, load_only=('title', 'description', 'slug', 'url'), sortby=['title:asc', 'order:desc'], check_permission=Resource.rest(request, 'read', self.model.fields(), pop=1, list=True), **{'order:gt': 0, 'priority:gt': 0} ) return self.json_response(request, data)
def get(self, request): '''Get a list of models ''' model = self.get_model(request) data = self.get_list( request, check_permission=Resource.rest(request, 'read', model.fields(), list=True) ) return self.json_response(request, data)
def _links(self, request): if request.method == 'OPTIONS': request.app.fire('on_preflight', request, methods=GET_HEAD) return request.response data = self.get_list( request, load_only=('title', 'description', 'slug', 'url'), sortby=['title:asc', 'order:desc'], check_permission=Resource.rest(request, 'read', self.model.fields(), pop=1, list=True), **{'order:gt': 0, 'priority:gt': 0} ) return self.json_response(request, data)
def metadata(self, request): '''Model metadata''' if request.method == 'OPTIONS': request.app.fire('on_preflight', request, methods=GET_HEAD) return request.response filters, params = self.filters_params(request) model = self.get_model(request) meta = model.meta(request, *filters, check_permission=Resource.rest(request, 'read', model.fields(), pop=1, list=True), **params) return self.json_response(request, meta)
def metadata(self, request): '''Model metadata''' if request.method == 'OPTIONS': request.app.fire('on_preflight', request, methods=GET_HEAD) return request.response filters, params = self.filters_params(request) model = self.get_model(request) meta = model.meta( request, *filters, check_permission=Resource.rest(request, 'read', model.fields(), pop=1, list=True), **params ) return self.json_response(request, meta)
def _links(self, request): if request.method == 'OPTIONS': request.app.fire('on_preflight', request, methods=GET_HEAD) return request.response data = self.get_list(request, load_only=('title', 'description', 'slug', 'url'), sortby=['title:asc', 'order:desc'], check_permission=Resource.rest( request, 'read', self.model.fields(), pop=1, list=True), **{ 'order:gt': 0, 'priority:gt': 0 }) return self.json_response(request, data)
def post(self, request): '''Create a new model ''' model = self.get_model(request) form_class = get_form_class(request, model.form) if not form_class: raise MethodNotAllowed check_permission = Resource.rest(request, 'create', model.fields(), list=True) fields = check_permission(request) instance = model.instance(fields=fields) data, files = request.data_and_files() form = form_class(request, data=data, files=files, model=model) if form.is_valid(): with model.session(request) as session: try: instance = model.create_model(request, instance, form.cleaned_data, session=session) except ValidationError as exc: form.add_error_message(str(exc) or CREATE_MODEL_ERROR_MSG) data = form.tojson() except Exception as exc: request.logger.exception(CREATE_MODEL_ERROR_MSG) form.add_error_message(CREATE_MODEL_ERROR_MSG) data = form.tojson() else: data = model.tojson(request, instance) request.response.status_code = 201 else: data = form.tojson() return self.json_response(request, data)
def read_update_delete(self, request): model = self.get_model(request) if request.method == 'OPTIONS': request.app.fire('on_preflight', request, methods=model.instance_verbs()) return request.response with model.session(request) as session: if request.method in GET_HEAD: instance = self.get_instance(request, session=session, check_permission=Resource.rest( request, 'read', model.fields())) data = model.tojson(request, instance) elif request.method in POST_PUT_PATCH: exclude_missing = False if request.method == 'PATCH': exclude_missing = True form_class = get_form_class(request, model.updateform) elif request.method == 'POST': form_class = get_form_class(request, model.postform) else: form_class = get_form_class(request, model.putform) if not form_class: raise MethodNotAllowed instance = self.get_instance(request, session=session, check_permission=Resource.rest( request, 'update', model.fields())) data, files = request.data_and_files() form = form_class(request, data=data, files=files, previous_state=instance, model=model) if form.is_valid(exclude_missing=exclude_missing): try: instance = model.update_model(request, instance, form.cleaned_data, session=session) except Exception: request.logger.exception('Could not update model') form.add_error_message('Could not update model') data = form.tojson() else: if isinstance(instance, dict): data = instance elif instance: data = model.tojson(request, instance) else: request.response.status_code = 204 return request.response else: data = form.tojson() elif request.method == 'DELETE': instance = self.get_instance(request, session=session, check_permission=Resource.rest( request, 'delete', model.fields())) model.delete_model(request, instance, session=session) request.response.status_code = 204 return request.response else: raise MethodNotAllowed return self.json_response(request, data)
def read_update_delete(self, request): model = self.get_model(request) if request.method == 'OPTIONS': request.app.fire('on_preflight', request, methods=model.instance_verbs()) return request.response with model.session(request) as session: if request.method in GET_HEAD: instance = self.get_instance( request, session=session, check_permission=Resource.rest(request, 'read', model.fields()) ) data = model.tojson(request, instance) elif request.method in POST_PUT_PATCH: exclude_missing = False if request.method == 'PATCH': exclude_missing = True form_class = get_form_class(request, model.updateform) elif request.method == 'POST': form_class = get_form_class(request, model.postform) else: form_class = get_form_class(request, model.putform) if not form_class: raise MethodNotAllowed instance = self.get_instance( request, session=session, check_permission=Resource.rest(request, 'update', model.fields()) ) data, files = request.data_and_files() form = form_class(request, data=data, files=files, previous_state=instance, model=model) if form.is_valid(exclude_missing=exclude_missing): try: instance = model.update_model(request, instance, form.cleaned_data, session=session) except Exception: request.logger.exception('Could not update model') form.add_error_message('Could not update model') data = form.tojson() else: if isinstance(instance, dict): data = instance elif instance: data = model.tojson(request, instance) else: request.response.status_code = 204 return request.response else: data = form.tojson() elif request.method == 'DELETE': instance = self.get_instance( request, session=session, check_permission=Resource.rest(request, 'delete', model.fields()) ) model.delete_model(request, instance, session=session) request.response.status_code = 204 return request.response else: raise MethodNotAllowed return self.json_response(request, data)