assets: add dynamic asset slots to category and form cells (#24770)

This commit is contained in:
Frédéric Péters 2018-06-25 20:23:59 +02:00
parent c9b7df83bb
commit 70c5da0d23
5 changed files with 67 additions and 5 deletions

View File

@ -27,6 +27,8 @@ from django.views.generic import TemplateView, ListView, FormView
import ckeditor
from sorl.thumbnail.shortcuts import get_thumbnail
from combo.data.models import CellBase
from .forms import AssetUploadForm
from .models import Asset
@ -63,9 +65,9 @@ class CkEditorAsset(object):
class SlotAsset(object):
def __init__(self, key=None, asset=None):
def __init__(self, key=None, name=None, asset=None):
self.key = key
self.name = settings.COMBO_ASSET_SLOTS[key]['label']
self.name = name
self.asset = asset
def is_image(self):
@ -84,9 +86,13 @@ class SlotAsset(object):
@classmethod
def get_assets(cls):
assets = dict([(x.key, x) for x in Asset.objects.all() if x.key in settings.COMBO_ASSET_SLOTS])
for key, value in settings.COMBO_ASSET_SLOTS.items():
yield cls(key, asset=assets.get(key))
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)):
uniq_slots.update(cell.get_asset_slots())
for key, value in uniq_slots.items():
yield cls(key, name=value.get('label'), asset=assets.get(key))
class Assets(ListView):

View File

@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
#
# combo - content management system
# Copyright (C) 2014-2015 Entr'ouvert
#
@ -18,6 +20,7 @@ import copy
import logging
from django import template
from django.conf import settings
from django.db import models
from django.forms import models as model_forms
from django.forms import Select
@ -98,6 +101,15 @@ class WcsFormCell(CellBase):
'text': text,
}]
def get_asset_slots(self):
slots = {}
for slot_template_key, slot_template_data in settings.WCS_FORM_ASSET_SLOTS.items():
slots['wcs:form:%s:%s' % (slot_template_key, self.formdef_reference)] = {
'label': u'%(prefix)s%(label)s' % {
'prefix': slot_template_data['prefix'],
'label': self.cached_title}}
return slots
class WcsCommonCategoryCell(CellBase):
is_enabled = classmethod(is_wcs_enabled)
@ -128,6 +140,15 @@ class WcsCommonCategoryCell(CellBase):
return
return self.cached_title
def get_asset_slots(self):
slots = {}
for slot_template_key, slot_template_data in settings.WCS_CATEGORY_ASSET_SLOTS.items():
slots['wcs:category:%s:%s' % (slot_template_key, self.category_reference)] = {
'label': u'%(prefix)s%(label)s' % {
'prefix': slot_template_data['prefix'],
'label': self.cached_title}}
return slots
@register_cell_class
class WcsCategoryCell(WcsCommonCategoryCell):

View File

@ -437,6 +437,9 @@ class CellBase(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...')

View File

@ -307,6 +307,11 @@ COMBO_DEFAULT_NOTIFICATION_DURATION = 3
# example: {'banner': {'label': 'Banner image'}}
COMBO_ASSET_SLOTS = {}
# dynamic slots created for wcs category/form cells
# example: {'picture': {'prefix': 'Picture'}}
WCS_CATEGORY_ASSET_SLOTS = {}
WCS_FORM_ASSET_SLOTS = {}
# hide work-in-progress/experimental/whatever cells for now
BOOKING_CALENDAR_CELL_ENABLED = False
NEWSLETTERS_CELL_ENABLED = False

View File

@ -1,3 +1,5 @@
# -*- coding: utf-8 -*-
import pytest
import json
@ -12,6 +14,7 @@ import os
from django.conf import settings
from django.core.cache import cache
from django.test import override_settings
from django.test.client import RequestFactory
from combo.data.models import Page
@ -615,3 +618,27 @@ def test_tracking_code_cell(app):
resp.form['cell'] = 'xxxx'
resp.form['code'] = 'CNPHNTFB'
resp = resp.form.submit(status=400)
@wcsctl_present
def test_cell_assets(app, admin_user):
page = Page(title='xxx', slug='test_cell_assets', template_name='standard')
page.save()
cell = WcsFormCell(page=page, placeholder='content', order=0)
cell.formdef_reference = u'default:form-title'
cell.save()
cell = WcsFormsOfCategoryCell(page=page, placeholder='content', order=0)
cell.category_reference = 'default:test-9'
cell.ordering = 'alpha'
cell.save()
app = login(app)
resp = app.get('/manage/assets/')
assert 'have any asset yet.' in resp.content
with override_settings(
WCS_CATEGORY_ASSET_SLOTS={'logo': {'prefix': 'Logo'}},
WCS_FORM_ASSET_SLOTS={'picture': {'prefix': 'Picture'}}):
resp = app.get('/manage/assets/')
assert '>Logo — Test 9<' in resp.content
assert '>Picture — form title<' in resp.content