Projet

Général

Profil

0003-wcs-delete-old-card-cell-models-68140.patch

Lauréline Guérin, 12 août 2022 15:37

Télécharger (58,4 ko)

Voir les différences:

Subject: [PATCH 3/5] wcs: delete old card cell models (#68140)

 combo/apps/wcs/__init__.py                    |  11 +-
 combo/apps/wcs/forms.py                       |  37 +-
 .../apps/wcs/migrations/0053_new_card_cell.py |  25 ++
 combo/apps/wcs/models.py                      | 196 +---------
 .../manager/card-cell-form-appearance.html    |  26 ++
 ...splay.html => card-cell-form-display.html} |  14 +-
 .../card-infos-cell-form-appearance.html      |  26 --
 combo/manager/static/js/combo.manager.js      |   4 +-
 tests/test_manager.py                         |   8 +-
 tests/test_search.py                          |   2 +-
 tests/wcs/test_all.py                         | 336 +-----------------
 tests/wcs/test_card.py                        | 102 +++---
 12 files changed, 143 insertions(+), 644 deletions(-)
 create mode 100644 combo/apps/wcs/migrations/0053_new_card_cell.py
 create mode 100644 combo/apps/wcs/templates/combo/wcs/manager/card-cell-form-appearance.html
 rename combo/apps/wcs/templates/combo/wcs/manager/{card-infos-cell-form-display.html => card-cell-form-display.html} (90%)
 delete mode 100644 combo/apps/wcs/templates/combo/wcs/manager/card-infos-cell-form-appearance.html
combo/apps/wcs/__init__.py
128 128
    def update_db_cache(self):
129 129
        from combo.data.models import CellBase
130 130

  
131
        from .models import (
132
            WcsCardInfosCell,
133
            WcsCardsCell,
134
            WcsCategoryCell,
135
            WcsFormCell,
136
            WcsFormsOfCategoryCell,
137
        )
131
        from .models import WcsCardCell, WcsCategoryCell, WcsFormCell, WcsFormsOfCategoryCell
138 132

  
139 133
        models_to_update = [
140 134
            WcsFormCell,
141 135
            WcsCategoryCell,
142 136
            WcsFormsOfCategoryCell,
143
            WcsCardsCell,
144
            WcsCardInfosCell,
137
            WcsCardCell,
145 138
        ]
146 139
        for cell in CellBase.get_cells(cell_filter=lambda x: x in models_to_update):
147 140
            cell.save()
combo/apps/wcs/forms.py
20 20
from combo.utils.forms import MultiSortWidget
21 21

  
22 22
from .models import (
23
    WcsCardInfosCell,
24
    WcsCardsCell,
23
    WcsCardCell,
25 24
    WcsCareFormsCell,
26 25
    WcsCategoryCell,
27 26
    WcsCurrentDraftsCell,
......
49 48
        fields = ('formdef_reference', 'extra_css_class')
50 49

  
51 50

  
52
class WcsCardsCellForm(forms.ModelForm):
53
    with_user = forms.BooleanField(
54
        label=_('Restrict to cards accessible to the user'), required=False, initial=True
55
    )
56

  
57
    class Meta:
58
        model = WcsCardsCell
59
        fields = ('carddef_reference', 'limit', 'only_for_user')
60

  
61
    def __init__(self, *args, **kwargs):
62
        instance = kwargs['instance']
63
        initial = kwargs.pop('initial', {})
64
        initial['with_user'] = not instance.without_user
65
        super().__init__(initial=initial, *args, **kwargs)
66
        card_models = get_wcs_options('/api/cards/@list', include_custom_views=True)
67
        self.fields['carddef_reference'].widget = forms.Select(choices=card_models)
68

  
69
    def save(self, *args, **kwargs):
70
        super().save(*args, **kwargs)
71
        self.instance.without_user = not self.cleaned_data['with_user']
72
        self.instance.save()
73
        return self.instance
74

  
75

  
76
class WcsCardInfoCellForm(forms.ModelForm):
51
class WcsCardCellForm(forms.ModelForm):
77 52
    with_user = forms.BooleanField(
78 53
        label=_('Restrict to cards accessible to the user'), required=False, initial=True
79 54
    )
80 55
    related_card_path = forms.ChoiceField(label=_('Card Identifier'), required=False)
81 56

  
82 57
    class Meta:
83
        model = WcsCardInfosCell
58
        model = WcsCardCell
84 59
        fields = (
85 60
            'carddef_reference',
86 61
            'related_card_path',
......
132 107
        return cleaned_data
133 108

  
134 109

  
135
class WcsCardInfoCellAppearanceBaseForm(forms.ModelForm):
110
class WcsCardCellAppearanceBaseForm(forms.ModelForm):
136 111
    def save(self, *args, **kwargs):
137 112
        super().save(*args, **kwargs)
138 113
        if self.instance.title_type != 'manual':
......
141 116
        return self.instance
142 117

  
143 118

  
144
class WcsCardInfoCellDisplayForm(forms.ModelForm):
119
class WcsCardCellDisplayForm(forms.ModelForm):
145 120
    customize_display = forms.BooleanField(label=_('Customize display'), required=False)
146 121

  
147 122
    class Meta:
148
        model = WcsCardInfosCell
123
        model = WcsCardCell
149 124
        fields = (
150 125
            'limit',
151 126
            'display_mode',
combo/apps/wcs/migrations/0053_new_card_cell.py
1
from django.db import migrations
2

  
3

  
4
class Migration(migrations.Migration):
5

  
6
    dependencies = [
7
        ('wcs', '0052_new_card_cell'),
8
    ]
9

  
10
    operations = [
11
        migrations.RemoveField(
12
            model_name='wcscardscell',
13
            name='groups',
14
        ),
15
        migrations.RemoveField(
16
            model_name='wcscardscell',
17
            name='page',
18
        ),
19
        migrations.DeleteModel(
20
            name='WcsCardInfosCell',
21
        ),
22
        migrations.DeleteModel(
23
            name='WcsCardsCell',
24
        ),
25
    ]
combo/apps/wcs/models.py
816 816
        return escape(self.custom_title) or self.cached_title or None
817 817

  
818 818

  
819
@register_cell_class
820
class WcsCardsCell(CardMixin, WcsBlurpMixin, CellBase):
821
    carddef_reference = models.CharField(_('Card Model'), max_length=150)
822
    cached_title = models.CharField(_('Title'), max_length=150)
823
    custom_title = models.CharField(_('Custom Title'), max_length=150, blank=True)
824
    only_for_user = models.BooleanField(_('Limit to cards linked to the logged-in user'), default=False)
825
    without_user = models.BooleanField(_('Ignore the logged-in user'), default=False)
826
    limit = models.PositiveSmallIntegerField(
827
        _('Number of cards per page (default 10)'), null=True, blank=True
828
    )
829

  
830
    default_template_name = 'combo/wcs/cards.html'
831
    variable_name = 'card_objects'
832

  
833
    class Meta:
834
        verbose_name = _('Cards')
835

  
836
    def save(self, *args, **kwargs):
837
        super().save(*args, **kwargs)
838

  
839
        if 'update_fields' in kwargs:
840
            # don't populate the cache
841
            return
842

  
843
        def populate_cache():
844
            if self.carddef_reference:
845
                parts = self.carddef_reference.split(':')
846
                wcs_key, card_slug = parts[:2]
847
                wcs_site = get_wcs_services().get(wcs_key)
848
                card_models = get_wcs_json(wcs_site, 'api/cards/@list')
849

  
850
                if not card_models or card_models.get('err') == 1:
851
                    # can not retrieve data, don't report cell as invalid
852
                    self.mark_as_valid()
853
                    return
854

  
855
                card_found = False
856
                for card in card_models.get('data') or []:
857
                    slug = card['slug']
858

  
859
                    if slug != card_slug:
860
                        continue
861

  
862
                    card_title = card['title']
863

  
864
                    if len(parts) > 2:
865
                        custom_view = None
866

  
867
                        for v in card.get('custom_views') or []:
868
                            if v['id'] == parts[2]:
869
                                custom_view = v
870
                                break
871

  
872
                        if custom_view is None:
873
                            continue
874

  
875
                        card_title = '%s - %s' % (card_title, custom_view['text'])
876

  
877
                    self.cached_title = card_title
878
                    self.save(update_fields=['cached_title'])
879
                    card_found = True
880
                    break
881
                if card_found:
882
                    self.mark_as_valid()
883
                    return
884
                else:
885
                    return self.mark_as_invalid('wcs_card_not_found')
886
            else:
887
                return self.mark_as_invalid('wcs_card_not_defined')
888

  
889
        populate_cache()
890

  
891
    def is_visible(self, request, **kwargs):
892
        user = getattr(request, 'user', None)
893
        if self.only_for_user and (not user or user.is_anonymous):
894
            return False
895
        return super().is_visible(request, **kwargs)
896

  
897
    def get_api_url(self, context):
898
        parts = self.carddef_reference.split(':')
899
        url = '/api/cards/%s/list' % parts[1]
900
        if len(parts) > 2:
901
            url = '%s/%s' % (url, parts[2])
902
        user = self.get_concerned_user(context)
903
        if self.only_for_user and user and not user.is_anonymous and user.get_name_id():
904
            url = '%s?filter-user-uuid=%s' % (url, user.get_name_id())
905
        return url
906

  
907
    def get_cell_extra_context(self, context):
908
        extra_context = super().get_cell_extra_context(context)
909
        extra_context['paginate_by'] = self.limit or 10
910
        extra_context['title'] = self.custom_title or self.cached_title
911

  
912
        pages_with_sub_slug = Page.objects.exclude(sub_slug='')
913
        card_id = '%s_id' % self.carddef_reference.split(':')[1]
914
        matching_pages = [
915
            p for p in pages_with_sub_slug if '<%s>' % card_id in p.sub_slug or p.sub_slug == card_id
916
        ]
917
        if matching_pages:
918
            card_page = matching_pages[0]
919
            extra_context['card_page_base_url'] = card_page.get_online_url()
920

  
921
        try:
922
            extra_context['card_objects'] = list(extra_context['card_objects'][self.wcs_site]['data'])
923
        except (KeyError, TypeError):
924
            # an error occured when getting the data
925
            extra_context['card_objects'] = []
926

  
927
        return extra_context
928

  
929
    def get_default_form_class(self):
930
        from .forms import WcsCardsCellForm
931

  
932
        return WcsCardsCellForm
933

  
934
    def render_for_search(self):
935
        return ''
936

  
937

  
938 819
@register_cell_class
939 820
class WcsCardCell(CardMixin, CellBase):
940 821
    carddef_reference = models.CharField(_('Card Model'), max_length=150)
......
972 853
    cached_title = models.CharField(_('Title'), max_length=150)
973 854
    cached_json = JSONField(blank=True, default=dict)
974 855

  
975
    class Meta:
976
        verbose_name = _('Card(s)')
977

  
978

  
979
@register_cell_class
980
class WcsCardInfosCell(CardMixin, CellBase):
981
    carddef_reference = models.CharField(_('Card Model'), max_length=150)
982
    related_card_path = models.CharField(_('Card Identifier'), max_length=1000, blank=True)
983
    card_ids = models.CharField(_('Other Card Identifiers'), max_length=1000, blank=True)
984
    only_for_user = models.BooleanField(_('Limit to cards linked to the logged-in user'), default=False)
985
    without_user = models.BooleanField(_('Ignore the logged-in user'), default=False)
986
    limit = models.PositiveSmallIntegerField(
987
        _('Number of cards per page (default 10)'), null=True, blank=True
988
    )
989
    custom_schema = JSONField(blank=True, default=dict)
990
    display_mode = models.CharField(
991
        _('Display mode'),
992
        max_length=10,
993
        default='card',
994
        choices=[
995
            ('card', _('Card')),
996
            ('table', _('Table')),
997
        ],
998
    )
999

  
1000
    title_type = models.CharField(
1001
        _('Title'),
1002
        max_length=20,
1003
        default='auto',
1004
        blank=False,
1005
        choices=[
1006
            ('auto', _('Default Title (Card Label)')),
1007
            ('manual', _('Custom Title')),
1008
            ('empty', _('No Title')),
1009
        ],
1010
    )
1011
    custom_title = models.CharField(_('Custom Title'), max_length=150, blank=True)
1012

  
1013
    cached_title = models.CharField(_('Title'), max_length=150)
1014
    cached_json = JSONField(blank=True, default=dict)
1015

  
1016 856
    is_enabled = classmethod(is_wcs_enabled)
1017 857

  
1018
    manager_appearance_template = 'combo/wcs/manager/card-infos-cell-form-appearance.html'
858
    manager_appearance_template = 'combo/wcs/manager/card-cell-form-appearance.html'
1019 859

  
1020 860
    class Meta:
1021
        verbose_name = _('Card Information Cell')
861
        verbose_name = _('Card(s)')
1022 862

  
1023 863
    def save(self, *args, **kwargs):
1024 864
        super().save(*args, **kwargs)
......
1260 1100

  
1261 1101
        # get cells with explicit ids
1262 1102
        results = []
1263
        for cell in WcsCardInfosCell.objects.filter(page=self.page_id).exclude(pk=self.pk):
1103
        for cell in WcsCardCell.objects.filter(page=self.page_id).exclude(pk=self.pk):
1264 1104
            if not cell.slug:
1265 1105
                # no slug
1266 1106
                continue
......
1386 1226

  
1387 1227
        first_cell_slug = self.get_related_card_path().split('/', maxsplit=1)[0]
1388 1228
        try:
1389
            first_cell = WcsCardInfosCell.objects.get(page=self.page_id, slug=first_cell_slug)
1390
        except (WcsCardInfosCell.DoesNotExist, WcsCardInfosCell.MultipleObjectsReturned):
1229
            first_cell = WcsCardCell.objects.get(page=self.page_id, slug=first_cell_slug)
1230
        except (WcsCardCell.DoesNotExist, WcsCardCell.MultipleObjectsReturned):
1391 1231
            return []
1392 1232
        if first_cell.related_card_path:
1393 1233
            # no explicit ids
......
1594 1434
        return extra_context
1595 1435

  
1596 1436
    def get_default_form_class(self):
1597
        from .forms import WcsCardInfoCellForm
1437
        from .forms import WcsCardCellForm
1598 1438

  
1599
        return WcsCardInfoCellForm
1439
        return WcsCardCellForm
1600 1440

  
1601 1441
    def get_appearance_fields(self):
1602 1442
        return ['title_type', 'custom_title']
1603 1443

  
1604 1444
    def get_appearance_form_class(self):
1605
        from .forms import WcsCardInfoCellAppearanceBaseForm
1445
        from .forms import WcsCardCellAppearanceBaseForm
1606 1446

  
1607
        return super().get_appearance_form_class(base_options_form_class=WcsCardInfoCellAppearanceBaseForm)
1447
        return super().get_appearance_form_class(base_options_form_class=WcsCardCellAppearanceBaseForm)
1608 1448

  
1609 1449
    def get_manager_tabs(self):
1610
        from .forms import WcsCardInfoCellDisplayForm
1450
        from .forms import WcsCardCellDisplayForm
1611 1451

  
1612 1452
        tabs = super().get_manager_tabs()
1613 1453
        tabs.append(
1614 1454
            {
1615 1455
                'slug': 'display',
1616 1456
                'name': _('Display'),
1617
                'template': 'combo/wcs/manager/card-infos-cell-form-display.html',
1618
                'form': WcsCardInfoCellDisplayForm,
1457
                'template': 'combo/wcs/manager/card-cell-form-display.html',
1458
                'form': WcsCardCellDisplayForm,
1619 1459
            },
1620 1460
        )
1621 1461
        return tabs
......
1642 1482
        return custom_schema
1643 1483

  
1644 1484
    def get_asset_slot_key(self, key):
1485
        # for legacy
1645 1486
        if self.display_mode == 'table':
1646
            # for legacy: card cell with table mode should use assets of old cards cell
1647 1487
            return 'cell:wcs_wcscardscell:%s:%s' % (key, self.get_slug_for_asset())
1648
        return super().get_asset_slot_key(key)
1488
        return 'cell:wcs_wcscardinfoscell:%s:%s' % (key, self.get_slug_for_asset())
1649 1489

  
1650 1490
    def get_asset_slot_templates(self):
1651
        if self.display_mode == 'table' and settings.COMBO_CELL_ASSET_SLOTS.get('wcs_wcscardscell'):
1652
            # for legacy: card cell with table mode should use assets of old cards cell
1653
            return settings.COMBO_CELL_ASSET_SLOTS['wcs_wcscardscell']
1654
        return super().get_asset_slot_templates()
1491
        # for legacy
1492
        if self.display_mode == 'table':
1493
            return settings.COMBO_CELL_ASSET_SLOTS.get('wcs_wcscardscell')
1494
        return settings.COMBO_CELL_ASSET_SLOTS.get('wcs_wcscardinfoscell')
1655 1495

  
1656 1496

  
1657 1497
@register_cell_class
combo/apps/wcs/templates/combo/wcs/manager/card-cell-form-appearance.html
1
{% extends "combo/cell_appearance.html" %}
2

  
3
{% block cell-form-appearance %}
4
  {{ block.super }}
5
  <script>
6
    {# display/hide custom_title field #}
7
    $('#id_cwcs_wcscardcell-{{ cell.pk }}-title_type').on('change', function() {
8
      if ($(this).val() == 'manual') {
9
        $('#id_cwcs_wcscardcell-{{ cell.pk }}-custom_title').parent().show();
10
      } else {
11
        $('#id_cwcs_wcscardcell-{{ cell.pk }}-custom_title').parent().hide();
12
      }
13
    });
14
    $('#id_cwcs_wcscardcell-{{ cell.pk }}-title_type').change();
15

  
16
    {# display/hide card_ids field #}
17
    $('#id_cwcs_wcscardcell-{{ cell.pk }}-related_card_path').on('change', function() {
18
      if (!$(this).val()) {
19
        $('#id_cwcs_wcscardcell-{{ cell.pk }}-card_ids').parent().show();
20
      } else {
21
        $('#id_cwcs_wcscardcell-{{ cell.pk }}-card_ids').parent().hide();
22
      }
23
    });
24
    $('#id_cwcs_wcscardcell-{{ cell.pk }}-related_card_path').change();
25
  </script>
26
{% endblock %}
combo/apps/wcs/templates/combo/wcs/manager/card-infos-cell-form-display.html → combo/apps/wcs/templates/combo/wcs/manager/card-cell-form-display.html
3 3
{{ display_form.as_p }}
4 4
<script>
5 5
  {# display/hide custom_schema fields #}
6
  $('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-display_mode').on('change', function() {
6
  $('#id_cwcs_wcscardcell-{{ cell.pk }}-display_mode').on('change', function() {
7 7
    if ($(this).val() == 'card') {
8
      $('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-customize_display').parent().show();
9
      if ($('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-customize_display').val()) {
10
        $('.wcs-cards-cell--grid', $('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-customize_display').parents('.cell')).show();
8
      $('#id_cwcs_wcscardcell-{{ cell.pk }}-customize_display').parent().show();
9
      if ($('#id_cwcs_wcscardcell-{{ cell.pk }}-customize_display').val()) {
10
        $('.wcs-cards-cell--grid', $('#id_cwcs_wcscardcell-{{ cell.pk }}-customize_display').parents('.cell')).show();
11 11
      }
12 12
    } else {
13
      $('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-customize_display').parent().hide();
14
      $('.wcs-cards-cell--grid', $('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-customize_display').parents('.cell')).hide();
13
      $('#id_cwcs_wcscardcell-{{ cell.pk }}-customize_display').parent().hide();
14
      $('.wcs-cards-cell--grid', $('#id_cwcs_wcscardcell-{{ cell.pk }}-customize_display').parents('.cell')).hide();
15 15
    }
16 16
  });
17
  $('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-display_mode').change();
17
  $('#id_cwcs_wcscardcell-{{ cell.pk }}-display_mode').change();
18 18
</script>
19 19

  
20 20
{% if card_schema %}
combo/apps/wcs/templates/combo/wcs/manager/card-infos-cell-form-appearance.html
1
{% extends "combo/cell_appearance.html" %}
2

  
3
{% block cell-form-appearance %}
4
  {{ block.super }}
5
  <script>
6
    {# display/hide custom_title field #}
7
    $('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-title_type').on('change', function() {
8
      if ($(this).val() == 'manual') {
9
        $('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-custom_title').parent().show();
10
      } else {
11
        $('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-custom_title').parent().hide();
12
      }
13
    });
14
    $('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-title_type').change();
15

  
16
    {# display/hide card_ids field #}
17
    $('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-related_card_path').on('change', function() {
18
      if (!$(this).val()) {
19
        $('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-card_ids').parent().show();
20
      } else {
21
        $('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-card_ids').parent().hide();
22
      }
23
    });
24
    $('#id_cwcs_wcscardinfoscell-{{ cell.pk }}-related_card_path').change();
25
  </script>
26
{% endblock %}
combo/manager/static/js/combo.manager.js
455 455
});
456 456

  
457 457

  
458
// UI to customize the layout of the content of a wcs-card-infos-cell
458
// UI to customize the layout of the content of a wcs-card-cell
459 459
const Card_cell_custom = function(cell) {
460 460
  this.cell = cell;
461 461
  this.gridSchema_default = {
......
845 845

  
846 846
// Active custom card UI for each card cell
847 847
$(function() {
848
  $('.wcs-card-infos-cell').each(function(i, el) {
848
  $('.wcs-card-cell').each(function(i, el) {
849 849
    const custom_card = new Card_cell_custom(el);
850 850
    $(el).on('combo:cellform-reloaded', function() {
851 851
      custom_card.init();
tests/test_manager.py
1040 1040
    resp.form['site_file'] = Upload('site-export.json', site_export, 'application/json')
1041 1041
    with CaptureQueriesContext(connection) as ctx:
1042 1042
        resp = resp.form.submit()
1043
        assert len(ctx.captured_queries) in [314, 315]
1043
        assert len(ctx.captured_queries) in [304, 305]
1044 1044
    assert Page.objects.count() == 4
1045 1045
    assert PageSnapshot.objects.all().count() == 4
1046 1046

  
......
1051 1051
    resp.form['site_file'] = Upload('site-export.json', site_export, 'application/json')
1052 1052
    with CaptureQueriesContext(connection) as ctx:
1053 1053
        resp = resp.form.submit()
1054
        assert len(ctx.captured_queries) == 282
1054
        assert len(ctx.captured_queries) == 274
1055 1055
    assert set(Page.objects.get(slug='one').related_cells['cell_types']) == {'data_textcell', 'data_linkcell'}
1056 1056
    assert Page.objects.count() == 4
1057 1057
    assert LinkCell.objects.count() == 2
......
2447 2447

  
2448 2448
    with CaptureQueriesContext(connection) as ctx:
2449 2449
        resp2 = resp.click('view', index=1)
2450
        assert len(ctx.captured_queries) == 72
2450
        assert len(ctx.captured_queries) == 70
2451 2451
    assert Page.snapshots.latest('pk').related_cells == {'cell_types': ['data_textcell']}
2452 2452
    assert resp2.text.index('Hello world') < resp2.text.index('Foobar3')
2453 2453

  
......
2508 2508
    resp = resp.click('restore', index=6)
2509 2509
    with CaptureQueriesContext(connection) as ctx:
2510 2510
        resp = resp.form.submit().follow()
2511
        assert len(ctx.captured_queries) == 157
2511
        assert len(ctx.captured_queries) == 153
2512 2512

  
2513 2513
    resp2 = resp.click('See online')
2514 2514
    assert resp2.text.index('Foobar1') < resp2.text.index('Foobar2') < resp2.text.index('Foobar3')
tests/test_search.py
1432 1432
    assert IndexedCell.objects.count() == 50
1433 1433
    with CaptureQueriesContext(connection) as ctx:
1434 1434
        index_site()
1435
        assert len(ctx.captured_queries) in (176, 226)  # (3.2, 2.2)
1435
        assert len(ctx.captured_queries) in (174, 224)  # (3.2, 2.2)
1436 1436

  
1437 1437
    SearchCell.objects.create(
1438 1438
        page=page, placeholder='content', order=0, _search_services={'data': ['search1']}
tests/wcs/test_all.py
22 22
    BackofficeSubmissionCell,
23 23
    CategoriesCell,
24 24
    TrackingCodeInputCell,
25
    WcsCardInfosCell,
26
    WcsCardsCell,
25
    WcsCardCell,
27 26
    WcsCareFormsCell,
28 27
    WcsCategoryCell,
29 28
    WcsCurrentDraftsCell,
......
1234 1233
    assert resp.pyquery('[data-tab-slug="appearance"] input[name$="custom_title"]')
1235 1234

  
1236 1235

  
1237
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
1238
def test_manager_cards_cell(mock_send, app, admin_user):
1239
    page = Page.objects.create(title='xxx', slug='test_cards_cell_save_cache', template_name='standard')
1240
    cell = WcsCardsCell.objects.create(page=page, placeholder='content', order=0)
1241
    app = login(app)
1242

  
1243
    resp = app.get('/manage/pages/%s/' % page.pk)
1244
    assert ('data-cell-reference="%s"' % cell.get_reference()) in resp.text
1245
    assert cell.without_user is False
1246
    assert resp.forms[0]['c%s-with_user' % cell.get_reference()].value == 'on'
1247
    resp.forms[0]['c%s-with_user' % cell.get_reference()].value = False
1248
    manager_submit_cell(resp.forms[0])
1249
    cell.refresh_from_db()
1250
    assert cell.without_user is True
1251
    assert resp.forms[0]['c%s-with_user' % cell.get_reference()].value is None
1252

  
1253

  
1254
def test_manager_cards_cell_tabs(app, admin_user):
1255
    page = Page.objects.create(title='xxx', slug='test_cards_cell_save_cache', template_name='standard')
1256
    cell = WcsCardsCell.objects.create(page=page, placeholder='content', order=0)
1257
    login(app)
1258

  
1259
    resp = app.get('/manage/pages/%s/' % page.pk)
1260

  
1261
    assert not resp.pyquery('[data-tab-slug="general"] input[name$="custom_title"]')
1262
    assert not resp.pyquery('#tab-%s-general.pk-tabs--button-marker' % cell.get_reference())
1263
    assert resp.pyquery('[data-tab-slug="appearance"] input[name$="custom_title"]')
1264

  
1265

  
1266
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
1267
def test_cards_cell_setup(mock_send):
1268
    cell = WcsCardsCell()
1269
    form_class = cell.get_default_form_class()
1270
    form = form_class(instance=cell)
1271
    assert form.fields['carddef_reference'].widget.choices == [
1272
        ('default:card_model_1', 'test : Card Model 1'),
1273
        ('default:card_model_1:foo', 'test : Card Model 1 - bar'),
1274
        ('default:card_model_2', 'test : Card Model 2'),
1275
        ('default:card_model_3', 'test : Card Model 3'),
1276
        ('default:card_a', 'test : Card A'),
1277
        ('default:card_b', 'test : Card B'),
1278
        ('default:card_b:a-custom-view', 'test : Card B - foo bar'),
1279
        ('default:card_c', 'test : Card C'),
1280
        ('default:card_d', 'test : Card D'),
1281
        ('default:card_e', 'test : Card E'),
1282
        ('other:card_model_1', 'test2 : Card Model 1'),
1283
        ('other:card_model_1:foo', 'test2 : Card Model 1 - bar'),
1284
        ('other:card_model_2', 'test2 : Card Model 2'),
1285
        ('other:card_model_3', 'test2 : Card Model 3'),
1286
        ('other:card_a', 'test2 : Card A'),
1287
        ('other:card_b', 'test2 : Card B'),
1288
        ('other:card_b:a-custom-view', 'test2 : Card B - foo bar'),
1289
        ('other:card_c', 'test2 : Card C'),
1290
        ('other:card_d', 'test2 : Card D'),
1291
        ('other:card_e', 'test2 : Card E'),
1292
    ]
1293

  
1294

  
1295
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
1296
def test_cards_cell_save_cache(mock_send):
1297
    page = Page.objects.create(title='xxx', slug='test_cards_cell_save_cache', template_name='standard')
1298
    cell = WcsCardsCell(page=page, placeholder='content', order=0)
1299
    assert cell.get_additional_label() is None
1300
    cell.carddef_reference = 'default:card_model_1'
1301
    cell.save()
1302
    assert cell.cached_title == 'Card Model 1'
1303
    assert cell.get_additional_label() == 'Card Model 1'
1304
    # make sure cached attributes are removed from serialized pages
1305
    assert 'cached_' not in json.dumps(page.get_serialized_page())
1306

  
1307
    cell.carddef_reference = 'default:card_model_1:foo'
1308
    cell.save()
1309
    assert cell.cached_title == 'Card Model 1 - bar'
1310
    assert cell.get_additional_label() == 'Card Model 1 - bar'
1311

  
1312
    # check content provided to search engine
1313
    assert cell.render_for_search() == ''
1314

  
1315
    # artificially change title
1316
    WcsCardsCell.objects.filter(pk=cell.pk).update(cached_title='XXX')
1317
    assert WcsCardsCell.objects.get(pk=cell.pk).cached_title == 'XXX'
1318
    # run update db cache
1319
    appconfig = apps.get_app_config('wcs')
1320
    appconfig.update_db_cache()
1321
    assert WcsCardsCell.objects.get(pk=cell.pk).cached_title == 'Card Model 1 - bar'
1322

  
1323

  
1324
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
1325
def test_cards_cell_validity(mock_send):
1326
    page = Page.objects.create(title='xxx', template_name='standard')
1327
    cell = WcsCardsCell.objects.create(page=page, placeholder='content', order=0)
1328
    validity_info = ValidityInfo.objects.latest('pk')
1329
    assert validity_info.invalid_reason_code == 'wcs_card_not_defined'
1330
    assert validity_info.invalid_since is not None
1331

  
1332
    cell.carddef_reference = 'default:card_model_1'
1333
    cell.save()
1334
    assert ValidityInfo.objects.exists() is False
1335

  
1336
    # can not retrieve data, don't set cell as invalid
1337
    with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
1338
        mock_resp = Response()
1339
        mock_resp.status_code = 500
1340
        requests_get.return_value = mock_resp
1341
        cell.save()
1342
    assert ValidityInfo.objects.exists() is False
1343
    with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
1344
        requests_get.side_effect = ConnectionError()
1345
        cell.save()
1346
    assert ValidityInfo.objects.exists() is False
1347

  
1348
    # can not retrieve carddefs, don't set cell as invalid
1349
    with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
1350
        mock_resp = Response()
1351
        mock_resp.status_code = 404
1352
        requests_get.return_value = mock_resp
1353
        cell.save()
1354
    assert ValidityInfo.objects.exists() is False
1355

  
1356
    cell.carddef_reference = 'default:foobar'
1357
    cell.save()
1358
    validity_info = ValidityInfo.objects.latest('pk')
1359
    assert validity_info.invalid_reason_code == 'wcs_card_not_found'
1360
    assert validity_info.invalid_since is not None
1361

  
1362
    cell.carddef_reference = 'default:card_model_1:foo'
1363
    cell.save()
1364
    assert ValidityInfo.objects.exists() is False
1365

  
1366
    cell.carddef_reference = 'default:card_model_1:bar'
1367
    cell.save()
1368
    validity_info = ValidityInfo.objects.latest('pk')
1369
    assert validity_info.invalid_reason_code == 'wcs_card_not_found'
1370
    assert validity_info.invalid_since is not None
1371

  
1372

  
1373
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
1374
def test_cards_cell_load(mock_send):
1375
    page = Page.objects.create(title='xxx', slug='test_cards', template_name='standard')
1376
    cell = WcsCardsCell(page=page, placeholder='content', order=0)
1377
    cell.carddef_reference = 'default:card_model_1'
1378
    cell.save()
1379
    site_export = [page.get_serialized_page()]
1380
    cell.delete()
1381
    assert not Page.objects.get(pk=page.pk).get_cells()
1382
    Page.load_serialized_pages(site_export)
1383
    page = Page.objects.get(slug='test_cards')
1384
    cells = page.get_cells()
1385
    assert len(cells) == 1
1386
    cell = cells[0]
1387
    assert cell.cached_title == 'Card Model 1'
1388

  
1389
    cell.carddef_reference = 'default:card_model_1:foo'
1390
    cell.save()
1391
    site_export = [page.get_serialized_page()]
1392
    cell.delete()
1393
    assert not Page.objects.get(pk=page.pk).get_cells()
1394
    Page.load_serialized_pages(site_export)
1395
    page = Page.objects.get(slug='test_cards')
1396
    cells = page.get_cells()
1397
    assert len(cells) == 1
1398
    cell = cells[0]
1399
    assert cell.cached_title == 'Card Model 1 - bar'
1400

  
1401

  
1402
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
1403
def test_cards_cell_render(mock_send, context):
1404
    page = Page.objects.create(title='xxx', template_name='standard')
1405
    cell = WcsCardsCell(page=page, placeholder='content', order=0)
1406
    cell.carddef_reference = 'default:card_model_1'
1407
    cell.save()
1408

  
1409
    # query should fail as nothing is cached
1410
    cache.clear()
1411
    with pytest.raises(NothingInCacheException):
1412
        result = cell.render(context)
1413

  
1414
    context['synchronous'] = True  # to get fresh content
1415
    context['cell'] = cell
1416

  
1417
    result = cell.render(context)
1418
    assert '<h2>Card Model 1</h2>' in result
1419
    assert 'cards-card_model_1' in result
1420
    assert (
1421
        '<a href="http://127.0.0.1:8999/backoffice/data/card_model_1/11/"><span class="card-title">aa</span></a>'
1422
        in result
1423
    )
1424
    assert (
1425
        '<a href="http://127.0.0.1:8999/backoffice/data/card_model_1/12/"><span class="card-title">bb</span></a>'
1426
        in result
1427
    )
1428
    assert (
1429
        '<a href="http://127.0.0.1:8999/backoffice/data/card_model_1/13/"><span class="card-title">cc</span></a>'
1430
        in result
1431
    )
1432
    assert 'data-paginate-by="10"' in result
1433

  
1434
    # create a page with the correct subslug
1435
    page = Page.objects.create(slug='foo', title='Foo', sub_slug='(?P<card_model_1_id>[a-z0-9]+)')
1436

  
1437
    result = cell.render(context)
1438
    assert '<h2>Card Model 1</h2>' in result
1439
    assert '<a href="/foo/11"><span class="card-title">aa</span></a>' in result
1440
    assert '<a href="/foo/12"><span class="card-title">bb</span></a>' in result
1441
    assert '<a href="/foo/13"><span class="card-title">cc</span></a>' in result
1442

  
1443
    cell.carddef_reference = 'default:card_model_1:foo'
1444
    cell.limit = 42
1445
    cell.save()
1446
    page.sub_slug = 'card_model_1_id'
1447
    page.save()
1448

  
1449
    result = cell.render(context)
1450
    assert '<h2>Card Model 1 - bar</h2>' in result
1451
    assert '<a href="/foo/11"><span class="card-title">aa</span></a>' in result
1452
    assert '<a href="/foo/12"><span class="card-title">bb</span></a>' in result
1453
    assert '<a href="/foo/13"><span class="card-title">cc</span></a>' not in result
1454
    assert 'data-paginate-by="42"' in result
1455

  
1456
    with mock.patch('combo.apps.wcs.models.requests.get') as requests_get:
1457
        mock_json = mock.Mock(status_code=200)
1458
        requests_get.return_value = mock_json
1459
        cell.render(context)
1460
    assert len(requests_get.call_args_list) == 1
1461
    assert requests_get.call_args_list[0][0][0] == '/api/cards/card_model_1/list/foo'
1462
    assert requests_get.call_args_list[0][1]['remote_service']['url'] == 'http://127.0.0.1:8999/'
1463

  
1464
    cell.custom_title = 'Foo bar'
1465
    cell.save()
1466
    result = cell.render(context)
1467
    assert '<h2>Card Model 1 - bar</h2>' not in result
1468
    assert '<h2>Foo bar</h2>' in result
1469

  
1470

  
1471
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
1472
def test_cards_cell_only_for_user(mock_send, context):
1473
    page = Page.objects.create(title='xxx', template_name='standard')
1474
    cell = WcsCardsCell(page=page, placeholder='content', order=0)
1475
    cell.carddef_reference = 'default:card_model_1'
1476
    cell.only_for_user = False
1477
    cell.save()
1478

  
1479
    assert cell.is_visible(request=context['request']) is True
1480
    context['request'].user = MockUserWithNameId()
1481
    assert cell.is_visible(request=context['request']) is True
1482

  
1483
    cell.only_for_user = True
1484
    cell.save()
1485
    context['request'].user = None
1486
    assert cell.is_visible(request=context['request']) is False
1487
    context['request'].user = MockUserWithNameId()
1488
    assert cell.is_visible(request=context['request']) is True
1489

  
1490
    cache.clear()
1491
    context['synchronous'] = True  # to get fresh content
1492
    context['request'].user = None
1493

  
1494
    mock_send.reset_mock()
1495
    cell.render(context)
1496
    assert 'filter-user-uuid' not in mock_send.call_args_list[0][0][0].url
1497

  
1498
    context['request'].user = MockUser()
1499
    mock_send.reset_mock()
1500
    cell.render(context)
1501
    assert 'filter-user-uuid' not in mock_send.call_args_list[0][0][0].url
1502

  
1503
    context['request'].user = MockUserWithNameId()
1504
    mock_send.reset_mock()
1505
    cell.render(context)
1506
    assert 'filter-user-uuid=xyz' in mock_send.call_args_list[0][0][0].url
1507

  
1508

  
1509
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
1510
def test_cards_cell_render_user(mock_send, context, nocache):
1511
    page = Page.objects.create(title='xxx', template_name='standard')
1512
    cell = WcsCardsCell(page=page, placeholder='content', order=0)
1513
    cell.carddef_reference = 'default:card_model_1'
1514
    cell.save()
1515

  
1516
    context['synchronous'] = True  # to get fresh content
1517

  
1518
    assert context['request'].user is None
1519
    mock_send.reset_mock()
1520
    cell.render(context)
1521
    assert 'NameID=&' in mock_send.call_args_list[0][0][0].url
1522
    assert 'email=&' in mock_send.call_args_list[0][0][0].url
1523

  
1524
    context['request'].user = AnonymousUser()
1525
    mock_send.reset_mock()
1526
    cell.render(context)
1527
    assert 'NameID=&' in mock_send.call_args_list[0][0][0].url
1528
    assert 'email=&' in mock_send.call_args_list[0][0][0].url
1529

  
1530
    context['request'].user = MockUser()
1531
    mock_send.reset_mock()
1532
    cell.render(context)
1533
    assert 'email=foo%40example.net' in mock_send.call_args_list[0][0][0].url
1534

  
1535
    context['request'].user = MockUserWithNameId()
1536
    mock_send.reset_mock()
1537
    cell.render(context)
1538
    assert 'NameID=xyz' in mock_send.call_args_list[0][0][0].url
1539

  
1540
    cell.without_user = True
1541
    cell.save()
1542

  
1543
    context['request'].user = None
1544
    mock_send.reset_mock()
1545
    cell.render(context)
1546
    assert 'NameID' not in mock_send.call_args_list[0][0][0].url
1547
    assert 'email' not in mock_send.call_args_list[0][0][0].url
1548

  
1549
    context['request'].user = AnonymousUser()
1550
    mock_send.reset_mock()
1551
    cell.render(context)
1552
    assert 'NameID' not in mock_send.call_args_list[0][0][0].url
1553
    assert 'email' not in mock_send.call_args_list[0][0][0].url
1554

  
1555
    context['request'].user = MockUser()
1556
    mock_send.reset_mock()
1557
    cell.render(context)
1558
    assert 'NameID' not in mock_send.call_args_list[0][0][0].url
1559
    assert 'email' not in mock_send.call_args_list[0][0][0].url
1560

  
1561
    context['request'].user = MockUserWithNameId()
1562
    mock_send.reset_mock()
1563
    cell.render(context)
1564
    assert 'NameID' not in mock_send.call_args_list[0][0][0].url
1565
    assert 'email' not in mock_send.call_args_list[0][0][0].url
1566

  
1567

  
1568 1236
def test_tracking_code_cell(app, nocache):
1569 1237
    page = Page(title='One', slug='index', template_name='standard')
1570 1238
    page.save()
......
2177 1845
            WcsCurrentFormsCell,
2178 1846
            WcsCurrentDraftsCell,
2179 1847
            WcsFormsOfCategoryCell,
2180
            WcsCardInfosCell,
1848
            WcsCardCell,
2181 1849
            BackofficeSubmissionCell,
2182 1850
            CategoriesCell,
2183 1851
            TrackingCodeInputCell,
tests/wcs/test_card.py
12 12
from requests.exceptions import ConnectionError
13 13
from requests.models import Response
14 14

  
15
from combo.apps.wcs.forms import WcsCardInfoCellDisplayForm
16
from combo.apps.wcs.models import WcsCardInfosCell
15
from combo.apps.wcs.forms import WcsCardCellDisplayForm
16
from combo.apps.wcs.models import WcsCardCell
17 17
from combo.data.models import Page, TextCell, ValidityInfo
18 18
from tests.test_manager import login
19 19
from tests.utils import manager_submit_cell
......
28 28
    page = Page.objects.create(
29 29
        title='xxx', slug='test_card_cell_save_cache', template_name='standard', sub_slug='foobar'
30 30
    )
31
    cell = WcsCardInfosCell(page=page, placeholder='content', order=0)
31
    cell = WcsCardCell(page=page, placeholder='content', order=0)
32 32
    form_class = cell.get_default_form_class()
33 33
    form = form_class(instance=cell)
34 34
    assert form.fields['carddef_reference'].widget.choices == [
......
54 54
        ('other:card_e', 'test2 : Card E'),
55 55
    ]
56 56

  
57
    form_display = WcsCardInfoCellDisplayForm(instance=cell)
57
    form_display = WcsCardCellDisplayForm(instance=cell)
58 58
    assert 'customize_display' not in form_display.fields
59 59
    assert 'custom_schema' not in form_display.fields
60 60

  
......
64 64

  
65 65
    cell.carddef_reference = 'default:card_model_1'
66 66
    cell.save()
67
    form_display = WcsCardInfoCellDisplayForm(instance=cell)
67
    form_display = WcsCardCellDisplayForm(instance=cell)
68 68
    assert 'customize_display' in form_display.fields
69 69
    assert 'custom_schema' in form_display.fields
70 70
    assert 'customize_display' not in form_display.initial
......
72 72

  
73 73
    cell.carddef_reference = 'default:card_model_1:foo'
74 74
    cell.save()
75
    form_display = WcsCardInfoCellDisplayForm(instance=cell)
75
    form_display = WcsCardCellDisplayForm(instance=cell)
76 76
    assert 'customize_display' in form_display.fields
77 77
    assert 'custom_schema' in form_display.fields
78 78
    assert 'customize_display' not in form_display.initial
......
83 83

  
84 84
    cell.custom_schema = {'cells': [{'varname': 'foo', 'display_mode': 'value'}]}
85 85
    cell.save()
86
    form_display = WcsCardInfoCellDisplayForm(instance=cell)
86
    form_display = WcsCardCellDisplayForm(instance=cell)
87 87
    assert 'customize_display' in form_display.fields
88 88
    assert 'custom_schema' in form_display.fields
89 89
    assert form_display.initial['customize_display'] is True
......
93 93
        ]
94 94
    }
95 95

  
96
    WcsCardInfosCell.objects.all().delete()
96
    WcsCardCell.objects.all().delete()
97 97

  
98 98
    # check adding a cell from the UI
99 99
    app = login(app)
100 100
    resp = app.get('/manage/pages/%s/' % page.pk)
101
    cell_add_url = [x for x in resp.html.find_all('option') if x.text == 'Card Information Cell'][0].get(
102
        'data-add-url'
103
    )
101
    cell_add_url = [x for x in resp.html.find_all('option') if x.text == 'Card(s)'][0].get('data-add-url')
104 102
    resp = app.get(cell_add_url).follow()
105
    cell = WcsCardInfosCell.objects.all().first()
103
    cell = WcsCardCell.objects.all().first()
106 104
    manager_submit_cell(resp.forms[0])  # will save card model
107 105
    cell.refresh_from_db()
108 106

  
......
188 186

  
189 187

  
190 188
def test_card_cell_custom_schema_migration():
191
    cell = WcsCardInfosCell()
189
    cell = WcsCardCell()
192 190

  
193 191
    cell.custom_schema = {
194 192
        'cells': [{'varname': 'some-field', 'display_mode': 'label', 'cell_size': 'foobar'}]
......
261 259
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
262 260
def test_card_cell_save_cache(mock_send):
263 261
    page = Page.objects.create(title='xxx', slug='test_card_cell_save_cache', template_name='standard')
264
    cell = WcsCardInfosCell(page=page, placeholder='content', order=0)
262
    cell = WcsCardCell(page=page, placeholder='content', order=0)
265 263
    assert cell.get_additional_label() is None
266 264
    cell.carddef_reference = 'default:card_model_1'
267 265
    cell.save()
......
272 270
    assert 'cached_' not in json.dumps(page.get_serialized_page())
273 271

  
274 272
    # artificially change title and json
275
    WcsCardInfosCell.objects.filter(pk=cell.pk).update(cached_title='XXX', cached_json={})
276
    assert WcsCardInfosCell.objects.get(pk=cell.pk).cached_title == 'XXX'
277
    assert WcsCardInfosCell.objects.get(pk=cell.pk).cached_json == {}
273
    WcsCardCell.objects.filter(pk=cell.pk).update(cached_title='XXX', cached_json={})
274
    assert WcsCardCell.objects.get(pk=cell.pk).cached_title == 'XXX'
275
    assert WcsCardCell.objects.get(pk=cell.pk).cached_json == {}
278 276
    # run update db cache
279 277
    appconfig = apps.get_app_config('wcs')
280 278
    appconfig.update_db_cache()
281
    assert WcsCardInfosCell.objects.get(pk=cell.pk).cached_title == 'Card Model 1'
282
    assert WcsCardInfosCell.objects.get(pk=cell.pk).cached_json != {}
279
    assert WcsCardCell.objects.get(pk=cell.pk).cached_title == 'Card Model 1'
280
    assert WcsCardCell.objects.get(pk=cell.pk).cached_json != {}
283 281

  
284 282

  
285 283
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
286 284
def test_card_cell_validity(mock_send):
287 285
    page = Page.objects.create(title='xxx', template_name='standard')
288
    cell = WcsCardInfosCell.objects.create(page=page, placeholder='content', order=0)
286
    cell = WcsCardCell.objects.create(page=page, placeholder='content', order=0)
289 287
    validity_info = ValidityInfo.objects.latest('pk')
290 288
    assert validity_info.invalid_reason_code == 'wcs_card_not_defined'
291 289
    assert validity_info.invalid_since is not None
......
329 327
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
330 328
def test_card_cell_check_validity(mock_send):
331 329
    page = Page.objects.create(title='xxx', template_name='standard')
332
    cell = WcsCardInfosCell.objects.create(
330
    cell = WcsCardCell.objects.create(
333 331
        page=page,
334 332
        placeholder='content',
335 333
        order=0,
336 334
        carddef_reference='default:card_a',
337 335
        card_ids='1',
338 336
    )
339
    cell2 = WcsCardInfosCell.objects.create(
337
    cell2 = WcsCardCell.objects.create(
340 338
        page=page, placeholder='content', order=1, carddef_reference='default:card_b'
341 339
    )
342 340

  
......
370 368
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
371 369
def test_manager_card_cell(mock_send, app, admin_user):
372 370
    page = Page.objects.create(title='xxx', slug='test_cards', template_name='standard', sub_slug='foobar')
373
    cell = WcsCardInfosCell.objects.create(page=page, placeholder='content', order=0)
371
    cell = WcsCardCell.objects.create(page=page, placeholder='content', order=0)
374 372

  
375 373
    app = login(app)
376 374
    resp = app.get('/manage/pages/%s/' % page.pk)
......
414 412
    # add a second cell, related to the first card model
415 413
    cell.related_card_path = ''
416 414
    cell.save()
417
    cell2 = WcsCardInfosCell.objects.create(
415
    cell2 = WcsCardCell.objects.create(
418 416
        page=page, placeholder='content', order=1, carddef_reference='default:card_b'
419 417
    )
420 418
    resp = app.get('/manage/pages/%s/' % page.pk)
......
606 604
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
607 605
def test_manager_card_cell_tabs(mock_send, app, admin_user):
608 606
    page = Page.objects.create(title='xxx', slug='test_cards', template_name='standard', sub_slug='foobar')
609
    cell = WcsCardInfosCell.objects.create(page=page, placeholder='content', order=0)
607
    cell = WcsCardCell.objects.create(page=page, placeholder='content', order=0)
610 608

  
611 609
    app = login(app)
612 610
    resp = app.get('/manage/pages/%s/' % page.pk)
......
629 627
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
630 628
def test_card_cell_load(mock_send):
631 629
    page = Page.objects.create(title='xxx', slug='test_cards', template_name='standard')
632
    cell = WcsCardInfosCell(page=page, placeholder='content', order=0)
630
    cell = WcsCardCell(page=page, placeholder='content', order=0)
633 631
    cell.carddef_reference = 'default:card_model_1'
634 632
    cell.save()
635 633
    site_export = [page.get_serialized_page()]
......
646 644
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
647 645
def test_card_cell_table_mode_render(mock_send, context, app):
648 646
    page = Page.objects.create(title='xxx', template_name='standard')
649
    cell = WcsCardInfosCell.objects.create(
647
    cell = WcsCardCell.objects.create(
650 648
        page=page,
651 649
        placeholder='content',
652 650
        order=0,
......
712 710
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
713 711
def test_card_cell_table_mode_render_all_cards(mock_send, nocache, app):
714 712
    page = Page.objects.create(title='xxx', slug='foo', template_name='standard')
715
    cell = WcsCardInfosCell.objects.create(
713
    cell = WcsCardCell.objects.create(
716 714
        page=page,
717 715
        placeholder='content',
718 716
        order=0,
......
743 741
    page = Page.objects.create(
744 742
        title='xxx', slug='foo', template_name='standard', sub_slug='(?P<card_model_1_id>[a-z0-9]+)'
745 743
    )
746
    cell = WcsCardInfosCell.objects.create(
744
    cell = WcsCardCell.objects.create(
747 745
        page=page,
748 746
        placeholder='content',
749 747
        order=0,
......
817 815
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
818 816
def test_card_cell_table_mode_render_identifier_from_related(mock_send, nocache, app):
819 817
    page = Page.objects.create(title='xxx', slug='foo', template_name='standard')
820
    WcsCardInfosCell.objects.create(
818
    WcsCardCell.objects.create(
821 819
        page=page,
822 820
        placeholder='content',
823 821
        order=0,
......
826 824
        carddef_reference='default:card_a',
827 825
        card_ids='1',
828 826
    )
829
    cell2 = WcsCardInfosCell.objects.create(
827
    cell2 = WcsCardCell.objects.create(
830 828
        page=page, placeholder='content', order=1, slug='slugb', carddef_reference='default:card_b'
831 829
    )
832 830

  
......
876 874
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
877 875
def test_card_cell_table_mode_render_title(mock_send, context):
878 876
    page = Page.objects.create(title='xxx', template_name='standard')
879
    cell = WcsCardInfosCell.objects.create(
877
    cell = WcsCardCell.objects.create(
880 878
        page=page,
881 879
        placeholder='content',
882 880
        order=0,
......
911 909
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
912 910
def test_card_cell_card_mode_render(mock_send, context, app):
913 911
    page = Page.objects.create(title='xxx', template_name='standard')
914
    cell = WcsCardInfosCell.objects.create(
912
    cell = WcsCardCell.objects.create(
915 913
        page=page,
916 914
        placeholder='content',
917 915
        order=0,
......
1057 1055
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
1058 1056
def test_card_cell_card_mode_render_text_field(mock_send, context):
1059 1057
    page = Page.objects.create(title='xxx', template_name='standard')
1060
    cell = WcsCardInfosCell.objects.create(
1058
    cell = WcsCardCell.objects.create(
1061 1059
        page=page,
1062 1060
        placeholder='content',
1063 1061
        order=0,
......
1093 1091
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
1094 1092
def test_card_cell_card_mode_render_email_field(mock_send, context):
1095 1093
    page = Page.objects.create(title='xxx', template_name='standard')
1096
    cell = WcsCardInfosCell.objects.create(
1094
    cell = WcsCardCell.objects.create(
1097 1095
        page=page,
1098 1096
        placeholder='content',
1099 1097
        order=0,
......
1119 1117
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
1120 1118
def test_card_cell_card_mode_render_string_with_url_field(mock_send, context):
1121 1119
    page = Page.objects.create(title='xxx', template_name='standard')
1122
    cell = WcsCardInfosCell.objects.create(
1120
    cell = WcsCardCell.objects.create(
1123 1121
        page=page,
1124 1122
        placeholder='content',
1125 1123
        order=0,
......
1147 1145
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
1148 1146
def test_card_cell_card_mode_render_custom_schema_card_field(mock_send, context):
1149 1147
    page = Page.objects.create(title='xxx', template_name='standard')
1150
    cell = WcsCardInfosCell.objects.create(
1148
    cell = WcsCardCell.objects.create(
1151 1149
        page=page,
1152 1150
        placeholder='content',
1153 1151
        order=0,
......
1297 1295
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
1298 1296
def test_card_cell_card_mode_render_custom_schema_card_empty_field(mock_send, context):
1299 1297
    page = Page.objects.create(title='xxx', template_name='standard')
1300
    cell = WcsCardInfosCell.objects.create(
1298
    cell = WcsCardCell.objects.create(
1301 1299
        page=page,
1302 1300
        placeholder='content',
1303 1301
        order=0,
......
1398 1396
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
1399 1397
def test_card_cell_card_mode_render_custom_schema_custom_entry(mock_send, context, app):
1400 1398
    page = Page.objects.create(title='xxx', template_name='standard')
1401
    cell = WcsCardInfosCell.objects.create(
1399
    cell = WcsCardCell.objects.create(
1402 1400
        page=page,
1403 1401
        placeholder='content',
1404 1402
        order=0,
......
1515 1513
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
1516 1514
def test_card_cell_card_mode_render_custom_schema_link_entry(mock_send, context, app):
1517 1515
    page = Page.objects.create(title='xxx', template_name='standard')
1518
    cell = WcsCardInfosCell.objects.create(
1516
    cell = WcsCardCell.objects.create(
1519 1517
        page=page,
1520 1518
        placeholder='content',
1521 1519
        order=0,
......
1573 1571
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
1574 1572
def test_card_cell_card_mode_render_all_cards(mock_send, nocache, app):
1575 1573
    page = Page.objects.create(title='xxx', slug='foo', template_name='standard')
1576
    cell = WcsCardInfosCell.objects.create(
1574
    cell = WcsCardCell.objects.create(
1577 1575
        page=page,
1578 1576
        placeholder='content',
1579 1577
        order=0,
......
1611 1609
    page = Page.objects.create(
1612 1610
        title='xxx', slug='foo', template_name='standard', sub_slug='(?P<card_model_1_id>[a-z0-9]+)'
1613 1611
    )
1614
    cell = WcsCardInfosCell.objects.create(
1612
    cell = WcsCardCell.objects.create(
1615 1613
        page=page, placeholder='content', order=0, carddef_reference='default:card_model_1'
1616 1614
    )
1617 1615

  
......
1746 1744
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
1747 1745
def test_card_cell_card_mode_render_identifier_from_related(mock_send, nocache, app):
1748 1746
    page = Page.objects.create(title='xxx', slug='foo', template_name='standard')
1749
    cell = WcsCardInfosCell.objects.create(
1747
    cell = WcsCardCell.objects.create(
1750 1748
        page=page,
1751 1749
        placeholder='content',
1752 1750
        order=0,
......
1755 1753
        carddef_reference='default:card_a',
1756 1754
        card_ids='1',
1757 1755
    )
1758
    cell2 = WcsCardInfosCell.objects.create(
1756
    cell2 = WcsCardCell.objects.create(
1759 1757
        page=page, placeholder='content', order=1, slug='slugb', carddef_reference='default:card_b'
1760 1758
    )
1761 1759

  
......
1819 1817
    failing(urls=[])
1820 1818

  
1821 1819
    # another cell with the same slug
1822
    cell3 = WcsCardInfosCell.objects.create(page=page, placeholder='content', order=2, slug='sluga')
1820
    cell3 = WcsCardCell.objects.create(page=page, placeholder='content', order=2, slug='sluga')
1823 1821
    cell2.related_card_path = 'sluga/foo'
1824 1822
    cell2.save()
1825 1823
    failing(urls=[])
......
1850 1848
    cell.related_path = ''
1851 1849
    cell.save()
1852 1850

  
1853
    # another cell as the same slug, but not a WcsCardInfosCell
1851
    # another cell as the same slug, but not a WcsCardCell
1854 1852
    cell3 = TextCell.objects.create(page=page, placeholder='content', order=2, slug='sluga')
1855 1853

  
1856 1854
    # direct and single relation (item)
......
2285 2283
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
2286 2284
def test_card_cell_only_for_user(mock_send, context, carddef_reference):
2287 2285
    page = Page.objects.create(title='xxx', template_name='standard')
2288
    cell = WcsCardInfosCell.objects.create(
2286
    cell = WcsCardCell.objects.create(
2289 2287
        page=page,
2290 2288
        placeholder='content',
2291 2289
        order=0,
......
2332 2330
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
2333 2331
def test_card_cell_render_user(mock_send, context, nocache, carddef_reference):
2334 2332
    page = Page.objects.create(title='xxx', template_name='standard')
2335
    cell = WcsCardInfosCell.objects.create(
2333
    cell = WcsCardCell.objects.create(
2336 2334
        page=page,
2337 2335
        placeholder='content',
2338 2336
        order=0,
......
2392 2390
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
2393 2391
def test_cell_condition(mock_send, nocache, app):
2394 2392
    page = Page.objects.create(title='xxx', slug='foo', template_name='standard')
2395
    cell = WcsCardInfosCell.objects.create(
2393
    cell = WcsCardCell.objects.create(
2396 2394
        page=page,
2397 2395
        placeholder='content',
2398 2396
        order=0,
......
2453 2451
def test_card_file_redirection(mock_send, app):
2454 2452
    page = Page(title='One', slug='one', template_name='standard')
2455 2453
    page.save()
2456
    cell = WcsCardInfosCell(page=page, placeholder='content', order=0)
2454
    cell = WcsCardCell(page=page, placeholder='content', order=0)
2457 2455
    cell.carddef_reference = 'default:card_model_1'
2458 2456
    cell.card_ids = '11'
2459 2457
    cell.save()
......
2476 2474
@mock.patch('requests.Session.send', side_effect=mocked_requests_send)
2477 2475
def test_card_cell_assets(mock_send, settings, app, admin_user):
2478 2476
    page = Page.objects.create(title='xxx', slug='test_cell_assets', template_name='standard')
2479
    cell1 = WcsCardInfosCell.objects.create(
2477
    cell1 = WcsCardCell.objects.create(
2480 2478
        page=page,
2481 2479
        placeholder='content',
2482 2480
        order=0,
......
2484 2482
        display_mode='card',
2485 2483
        slug='slug1',
2486 2484
    )
2487
    cell2 = WcsCardInfosCell.objects.create(
2485
    cell2 = WcsCardCell.objects.create(
2488 2486
        page=page,
2489 2487
        placeholder='content',
2490 2488
        order=0,
2491
-