Beispiel #1
0
    def get(self, *args, **kwargs):
        exclude_fields = kwargs.pop('exclude_fields', None)
        raise_exception = kwargs.pop('raise_exception', False)
        only_fields = kwargs.pop('only_fields', None)

        args = self._process_arg_filters(args)

        instances = self.model.objects(*args, **kwargs)

        if exclude_fields:
            instances = instances.exclude(*exclude_fields)

        if only_fields:
            try:
                instances = instances.only(*only_fields)
            except (mongoengine.errors.LookUpError, AttributeError) as e:
                msg = ('Invalid or unsupported include attribute specified: %s' % six.text_type(e))
                raise ValueError(msg)

        instance = instances[0] if instances else None
        log_query_and_profile_data_for_queryset(queryset=instances)

        if not instance and raise_exception:
            msg = 'Unable to find the %s instance. %s' % (self.model.__name__, kwargs)
            raise db_exc.StackStormDBObjectNotFoundError(msg)

        return instance
Beispiel #2
0
    def delete_by_query(self, *args, **query):
        """
        Delete objects by query and return number of deleted objects.
        """
        qs = self.model.objects.filter(*args, **query)
        count = qs.delete()
        log_query_and_profile_data_for_queryset(queryset=qs)

        return count
Beispiel #3
0
    def get(self, exclude_fields=None, *args, **kwargs):
        raise_exception = kwargs.pop('raise_exception', False)

        instances = self.model.objects(**kwargs)

        if exclude_fields:
            instances = instances.exclude(*exclude_fields)

        instance = instances[0] if instances else None
        log_query_and_profile_data_for_queryset(queryset=instances)

        if not instance and raise_exception:
            raise ValueError('Unable to find the %s instance. %s' % (self.model.__name__, kwargs))
        return instance
    def test_logging_profiling_is_enabled_non_queryset_object(self):
        enable_profiling()

        # Should not throw on non QuerySet object
        queryset = 1
        result = log_query_and_profile_data_for_queryset(queryset)
        self.assertEqual(result, queryset)
 def test_logging_profiling_is_disabled(self, mock_log):
     disable_profiling()
     queryset = User.query(name__in=['test1', 'test2'], order_by=['+aa', '-bb'], limit=1)
     result = log_query_and_profile_data_for_queryset(queryset=queryset)
     self.assertEqual(queryset, result)
     call_args_list = mock_log.debug.call_args_list
     self.assertItemsEqual(call_args_list, [])
Beispiel #6
0
    def query(self, *args, **filters):
        # Python 2: Pop keyword parameters that aren't actually filters off of the kwargs
        offset = filters.pop('offset', 0)
        limit = filters.pop('limit', None)
        order_by = filters.pop('order_by', None)
        exclude_fields = filters.pop('exclude_fields', None)
        only_fields = filters.pop('only_fields', None)
        no_dereference = filters.pop('no_dereference', None)

        order_by = order_by or []
        exclude_fields = exclude_fields or []
        eop = offset + int(limit) if limit else None

        args = self._process_arg_filters(args)
        # Process the filters
        # Note: Both of those functions manipulate "filters" variable so the order in which they
        # are called matters
        filters, order_by = self._process_datetime_range_filters(filters=filters, order_by=order_by)
        filters = self._process_null_filters(filters=filters)

        result = self.model.objects(*args, **filters)

        if exclude_fields:
            try:
                result = result.exclude(*exclude_fields)
            except (mongoengine.errors.LookUpError, AttributeError) as e:
                field = get_field_name_from_mongoengine_error(e)
                msg = ('Invalid or unsupported exclude attribute specified: %s' % field)
                raise ValueError(msg)

        if only_fields:
            try:
                result = result.only(*only_fields)
            except (mongoengine.errors.LookUpError, AttributeError) as e:
                field = get_field_name_from_mongoengine_error(e)
                msg = ('Invalid or unsupported include attribute specified: %s' % field)
                raise ValueError(msg)

        if no_dereference:
            result = result.no_dereference()

        result = result.order_by(*order_by)
        result = result[offset:eop]
        log_query_and_profile_data_for_queryset(queryset=result)

        return result
Beispiel #7
0
    def query(self, offset=0, limit=None, order_by=None, exclude_fields=None,
              **filters):
        order_by = order_by or []
        exclude_fields = exclude_fields or []
        eop = offset + int(limit) if limit else None

        # Process the filters
        # Note: Both of those functions manipulate "filters" variable so the order in which they
        # are called matters
        filters, order_by = self._process_datetime_range_filters(filters=filters, order_by=order_by)
        filters = self._process_null_filters(filters=filters)

        result = self.model.objects(**filters)

        if exclude_fields:
            result = result.exclude(*exclude_fields)

        result = result.order_by(*order_by)
        result = result[offset:eop]
        log_query_and_profile_data_for_queryset(queryset=result)

        return result
    def test_logging_profiling_is_enabled(self, mock_log):
        enable_profiling()
        queryset = User.query(name__in=['test1', 'test2'], order_by=['+aa', '-bb'], limit=1)
        result = log_query_and_profile_data_for_queryset(queryset=queryset)

        call_args_list = mock_log.debug.call_args_list
        call_args = call_args_list[0][0]
        call_kwargs = call_args_list[0][1]

        expected_result = ("db.user_d_b.find({'name': {'$in': ['test1', 'test2']}})"
                           ".sort({aa: 1, bb: -1}).limit(1);")
        self.assertEqual(queryset, result)
        self.assertTrue(expected_result in call_args[0])
        self.assertTrue('mongo_query' in call_kwargs['extra'])
        self.assertTrue('mongo_shell_query' in call_kwargs['extra'])
Beispiel #9
0
 def distinct(self, *args, **kwargs):
     field = kwargs.pop('field')
     result = self.model.objects(**kwargs).distinct(field)
     log_query_and_profile_data_for_queryset(queryset=result)
     return result
Beispiel #10
0
 def count(self, *args, **kwargs):
     result = self.model.objects(*args, **kwargs).count()
     log_query_and_profile_data_for_queryset(queryset=result)
     return result
Beispiel #11
0
 def distinct(self, *args, **kwargs):
     field = kwargs.pop('field')
     result = self.model.objects(**kwargs).distinct(field)
     log_query_and_profile_data_for_queryset(queryset=result)
     return result
Beispiel #12
0
 def count(self, *args, **kwargs):
     result = self.model.objects(*args, **kwargs).count()
     log_query_and_profile_data_for_queryset(queryset=result)
     return result
Beispiel #13
0
 def delete_by_query(self, **query):
     qs = self.model.objects.filter(**query)
     qs.delete()
     log_query_and_profile_data_for_queryset(queryset=qs)
     # mongoengine does not return anything useful so cannot return anything meaningful.
     return None
Beispiel #14
0
 def delete_by_query(self, **query):
     qs = self.model.objects.filter(**query)
     qs.delete()
     log_query_and_profile_data_for_queryset(queryset=qs)
     # mongoengine does not return anything useful so cannot return anything meaningful.
     return None
Beispiel #15
0
 def delete_by_query(self, **query):
     result = self.model.objects.filter(**query).delete()
     log_query_and_profile_data_for_queryset(queryset=result)
     return result