misc: record LoggedError when qs filter on unknown attribute (#49307)

This commit is contained in:
Lauréline Guérin 2020-12-10 11:55:07 +01:00
parent 10a2709d03
commit 04aeca215e
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 18 additions and 14 deletions

View File

@ -3,13 +3,9 @@
import collections
import datetime
import pytest
import sys
import shutil
import time
import mock
from django.utils import six
from quixote import cleanup
from quixote.http_request import Upload
from wcs.qommon import force_str
from wcs.qommon.template import Template
@ -22,11 +18,11 @@ from wcs.categories import Category
from wcs.conditions import Condition
from wcs.formdef import FormDef
from wcs.formdata import Evolution
from wcs.logged_errors import LoggedError
from wcs.roles import Role
from wcs import sessions
from wcs.variables import LazyFormData
from wcs.workflows import Workflow, WorkflowStatusItem, WorkflowCriticalityLevel, WorkflowBackofficeFieldsFormDef
from wcs.wf.anonymise import AnonymiseWorkflowStatusItem
from wcs.wf.wscall import JournalWsCallErrorPart
from wcs.wf.register_comment import JournalEvolutionPart
@ -1019,6 +1015,12 @@ def test_lazy_formdata_queryset_filter(pub, variable_test_data):
assert queryset.count == 4
queryset = lazy_formdata.objects.filter_by('foo_foo').apply_filter_value('X')
assert queryset.count == 0
LoggedError.wipe()
queryset = lazy_formdata.objects.filter_by('unknown').apply_filter_value('X')
assert queryset.count == 0
assert LoggedError.count() == 1
logged_error = LoggedError.select()[0]
assert logged_error.summary == 'Invalid filter "unknown"'
# filter function on backoffice field
queryset = lazy_formdata.objects.filter_by('backoffice_blah').apply_filter_value('plop1')

View File

@ -24,7 +24,8 @@ from quixote import get_publisher, get_request
from pyproj import Geod
from .qommon import misc, force_str
from .logged_errors import LoggedError
from .qommon import misc, force_str, _
from .qommon.evalutils import make_datetime
from .qommon.templatetags.qommon import parse_datetime
from .qommon.storage import (Or, Equal, NotEqual, Null)
@ -70,6 +71,9 @@ class LazyFormDefObjectsManager(object):
# object serves as both manager and queryset)
return self._clone(None)
def none(self):
return self._clone([Equal('status', '_none')])
def pending(self):
status_filters = ['wf-%s' % x.id for x in
self._formdef.workflow.get_not_endpoint_status()]
@ -84,12 +88,11 @@ class LazyFormDefObjectsManager(object):
return self._clone(self._criterias + [Equal('user_id', str(user.id) if user else '-1')])
def filter_by_status(self, status):
wf_status = '_none'
for wfs in self._formdef.workflow.possible_status:
if wfs.name == status:
wf_status = 'wf-%s' % wfs.id
break
return self._clone(self._criterias + [Equal('status', wf_status)])
return self._clone(self._criterias + [Equal('status', wf_status)])
return self.none()
def with_custom_view(self, custom_view_slug):
lookup_criterias = [
@ -101,7 +104,7 @@ class LazyFormDefObjectsManager(object):
try:
custom_view = get_publisher().custom_view_class.select(lookup_criterias)[0]
except IndexError:
return self._clone([Equal('status', '_none')])
return self.none()
return self._clone(self._criterias + custom_view.get_criterias(), order_by=custom_view.order_by)
def exclude_self(self):
@ -156,10 +159,9 @@ class LazyFormDefObjectsManager(object):
if getattr(field, 'varname', None) == self.pending_attr:
from wcs import sql
criteria = Equal(sql.get_field_id(field), value)
break
else:
raise Exception('invalid filter')
return self._clone(self._criterias + [criteria])
return self._clone(self._criterias + [criteria])
LoggedError.record(_('Invalid filter "%s"') % self.pending_attr, formdata=self._formdata)
return self.none()
def __getattr__(self, attribute):
if attribute.startswith('count_status_'):