general: add same_user queryset "filter" (#43328)

This commit is contained in:
Frédéric Péters 2020-06-29 16:49:01 +02:00
parent 9ebb81bd09
commit 1e83b2b629
3 changed files with 40 additions and 0 deletions

View File

@ -924,6 +924,27 @@ def test_lazy_formdata_queryset_filter(pub, variable_test_data):
queryset = lazy_formdata.objects.exclude_self().filter_by('foo_foo').apply_filter_value('foo')
assert queryset.count == 4
# filter + limit to same user
queryset = lazy_formdata.objects.exclude_self().same_user().filter_by('foo_foo').apply_filter_value('foo')
assert queryset.count == 0
for lazy in lazy_formdata.objects.filter_by('foo_foo').apply_filter_value('foo')[:2]:
lazy._formdata.user_id = variable_test_data._formdata.user_id
lazy._formdata.store()
queryset = lazy_formdata.objects.exclude_self().same_user().filter_by('foo_foo').apply_filter_value('foo')
assert queryset.count == 2
# + exclude self (lazy being set from the for loop)
queryset = lazy.objects.exclude_self().same_user().filter_by('foo_foo').apply_filter_value('foo')
assert queryset.count == 1
# and with anonymous user
lazy._formdata.user_id = None
lazy._formdata.store()
queryset = lazy.objects.same_user().filter_by('foo_foo').apply_filter_value('foo')
assert queryset.count == 4
# template tags
context = pub.substitutions.get_context_variables(mode='lazy')
tmpl = Template('{{form_objects|filter_by:"foo_foo"|filter_value:"bar"|count}}')
@ -933,6 +954,14 @@ def test_lazy_formdata_queryset_filter(pub, variable_test_data):
tmpl = Template('{{form_objects|filter_by:"foo_foo"|filter_value:form_var_foo_foo|count}}')
assert tmpl.render(context) == '7'
context = pub.substitutions.get_context_variables(mode='lazy')
tmpl = Template('{{form_objects|filter_by:"foo_foo"|filter_value:"bar"|count}}')
assert tmpl.render(context) == '7'
context = pub.substitutions.get_context_variables(mode='lazy')
tmpl = Template('{{form_objects|same_user|filter_by:"foo_foo"|filter_value:"foo"|count}}')
assert tmpl.render(context) == '4'
def test_lazy_global_forms(pub, variable_test_data):
lazy_formdata = variable_test_data

View File

@ -516,6 +516,11 @@ def distance_filter(queryset, distance=1000):
return queryset.distance_filter(distance=int(distance))
@register.filter
def same_user(queryset):
return queryset.same_user()
@register.filter
def objects(forms_source, slug):
if hasattr(slug, 'get_value'):

View File

@ -79,6 +79,12 @@ class LazyFormDefObjectsManager(object):
assert self._formdata
return self._clone(self._criterias + [NotEqual('id', str(self._formdata.id))])
def same_user(self):
assert self._formdata
if self._formdata.user_id is None:
return self
return self._clone(self._criterias + [Equal('user_id', str(self._formdata.user.id))])
def drafts(self):
criterias = [x for x in self._criterias if not getattr(x, 'exclude_drafts', False)]
return self._clone(criterias + [Equal('status', 'draft')])