add support for cmsplugin_blurps
This commit is contained in:
parent
ae499226fd
commit
259b65fefc
|
@ -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
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'),
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
{% load combo %}
|
||||
{% for cell in cells %}
|
||||
<div>{{ cell.render }}</div>
|
||||
<div>{% render_cell cell %}</div>
|
||||
{% endfor %}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue