Skip to content

Instantly share code, notes, and snippets.

@franckbret
Created October 27, 2010 17:01
Show Gist options
  • Save franckbret/649455 to your computer and use it in GitHub Desktop.
Save franckbret/649455 to your computer and use it in GitHub Desktop.
Trying to find a way for using placeholder in place of content entry, add ZINNIA_WYSIWYG = 'placeholder' to your settings to see it in action
diff --git a/zinnia/admin/entry.py b/zinnia/admin/entry.py
index 858ac76..435d713 100644
--- a/zinnia/admin/entry.py
+++ b/zinnia/admin/entry.py
@@ -12,6 +12,7 @@ from django.utils.translation import ugettext_lazy as _
from django.core.urlresolvers import reverse, NoReverseMatch
from tagging.models import Tag
+from cms.admin.placeholderadmin import PlaceholderAdmin
from zinnia import settings
from zinnia.managers import HIDDEN
@@ -20,12 +21,13 @@ from zinnia.ping import DirectoryPinger
from zinnia.admin.forms import EntryAdminForm
-class EntryAdmin(admin.ModelAdmin):
+class EntryAdmin(PlaceholderAdmin):
"""Admin for Entry model"""
form = EntryAdminForm
date_hierarchy = 'creation_date'
- fieldsets = ((_('Content'), {'fields': ('title', 'content',
- 'image', 'status')}),
+ fieldsets = ((_('Content'), {'fields': ('title', 'image', 'status', 'content')}),
+ (None, {'fields': ('placeholder',),
+ 'classes': ('plugin-holder', 'plugin-holder-nopage')}),
(_('Options'), {'fields': ('excerpt', 'template', 'related',
'authors', 'creation_date',
'start_publication',
@@ -141,19 +143,36 @@ class EntryAdmin(admin.ModelAdmin):
{'url': short_url}
get_short_url.allow_tags = True
get_short_url.short_description = _('short url')
+
+ def get_placeholder_content(self, entry):
+ """Use render_placeholder to parse placeholder content and give the
+ result to entry content field"""
+ content = render_placeholder(entry.placeholder, context)
# Custom Methods
def save_model(self, request, entry, form, change):
- """Save the authors, update time, make an excerpt"""
+ """Save the authors, update time, make an excerpt.
+ If ZINNIA_WYSIWYG = 'placeholders' render placeholder to content."""
+
+ if settings.WYSIWYG == 'placeholder' :
+ try:
+ from cms.plugin_rendering import render_placeholder
+ except ImportError:
+ raise ImproperlyConfigured, "Could not load cms.plugin_rendering"
+
+ context = {}
+ context['request'] = request
+ entry.content = render_placeholder(entry.placeholder, context)
+
if not form.cleaned_data.get('excerpt') and entry.status == PUBLISHED:
entry.excerpt = truncate_words(strip_tags(entry.content), 50)
if entry.pk and not request.user.has_perm('zinnia.can_change_author'):
form.cleaned_data['authors'] = entry.authors.all()
-
+
if not form.cleaned_data.get('authors'):
form.cleaned_data['authors'].append(request.user)
-
+
entry.last_update = datetime.now()
entry.save()
@@ -164,16 +183,16 @@ class EntryAdmin(admin.ModelAdmin):
return queryset
return request.user.entry_set.all()
- def formfield_for_manytomany(self, db_field, request, **kwargs):
- """Filters the disposable authors"""
- if db_field.name == 'authors':
- if request.user.has_perm('zinnia.can_change_author'):
- kwargs['queryset'] = User.objects.filter(is_staff=True)
- else:
- kwargs['queryset'] = User.objects.filter(pk=request.user.pk)
+# def formfield_for_manytomany(self, db_field, request, **kwargs):
+# """Filters the disposable authors"""
+# if db_field.name == 'authors':
+# if request.user.has_perm('zinnia.can_change_author'):
+# kwargs['queryset'] = User.objects.filter(is_staff=True)
+# else:
+# kwargs['queryset'] = User.objects.filter(pk=request.user.pk)
- return super(EntryAdmin, self).formfield_for_manytomany(
- db_field, request, **kwargs)
+# return super(EntryAdmin, self).formfield_for_manytomany(
+# db_field, request, **kwargs)
def get_actions(self, request):
"""Define user actions by permissions"""
@@ -250,34 +269,34 @@ class EntryAdmin(admin.ModelAdmin):
ping_directories.short_description = _('Ping Directories for ' \
'selected entries')
- def get_urls(self):
- entry_admin_urls = super(EntryAdmin, self).get_urls()
- urls = patterns('django.views.generic.simple',
- url(r'^autocomplete_tags/$', 'direct_to_template',
- {'template': 'admin/zinnia/entry/autocomplete_tags.js',
- 'mimetype': 'application/javascript'},
- name='zinnia_entry_autocomplete_tags'),
- url(r'^wymeditor/$', 'direct_to_template',
- {'template': 'admin/zinnia/entry/wymeditor.js',
- 'mimetype': 'application/javascript'},
- name='zinnia_entry_wymeditor'),)
- return urls + entry_admin_urls
-
- def _media(self):
- MEDIA_URL = settings.MEDIA_URL
- media = super(EntryAdmin, self).media + \
- Media(css={'all': ('%scss/jquery.autocomplete.css' % MEDIA_URL,)},
- js=('%sjs/jquery.js' % MEDIA_URL,
- '%sjs/jquery.bgiframe.js' % MEDIA_URL,
- '%sjs/jquery.autocomplete.js' % MEDIA_URL,
- reverse('admin:zinnia_entry_autocomplete_tags'),))
-
- if settings.WYSIWYG == 'wymeditor':
- media += Media(js=('%sjs/wymeditor/jquery.wymeditor.pack.js' % MEDIA_URL,
- reverse('admin:zinnia_entry_wymeditor')))
- elif settings.WYSIWYG == 'tinymce':
- from tinymce.widgets import TinyMCE
- media += TinyMCE().media + Media(
- js=(reverse('tinymce-js', args=('admin/zinnia/entry',)),))
- return media
- media = property(_media)
+# def get_urls(self):
+# entry_admin_urls = super(EntryAdmin, self).get_urls()
+# urls = patterns('django.views.generic.simple',
+# url(r'^autocomplete_tags/$', 'direct_to_template',
+# {'template': 'admin/zinnia/entry/autocomplete_tags.js',
+# 'mimetype': 'application/javascript'},
+# name='zinnia_entry_autocomplete_tags'),
+# url(r'^wymeditor/$', 'direct_to_template',
+# {'template': 'admin/zinnia/entry/wymeditor.js',
+# 'mimetype': 'application/javascript'},
+# name='zinnia_entry_wymeditor'),)
+# return urls + entry_admin_urls
+
+# def _media(self):
+# MEDIA_URL = settings.MEDIA_URL
+# media = super(EntryAdmin, self).media + \
+# Media(css={'all': ('%scss/jquery.autocomplete.css' % MEDIA_URL,)},
+# js=('%sjs/jquery.js' % MEDIA_URL,
+# '%sjs/jquery.bgiframe.js' % MEDIA_URL,
+# '%sjs/jquery.autocomplete.js' % MEDIA_URL,
+# reverse('admin:zinnia_entry_autocomplete_tags'),))
+
+# if settings.WYSIWYG == 'wymeditor':
+# media += Media(js=('%sjs/wymeditor/jquery.wymeditor.pack.js' % MEDIA_URL,
+# reverse('admin:zinnia_entry_wymeditor')))
+# elif settings.WYSIWYG == 'tinymce':
+# from tinymce.widgets import TinyMCE
+# media += TinyMCE().media + Media(
+# js=(reverse('tinymce-js', args=('admin/zinnia/entry',)),))
+# return media
+# media = property(_media)
diff --git a/zinnia/models.py b/zinnia/models.py
index 120c01b..3cd7f1a 100644
--- a/zinnia/models.py
+++ b/zinnia/models.py
@@ -16,6 +16,7 @@ try:
except ImportError:
MPTTModel = models.Model
from tagging.fields import TagField
+from cms.models.fields import PlaceholderField
from zinnia.settings import USE_BITLY
from zinnia.settings import UPLOAD_TO
@@ -80,7 +81,8 @@ class Entry(models.Model):
image = models.ImageField(_('image'), upload_to=UPLOAD_TO,
blank=True, help_text=_('used for illustration'))
- content = models.TextField(_('content'))
+ content = models.TextField(_('content'), blank=True)
+ placeholder = PlaceholderField('content')
excerpt = models.TextField(_('excerpt'), blank=True,
help_text=_('optional element'))
diff --git a/zinnia/settings.py b/zinnia/settings.py
index 0eb8dfa..5685e72 100644
--- a/zinnia/settings.py
+++ b/zinnia/settings.py
@@ -18,7 +18,7 @@ ADVANCED_SEARCH = getattr(settings, 'ZINNIA_ADVANCED_SEARCH', True)
WYSIWYG = getattr(settings, 'ZINNIA_WYSIWYG',
'tinymce' in settings.INSTALLED_APPS \
- and 'tinymce' or 'wymeditor')
+ and 'tinymce' or 'wymeditor' or 'placeholder')
MAIL_COMMENT = getattr(settings, 'ZINNIA_MAIL_COMMENT', True)
MAIL_COMMENT_REPLY = getattr(settings, 'ZINNIA_MAIL_COMMENT_REPLY', False)
diff --git a/zinnia/templates/zinnia/_entry_detail.html b/zinnia/templates/zinnia/_entry_detail.html
index b90028c..9f6fd7f 100644
--- a/zinnia/templates/zinnia/_entry_detail.html
+++ b/zinnia/templates/zinnia/_entry_detail.html
@@ -1,4 +1,4 @@
-{% load tagging_tags comments i18n %}
+{% load tagging_tags comments i18n placeholder_tags %}
<div class="entry-header span-16 last">
<h2 class="entry-title">
@@ -41,7 +41,8 @@
</div>
{% endif %}
<div class="entry-content">
- {{ object_content }}
+ {% comment %}{% render_placeholder object.content "640" %}{% endcomment %}
+ {{ object_content }}
</div>
</div>
diff --git a/zinnia/templatetags/zinnia_tags.py b/zinnia/templatetags/zinnia_tags.py
index 2b1752b..2558d93 100644
--- a/zinnia/templatetags/zinnia_tags.py
+++ b/zinnia/templatetags/zinnia_tags.py
@@ -23,7 +23,7 @@ from zinnia.comparison import pearson_score
register = Library()
VECTORS = VectorBuilder({'queryset': Entry.published.all(),
- 'fields': ['title', 'excerpt', 'content']})
+ 'fields': ['title', 'excerpt']})
CACHE_ENTRIES_RELATED = {}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment