from philo.admin.base import COLLAPSE_CLASSES, TreeEntityAdmin
from philo.admin.forms.containers import *
from philo.admin.nodes import ViewAdmin
+from philo.admin.widgets import EmbedWidget
+from philo.models.fields import TemplateField
from philo.models.pages import Page, Template, Contentlet, ContentReference
-class ContentletInline(admin.StackedInline):
- model = Contentlet
+class ContainerInline(admin.StackedInline):
extra = 0
max_num = 0
- formset = ContentletInlineFormSet
- form = ContentletForm
can_delete = False
classes = ('collapse-open', 'collapse','open')
+ formfield_overrides = {
+ TemplateField: {'widget': EmbedWidget}
+ }
if 'grappelli' in settings.INSTALLED_APPS:
template = 'admin/philo/edit_inline/grappelli_tabular_container.html'
else:
template = 'admin/philo/edit_inline/tabular_container.html'
-class ContentReferenceInline(admin.StackedInline):
+class ContentletInline(ContainerInline):
+ model = Contentlet
+ formset = ContentletInlineFormSet
+ form = ContentletForm
+
+
+class ContentReferenceInline(ContainerInline):
model = ContentReference
- extra = 0
- max_num = 0
formset = ContentReferenceInlineFormSet
form = ContentReferenceForm
- can_delete = False
- classes = ('collapse-open', 'collapse','open')
- if 'grappelli' in settings.INSTALLED_APPS:
- template = 'admin/philo/edit_inline/grappelli_tabular_container.html'
- else:
- template = 'admin/philo/edit_inline/tabular_container.html'
class PageAdmin(ViewAdmin):
'fields': ('mimetype',)
}),
)
+ formfield_overrides = {
+ TemplateField: {'widget': EmbedWidget}
+ }
save_on_top = True
save_as = True
list_display = ('__unicode__', 'slug', 'get_path',)
from django import forms
from django.conf import settings
from django.contrib.admin.widgets import FilteredSelectMultiple, url_params_from_lookup_dict
+from django.utils import simplejson as json
from django.utils.html import escape
from django.utils.safestring import mark_safe
from django.utils.text import truncate_words
# API to determine the ID dynamically.
output.append(u'SelectFilter.init("id_%s", "%s", %s, "%s"); tagCreation.init("id_%s"); });</script>\n' % \
(name, self.verbose_name.replace('"', '\\"'), int(self.is_stacked), settings.ADMIN_MEDIA_PREFIX, name))
- return mark_safe(u''.join(output))
\ No newline at end of file
+ return mark_safe(u''.join(output))
+
+
+class EmbedWidget(forms.Textarea):
+ """A form widget with the HTML class embedding and an embedded list of content-types."""
+ def __init__(self, attrs=None):
+ from philo.models import value_content_type_limiter
+
+ content_types = value_content_type_limiter.classes
+ data = []
+
+ for content_type in content_types:
+ data.append({'app_label': content_type._meta.app_label, 'object_name': content_type._meta.object_name.lower(), 'verbose_name': unicode(content_type._meta.verbose_name)})
+
+ json_ = json.dumps(data)
+
+ default_attrs = {'class': 'embedding vLargeTextField', 'data-content-types': json_ }
+
+ if attrs:
+ default_attrs.update(attrs)
+
+ super(EmbedWidget, self).__init__(default_attrs)
+
+ class Media:
+ css = {
+ 'all': ('philo/css/EmbedWidget.css',),
+ }
+ js = ('philo/js/EmbedWidget.js',)
\ No newline at end of file
from django.http import HttpResponseRedirect, QueryDict
from philo.admin import EntityAdmin, AddTagAdmin, COLLAPSE_CLASSES
+from philo.admin.widgets import EmbedWidget
from philo.contrib.penfield.models import BlogEntry, Blog, BlogView, Newsletter, NewsletterArticle, NewsletterIssue, NewsletterView
+from philo.models.fields import TemplateField
class DelayedDateForm(forms.ModelForm):
)
related_lookup_fields = {'fk': raw_id_fields}
prepopulated_fields = {'slug': ('title',)}
+ formfield_overrides = {
+ TemplateField: {'widget': EmbedWidget}
+ }
class BlogViewAdmin(EntityAdmin):
)
actions = ['make_issue']
prepopulated_fields = {'slug': ('title',)}
+ formfield_overrides = {
+ TemplateField: {'widget': EmbedWidget}
+ }
def author_names(self, obj):
return ', '.join([author.get_full_name() for author in obj.authors.all()])
date = models.DateTimeField(default=None)
#: The content of the :class:`BlogEntry`.
- content = models.TextField()
+ content = TemplateField()
#: An optional brief excerpt from the :class:`BlogEntry`.
- excerpt = models.TextField(blank=True, null=True)
+ excerpt = TemplateField(blank=True, null=True)
#: :class:`.Tag`\ s for this :class:`BlogEntry`.
tags = models.ManyToManyField(Tag, related_name='blogentries', blank=True, null=True)
+++ /dev/null
-from django.forms.widgets import Textarea
-from django.utils import simplejson as json
-
-__all__ = ('EmbedWidget',)
-
-class EmbedWidget(Textarea):
- """A form widget with the HTML class embedding and an embedded list of content-types."""
- def __init__(self, attrs=None):
- from philo.models import value_content_type_limiter
-
- content_types = value_content_type_limiter.classes
- data = []
-
- for content_type in content_types:
- data.append({'app_label': content_type._meta.app_label, 'object_name': content_type._meta.object_name.lower(), 'verbose_name': unicode(content_type._meta.verbose_name)})
-
- json_ = json.dumps(data)
-
- default_attrs = {'class': 'embedding vLargeTextField', 'data-content-types': json_ }
-
- if attrs:
- default_attrs.update(attrs)
-
- super(EmbedWidget, self).__init__(default_attrs)
-
- class Media:
- css = {
- 'all': ('philo/css/EmbedWidget.css',),
- }
- js = ('philo/js/EmbedWidget.js',)
\ No newline at end of file
from philo.forms.fields import JSONFormField
from philo.utils.registry import RegistryIterator
from philo.validators import TemplateValidator, json_validator
-from philo.forms.widgets import EmbedWidget
#from philo.models.fields.entities import *
-class TemplateField(models.Field):
+class TemplateField(models.TextField):
"""A :class:`TextField` which is validated with a :class:`.TemplateValidator`. ``allow``, ``disallow``, and ``secure`` will be passed into the validator's construction."""
def __init__(self, allow=None, disallow=None, secure=True, *args, **kwargs):
super(TemplateField, self).__init__(*args, **kwargs)
self.validators.append(TemplateValidator(allow, disallow, secure))
-
- def formfield(self, **kwargs):
- defaults = {'widget': EmbedWidget}
- defaults.update(kwargs)
- return super(TemplateField, self).formfield(**defaults)
class JSONDescriptor(object):