Esempio n. 1
0
def register_hook(model, name, query_hook, filter_hook,
                  result_filters=None):
    """Register a hook to be invoked when a query is executed.

    Adds the hook components to the _model_query_hooks dict. Models are the
    keys of this dict, whereas the value is another dict mapping hook names
    to callables performing the hook.

    :param model: The DB Model that the hook applies to.
    :param name: A name for the hook.
    :param query_hook: The method to be called to augment the query.
    :param filter_hook: A method to be called to augment the query filter.
    :param result_filters: A Method to be called to filter the query result.
    :returns: None.
    """
    if callable(query_hook):
        query_hook = helpers.make_weak_ref(query_hook)
    if callable(filter_hook):
        filter_hook = helpers.make_weak_ref(filter_hook)
    if callable(result_filters):
        result_filters = helpers.make_weak_ref(result_filters)
    _model_query_hooks.setdefault(model, {})[name] = {
        'query': query_hook,
        'filter': filter_hook,
        'result_filters': result_filters
    }
Esempio n. 2
0
def register_hook(model, name, query_hook, filter_hook,
                  result_filters=None):
    """Register a hook to be invoked when a query is executed.

    :param model: The DB Model that the hook applies to.
    :type model: sqlalchemy orm model

    :param name: A name for the hook.
    :type name: str

    :param query_hook: The method to be called to augment the query.
    :type query_hook: callable or None

    :param filter_hook: A method to be called to augment the query filter.
    :type filter_hook: callable or None

    :param result_filters: A Method to be called to filter the query result.
    :type result_filters: callable or None

    Adds the hook components to the _model_query_hooks dict. Models are the
    keys of this dict, whereas the value is another dict mapping hook names
    to callables performing the hook.

    Each hook has three components:
        "query", used to build the query expression
        "filter", used to build the filter expression
        "result_filters", used for final filtering on the query result

    Query hooks take as input the query being built and return a
    transformed query expression.
        def mymodel_query_hook(context, original_model, query):
            augmented_query = ...
            return augmented_query

    Filter hooks take as input the filter expression being built and return
    a transformed filter expression
        def mymodel_filter_hook(context, original_model, filters):
            refined_filters = ...
            return refined_filters

    Result filter hooks take as input the query expression and the filter
    expression, and return a final transformed query expression.
        def mymodel_result_filter_hook(query, filters):
            final_filters = ...
            return query.filter(final_filters)

    """
    if callable(query_hook):
        query_hook = helpers.make_weak_ref(query_hook)
    if callable(filter_hook):
        filter_hook = helpers.make_weak_ref(filter_hook)
    if callable(result_filters):
        result_filters = helpers.make_weak_ref(result_filters)
    _model_query_hooks.setdefault(model, {})[name] = {
        'query': query_hook,
        'filter': filter_hook,
        'result_filters': result_filters
    }
Esempio n. 3
0
def register_hook(model, name, query_hook, filter_hook,
                  result_filters=None):
    """Register a hook to be invoked when a query is executed.

    :param model: The DB Model that the hook applies to.
    :type model: sqlalchemy orm model

    :param name: A name for the hook.
    :type name: str

    :param query_hook: The method to be called to augment the query.
    :type query_hook: callable or None

    :param filter_hook: A method to be called to augment the query filter.
    :type filter_hook: callable or None

    :param result_filters: A Method to be called to filter the query result.
    :type result_filters: callable or None

    Adds the hook components to the _model_query_hooks dict. Models are the
    keys of this dict, whereas the value is another dict mapping hook names
    to callables performing the hook.

    Each hook has three components:
        "query", used to build the query expression
        "filter", used to build the filter expression
        "result_filters", used for final filtering on the query result

    Query hooks take as input the query being built and return a
    transformed query expression.
        def mymodel_query_hook(context, original_model, query):
            augmented_query = ...
            return augmented_query

    Filter hooks take as input the filter expression being built and return
    a transformed filter expression
        def mymodel_filter_hook(context, original_model, filters):
            refined_filters = ...
            return refined_filters

    Result filter hooks take as input the query expression and the filter
    expression, and return a final transformed query expression.
        def mymodel_result_filter_hook(query, filters):
            final_filters = ...
            return query.filter(final_filters)

    """
    if callable(query_hook):
        query_hook = helpers.make_weak_ref(query_hook)
    if callable(filter_hook):
        filter_hook = helpers.make_weak_ref(filter_hook)
    if callable(result_filters):
        result_filters = helpers.make_weak_ref(result_filters)
    _model_query_hooks.setdefault(model, {})[name] = {
        'query': query_hook,
        'filter': filter_hook,
        'result_filters': result_filters
    }
Esempio n. 4
0
 def test_register_hook(self):
     mock_model = mock.Mock()
     model_query.register_hook(
         mock_model, 'hook1', self._mock_hook,
         self._mock_hook, result_filters=self._mock_hook)
     self.assertEqual(1, len(model_query._model_query_hooks.keys()))
     hook_ref = helpers.make_weak_ref(self._mock_hook)
     registered_hooks = model_query.get_hooks(mock_model)
     self.assertEqual(1, len(registered_hooks))
     for d in registered_hooks:
         for k in d.keys():
             self.assertEqual(hook_ref, d.get(k))
Esempio n. 5
0
 def test_register_hook_non_callables(self):
     mock_model = mock.Mock()
     model_query.register_hook(
         mock_model, 'hook1', self._mock_hook, {}, result_filters={})
     self.assertEqual(1, len(model_query._model_query_hooks.keys()))
     hook_ref = helpers.make_weak_ref(self._mock_hook)
     registered_hooks = model_query.get_hooks(mock_model)
     self.assertEqual(1, len(registered_hooks))
     for d in registered_hooks:
         for k in d.keys():
             if k == 'query':
                 self.assertEqual(hook_ref, d.get(k))
             else:
                 self.assertEqual({}, d.get(k))
Esempio n. 6
0
def register_funcs(resource, funcs):
    """Add functions to extend a resource.

    :param resource: A resource collection name.
    :type resource: str

    :param funcs: A list of functions.
    :type funcs: list of callable

    These functions take a resource dict and a resource object and
    update the resource dict with extension data (possibly retrieved
    from the resource db object).
        def _extend_foo_with_bar(foo_res, foo_db):
            foo_res['bar'] = foo_db.bar_info  # example
            return foo_res

    """
    funcs = [helpers.make_weak_ref(f) if callable(f) else f for f in funcs]
    _resource_extend_functions.setdefault(resource, []).extend(funcs)