"Demandes de l'usager", pouvoir filtrer les demandes de la cellule "Demande de l'usager" selon la fiche liée à la page (#58854) #120

Merged
lguerin merged 2 commits from wip/58854-wcs-user-forms-by-card into main 2023-06-30 11:01:14 +02:00
5 changed files with 78 additions and 7 deletions

View File

@ -31,7 +31,7 @@ from .models import (
WcsFormCell,
WcsFormsOfCategoryCell,
)
from .utils import get_wcs_options, get_wcs_services
from .utils import get_wcs_matching_card_model, get_wcs_options, get_wcs_services
class WcsFormCellForm(forms.ModelForm):
@ -289,6 +289,7 @@ class WcsCurrentFormsCellForm(WcsFormsMixin, forms.ModelForm):
'done_forms',
'include_drafts',
'include_forms_user_can_access',
'filter_by_card',
]
class Meta:
@ -299,12 +300,19 @@ class WcsCurrentFormsCellForm(WcsFormsMixin, forms.ModelForm):
'done_forms',
'include_drafts',
'include_forms_user_can_access',
'filter_by_card',
]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._init_wcs_site()
self._init_categories()
if self.instance.page.sub_slug:
result = get_wcs_matching_card_model(self.instance.page.sub_slug)
if not result:
del self.fields['filter_by_card']
else:
del self.fields['filter_by_card']
def clean(self):
cleaned_data = super().clean()

View File

@ -1,4 +1,3 @@
import django.contrib.postgres.fields.jsonb
import django.db.models.deletion
from django.db import migrations, models
@ -72,7 +71,7 @@ class Migration(migrations.Migration):
blank=True, null=True, verbose_name='Number of cards per page (default 10)'
),
),
('custom_schema', django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict)),
('custom_schema', models.JSONField(blank=True, default=dict)),
(
'display_mode',
models.CharField(
@ -97,7 +96,7 @@ class Migration(migrations.Migration):
),
('custom_title', models.CharField(blank=True, max_length=150, verbose_name='Custom Title')),
('cached_title', models.CharField(max_length=150, verbose_name='Title')),
('cached_json', django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict)),
('cached_json', models.JSONField(blank=True, default=dict)),
('groups', models.ManyToManyField(blank=True, to='auth.Group', verbose_name='Roles')),
('page', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='data.Page')),
],

View File

@ -0,0 +1,17 @@
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('wcs', '0056_wcscardcell_inline_filters'),
]
operations = [
migrations.AddField(
model_name='wcscurrentformscell',
name='filter_by_card',
field=models.BooleanField(
default=False, verbose_name='Only display forms related to the card linked to this page'
),
),
]

View File

@ -40,7 +40,13 @@ from combo.data.models import CellBase, Page
from combo.utils import NothingInCacheException, is_bot, requests
from combo.utils.misc import is_portal_agent
from .utils import get_matching_pages_from_card_slug, get_wcs_json, get_wcs_services, is_wcs_enabled
from .utils import (
get_matching_pages_from_card_slug,
get_wcs_json,
get_wcs_matching_card_model,
get_wcs_services,
is_wcs_enabled,
)
invalid_reason_codes = {
'wcs_form_not_defined': _('No form set'),
@ -486,6 +492,9 @@ class WcsCurrentFormsCell(CategoriesAndWcsSiteValidityMixin, CategoriesFiltering
include_forms_user_can_access = models.BooleanField(
_('Include forms to which the user can access'), default=False
)
filter_by_card = models.BooleanField(
_('Only display forms related to the card linked to this page'), default=False
)
class Meta:
verbose_name = _('User Forms')
@ -512,6 +521,14 @@ class WcsCurrentFormsCell(CategoriesAndWcsSiteValidityMixin, CategoriesFiltering
url += '&include-accessible=on'
if self.include_drafts:
url += '&include-drafts=on'
if self.filter_by_card:
if self.page.sub_slug:
result = get_wcs_matching_card_model(self.page.sub_slug)
if result:
card_slug = result[0].split(':')[1]
card_id = context.get('%s_id' % card_slug)
if card_id:
url += '&related=carddef:%s:%s' % (card_slug, card_id)
url += '&limit=%s&sort=desc' % settings.WCS_USER_FORMS_LIMIT
return url

View File

@ -266,15 +266,17 @@ def test_form_cell_render(mock_send):
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_current_forms_cell_setup(mock_send):
cell = WcsCurrentFormsCell()
page = Page.objects.create(title='xxx', slug='test_form_cell_render', template_name='standard')
cell = WcsCurrentFormsCell(page=page)
form_class = cell.get_default_form_class()
form = form_class()
form = form_class(instance=cell)
assert form.fields['wcs_site'].widget.choices == [
('', 'All'),
('default', 'test'),
('other', 'test2'),
]
assert 'current_forms' in form.fields
assert 'filter_by_card' not in form.fields
assert cell.get_additional_label() == 'All Sites - Current Forms'
cell.wcs_site = 'default'
assert cell.get_additional_label() == 'test - Current Forms'
@ -288,6 +290,16 @@ def test_current_forms_cell_setup(mock_send):
cell.done_forms = True
assert cell.get_additional_label() == 'All Sites - Done Forms'
page.sub_slug = 'foobar'
page.save()
form = form_class(instance=cell)
assert 'filter_by_card' not in form.fields
page.sub_slug = 'card_model_1_id'
page.save()
form = form_class(instance=cell)
assert 'filter_by_card' in form.fields
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_current_forms_cell_render(mock_send, context):
@ -458,6 +470,24 @@ def test_current_forms_cell_render(mock_send, context):
result = cell.render(context)
assert '<h2>Foo bar</h2>' in result
# check card filtering
cell.include_forms_user_can_access = False
cell.filter_by_card = True
cell.save()
url = cell.get_api_url(context)
assert url == '/api/user/forms/?status=done&limit=100&sort=desc'
page.sub_slug = 'unknown'
page.save()
url = cell.get_api_url(context)
assert url == '/api/user/forms/?status=done&limit=100&sort=desc'
page.sub_slug = 'card_model_1_id'
page.save()
url = cell.get_api_url(context)
assert url == '/api/user/forms/?status=done&limit=100&sort=desc'
context['card_model_1_id'] = '42'
url = cell.get_api_url(context)
assert url == '/api/user/forms/?status=done&related=carddef:card_model_1:42&limit=100&sort=desc'
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
def test_current_forms_cell_validity(mock_send, context):