wcs: publik-django-templatetags integration (#64803)
gitea-wip/combo/pipeline/head There was a failure building this commit Details
gitea/combo/pipeline/head Something is wrong with the build of this commit Details

This commit is contained in:
Lauréline Guérin 2022-05-02 11:37:34 +02:00
parent 4f9abf2d00
commit b6dc499003
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
9 changed files with 85 additions and 720 deletions

View File

@ -1,197 +0,0 @@
# combo - content management system
# Copyright (C) 2020 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.utils.http import urlencode
from requests.exceptions import RequestException
from combo.apps.wcs.utils import get_wcs_services
from combo.utils import requests
def get_default_wcs_service_key():
services = get_wcs_services()
for key, service in services.items():
if not service.get('secondary', False):
# if secondary is not set or not set to True, return this one
return key
return None
class LazyCardDefObjectsManager:
def __init__(self, service_key, card_id, custom_view_id=None, filters=None, user=Ellipsis):
self._service_key = service_key
self._card_id = card_id
self._custom_view_id = custom_view_id
self._filters = filters or {}
self._user = user
self._cached_resultset = None
def _clone(self):
return LazyCardDefObjectsManager(
service_key=self._service_key,
card_id=self._card_id,
custom_view_id=self._custom_view_id,
filters=self._filters,
user=self._user,
)
def order_by(self, attribute):
qs = self._clone()
qs._filters['order_by'] = attribute
if not attribute:
del qs._filters['order_by']
return qs
def with_custom_view(self, custom_view_id):
qs = self._clone()
qs._custom_view_id = custom_view_id
return qs
def get_full(self):
qs = self._clone()
qs._filters['full'] = 'on'
return qs
def access_control(self, user):
qs = self._clone()
qs._user = user
return qs
@property
def count(self):
return len(self)
def filter_by(self, attribute):
qs = self._clone()
qs.pending_attr = attribute
return qs
def apply_filter_value(self, value):
assert self.pending_attr
qs = self._clone()
if value is None:
value = ''
if isinstance(value, bool):
value = str(value).lower()
qs._filters['filter-%s' % self.pending_attr] = value
return qs
def filter_by_internal_id(self, internal_id):
qs = self._clone()
if internal_id:
qs._filters['filter-internal-id'] = internal_id
return qs
def filter_by_number(self, number):
qs = self._clone()
if number:
qs._filters['filter-number'] = number
return qs
def filter_by_user(self, user):
qs = self._clone()
if user and user.is_authenticated and user.get_name_id():
qs._filters['filter-user-uuid'] = user.get_name_id()
return qs
def filter_by_status(self, status):
qs = self._clone()
if status:
qs._filters['filter'] = status
return qs
def _get_results_from_wcs(self):
service = get_wcs_services().get(self._service_key)
if not service:
return []
api_url = 'api/cards/%s/list' % self._card_id
if self._custom_view_id:
api_url += '/%s' % self._custom_view_id
if self._filters:
query = urlencode(self._filters)
api_url += '?%s' % query
without_user = self._user is Ellipsis # not set
try:
response = requests.get(
api_url,
remote_service=service,
user=None if without_user else self._user,
without_user=without_user,
log_errors=False,
)
response.raise_for_status()
except RequestException:
return []
if response.json().get('err') == 1:
return []
return response.json().get('data') or []
def _populate_cache(self):
if self._cached_resultset is not None:
return
self._cached_resultset = self._get_results_from_wcs()
def __len__(self):
self._populate_cache()
return len(self._cached_resultset)
def __getitem__(self, key):
try:
if not isinstance(key, slice):
int(key)
except ValueError:
raise TypeError
self._populate_cache()
return self._cached_resultset[key]
def __iter__(self):
self._populate_cache()
yield from self._cached_resultset
def __nonzero__(self):
return any(self)
class LazyCardDef:
def __init__(self, slug):
if ':' in slug:
self.service_key, self.card_id = slug.split(':')[:2]
else:
self.card_id = slug
self.service_key = get_default_wcs_service_key()
@property
def objects(self):
return LazyCardDefObjectsManager(self.service_key, self.card_id)
class Cards:
def __getattr__(self, attr):
try:
return LazyCardDef(attr)
except KeyError:
raise AttributeError(attr)
def cards(request):
return {'cards': Cards()}

View File

@ -29,66 +29,6 @@ from combo.utils.misc import is_url_from_known_service
register = template.Library()
@register.filter
def objects(cards, slug):
return getattr(cards, slug).objects
@register.filter
def with_custom_view(queryset, custom_view_id):
return queryset.with_custom_view(custom_view_id)
@register.filter
def get_full(queryset):
return queryset.get_full()
@register.filter
def access_control(queryset, user):
return queryset.access_control(user)
@register.filter
def count(queryset):
return queryset.count
@register.filter
def filter_by(queryset, attribute):
return queryset.filter_by(attribute)
@register.filter
def filter_value(queryset, value):
return queryset.apply_filter_value(value)
@register.filter
def filter_by_internal_id(queryset, internal_id):
return queryset.filter_by_internal_id(internal_id)
@register.filter
def filter_by_number(queryset, number):
return queryset.filter_by_number(number)
@register.filter
def filter_by_user(queryset, user):
return queryset.filter_by_user(user)
@register.filter
def filter_by_status(queryset, status):
return queryset.filter_by_status(status)
@register.filter
def order_by(queryset, attribute):
return queryset.order_by(attribute)
@register.filter
def format_text(field, value):
if field.get('pre'):

View File

@ -345,18 +345,6 @@ def get(obj, key):
return None
@register.filter
def getlist(mapping, key):
if mapping is None:
return []
mapping = list(mapping)
for value in mapping:
try:
yield value.get(key)
except AttributeError:
yield None
@register.filter
def split(string, separator=' '):
return (force_text(string) or '').split(separator)
@ -411,11 +399,6 @@ def is_empty_placeholder(page, placeholder_name):
return len([x for x in page.get_cells() if x.placeholder == placeholder_name]) == 0
@register.filter(name='list')
def as_list(obj):
return list(obj)
@register.filter(name='as_json')
def as_json(obj):
return json.dumps(obj)

View File

@ -115,12 +115,14 @@ TEMPLATES = [
'django.template.context_processors.tz',
'django.contrib.messages.context_processors.messages',
'combo.context_processors.template_vars',
'combo.apps.wcs.context_processors.cards',
'publik_django_templatetags.wcs.context_processors.cards',
],
'builtins': [
'combo.public.templatetags.combo',
'publik_django_templatetags.publik.templatetags.publik',
'django.contrib.humanize.templatetags.humanize',
'combo.apps.wcs.templatetags.wcs',
'publik_django_templatetags.wcs.templatetags.wcs',
],
},
},

3
debian/control vendored
View File

@ -27,7 +27,8 @@ Depends: ${misc:Depends}, ${python3:Depends},
python3-pycryptodome,
python3-pywebpush,
python3-pygal,
python3-lxml
python3-lxml,
python3-publik-django-templatetags
Recommends: python3-django-mellon
Conflicts: python-lingo
Breaks: combo (<< 2.34.post2)

View File

@ -3,9 +3,9 @@ from unittest import mock
import pytest
from django.test.client import RequestFactory
from publik_django_templatetags.wcs.context_processors import Cards
from combo.apps.family.models import WeeklyAgendaCell
from combo.apps.wcs.context_processors import Cards
from combo.data.models import Page
from .test_manager import login
@ -92,7 +92,7 @@ def test_weeklyagenda_cell_user_external_id(context):
context['synchronous'] = True # to get fresh content
data = {'data': []}
with mock.patch('combo.utils.requests.get') as requests_get:
with mock.patch('requests.Session.get') as requests_get:
requests_get.return_value = MockedRequestResponse(content=json.dumps(data))
cell.render(context)
assert requests_get.call_args_list[0][0][0] == (
@ -101,7 +101,7 @@ def test_weeklyagenda_cell_user_external_id(context):
)
context['request'].user = MockUserWithNameId()
with mock.patch('combo.utils.requests.get') as requests_get:
with mock.patch('requests.Session.get') as requests_get:
requests_get.return_value = MockedRequestResponse(content=json.dumps(data))
cell.render(context)
assert requests_get.call_args_list[0][0][0] == (
@ -111,7 +111,7 @@ def test_weeklyagenda_cell_user_external_id(context):
cell.user_external_template = 'some-key:{{ user_nameid }}' # check that templating is ok
cell.save()
with mock.patch('combo.utils.requests.get') as requests_get:
with mock.patch('requests.Session.get') as requests_get:
requests_get.return_value = MockedRequestResponse(content=json.dumps(data))
cell.render(context)
assert requests_get.call_args_list[0][0][0] == (
@ -128,7 +128,7 @@ def test_weeklyagenda_cell_agenda_references_template(context):
context['synchronous'] = True # to get fresh content
data = {'data': []}
with mock.patch('combo.utils.requests.get') as requests_get:
with mock.patch('requests.Session.get') as requests_get:
requests_get.return_value = MockedRequestResponse(content=json.dumps(data))
cell.render(context)
assert requests_get.call_args_list[0][0][0] == (
@ -138,7 +138,7 @@ def test_weeklyagenda_cell_agenda_references_template(context):
cell.agenda_references_template = 'some-agenda,other-agenda'
cell.save()
with mock.patch('combo.utils.requests.get') as requests_get:
with mock.patch('requests.Session.get') as requests_get:
requests_get.return_value = MockedRequestResponse(content=json.dumps(data))
cell.render(context)
assert requests_get.call_args_list[0][0][0] == (
@ -152,7 +152,7 @@ def test_weeklyagenda_cell_agenda_references_template(context):
',some-agenda,other-agenda,{{ user_nameid }}' # check that templating is ok
)
cell.save()
with mock.patch('combo.utils.requests.get') as requests_get:
with mock.patch('requests.Session.get') as requests_get:
requests_get.return_value = MockedRequestResponse(content=json.dumps(data))
cell.render(context)
assert requests_get.call_args_list[1][0][0] == (
@ -171,7 +171,7 @@ def test_weeklyagenda_cell_agenda_subscribed(context):
context['synchronous'] = True # to get fresh content
data = {'data': []}
with mock.patch('combo.utils.requests.get') as requests_get:
with mock.patch('requests.Session.get') as requests_get:
requests_get.return_value = MockedRequestResponse(content=json.dumps(data))
cell.render(context)
assert requests_get.call_args_list[0][0][0] == (
@ -194,7 +194,7 @@ def test_weeklyagenda_cell_agenda_agenda_categories(context):
context['synchronous'] = True # to get fresh content
data = {'data': []}
with mock.patch('combo.utils.requests.get') as requests_get:
with mock.patch('requests.Session.get') as requests_get:
requests_get.return_value = MockedRequestResponse(content=json.dumps(data))
cell.render(context)
assert requests_get.call_args_list[0][0][0] == (
@ -205,7 +205,7 @@ def test_weeklyagenda_cell_agenda_agenda_categories(context):
context['request'].user = MockUserWithNameId()
cell.agenda_categories = 'foo,bar,foobar,{{ user_nameid }}' # check that templating is ok
cell.save()
with mock.patch('combo.utils.requests.get') as requests_get:
with mock.patch('requests.Session.get') as requests_get:
requests_get.return_value = MockedRequestResponse(content=json.dumps(data))
cell.render(context)
assert requests_get.call_args_list[0][0][0] == (
@ -225,7 +225,7 @@ def test_weeklyagenda_cell_filter_dates(context, agenda_type, agenda_param):
context['synchronous'] = True # to get fresh content
data = {'data': []}
with mock.patch('combo.utils.requests.get') as requests_get:
with mock.patch('requests.Session.get') as requests_get:
requests_get.return_value = MockedRequestResponse(content=json.dumps(data))
cell.render(context)
assert requests_get.call_args_list[0][0][0] == (
@ -236,7 +236,7 @@ def test_weeklyagenda_cell_filter_dates(context, agenda_type, agenda_param):
cell.start_date_filter = '2021-09-01'
cell.save()
with mock.patch('combo.utils.requests.get') as requests_get:
with mock.patch('requests.Session.get') as requests_get:
requests_get.return_value = MockedRequestResponse(content=json.dumps(data))
cell.render(context)
assert requests_get.call_args_list[0][0][0] == (
@ -247,7 +247,7 @@ def test_weeklyagenda_cell_filter_dates(context, agenda_type, agenda_param):
cell.end_date_filter = '2022-08-31'
cell.save()
with mock.patch('combo.utils.requests.get') as requests_get:
with mock.patch('requests.Session.get') as requests_get:
requests_get.return_value = MockedRequestResponse(content=json.dumps(data))
cell.render(context)
assert requests_get.call_args_list[0][0][0] == (
@ -260,7 +260,7 @@ def test_weeklyagenda_cell_filter_dates(context, agenda_type, agenda_param):
cell.start_date_filter = ''
cell.end_date_filter = '{{ user_nameid }}' # check that templating is ok
cell.save()
with mock.patch('combo.utils.requests.get') as requests_get:
with mock.patch('requests.Session.get') as requests_get:
requests_get.return_value = MockedRequestResponse(content=json.dumps(data))
cell.render(context)
assert requests_get.call_args_list[0][0][0] == (
@ -282,14 +282,14 @@ def test_weeklyagenda_cell_booking_form_url(context):
context['synchronous'] = True # to get fresh content
context['request'].user = MockUserWithNameId()
with mock.patch('combo.utils.requests.get') as requests_get:
with mock.patch('requests.Session.get') as requests_get:
requests_get.return_value = MockedRequestResponse(content=json.dumps(data))
result = cell.render(context)
assert 'booking-btn' not in result
cell.booking_form_url = 'http://example.com/foobar/'
cell.save()
with mock.patch('combo.utils.requests.get') as requests_get:
with mock.patch('requests.Session.get') as requests_get:
requests_get.return_value = MockedRequestResponse(content=json.dumps(data))
result = cell.render(context)
assert 'booking-btn' in result
@ -297,7 +297,7 @@ def test_weeklyagenda_cell_booking_form_url(context):
cell.booking_form_url = 'http://example.com/foobar/?user={{ user_nameid }}'
cell.save()
with mock.patch('combo.utils.requests.get') as requests_get:
with mock.patch('requests.Session.get') as requests_get:
requests_get.return_value = MockedRequestResponse(content=json.dumps(data))
result = cell.render(context)
assert 'booking-btn' in result

View File

@ -462,7 +462,7 @@ def context():
return ctx
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_form_cell_setup(mock_send):
cell = WcsFormCell()
form_class = cell.get_default_form_class()
@ -480,7 +480,7 @@ def test_form_cell_setup(mock_send):
assert 'extra_css_class' not in form.fields
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_form_cell_save_cache(mock_send):
page = Page(title='xxx', slug='test_form_cell_save_cache', template_name='standard')
page.save()
@ -508,7 +508,7 @@ def test_form_cell_save_cache(mock_send):
assert WcsFormCell.objects.get(id=cell.id).cached_title == 'form title'
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_form_cell_validity(mock_send):
page = Page.objects.create(title='xxx', slug='test_form_cell_save_cache', template_name='standard')
cell = WcsFormCell.objects.create(page=page, placeholder='content', order=0)
@ -547,7 +547,7 @@ def test_form_cell_validity(mock_send):
assert validity_info.invalid_since is not None
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_form_cell_load(mock_send):
page = Page(title='xxx', slug='test_form_cell_save_cache', template_name='standard')
page.save()
@ -565,7 +565,7 @@ def test_form_cell_load(mock_send):
assert cell.cached_title == 'form title'
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_category_cell_save_cache(mock_send):
page = Page(title='xxx', slug='test_category_cell_save_cache', template_name='standard')
page.save()
@ -577,7 +577,7 @@ def test_category_cell_save_cache(mock_send):
assert cell.get_additional_label() == 'Test 3'
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_category_cell_validity(mock_send):
page = Page.objects.create(title='xxx', slug='test_category_cell_save_cache', template_name='standard')
cell = WcsCategoryCell.objects.create(page=page, placeholder='content', order=0)
@ -616,7 +616,7 @@ def test_category_cell_validity(mock_send):
assert validity_info.invalid_since is not None
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_categories_cell_check_validity(mock_send):
page = Page.objects.create(title='xxx', slug='test', template_name='standard')
cell = CategoriesCell.objects.create(page=page, placeholder='content', order=0)
@ -636,7 +636,7 @@ def test_categories_cell_check_validity(mock_send):
assert ValidityInfo.objects.exists() is False
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_form_cell_render(mock_send):
page = Page(title='xxx', slug='test_form_cell_render', template_name='standard')
page.save()
@ -648,7 +648,7 @@ def test_form_cell_render(mock_send):
assert 'form title' in result
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_current_forms_cell_setup(mock_send):
cell = WcsCurrentFormsCell()
form_class = cell.get_default_form_class()
@ -673,7 +673,7 @@ def test_current_forms_cell_setup(mock_send):
assert cell.get_additional_label() == 'All Sites - Done Forms'
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_current_forms_cell_render(mock_send, context):
page = Page(title='xxx', slug='test_current_forms_cell_render', template_name='standard')
page.save()
@ -843,7 +843,7 @@ def test_current_forms_cell_render(mock_send, context):
assert '<h2>Foo bar</h2>' in result
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_current_forms_cell_validity(mock_send, context):
page = Page.objects.create(title='xxx', slug='test_current_forms_cell_render', template_name='standard')
cell = WcsCurrentFormsCell.objects.create(page=page, placeholder='content', order=0)
@ -873,7 +873,7 @@ def test_current_forms_cell_validity(mock_send, context):
assert ValidityInfo.objects.exists() is False
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_current_forms_cell_check_validity(mock_send, context):
page = Page.objects.create(title='xxx', slug='test_current_forms_cell_render', template_name='standard')
cell = WcsCurrentFormsCell.objects.create(page=page, placeholder='content', order=0)
@ -932,7 +932,7 @@ def test_current_forms_cell_check_validity(mock_send, context):
assert ValidityInfo.objects.exists() is False
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_current_forms_cell_render_single_site(mock_send, context):
page = Page(title='xxx', slug='test_current_forms_cell_render', template_name='standard')
page.save()
@ -994,7 +994,7 @@ def test_care_forms_cell_setup():
assert cell.get_additional_label() == 'test'
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_care_forms_cell_render(mock_send, context):
page = Page(title='xxx', slug='test_care_forms_cell_render', template_name='standard')
page.save()
@ -1125,7 +1125,7 @@ def test_care_forms_cell_validity(context):
assert validity_info.invalid_since is not None
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_care_forms_cell_check_validity(mock_send, context):
page = Page.objects.create(title='xxx', slug='test_care_forms_cell_render', template_name='standard')
cell = WcsCareFormsCell.objects.create(page=page, placeholder='content', order=0)
@ -1184,7 +1184,7 @@ def test_care_forms_cell_check_validity(mock_send, context):
assert ValidityInfo.objects.exists() is False
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_care_forms_cell_render_single_site(mock_send, context):
page = Page(title='xxx', slug='test_care_forms_cell_render', template_name='standard')
page.save()
@ -1212,7 +1212,7 @@ def test_care_forms_cell_render_single_site(mock_send, context):
assert 'other' not in data
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_forms_of_category_cell_setup(mock_send):
cell = WcsFormsOfCategoryCell()
form_class = cell.get_default_form_class()
@ -1225,7 +1225,7 @@ def test_forms_of_category_cell_setup(mock_send):
]
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_forms_of_category_cell_render(mock_send, context):
page = Page(title='xxx', slug='test_forms_of_category_cell_render', template_name='standard')
page.save()
@ -1288,7 +1288,7 @@ def test_forms_of_category_cell_render(mock_send, context):
context.pop('combo_display_even_empty_categories')
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_forms_of_category_cancelurl(mock_send, app):
page = Page(title='xxx', slug='test_forms_of_category_cell_render', template_name='standard')
page.save()
@ -1306,7 +1306,7 @@ def test_forms_of_category_cancelurl(mock_send, app):
)
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_forms_of_category_cell_validity(mock_send, context):
page = Page.objects.create(
title='xxx', slug='test_forms_of_category_cell_render', template_name='standard'
@ -1354,7 +1354,7 @@ def test_forms_of_category_cell_validity(mock_send, context):
assert validity_info.invalid_since is not None
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_forms_of_category_cell_check_validity(mock_send, context):
page = Page.objects.create(
title='xxx', slug='test_forms_of_category_cell_render', template_name='standard'
@ -1390,7 +1390,7 @@ def test_current_drafts_cell_render_unlogged(context):
assert 'http://127.0.0.1:8999/third-form-title' not in result # no form
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_current_drafts_cell_render_logged_in(mock_send, context):
page = Page(title='xxx', slug='test_current_drafts_cell_render', template_name='standard')
page.save()
@ -1468,7 +1468,7 @@ def test_current_drafts_cell_render_logged_in(mock_send, context):
assert requests_get.call_args_list[0][0][0] == '/api/user/drafts'
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_current_drafts_cell_check_validity(mock_send, context):
page = Page.objects.create(title='xxx', slug='test_current_forms_cell_render', template_name='standard')
cell = WcsCurrentDraftsCell.objects.create(page=page, placeholder='content', order=0)
@ -1527,7 +1527,7 @@ def test_current_drafts_cell_check_validity(mock_send, context):
assert ValidityInfo.objects.exists() is False
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_manager_forms_of_category_cell(mock_send, app, admin_user):
page = Page(title='One', slug='one', template_name='standard')
page.save()
@ -1554,7 +1554,7 @@ def test_manager_forms_of_category_cell(mock_send, app, admin_user):
assert cells[0].manual_order == {'data': ['default::a-second-form-title', 'default::third-form-title']}
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_manager_current_forms(mock_send, settings, app, admin_user):
page = Page(title='One', slug='one', template_name='standard')
page.save()
@ -1594,7 +1594,7 @@ def test_manager_current_forms(mock_send, settings, app, admin_user):
assert resp.form['c%s-wcs_site' % cells[0].get_reference()].attrs['type'] == 'hidden'
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_manager_forms_in_your_care_cell(mock_send, app, admin_user):
page = Page(title='One', slug='one', template_name='standard')
page.save()
@ -1618,7 +1618,7 @@ def test_manager_forms_in_your_care_cell(mock_send, app, admin_user):
assert cells[0].cache_duration == 10
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_manager_cards_cell(mock_send, app, admin_user):
page = Page.objects.create(title='xxx', slug='test_cards_cell_save_cache', template_name='standard')
cell = WcsCardsCell.objects.create(page=page, placeholder='content', order=0)
@ -1635,7 +1635,7 @@ def test_manager_cards_cell(mock_send, app, admin_user):
assert resp.forms[0]['c%s-with_user' % cell.get_reference()].value is None
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_cards_cell_setup(mock_send):
cell = WcsCardsCell()
form_class = cell.get_default_form_class()
@ -1662,7 +1662,7 @@ def test_cards_cell_setup(mock_send):
]
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_cards_cell_save_cache(mock_send):
page = Page.objects.create(title='xxx', slug='test_cards_cell_save_cache', template_name='standard')
cell = WcsCardsCell(page=page, placeholder='content', order=0)
@ -1691,7 +1691,7 @@ def test_cards_cell_save_cache(mock_send):
assert WcsCardsCell.objects.get(pk=cell.pk).cached_title == 'Card Model 1 - bar'
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_cards_cell_validity(mock_send):
page = Page.objects.create(title='xxx', template_name='standard')
cell = WcsCardsCell.objects.create(page=page, placeholder='content', order=0)
@ -1740,7 +1740,7 @@ def test_cards_cell_validity(mock_send):
assert validity_info.invalid_since is not None
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_cards_cell_load(mock_send):
page = Page.objects.create(title='xxx', slug='test_cards', template_name='standard')
cell = WcsCardsCell(page=page, placeholder='content', order=0)
@ -1769,7 +1769,7 @@ def test_cards_cell_load(mock_send):
assert cell.cached_title == 'Card Model 1 - bar'
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_cards_cell_render(mock_send, context):
page = Page.objects.create(title='xxx', template_name='standard')
cell = WcsCardsCell(page=page, placeholder='content', order=0)
@ -1838,7 +1838,7 @@ def test_cards_cell_render(mock_send, context):
assert '<h2>Foo bar</h2>' in result
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_cards_cell_only_for_user(mock_send, context):
page = Page.objects.create(title='xxx', template_name='standard')
cell = WcsCardsCell(page=page, placeholder='content', order=0)
@ -1872,7 +1872,7 @@ def test_cards_cell_only_for_user(mock_send, context):
assert 'filter-user-uuid=xyz' in mock_send.call_args_list[0][0][0].url
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_cards_cell_render_user(mock_send, context, nocache):
page = Page.objects.create(title='xxx', template_name='standard')
cell = WcsCardsCell(page=page, placeholder='content', order=0)
@ -1931,7 +1931,7 @@ def test_cards_cell_render_user(mock_send, context, nocache):
assert 'email' not in mock_send.call_args_list[0][0][0].url
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_cell_setup(mock_send, app, admin_user):
page = Page.objects.create(
title='xxx', slug='test_card_cell_save_cache', template_name='standard', sub_slug='foobar'
@ -2140,7 +2140,7 @@ def test_card_cell_custom_schema_migration():
}
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_cell_save_cache(mock_send):
page = Page.objects.create(title='xxx', slug='test_card_cell_save_cache', template_name='standard')
cell = WcsCardInfosCell(page=page, placeholder='content', order=0)
@ -2164,7 +2164,7 @@ def test_card_cell_save_cache(mock_send):
assert WcsCardInfosCell.objects.get(pk=cell.pk).cached_json != {}
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_cell_validity(mock_send):
page = Page.objects.create(title='xxx', template_name='standard')
cell = WcsCardInfosCell.objects.create(page=page, placeholder='content', order=0)
@ -2208,7 +2208,7 @@ def test_card_cell_validity(mock_send):
assert validity_info.invalid_since is not None
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_cell_check_validity(mock_send):
page = Page.objects.create(title='xxx', template_name='standard')
cell = WcsCardInfosCell.objects.create(
@ -2249,7 +2249,7 @@ def test_card_cell_check_validity(mock_send):
assert validity_info.invalid_since is not None
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_manager_card_cell(mock_send, app, admin_user):
page = Page.objects.create(title='xxx', slug='test_cards', template_name='standard', sub_slug='foobar')
cell = WcsCardInfosCell.objects.create(page=page, placeholder='content', order=0)
@ -2456,7 +2456,7 @@ def test_manager_card_cell(mock_send, app, admin_user):
]
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_cell_load(mock_send):
page = Page.objects.create(title='xxx', slug='test_cards', template_name='standard')
cell = WcsCardInfosCell(page=page, placeholder='content', order=0)
@ -2473,7 +2473,7 @@ def test_card_cell_load(mock_send):
assert cell.cached_title == 'Card Model 1'
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_cell_render(mock_send, context, app):
page = Page.objects.create(title='xxx', template_name='standard')
cell = WcsCardInfosCell(page=page, placeholder='content', order=0)
@ -2606,7 +2606,7 @@ def test_card_cell_render(mock_send, context, app):
assert not result.strip()
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_cell_render_text_field(mock_send, context):
page = Page.objects.create(title='xxx', template_name='standard')
cell = WcsCardInfosCell(page=page, placeholder='content', order=0)
@ -2638,7 +2638,7 @@ def test_card_cell_render_text_field(mock_send, context):
)
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_cell_render_email_field(mock_send, context):
page = Page.objects.create(title='xxx', template_name='standard')
cell = WcsCardInfosCell(page=page, placeholder='content', order=0)
@ -2660,7 +2660,7 @@ def test_card_cell_render_email_field(mock_send, context):
)
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_cell_render_string_with_url_field(mock_send, context):
page = Page.objects.create(title='xxx', template_name='standard')
cell = WcsCardInfosCell(page=page, placeholder='content', order=0)
@ -2684,7 +2684,7 @@ def test_card_cell_render_string_with_url_field(mock_send, context):
)
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_cell_render_custom_schema_card_field(mock_send, context):
page = Page.objects.create(title='xxx', template_name='standard')
cell = WcsCardInfosCell.objects.create(
@ -2834,7 +2834,7 @@ def test_card_cell_render_custom_schema_card_field(mock_send, context):
assert PyQuery(result).find('.value a').attr['href'] == 'https://www.example.net/'
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_cell_render_custom_schema_card_empty_field(mock_send, context):
page = Page.objects.create(title='xxx', template_name='standard')
cell = WcsCardInfosCell.objects.create(
@ -2929,7 +2929,7 @@ def test_card_cell_render_custom_schema_card_empty_field(mock_send, context):
)
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_cell_render_custom_schema_custom_entry(mock_send, context, app):
page = Page.objects.create(title='xxx', template_name='standard')
cell = WcsCardInfosCell.objects.create(
@ -3046,7 +3046,7 @@ def test_card_cell_render_custom_schema_custom_entry(mock_send, context, app):
assert PyQuery(result).find('div.cell--body') == []
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_cell_render_custom_schema_link_entry(mock_send, context, app):
page = Page.objects.create(title='xxx', template_name='standard')
cell = WcsCardInfosCell.objects.create(
@ -3104,7 +3104,7 @@ def test_card_cell_render_custom_schema_link_entry(mock_send, context, app):
)
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_cell_render_identifier(mock_send, nocache, app):
page = Page.objects.create(
title='xxx', slug='foo', template_name='standard', sub_slug='(?P<card_model_1_id>[a-z0-9]+)'
@ -3240,7 +3240,7 @@ def test_card_cell_render_identifier(mock_send, nocache, app):
assert cell_resp.text.replace('\n', '') == '' # empty-cell
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_cell_render_identifier_from_related(mock_send, nocache, app):
page = Page.objects.create(title='xxx', slug='foo', template_name='standard')
cell = WcsCardInfosCell.objects.create(
@ -3681,7 +3681,7 @@ def test_card_cell_render_identifier_from_related(mock_send, nocache, app):
@pytest.mark.parametrize('carddef_reference', ['default:card_model_1', 'default:card_model_1:foo'])
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_cell_render_user(mock_send, context, nocache, carddef_reference):
page = Page.objects.create(title='xxx', template_name='standard')
cell = WcsCardInfosCell(page=page, placeholder='content', order=0)
@ -3862,7 +3862,7 @@ def test_tracking_code_cell(app, nocache):
resp = app.post(reverse('wcs-tracking-code'), params={'cell': cell.id}, status=400)
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_tracking_code_cell_check_validity(mock_send):
page = Page.objects.create(title='xxx', slug='test', template_name='standard')
cell = TrackingCodeInputCell.objects.create(page=page, placeholder='content', order=0)
@ -3882,7 +3882,7 @@ def test_tracking_code_cell_check_validity(mock_send):
assert ValidityInfo.objects.exists() is False
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_cell_assets(mock_send, settings, app, admin_user):
page = Page.objects.create(title='xxx', slug='test_cell_assets', template_name='standard')
cell1 = WcsFormCell.objects.create(
@ -4082,7 +4082,7 @@ def test_backoffice_submission_cell_render(context):
assert len(requests_get.call_args_list) == 2
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_backoffice_submission_cell_check_validity(mock_send, context):
page = Page.objects.create(title='xxx', slug='test_current_forms_cell_render', template_name='standard')
cell = BackofficeSubmissionCell.objects.create(page=page, placeholder='content', order=0)
@ -4165,7 +4165,7 @@ def test_manager_link_list_cell_duplicate():
assert new_item.cached_json == item.cached_json
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_manager_add_edit_delete_list_link_item(mock_send, app, admin_user):
page = Page.objects.create(title='One', slug='one', template_name='standard')
cell = LinkListCell.objects.create(order=0, placeholder='content', page=page)
@ -4301,7 +4301,7 @@ def test_hourly():
assert hasattr(klass, 'check_validity') is False
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_search_external_forms_links(mock_send, context):
page = Page(title='xxx', slug='test_forms_of_category_cell_search', template_name='standard')
page.save()
@ -4332,7 +4332,7 @@ def test_search_external_forms_links(mock_send, context):
assert len(hits) == 2
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_card_file_redirection(mock_send, app):
page = Page(title='One', slug='one', template_name='standard')
page.save()

View File

@ -1,14 +1,10 @@
import copy
import json
from unittest import mock
import pytest
from django.template import Context, Template
from django.test.client import RequestFactory
from requests.exceptions import ConnectionError
from requests.models import Response
from combo.apps.wcs.context_processors import Cards
from publik_django_templatetags.wcs.context_processors import Cards
@pytest.fixture
@ -23,29 +19,6 @@ def context():
return ctx
class MockAnonymousUser:
is_authenticated = False
is_anonymous = True
class MockUser:
email = 'foo@example.net'
is_authenticated = True
is_anonymous = False
def get_name_id(self):
return None
class MockUserWithNameId:
email = 'foo@example.net'
is_authenticated = True
is_anonymous = False
def get_name_id(self):
return 'xyz'
class MockedRequestResponse(mock.Mock):
status_code = 200
@ -58,352 +31,13 @@ def mocked_requests_send(request, **kwargs):
return MockedRequestResponse(content=json.dumps({'data': data}))
def test_context(context):
assert 'cards' in context
@mock.patch('combo.apps.wcs.models.requests.send', side_effect=mocked_requests_send)
def test_objects(mock_send, settings, context, nocache):
# lazy filters
t = Template('{{ cards|objects:"foo" }}')
assert t.render(context).startswith(
'&lt;combo.apps.wcs.context_processors.LazyCardDefObjectsManager object at'
)
assert mock_send.call_args_list == [] # lazy
t = Template('{{ cards|objects:"default:foo" }}')
assert t.render(context).startswith(
'&lt;combo.apps.wcs.context_processors.LazyCardDefObjectsManager object at'
)
assert mock_send.call_args_list == [] # lazy
# test filters evaluation
t = Template('{% for card in cards|objects:"foo" %}{{ card.id }} {% endfor %}')
assert t.render(context) == "1 2 "
assert mock_send.call_args_list[0][0][0].url.startswith(
'http://127.0.0.1:8999/api/cards/foo/list?'
) # primary service
t = Template('{{ cards|objects:"default:foo"|list }}')
t.render(context)
assert mock_send.call_args_list[0][0][0].url.startswith('http://127.0.0.1:8999/api/cards/foo/list?')
mock_send.reset_mock()
t = Template('{{ cards|objects:"other:foo"|list }}')
t.render(context)
assert mock_send.call_args_list[0][0][0].url.startswith('http://127.0.0.2:8999/api/cards/foo/list?')
mock_send.reset_mock()
t = Template('{{ cards|objects:"unknown:foo"|list }}')
t.render(context)
assert mock_send.call_args_list == [] # unknown, not evaluated
# test card_id with variable
context['foobar'] = 'some-slug'
mock_send.reset_mock()
t = Template('{{ cards|objects:foobar|list }}')
t.render(context)
assert mock_send.call_args_list[0][0][0].url.startswith('http://127.0.0.1:8999/api/cards/some-slug/list?')
# test with no secondary param
KNOWN_SERVICES = copy.deepcopy(settings.KNOWN_SERVICES)
KNOWN_SERVICES['wcs'] = {'default': {'url': 'http://127.0.0.3:8999/'}}
settings.KNOWN_SERVICES = KNOWN_SERVICES
mock_send.reset_mock()
t = Template('{{ cards|objects:"bar"|list }}')
t.render(context)
assert mock_send.call_args_list[0][0][0].url.startswith('http://127.0.0.3:8999/api/cards/bar/list?')
@mock.patch('combo.apps.wcs.models.requests.send', side_effect=mocked_requests_send)
def test_with_custom_view(mock_send, context, nocache):
t = Template('{{ cards|objects:"foo"|with_custom_view:"foobar"|list }}')
t.render(context)
assert mock_send.call_args_list[0][0][0].url.startswith(
'http://127.0.0.1:8999/api/cards/foo/list/foobar?'
) # primary service
t = Template('{{ cards|objects:"default:foo"|with_custom_view:"foobar"|list }}')
t.render(context)
assert mock_send.call_args_list[0][0][0].url.startswith(
'http://127.0.0.1:8999/api/cards/foo/list/foobar?'
)
mock_send.reset_mock()
t = Template('{{ cards|objects:"other:foo"|with_custom_view:"foobar"|list }}')
t.render(context)
assert mock_send.call_args_list[0][0][0].url.startswith(
'http://127.0.0.2:8999/api/cards/foo/list/foobar?'
)
mock_send.reset_mock()
t = Template('{{ cards|objects:"unknown:foo"|with_custom_view:"foobar"|list }}')
t.render(context)
assert mock_send.call_args_list == [] # unknown, not evaluated
@mock.patch('combo.apps.wcs.models.requests.send', side_effect=mocked_requests_send)
def test_full(mock_send, context, nocache):
t = Template('{{ cards|objects:"foo"|list }}')
t.render(context)
assert 'full=on&' not in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|get_full|list }}')
t.render(context)
assert 'full=on&' in mock_send.call_args_list[0][0][0].url
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
def test_errors(mock_send, context, nocache):
t = Template('{{ cards|objects:"foo"|list }}')
with mock.patch('combo.apps.wcs.utils.requests.get') as requests_get:
mock_resp = Response()
mock_resp.status_code = 500
requests_get.return_value = mock_resp
assert t.render(context) == "[]"
with mock.patch('combo.apps.wcs.utils.requests.get') as requests_get:
requests_get.side_effect = ConnectionError()
requests_get.return_value = mock_resp
assert t.render(context) == "[]"
with mock.patch('combo.apps.wcs.utils.requests.get') as requests_get:
mock_resp = Response()
mock_resp.status_code = 404
requests_get.return_value = mock_resp
assert t.render(context) == "[]"
mock_send.side_effect = lambda *a, **k: MockedRequestResponse(content=json.dumps({'err': 1}))
assert t.render(context) == "[]"
mock_send.side_effect = lambda *a, **k: MockedRequestResponse(content=json.dumps({}))
assert t.render(context) == "[]"
mock_send.side_effect = lambda *a, **k: MockedRequestResponse(content=json.dumps({'data': None}))
assert t.render(context) == "[]"
@mock.patch('combo.apps.wcs.models.requests.send', side_effect=mocked_requests_send)
def test_access_control(mock_send, context, nocache):
# no user in context
t = Template('{{ cards|objects:"foo"|list }}')
t.render(context)
assert 'NameID' not in mock_send.call_args_list[0][0][0].url
assert 'email' not in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|access_control:request.user|list }}')
t.render(context)
assert 'NameID=&' in mock_send.call_args_list[0][0][0].url
assert 'email=&' in mock_send.call_args_list[0][0][0].url
# current user in anonymous
context['request'].user = MockAnonymousUser()
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|list }}')
t.render(context)
assert 'NameID' not in mock_send.call_args_list[0][0][0].url
assert 'email' not in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|access_control:request.user|list }}')
t.render(context)
assert 'NameID=&' in mock_send.call_args_list[0][0][0].url
assert 'email=&' in mock_send.call_args_list[0][0][0].url
# current user with uuid
context['request'].user = MockUserWithNameId()
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|list }}')
t.render(context)
assert 'NameID' not in mock_send.call_args_list[0][0][0].url
assert 'email' not in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|access_control:request.user|list }}')
t.render(context)
assert 'NameID=xyz&' in mock_send.call_args_list[0][0][0].url
assert 'email' not in mock_send.call_args_list[0][0][0].url
# current user without uuid
context['request'].user = MockUser()
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|list }}')
t.render(context)
assert 'NameID' not in mock_send.call_args_list[0][0][0].url
assert 'email' not in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|access_control:request.user|list }}')
t.render(context)
assert 'NameID' not in mock_send.call_args_list[0][0][0].url
assert 'email=foo%40example.net&' in mock_send.call_args_list[0][0][0].url
@mock.patch('combo.apps.wcs.models.requests.send', side_effect=mocked_requests_send)
def test_count(mock_send, context, nocache):
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_publik_django_templatetags_integration(mock_send, context, nocache):
t = Template('{{ cards|objects:"foo"|count }}')
assert t.render(context) == "2"
@mock.patch('combo.apps.wcs.models.requests.send', side_effect=mocked_requests_send)
def test_filter(mock_send, context, nocache):
t = Template('{{ cards|objects:"foo"|filter_by:"foo"|filter_value:"bar"|list }}')
t.render(context)
assert 'filter-foo=bar&' in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template(
'{{ cards|objects:"foo"|filter_by:"foo"|filter_value:"bar"|filter_by:"foo2"|filter_value:"bar2"|list }}'
)
t.render(context)
assert 'filter-foo=bar&' in mock_send.call_args_list[0][0][0].url
assert 'filter-foo2=bar2&' in mock_send.call_args_list[0][0][0].url
# check boolean
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|filter_by:"foo"|filter_value:True|list }}')
t.render(context)
assert 'filter-foo=true&' in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|filter_by:"foo"|filter_value:False|list }}')
t.render(context)
assert 'filter-foo=false&' in mock_send.call_args_list[0][0][0].url
# check None
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|filter_by:"foo"|filter_value:None|list }}')
t.render(context)
assert 'filter-foo=&' in mock_send.call_args_list[0][0][0].url
@mock.patch('combo.apps.wcs.models.requests.send', side_effect=mocked_requests_send)
def test_filter_by_internal_id(mock_send, context, nocache):
t = Template('{{ cards|objects:"foo"|list }}')
t.render(context)
assert 'filter-internal-id' not in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|filter_by_internal_id:None|list }}')
t.render(context)
assert 'filter-internal-id' not in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|filter_by_internal_id:""|list }}')
t.render(context)
assert 'filter-internal-id' not in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|filter_by_internal_id:"42"|list }}')
t.render(context)
assert 'filter-internal-id=42&' in mock_send.call_args_list[0][0][0].url
@mock.patch('combo.apps.wcs.models.requests.send', side_effect=mocked_requests_send)
def test_filter_by_number(mock_send, context, nocache):
t = Template('{{ cards|objects:"foo"|list }}')
t.render(context)
assert 'filter-number' not in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|filter_by_number:None|list }}')
t.render(context)
assert 'filter-number' not in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|filter_by_number:""|list }}')
t.render(context)
assert 'filter-number' not in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|filter_by_number:"42-35"|list }}')
t.render(context)
assert 'filter-number=42-35&' in mock_send.call_args_list[0][0][0].url
@mock.patch('combo.apps.wcs.models.requests.send', side_effect=mocked_requests_send)
def test_filter_by_user(mock_send, context, nocache):
t = Template('{{ cards|objects:"foo"|filter_by_user:request.user|list }}')
t.render(context)
assert 'filter-user-uuid' not in mock_send.call_args_list[0][0][0].url
context['request'].user = MockAnonymousUser()
mock_send.reset_mock()
t.render(context)
assert 'filter-user-uuid' not in mock_send.call_args_list[0][0][0].url
context['request'].user = MockUser()
mock_send.reset_mock()
t.render(context)
assert 'filter-user-uuid' not in mock_send.call_args_list[0][0][0].url
context['request'].user = MockUserWithNameId()
mock_send.reset_mock()
t.render(context)
assert 'filter-user-uuid=xyz&' in mock_send.call_args_list[0][0][0].url
@mock.patch('combo.apps.wcs.models.requests.send', side_effect=mocked_requests_send)
def test_filter_by_status(mock_send, context, nocache):
t = Template('{{ cards|objects:"foo"|list }}')
t.render(context)
assert 'filter=&' not in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|filter_by_status:None|list }}')
t.render(context)
assert 'filter=&' not in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|filter_by_status:""|list }}')
t.render(context)
assert 'filter=&' not in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{{ cards|objects:"foo"|filter_by_status:"foobar"|list }}')
t.render(context)
assert 'filter=foobar&' in mock_send.call_args_list[0][0][0].url
@mock.patch('combo.apps.wcs.models.requests.send', side_effect=mocked_requests_send)
def test_getlist(mock_send, context, nocache):
t = Template('{% for v in cards|objects:"foo"|getlist:"id" %}{{ v }},{% endfor %}')
t.render(context)
assert t.render(context) == "1,2,"
t = Template('{% for v in cards|objects:"foo"|getlist:"fields" %}{{ v }},{% endfor %}')
t.render(context)
assert t.render(context) == "{&#39;foo&#39;: &#39;bar&#39;},{&#39;foo&#39;: &#39;baz&#39;},"
t = Template('{% for v in cards|objects:"foo"|getlist:"fields"|getlist:"foo" %}{{ v }},{% endfor %}')
t.render(context)
assert t.render(context) == "bar,baz,"
t = Template('{% for v in cards|objects:"foo"|getlist:"fields"|getlist:"unknown" %}{{ v }},{% endfor %}')
t.render(context)
assert t.render(context) == "None,None,"
@mock.patch('combo.apps.wcs.models.requests.send', side_effect=mocked_requests_send)
def test_order_by(mock_send, context, nocache):
t = Template('{% for v in cards|objects:"foo" %}{{ v }},{% endfor %}')
t.render(context)
assert 'order_by' not in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{% for v in cards|objects:"foo"|order_by:"bar" %}{{ v }},{% endfor %}')
t.render(context)
assert 'order_by=bar' in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{% for v in cards|objects:"foo"|order_by:"-bar" %}{{ v }},{% endfor %}')
t.render(context)
assert 'order_by=-bar' in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{% for v in cards|objects:"foo"|order_by:"" %}{{ v }},{% endfor %}')
t.render(context)
assert 'order_by' not in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{% for v in cards|objects:"foo"|order_by:"bar"|order_by:"" %}{{ v }},{% endfor %}')
t.render(context)
assert 'order_by' not in mock_send.call_args_list[0][0][0].url
mock_send.reset_mock()
t = Template('{% for v in cards|objects:"foo"|order_by:""|order_by:"bar" %}{{ v }},{% endfor %}')
t.render(context)
assert 'order_by=bar' in mock_send.call_args_list[0][0][0].url
@mock.patch('combo.apps.wcs.models.requests.send', side_effect=mocked_requests_send)
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_with_explicit_load_wcs(mock_send, context, nocache):
t = Template('{% load wcs %}{{ cards|objects:"foo"|count }}')
assert t.render(context) == "2"

View File

@ -32,6 +32,7 @@ deps =
vobject
django-ratelimit<3
git+https://git.entrouvert.org/debian/django-ckeditor.git
git+https://git.entrouvert.org/publik-django-templatetags.git
pre-commit
uwsgidecorators
commands =
@ -61,6 +62,7 @@ deps =
pyquery
psycopg2-binary<2.9
git+https://git.entrouvert.org/debian/django-ckeditor.git
git+https://git.entrouvert.org/publik-django-templatetags.git
uwsgidecorators
commands =
./getlasso3.sh