Exemple #1
0
    def parse_process(self, key, value):
        assert key in self.PROCESSES
        values = [item.strip() for item in value.split(self.value_separator)]
        if not values:
            raise ValidationError(
                u'{0} must not empty, your value is {1}'.format(key, value))

        if key == '__show':
            invalid_item = set(values) - set(self.columns)
            if invalid_item:
                raise ValidationError(u'{0} of your __show columns {1} is not'
                                      u' an attribute of {2}  '.format(
                                          u','.join(invalid_item), value,
                                          self.name))

            return values
        elif key == '__order':
            order_by_columns = []
            for val in values:
                if val.endswith(('.desc', '.asc')):
                    attr, order = val.split('.')
                else:
                    attr, order = val, self.default_order

                if attr not in self.columns:
                    raise ValidationError(u'{0}  of your __order_by columns '
                                          u'is not an attribute of {1}'.format(
                                              attr, value, self.name))

                order_by_columns.append(_Order(key=attr, order=order))

            return order_by_columns
Exemple #2
0
    def parse_paginate(self, key, value):

        assert key in self.PAGINATE

        page_error = u'param __page must be a positive integer,' \
                     u'your value is {0}'.format(value)

        page_size_error = u'param __page_size must be a positive ' \
                          u'integer between ({0}, {1}), your value is {2}'.\
            format(self.min_page_size, self.max_page_size, value)

        if key == '__page':
            try:
                page = int(value)
            except ValueError:
                raise ValidationError(page_error)

            if page < 1:
                raise ValidationError(page_error)

            return page
        elif key == '__page_size':
            try:
                page_size = int(value)
            except ValueError:
                raise ValidationError(page_size_error)

            return max(min(page_size, self.max_page_size), self.min_page_size)
Exemple #3
0
    def validate_keys(table_name, columns, keys):
        invalid_keys = frozenset(keys) - frozenset(columns)

        if invalid_keys:
            raise ValidationError(u'{0} is not attributes of {1}'.format(
                u','.join(invalid_keys), table_name))

        return True
Exemple #4
0
    def http_post(self, data):
        if data.pop('id', None):
            raise ValidationError(u"id can't be specified when post")

        self.validate_keys(self.name, self.model.get_column_names(),
                           data.keys())
        item = self.model(**data)
        return item.save().to_dict()
Exemple #5
0
    def process_nonempty(self, data):
        no_empty = self.validator['nonempty']
        for k in no_empty:
            if not data.get(k, None):
                raise ValidationError(
                    u'param {0} required not empty'.format(k))

        return True
Exemple #6
0
    def process_types(self, data):
        types = self.validator['types']

        for key, tp in types.items():
            if key in data and not isinstance(data[key], tp):
                raise ValidationError(u'param {0} need to be type {1}, your type is {2}'
                                      .format(key, tp, type(data[key])))

        return True
Exemple #7
0
    def process_required(self, data):
        required = self.validator['required']
        not_supply = frozenset(required) - frozenset(data.keys())
        if not_supply:
            raise ValidationError(
                u'param %s is required' %
                u','.join(not_supply))

        return True
Exemple #8
0
 def query(self, params):
     rel_name = params.pop('__relation', None)
     pk = params.pop('__pk', None)
     if rel_name and pk is not None:
         if rel_name not in self.relations:
             raise ValidationError(u'{0} is not a relation of {1}'.format(
                 rel_name, self.name))
         return self.do_relation_query(params, rel_name, pk)
     else:
         return self.do_self_query(params)
Exemple #9
0
    def process_oneof(self, data):
        oneof = self.validator['oneof']

        for key, option_values in oneof.items():
            if key in data and data[key] not in option_values:
                raise ValidationError(u'param {0} must in {1}, your value is {2}'.format(
                    key, u','.join(option_values), data[key]
                ))

        return True
Exemple #10
0
    def http_put(self, data):
        _id = data.pop('id')
        self.validate_keys(self.name, self.model.get_column_names(),
                           data.keys())

        if not self.model.get(_id):
            raise ValidationError(u'id {0} of {1} not exists'.format(
                _id, self.name))

        self.model.query_update(query={'id': _id}, data=data)
        return self.model.get(_id).to_dict()
Exemple #11
0
    def process_length(self, data):
        length = self.validator['length']
        for key, ll in length.items():
            if key not in data:
                continue

            val_len = len(data[key])

            if val_len < ll[0] or val_len > ll[-1]:
                raise ValidationError(u'param {0} length required to between {1} and {2}, '
                                      u'your length is {3}'.format(key, ll[0], ll[-1], val_len))

        return True
Exemple #12
0
    def parse_filter(self, key, value):
        if key in self.columns:
            return _Filter(key=key, op='eq', val=value)
        elif key.endswith(self.OPERATORS):
            key_oper = key.split(self.operator_separator)
            if len(key_oper) != 2:
                raise ValidationError(u'invalid filter  {0} for {1}'.format(
                    key, self.name))

            fkey, oper = key_oper

            if fkey not in self.columns:
                raise ValidationError(
                    u'filter key {0} is not an attribute of {1}'.format(
                        fkey, self.name))
            elif oper not in self.OPERATORS:
                raise ValidationError(
                    u'filter operation {0} is not support'.format(oper))

            if oper == 'like' and not self.suffix_like and value.startswith(
                    '%'):
                raise ValidationError(
                    u'suffix like is not support, you used at {0}={1}'.format(
                        key, value))
            elif oper in ['in', 'between']:
                value = value.split(self.value_separator)
                if oper == 'between' and len(value) != 2:
                    raise ValidationError(
                        u'between value must be a range,'
                        u' your query: {0}={1}'.format(
                            key, self.value_separator.join(value)))

            return _Filter(key=fkey, op=oper, val=value)

        raise ValidationError(u'invalid filter {0} for {1}'.format(
            key, self.name))