def test_querystring_from_order_by_without_key(self, registry_blok):
     registry = registry_blok
     request = MockRequest(self)
     model = registry.System.Blok
     query = model.query()
     key = None
     op = 'asc'
     qs = QueryString(request, model)
     qs.order_by = [dict(key=key, op=op)]
     qs.from_order_by(query)
     assert len(request.errors.messages) == 1
示例#2
0
 def test_querystring_from_order_by_without_key(self):
     registry = self.init_registry(None)
     request = MockRequest(self)
     model = registry.System.Blok
     query = model.query()
     key = None
     op = 'asc'
     qs = QueryString(request, model)
     qs.order_by = [dict(key=key, op=op)]
     qs.from_order_by(query)
     self.assertEqual(len(request.errors.messages), 1)
 def test_querystring_from_order_by_ko_bad_op(self, registry_blok):
     registry = registry_blok
     request = MockRequest(self)
     model = registry.System.Blok
     query = model.query()
     key = 'name'
     op = 'unknown'
     qs = QueryString(request, model)
     qs.order_by = [dict(key=key, op=op)]
     qs.from_order_by(query)
     assert ("ORDER_by operator 'unknown' does not exist."
             in request.errors.messages)
 def test_querystring_from_order_by_bad_key(self, registry_blok):
     registry = registry_blok
     request = MockRequest(self)
     model = registry.System.Blok
     query = model.query()
     key = 'badkey'
     op = 'asc'
     qs = QueryString(request, model)
     qs.order_by = [dict(key=key, op=op)]
     qs.from_order_by(query)
     assert ("Order 'badkey': 'badkey' does not exist in model "
             "<class 'anyblok.model.factory.ModelSystemBlok'>."
             in request.errors.messages)
 def test_querystring_from_order_by_bad_key_relationship(self):
     registry = self.init_registry(add_many2one_class)
     request = MockRequest(self)
     model = registry.Test2
     query = model.query()
     key = 'test.badkey'
     op = 'asc'
     qs = QueryString(request, model)
     qs.order_by = [dict(key=key, op=op)]
     qs.from_order_by(query)
     self.assertIn(
         "Order 'test.badkey': 'badkey' does not exist in model "
         "<class 'anyblok.model.ModelTest'>.", request.errors.messages)
 def test_querystring_from_order_by_bad_key_relationship(
         self, registry_blok_with_m2o):
     registry = registry_blok_with_m2o
     request = MockRequest(self)
     model = registry.Test2
     query = model.query()
     key = 'test.badkey'
     op = 'asc'
     qs = QueryString(request, model)
     qs.order_by = [dict(key=key, op=op)]
     qs.from_order_by(query)
     assert ("Order 'test.badkey': 'badkey' does not exist in model "
             "<class 'anyblok.model.factory.ModelTest'>."
             in request.errors.messages)
def update_from_query_string(request, Model, query, adapter):
    headers = request.response.headers
    if request.params:
        # TODO: Implement schema validation to use request.validated
        querystring = QueryString(request, Model, adapter=adapter)
        total_query = querystring.from_filter_by(query)
        total_query = querystring.from_tags(total_query)
        query = querystring.from_order_by(total_query)
        query = querystring.from_limit(query)
        query = querystring.from_offset(query)
        # TODO: Advanced pagination with Link Header
        # Link: '<https://api.github.com/user/repos?page=3&per_page=100>;
        # rel="next",
        # <https://api.github.com/user/repos?page=50&per_page=100>;
        # rel="last"'
        headers['X-Count-Records'] = str(query.count())
        headers['X-Total-Records'] = str(total_query.count())
        # TODO: Etag / timestamp / 304 if no changes
        # TODO: Cache headers
        return query
    else:
        # no querystring, returns all records (maybe we will want to apply
        # some default filters values
        headers['X-Count-Records'] = str(query.count())
        headers['X-Total-Records'] = str(query.count())
        return query
 def test_querystring_from_order_by_ok(self, registry_blok):
     registry = registry_blok
     request = MockRequest(self)
     model = registry.System.Blok
     query = model.query()
     key = 'name'
     op = 'asc'
     qs = QueryString(request, model)
     qs.order_by = [dict(key=key, op=op)]
     Q = qs.from_order_by(query)
     assert Q.all().name == query.order_by(model.name.asc()).all().name
 def test_querystring_from_order_by_ok(self):
     registry = self.init_registry(None)
     request = MockRequest(self)
     model = registry.System.Blok
     query = model.query()
     key = 'name'
     op = 'asc'
     qs = QueryString(request, model)
     qs.order_by = [dict(key=key, op=op)]
     Q = qs.from_order_by(query)
     self.assertEqual(Q.all().name,
                      query.order_by(model.name.asc()).all().name)
 def test_querystring_from_order_by_ok_with_relationship(self):
     registry = self.init_registry(add_many2one_class)
     request = MockRequest(self)
     model = registry.Test2
     query = model.query()
     key = 'test.name'
     op = 'asc'
     qs = QueryString(request, model)
     qs.order_by = [dict(key=key, op=op)]
     Q = qs.from_order_by(query)
     t1 = registry.Test(name='test')
     t2 = registry.Test(name='other')
     model.insert(test=t1)
     model.insert(test=t2)
     model.insert(test=t2)
     model.insert(test=t1)
     query = query.join(registry.Test2.test)
     query = query.order_by(registry.Test.name.asc())
     self.assertEqual(Q.all(), query.all())
 def test_querystring_from_order_by_ok_with_relationship(
         self, registry_blok_with_m2o):
     registry = registry_blok_with_m2o
     request = MockRequest(self)
     model = registry.Test2
     query = model.query()
     key = 'test.name'
     op = 'asc'
     qs = QueryString(request, model)
     qs.order_by = [dict(key=key, op=op)]
     Q = qs.from_order_by(query)
     t1 = registry.Test(name='test')
     t2 = registry.Test(name='other')
     model.insert(test=t1)
     model.insert(test=t2)
     model.insert(test=t2)
     model.insert(test=t1)
     query = query.join(registry.Test2.test)
     query = query.order_by(registry.Test.name.asc())
     assert Q.all() == query.all()
示例#12
0
    def read(cls, request):
        # check user is disconnected
        # check user has access rigth to see this resource
        model = request.params['context[model]']

        fields = cls.parse_fields(
            request.params['context[fields]'],
            model,
            request.authenticated_userid,
        )

        # TODO complex case of relationship
        Model = cls.anyblok.get(model)
        adapter = Model.get_furetui_adapter()
        qs = QueryString(request, Model, adapter=adapter)
        query = cls.anyblok.Pyramid.restrict_query_by_user(
            qs.Model.query(), request.authenticated_userid)
        query = qs.from_filter_by(query)
        query = qs.from_filter_by_primary_keys(query)
        query = qs.from_composite_filter_by(query)
        query = qs.from_tags(query)

        query2 = qs.from_order_by(query)
        query2 = qs.from_limit(query2)
        query2 = qs.from_offset(query2)

        query2 = query2.options(*cls.add_options(deepcopy(fields), model))

        data = []
        pks = []

        def append_result(fields, model_name, entry):
            model = cls.anyblok.get(model_name)
            fd = model.fields_description()
            current_fields = fields.pop("__fields")
            current_fields.extend(fields.keys())
            data.append({
                'type': 'UPDATE_DATA',
                'model': model_name,
                'pk': entry.to_primary_keys(),
                'data': entry.to_dict(*current_fields),
            })
            for field, subfield in fields.items():
                children_entries = getattr(entry, field)
                if children_entries:
                    if fd[field]['type'] in ('Many2One', 'One2One'):
                        children_entries = [children_entries]
                    for child_entry in children_entries:
                        append_result(deepcopy(fields[field]),
                                      fd[field]['model'], child_entry)

        for entry in query2:
            pks.append(entry.to_primary_keys())
            append_result(deepcopy(fields), model, entry)

        # query.count do a sub query, we do not want it, because mysql
        # has a terrible support of subqueries
        # total = query.with_entities(func.count('*')).scalar()
        total = query.count()
        return {
            'pks': pks,
            'total': total,
            'data': data,
        }