Projet

Général

Profil

0001-wcs-add-an-option-to-ignore-user-for-cards-cell-5394.patch

Lauréline Guérin, 27 mai 2021 09:32

Télécharger (9,46 ko)

Voir les différences:

Subject: [PATCH] wcs: add an option to ignore user for cards cell (#53947)

 combo/apps/wcs/forms.py                       | 28 +++++-
 .../0028_wcscardscell_without_user.py         | 18 ++++
 combo/apps/wcs/models.py                      |  6 +-
 tests/test_wcs.py                             | 86 ++++++++++++++++++-
 4 files changed, 132 insertions(+), 6 deletions(-)
 create mode 100644 combo/apps/wcs/migrations/0028_wcscardscell_without_user.py
combo/apps/wcs/forms.py
45 45

  
46 46

  
47 47
class WcsCardsCellForm(forms.ModelForm):
48
    with_user = forms.BooleanField(label=_('Restrict to cards accessible to the user'), required=False)
49

  
48 50
    class Meta:
49 51
        model = WcsCardsCell
50 52
        fields = ('carddef_reference', 'only_for_user')
51 53

  
52 54
    def __init__(self, *args, **kwargs):
53
        super().__init__(*args, **kwargs)
55
        instance = kwargs['instance']
56
        initial = kwargs.pop('initial', {})
57
        initial['with_user'] = not instance.without_user
58
        super().__init__(initial=initial, *args, **kwargs)
54 59
        card_models = get_wcs_options('/api/cards/@list', include_custom_views=True)
55 60
        self.fields['carddef_reference'].widget = forms.Select(choices=card_models)
56 61

  
62
    def save(self, *args, **kwargs):
63
        super().save(*args, **kwargs)
64
        self.instance.without_user = not self.cleaned_data['with_user']
65
        self.instance.save()
66
        return self.instance
67

  
57 68

  
58 69
class WcsCardInfoCellForm(forms.ModelForm):
70
    with_user = forms.BooleanField(label=_('Restrict to cards accessible to the user'), required=False)
71

  
59 72
    class Meta:
60 73
        model = WcsCardInfosCell
61
        fields = ('carddef_reference', 'card_id', 'without_user')
74
        fields = ('carddef_reference', 'card_id')
62 75

  
63 76
    def __init__(self, *args, **kwargs):
64
        super().__init__(*args, **kwargs)
77
        instance = kwargs['instance']
78
        initial = kwargs.pop('initial', {})
79
        initial['with_user'] = not instance.without_user
80
        super().__init__(initial=initial, *args, **kwargs)
65 81
        card_models = get_wcs_options('/api/cards/@list')
66 82
        self.fields['carddef_reference'].widget = forms.Select(choices=card_models)
67 83

  
84
    def save(self, *args, **kwargs):
85
        super().save(*args, **kwargs)
86
        self.instance.without_user = not self.cleaned_data['with_user']
87
        self.instance.save()
88
        return self.instance
89

  
68 90

  
69 91
class WcsCategoryCellForm(forms.ModelForm):
70 92
    class Meta:
combo/apps/wcs/migrations/0028_wcscardscell_without_user.py
1
from __future__ import unicode_literals
2

  
3
from django.db import migrations, models
4

  
5

  
6
class Migration(migrations.Migration):
7

  
8
    dependencies = [
9
        ('wcs', '0027_careforms_categories'),
10
    ]
11

  
12
    operations = [
13
        migrations.AddField(
14
            model_name='wcscardscell',
15
            name='without_user',
16
            field=models.BooleanField(default=False, verbose_name='Ignore the logged-in user'),
17
        ),
18
    ]
combo/apps/wcs/models.py
315 315
                response = requests.get(
316 316
                    api_url,
317 317
                    remote_service=wcs_site,
318
                    user=getattr(context.get('request'), 'user', None),
318
                    user=None
319
                    if getattr(self, 'without_user', False)
320
                    else getattr(context.get('request'), 'user', None),
321
                    without_user=getattr(self, 'without_user', False),
319 322
                    cache_duration=self.cache_duration,
320 323
                    raise_if_not_cached=not (context.get('synchronous')),
321 324
                    log_errors=False,
......
781 784
    carddef_reference = models.CharField(_('Card Model'), max_length=150)
782 785
    cached_title = models.CharField(_('Title'), max_length=150)
783 786
    only_for_user = models.BooleanField(_('Limit to cards linked to the logged-in user'), default=False)
787
    without_user = models.BooleanField(_('Ignore the logged-in user'), default=False)
784 788

  
785 789
    template_name = 'combo/wcs/cards.html'
786 790
    variable_name = 'cards'
tests/test_wcs.py
1199 1199
        settings.KNOWN_SERVICES = temp_settings
1200 1200

  
1201 1201

  
1202
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
1203
def test_manager_cards_cell(mock_send, app, admin_user):
1204
    page = Page.objects.create(title='xxx', slug='test_cards_cell_save_cache', template_name='standard')
1205
    cell = WcsCardsCell.objects.create(page=page, placeholder='content', order=0)
1206
    app = login(app)
1207

  
1208
    resp = app.get('/manage/pages/%s/' % page.pk)
1209
    assert ('data-cell-reference="%s"' % cell.get_reference()) in resp.text
1210
    assert cell.without_user is False
1211
    assert resp.forms[0]['c%s-with_user' % cell.get_reference()].value == 'on'
1212
    resp.forms[0]['c%s-with_user' % cell.get_reference()].value = False
1213
    resp.forms[0].submit().follow()
1214
    cell.refresh_from_db()
1215
    assert cell.without_user is True
1216
    assert resp.forms[0]['c%s-with_user' % cell.get_reference()].value is None
1217

  
1218

  
1202 1219
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
1203 1220
def test_cards_cell_setup(mock_send):
1204 1221
    cell = WcsCardsCell()
1205 1222
    form_class = cell.get_default_form_class()
1206
    form = form_class()
1223
    form = form_class(instance=cell)
1207 1224
    assert form.fields['carddef_reference'].widget.choices == [
1208 1225
        ('default:card_model_1', 'test : Card Model 1'),
1209 1226
        ('default:card_model_1:foo', 'test : Card Model 1 - bar'),
......
1415 1432
    assert 'filter-user-uuid=xyz' in mock_send.call_args_list[0][0][0].url
1416 1433

  
1417 1434

  
1435
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
1436
def test_cards_cell_render_user(mock_send, context, nocache):
1437
    page = Page.objects.create(title='xxx', template_name='standard')
1438
    cell = WcsCardsCell(page=page, placeholder='content', order=0)
1439
    cell.carddef_reference = u'default:card_model_1'
1440
    cell.save()
1441

  
1442
    context['card_model_1_id'] = 11
1443
    context['synchronous'] = True  # to get fresh content
1444

  
1445
    assert context['request'].user is None
1446
    mock_send.reset_mock()
1447
    cell.render(context)
1448
    assert 'NameID=&' in mock_send.call_args_list[0][0][0].url
1449
    assert 'email=&' in mock_send.call_args_list[0][0][0].url
1450

  
1451
    context['request'].user = MockUser()
1452
    mock_send.reset_mock()
1453
    cell.render(context)
1454
    assert 'email=foo%40example.net' in mock_send.call_args_list[0][0][0].url
1455

  
1456
    context['request'].user = MockUserWithNameId()
1457
    mock_send.reset_mock()
1458
    cell.render(context)
1459
    assert 'NameID=xyz' in mock_send.call_args_list[0][0][0].url
1460

  
1461
    cell.without_user = True
1462
    cell.save()
1463

  
1464
    context['request'].user = None
1465
    mock_send.reset_mock()
1466
    cell.render(context)
1467
    assert 'NameID' not in mock_send.call_args_list[0][0][0].url
1468
    assert 'email' not in mock_send.call_args_list[0][0][0].url
1469

  
1470
    context['request'].user = MockUser()
1471
    mock_send.reset_mock()
1472
    cell.render(context)
1473
    assert 'NameID' not in mock_send.call_args_list[0][0][0].url
1474
    assert 'email' not in mock_send.call_args_list[0][0][0].url
1475

  
1476
    context['request'].user = MockUserWithNameId()
1477
    mock_send.reset_mock()
1478
    cell.render(context)
1479
    assert 'NameID' not in mock_send.call_args_list[0][0][0].url
1480
    assert 'email' not in mock_send.call_args_list[0][0][0].url
1481

  
1482

  
1483
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
1484
def test_manager_card_cell(mock_send, app, admin_user):
1485
    page = Page.objects.create(title='xxx', slug='test_cards_cell_save_cache', template_name='standard')
1486
    cell = WcsCardInfosCell.objects.create(page=page, placeholder='content', order=0)
1487
    app = login(app)
1488

  
1489
    resp = app.get('/manage/pages/%s/' % page.pk)
1490
    assert ('data-cell-reference="%s"' % cell.get_reference()) in resp.text
1491
    assert cell.without_user is False
1492
    assert resp.forms[0]['c%s-with_user' % cell.get_reference()].value == 'on'
1493
    resp.forms[0]['c%s-with_user' % cell.get_reference()].value = False
1494
    resp.forms[0].submit().follow()
1495
    cell.refresh_from_db()
1496
    assert cell.without_user is True
1497
    assert resp.forms[0]['c%s-with_user' % cell.get_reference()].value is None
1498

  
1499

  
1418 1500
@mock.patch('combo.apps.wcs.utils.requests.send', side_effect=mocked_requests_send)
1419 1501
def test_card_cell_setup(mock_send):
1420 1502
    cell = WcsCardInfosCell()
1421 1503
    form_class = cell.get_default_form_class()
1422
    form = form_class()
1504
    form = form_class(instance=cell)
1423 1505
    assert form.fields['carddef_reference'].widget.choices == [
1424 1506
        ('default:card_model_1', 'test : Card Model 1'),
1425 1507
        ('default:card_model_2', 'test : Card Model 2'),
1426
-