From 5d6d0a86fc5377da135830d3bca3181e43904575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laur=C3=A9line=20Gu=C3=A9rin?= Date: Tue, 10 Mar 2020 09:52:41 +0100 Subject: [PATCH] assets: add generic assets for cells (#40223) --- combo/apps/assets/templatetags/assets.py | 17 ++++- combo/apps/assets/views.py | 6 +- combo/data/models.py | 63 +++++++++++++++++-- combo/manager/views.py | 2 +- .../combo/asset_picture_fragment.html | 7 +++ combo/public/templates/combo/feed-cell.html | 1 + combo/public/templates/combo/json-cell.html | 1 + .../templates/combo/json-list-cell.html | 1 + combo/public/templates/combo/link-cell.html | 1 + .../templates/combo/link-list-cell.html | 1 + combo/public/templates/combo/text-cell.html | 1 + combo/public/views.py | 6 +- combo/settings.py | 13 ++++ tests/test_cells.py | 62 ++++++++++++++++++ tests/test_manager.py | 3 +- tests/test_public_templatetags.py | 29 ++++++++- 16 files changed, 203 insertions(+), 11 deletions(-) create mode 100644 combo/public/templates/combo/asset_picture_fragment.html diff --git a/combo/apps/assets/templatetags/assets.py b/combo/apps/assets/templatetags/assets.py index 5d7d5691..232d9767 100644 --- a/combo/apps/assets/templatetags/assets.py +++ b/combo/apps/assets/templatetags/assets.py @@ -62,6 +62,7 @@ def asset_url(*args, **kwargs): return get_thumbnail(asset, geometry_string, **kwargs).url + @register.simple_tag def asset_css_url(*args, **kwargs): url = asset_url(*args, **kwargs) @@ -72,7 +73,21 @@ def asset_css_url(*args, **kwargs): @register.simple_tag -def get_asset(key): +def get_asset(*args, **kwargs): + key = None + if 'cell' in kwargs and 'type' in kwargs: + try: + if not kwargs['cell'].can_have_assets(): + return None + key = kwargs['cell'].get_asset_slot_key(kwargs['type']) + except AttributeError: + return None + elif len(args) == 1: + key = args[0] + + if not key: + return None + try: return Asset.objects.get(key=key) except Asset.DoesNotExist: diff --git a/combo/apps/assets/views.py b/combo/apps/assets/views.py index 8b875dd7..f9005b5e 100644 --- a/combo/apps/assets/views.py +++ b/combo/apps/assets/views.py @@ -103,8 +103,10 @@ class SlotAsset(object): assets = dict([(x.key, x) for x in Asset.objects.all()]) uniq_slots = {} uniq_slots.update(settings.COMBO_ASSET_SLOTS) - for cell in CellBase.get_cells( - cell_filter=lambda x: bool(x.get_asset_slots)): + cells = CellBase.get_cells(select_related={ + '__all__': ['page'], + 'data_linkcell': ['link_page']}) + for cell in cells: uniq_slots.update(cell.get_asset_slots()) for key, value in uniq_slots.items(): yield cls(key, diff --git a/combo/data/models.py b/combo/data/models.py index 74223a58..2b0158bc 100644 --- a/combo/data/models.py +++ b/combo/data/models.py @@ -577,9 +577,6 @@ class CellBase(six.with_metaclass(CellMeta, models.Model)): # get_badge(self, context); set to None so cell types can be skipped easily get_badge = None - # get_asset_slots(self); set to None so cell types can be skipped easily - get_asset_slots = None - # message displayed when the cell is loaded asynchronously loading_message = _('Loading...') @@ -623,6 +620,50 @@ class CellBase(six.with_metaclass(CellMeta, models.Model)): def css_class_names(self): return ' '.join([self.class_name, self.legacy_class_name, self.extra_css_class]) + def can_have_assets(self): + return self.get_slug_for_asset() and self.get_asset_slot_templates() + + def get_slug_for_asset(self): + return self.slug + + def get_label_for_asset(self): + return _(u'%(cell_label)s on page %(page_name)s (%(page_slug)s)') % { + 'cell_label': str(self), + 'page_name': str(self.page), + 'page_slug': self.page.slug, + } + + def get_asset_slot_key(self, key): + return 'cell:%s:%s:%s' % ( + self.get_cell_type_str(), + key, + self.get_slug_for_asset()) + + def get_asset_slot_templates(self): + return settings.COMBO_CELL_ASSET_SLOTS.get(self.get_cell_type_str()) or {} + + def get_asset_slots(self): + if not self.can_have_assets(): + return {} + + slot_templates = self.get_asset_slot_templates() + slots = {} + for slot_template_key, slot_template_data in slot_templates.items(): + suffix = '' + if slot_template_data.get('suffix'): + suffix = ' (%s)' % slot_template_data['suffix'] + slot_key = self.get_asset_slot_key(slot_template_key) + label = u'%(prefix)s — %(label)s%(suffix)s' % { + 'prefix': slot_template_data['prefix'], + 'label': self.get_label_for_asset(), + 'suffix': suffix + } + slots[slot_key] = { + 'label': label + } + slots[slot_key].update(slot_template_data) + return slots + @classmethod def get_cell_classes(cls, class_filter=lambda x: True): for klass in get_cell_classes(): @@ -673,7 +714,9 @@ class CellBase(six.with_metaclass(CellMeta, models.Model)): continue cells_queryset = klass.objects.filter(**kwargs) if select_related: - cells_queryset = cells_queryset.select_related(*select_related) + cells_queryset = cells_queryset.select_related( + *select_related.get('__all__', []), + *select_related.get(klass.get_cell_type_str(), [])) cells.extend(cells_queryset) if prefetch_validity_info: validity_info_list = list(ValidityInfo.objects.select_related('content_type')) @@ -1059,6 +1102,18 @@ class LinkCell(CellBase): return None return utils.ellipsize(title) + def get_slug_for_asset(self): + if self.placeholder and self.placeholder.startswith('_'): + return + if self.link_page: + return self.link_page.slug + return self.slug + + def get_label_for_asset(self): + if self.link_page: + return str(self) + return super().get_label_for_asset() + def get_url(self, context=None): context = context or {} if self.link_page: diff --git a/combo/manager/views.py b/combo/manager/views.py index 3f81481f..e23aceaf 100644 --- a/combo/manager/views.py +++ b/combo/manager/views.py @@ -95,7 +95,7 @@ site_import = SiteImportView.as_view() def invalid_cell_report(request): invalid_cells = CellBase.get_cells( - select_related=['page'], + select_related={'__all__': ['page']}, page__snapshot__isnull=True, validity_info__invalid_since__isnull=False) invalid_cells = [c for c in invalid_cells if c.placeholder and not c.placeholder.startswith('_')] diff --git a/combo/public/templates/combo/asset_picture_fragment.html b/combo/public/templates/combo/asset_picture_fragment.html new file mode 100644 index 00000000..95930bd3 --- /dev/null +++ b/combo/public/templates/combo/asset_picture_fragment.html @@ -0,0 +1,7 @@ +{% load assets %} +{% get_asset cell=cell type='picture' as asset %} +{% if asset %} + + + +{% endif %} diff --git a/combo/public/templates/combo/feed-cell.html b/combo/public/templates/combo/feed-cell.html index 2a1724b9..1400718d 100644 --- a/combo/public/templates/combo/feed-cell.html +++ b/combo/public/templates/combo/feed-cell.html @@ -3,6 +3,7 @@ {% if cell.title %}

{{ cell.title }}

{% endif %} +{% include "combo/asset_picture_fragment.html" %}
{% for entry in feed.entries %} {% if entry.link %} diff --git a/combo/public/templates/combo/json-cell.html b/combo/public/templates/combo/json-cell.html index f72574fc..c1082a4e 100644 --- a/combo/public/templates/combo/json-cell.html +++ b/combo/public/templates/combo/json-cell.html @@ -1,5 +1,6 @@ {% block cell-content %} {% if title %}

{{title}}

{% endif %} +{% include "combo/asset_picture_fragment.html" %} diff --git a/combo/public/templates/combo/json-list-cell.html b/combo/public/templates/combo/json-list-cell.html index a2890ff5..b24ae536 100644 --- a/combo/public/templates/combo/json-list-cell.html +++ b/combo/public/templates/combo/json-list-cell.html @@ -1,6 +1,7 @@ {% block cell-content %}