Example #1
0
    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)
Example #2
0
    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)
Example #3
0
    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)
Example #4
0
 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
Example #5
0
 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
Example #6
0
 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)
Example #7
0
 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)
Example #8
0
 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)
Example #9
0
 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)
Example #10
0
    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)
Example #11
0
    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)
Example #12
0
 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)
Example #13
0
    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)
Example #14
0
    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)
Example #15
0
    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)
Example #16
0
    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)