add support for cmsplugin_blurps

This commit is contained in:
Frédéric Péters 2014-12-13 11:25:53 +01:00
parent ae499226fd
commit 259b65fefc
11 changed files with 98 additions and 17 deletions

View File

@ -16,12 +16,18 @@
import inspect
from django.conf import settings
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.forms import models as model_forms
from django.template import Context
from django.utils.html import strip_tags
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _
from ckeditor.fields import RichTextField
from model_utils.managers import InheritanceManager
import cmsplugin_blurp.utils
class Page(models.Model):
@ -37,6 +43,8 @@ class CellBase(models.Model):
objects = InheritanceManager()
default_form_class = None
@classmethod
def get_verbose_name(cls):
return cls._meta.verbose_name
@ -46,12 +54,33 @@ class CellBase(models.Model):
content_types = []
for symbol in globals().values():
if inspect.isclass(symbol) and issubclass(symbol, cls) and symbol is not cls:
content_types.append({
'name': symbol.get_verbose_name(),
'content_type': ContentType.objects.get_for_model(symbol),
})
content_types.extend(symbol.get_content_types())
return content_types
@classmethod
def get_content_types(cls):
return [{
'name': cls.get_verbose_name(),
'content_type': ContentType.objects.get_for_model(cls),
'variant': 'default',
}]
def set_variant(self, variant):
pass
def get_label(self):
return self.get_verbose_name()
def get_default_form_class(self):
if self.default_form_class:
return self.default_form_class
fields = [x.name for x in self._meta.local_concrete_fields if x.name != 'cellbase_ptr']
if not fields:
return None
return model_forms.modelform_factory(self.__class__, fields=fields)
class TextCell(CellBase):
text = RichTextField(_('Text'), null=True)
@ -59,8 +88,7 @@ class TextCell(CellBase):
class Meta:
verbose_name = _('Text')
def render(self):
from django.utils.safestring import mark_safe
def render(self, context):
return mark_safe(self.text or '')
@ -68,6 +96,42 @@ class FortuneCell(CellBase):
class Meta:
verbose_name = _('Fortune')
def render(self):
def render(self, context):
import subprocess
return subprocess.check_output(['fortune'])
class BlurpCell(CellBase):
blurp_key = models.CharField(max_length=50)
@classmethod
def get_content_types(cls):
try:
blurp_renderers = settings.CMS_PLUGIN_BLURP_RENDERERS
except AttributeError:
return []
l = []
base_content_type = ContentType.objects.get_for_model(cls)
for blurp_key, blurp_value in blurp_renderers.items():
l.append({
'name': blurp_value.get('name'),
'content_type': base_content_type,
'variant': blurp_key,
})
l.sort(lambda x, y: cmp(x.get('name'), y.get('name')))
return l
def get_label(self):
return settings.CMS_PLUGIN_BLURP_RENDERERS[self.blurp_key]['name']
def set_variant(self, variant):
self.blurp_key = variant
def render(self, context):
renderer = cmsplugin_blurp.utils.resolve_renderer(self.blurp_key)
template = renderer.render_template()
context = renderer.render(context)
return template.render(context)
def get_default_form_class(self):
return None

View File

@ -22,7 +22,7 @@
<span>{{ cell_type.name }}</span>
<ul>
{% for placeholder in placeholders %}
<li><button data-add-url="{% url 'combo-manager-page-add-cell' page_pk=object.id cell_type=cell_type.content_type.id ph_key=placeholder.key %}">→ {{ placeholder.name }}</button></li>
<li><button data-add-url="{% url 'combo-manager-page-add-cell' page_pk=object.id cell_type=cell_type.content_type.id variant=cell_type.variant ph_key=placeholder.key %}">→ {{ placeholder.name }}</button></li>
{% endfor %}
</ul>
</label></li>
@ -39,7 +39,7 @@
<div class="cell-list">
{% for cell in placeholder.cells %}
<div class="cell" data-cell-id="{{ cell.id }}">
<h3>{{ cell.get_verbose_name }}</h3>
<h3>{{ cell.get_label }}</h3>
<div>{% cell_form cell %}</div>
</div>
{% endfor %}

View File

@ -17,7 +17,6 @@
from django import template
from django.core.context_processors import csrf
from django.core.urlresolvers import reverse
from django.forms import models as model_forms
register = template.Library()
@ -25,9 +24,8 @@ register = template.Library()
def cell_form(context, cell):
context['url'] = reverse('combo-manager-page-edit-cell', kwargs={
'page_pk': cell.page.id, 'cell_pk': cell.id})
fields = [x.name for x in cell._meta.local_concrete_fields if x.name != 'cellbase_ptr']
if fields:
form_class = model_forms.modelform_factory(cell.__class__, fields=fields)
form_class = cell.get_default_form_class()
if form_class:
context['form'] = form_class(instance=cell, prefix='c%s' % cell.id)
else:
context['form'] = None

View File

@ -27,7 +27,8 @@ urlpatterns = patterns('combo.views',
name='combo-manager-page-view'),
url(r'^pages/(?P<pk>\w+)/edit$', views.page_edit,
name='combo-manager-page-edit'),
url(r'^pages/(?P<page_pk>\w+)/add-cell-to-(?P<ph_key>\w+)/(?P<cell_type>\w+)/$', views.page_add_cell,
url(r'^pages/(?P<page_pk>\w+)/add-cell-to-(?P<ph_key>\w+)/(?P<cell_type>\w+)/(?P<variant>[\w-]+)/$',
views.page_add_cell,
name='combo-manager-page-add-cell'),
url(r'^pages/(?P<page_pk>\w+)/cell/(?P<cell_pk>\w+)/$', views.page_edit_cell,
name='combo-manager-page-edit-cell'),

View File

@ -88,9 +88,10 @@ page_view = requires_csrf_token(PageView.as_view())
class PageAddCellView(RedirectView):
def get_redirect_url(self, page_pk, cell_type, ph_key):
def get_redirect_url(self, page_pk, cell_type, variant, ph_key):
cell_class = ContentType.objects.get(id=cell_type).model_class()
cell = cell_class(page_id=page_pk, placeholder=ph_key)
cell.set_variant(variant)
orders = [x.order for x in CellBase.objects.filter(page_id=page_pk)]
if orders:
cell.order = max(orders)+1

View File

@ -1,3 +1,4 @@
{% load combo %}
{% for cell in cells %}
<div>{{ cell.render }}</div>
<div>{% render_cell cell %}</div>
{% endfor %}

View File

@ -23,3 +23,7 @@ def placeholder(context, placeholder_name):
context['cells'] = [x for x in context['page_cells'] if
x.placeholder == placeholder_name]
return context
@register.simple_tag(takes_context=True)
def render_cell(context, cell):
return cell.render(context)

View File

@ -27,7 +27,8 @@ def page(request):
ctx = {
'page': page,
'page_cells': CellBase.objects.filter(page_id=page.id
).order_by('order').select_subclasses()
).order_by('order').select_subclasses(),
'request': request,
}
template_name = settings.COMBO_PUBLIC_TEMPLATES[page.template_name]['template']
return render(request, template_name, ctx)

View File

@ -37,7 +37,9 @@ INSTALLED_APPS = (
'django.contrib.messages',
'django.contrib.staticfiles',
'ckeditor',
'sekizai',
'gadjo',
'cmsplugin_blurp',
'combo.data',
'combo.manager',
'combo.public',
@ -57,6 +59,8 @@ from django.conf import global_settings
STATICFILES_FINDERS = global_settings.STATICFILES_FINDERS + \
('gadjo.finders.XStaticFinder',)
TEMPLATE_CONTEXT_PROCESSORS = global_settings.TEMPLATE_CONTEXT_PROCESSORS + \
('sekizai.context_processors.sekizai',)
ROOT_URLCONF = 'combo.urls'
@ -105,3 +109,8 @@ COMBO_PUBLIC_TEMPLATES = {
}
}
}
try:
from local_settings import *
except ImportError:
pass

View File

@ -2,3 +2,4 @@ Django==1.6
django-ckeditor
-e git+http://repos.entrouvert.org/gadjo.git/#egg=gadjo
django-model-utils
django-cmsplugin-blurp

View File

@ -61,6 +61,7 @@ setup(
'django-ckeditor',
'gadjo',
'django-model-utils',
'django-cmsplugin-blurp',
],
zip_safe=False,
)