Example #1
0
File: models.py Project: f3at/feat
 def annotate_fetch_documents(cls, effect):
     cls._fetch_documents_set = True
     cls._fetch_documents = model._validate_effect(effect)
Example #2
0
File: models.py Project: f3at/feat
 def annotate_db_connection(cls, effect):
     cls._connection_getter = model._validate_effect(effect)
Example #3
0
File: models.py Project: f3at/feat
 def annotate_static_conditions(cls, effect):
     cls._static_conditions = model._validate_effect(effect)
Example #4
0
    def annotate_view_factory(cls, factory, allowed_fields=[],
                              static_conditions=None,
                              fetch_documents=None):
        cls._view = IQueryViewFactory(factory)
        cls._static_conditions = (static_conditions and
                                  model._validate_effect(static_conditions))
        if not fetch_documents:
            cls._fetch_documents_set = False
            fetch_documents = effect.identity
        else:
            cls._fetch_documents_set = True
            fetch_documents = fetch_documents

        for x in allowed_fields:
            if not cls._view.has_field(x):
                raise ValueError("%r doesn't define a field: '%s'" % (cls, x))
        cls._allowed_fields = allowed_fields

        # define query action
        name = utils.mk_class_name(cls._view.name, "Query")
        QueryValue = MetaQueryValue.new(name, cls._view, cls._allowed_fields)
        name = utils.mk_class_name(cls._view.name, "Sorting")
        SortingValue = MetaSortingValue.new(name, cls._allowed_fields)
        result_info = value.Model()

        def get_static_conditions(value, context, *args, **kwargs):

            def build_query(static_conditions, factory, q):
                subquery = query.Query(factory, *static_conditions)
                return query.Query(factory, q, query.Operator.AND, subquery)

            cls = type(context['model'])
            if cls._static_conditions:
                d = cls._static_conditions(None, context)
                d.addCallback(build_query, cls._view, kwargs['query'])
                return d
            return defer.succeed(kwargs['query'])

        SelectAction = action.MetaAction.new(
            utils.mk_class_name(cls._view.name, "Select"),
            ActionCategories.retrieve,
            is_idempotent=False, result_info=result_info,
            effects=[
                get_static_conditions,
                call.model_perform('do_select'),
                fetch_documents,
                call.model_filter('render_select_response')],
            params=[action.Param('query', QueryValue()),
                    action.Param('sorting', SortingValue(), is_required=False),
                    action.Param('skip', value.Integer(0), is_required=False),
                    action.Param('limit', value.Integer(), is_required=False)])
        cls.annotate_action(u"select", SelectAction)

        # define count action
        CountAction = action.MetaAction.new(
            utils.mk_class_name(cls._view.name, "Count"),
            ActionCategories.retrieve,
            effects=[
                get_static_conditions,
                call.model_perform('do_count')],
            result_info=value.Integer(),
            is_idempotent=False,
            params=[action.Param('query', QueryValue())])
        cls.annotate_action(u"count", CountAction)