cron et vue personnalisée filtrée sur l'usager connecté (#75154) #150

Merged
fpeters merged 2 commits from wip/75154-custom-view-no-request into main 2023-03-21 07:54:25 +01:00
3 changed files with 66 additions and 11 deletions

View File

@ -1019,6 +1019,57 @@ def test_anonymise(pub):
assert formdata.evolution[1].parts is None
def test_anonymise_custom_view_user_filtered(pub):
CardDef.wipe()
FormDef.wipe()
Workflow.wipe()
pub.custom_view_class.wipe()
carddef = CardDef()
carddef.name = 'foo'
carddef.store()
carddata = carddef.data_class()()
carddata.data = {'0': 'FOO BAR 0'}
carddata.just_created()
carddata.jump_status('new')
carddata.store()
custom_view = pub.custom_view_class()
custom_view.title = 'card view'
custom_view.formdef = carddef
custom_view.columns = {'list': [{'id': '0'}]}
custom_view.filters = {'filter-user': 'on', 'filter-user-value': '__current__'}
custom_view.visibility = 'datasource'
custom_view.store()
formdef = FormDef()
formdef.name = 'baz'
formdef.fields = [
ItemsField(
id='1', label='list', type='items', data_source={'type': 'carddef:foo:card-view'}, anonymise=True
),
]
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.data = {
'1': ['foo', 'bar'],
'1_display': 'foo, bar',
}
formdata.store()
pub._set_request(None) # must run without request
item = AnonymiseWorkflowStatusItem()
item.perform(formdata)
formdata.refresh_from_storage()
assert formdata.data == {
'1': None,
'1_display': None,
}
def test_remove(pub):
formdef = FormDef()
formdef.name = 'baz'

View File

@ -1734,9 +1734,7 @@ class FormPage(FormdefDirectoryBase):
def get_criterias_from_query(self, statistics_fields_only=False):
query_overrides = get_request().form
return self.get_view_criterias(
query_overrides, request=get_request(), statistics_fields_only=statistics_fields_only
)
return self.get_view_criterias(query_overrides, statistics_fields_only=statistics_fields_only)
def get_field_allowed_operators(self, field):
operators = [
@ -1774,7 +1772,6 @@ class FormPage(FormdefDirectoryBase):
def get_view_criterias(
self,
query_overrides=None,
request=None,
custom_view=None,
compile_templates=False,
keep_templates=False,
@ -1794,6 +1791,8 @@ class FormPage(FormdefDirectoryBase):
]
criterias = []
request = get_request()
filters_dict = {}
if self.view:
filters_dict.update(self.view.get_filters_dict() or {})
@ -2031,14 +2030,14 @@ class FormPage(FormdefDirectoryBase):
elif filter_field.type == 'user-id':
if filter_field_value == '__current__':
context_vars = get_publisher().substitutions.get_context_variables(mode='lazy')
if get_request().is_in_backoffice() and context_vars.get('form'):
if request and request.is_in_backoffice() and context_vars.get('form'):
# in case of backoffice submission/edition, take user associated
# with the form being submitted/edited, if any.
form_user = context_vars.get('form_user')
if form_user:
filter_field_value = str(form_user.id)
elif isinstance(get_request().user, get_publisher().user_class):
filter_field_value = str(get_request().user.id)
elif request and isinstance(request.user, get_publisher().user_class):
filter_field_value = str(request.user.id)
else:
filter_field_value = None
if filter_field_value in ('__current__', None):
@ -2048,11 +2047,12 @@ class FormPage(FormdefDirectoryBase):
elif filter_field.type == 'submission-agent-id':
criterias.append(Equal('submission_agent_id', filter_field_value))
elif filter_field.type == 'user-function':
user_object = None
if ':' in filter_field_value:
filter_field_value, user_id = filter_field_value.split(':', 1)
user_object = None if user_id == '__none__' else get_publisher().user_class().get(user_id)
else:
user_object = get_request().user
elif request:
user_object = request.user
criterias.append(
ElementIntersects(
'workflow_merged_roles_dict',
@ -2061,8 +2061,8 @@ class FormPage(FormdefDirectoryBase):
)
)
elif filter_field.type == 'distance':
center_lat = get_request().form.get('center_lat')
center_lon = get_request().form.get('center_lon')
center_lat = request.form.get('center_lat') if request else None
center_lon = request.form.get('center_lon') if request else None
if not (center_lat and center_lon):
raise RequestError('Distance filter missing a center')
center = misc.normalize_geolocation({'lat': center_lat, 'lon': center_lon})

View File

@ -2803,6 +2803,8 @@ class ItemsField(WidgetField, ItemFieldMixin):
return values
def store_display_value(self, data, field_id, raise_on_error=False):
if not data.get(field_id):
return ''
options = self.get_options()
if not options:
return ''
@ -2827,6 +2829,8 @@ class ItemsField(WidgetField, ItemFieldMixin):
return ', '.join(choices)
def store_structured_value(self, data, field_id, raise_on_error=False):
if not data.get(field_id):
return
if not self.data_source:
return
try: