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
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
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, [])
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
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'])
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
def count(self, *args, **kwargs): result = self.model.objects(*args, **kwargs).count() log_query_and_profile_data_for_queryset(queryset=result) return result
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
def delete_by_query(self, **query): result = self.model.objects.filter(**query).delete() log_query_and_profile_data_for_queryset(queryset=result) return result