Reverted TemplateField parent to models.TextField and moved EmbedWidget into philo...
authorStephen Burrows <stephen.r.burrows@gmail.com>
Fri, 15 Jul 2011 19:08:23 +0000 (15:08 -0400)
committerStephen Burrows <stephen.r.burrows@gmail.com>
Fri, 15 Jul 2011 19:13:59 +0000 (15:13 -0400)
philo/admin/pages.py
philo/admin/widgets.py
philo/contrib/penfield/admin.py
philo/contrib/penfield/models.py
philo/forms/widgets.py [deleted file]
philo/models/fields/__init__.py

index 3e8f0f1..96951c9 100644 (file)
@@ -5,35 +5,35 @@ from django.contrib import admin
 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):
@@ -73,6 +73,9 @@ class TemplateAdmin(TreeEntityAdmin):
                        'fields': ('mimetype',)
                }),
        )
+       formfield_overrides = {
+               TemplateField: {'widget': EmbedWidget}
+       }
        save_on_top = True
        save_as = True
        list_display = ('__unicode__', 'slug', 'get_path',)
index c753850..7fda164 100644 (file)
@@ -1,6 +1,7 @@
 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
@@ -65,4 +66,31 @@ class TagFilteredSelectMultiple(FilteredSelectMultiple):
                # 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
index d350303..4cfa1a6 100644 (file)
@@ -4,7 +4,9 @@ from django.core.urlresolvers import reverse
 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):
@@ -42,6 +44,9 @@ class BlogEntryAdmin(AddTagAdmin):
        )
        related_lookup_fields = {'fk': raw_id_fields}
        prepopulated_fields = {'slug': ('title',)}
+       formfield_overrides = {
+               TemplateField: {'widget': EmbedWidget}
+       }
 
 
 class BlogViewAdmin(EntityAdmin):
@@ -94,6 +99,9 @@ class NewsletterArticleAdmin(AddTagAdmin):
        )
        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()])
index b22dfa1..6eef5df 100644 (file)
@@ -57,10 +57,10 @@ class BlogEntry(Entity):
        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)
diff --git a/philo/forms/widgets.py b/philo/forms/widgets.py
deleted file mode 100644 (file)
index d223605..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-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
index 575b3a4..7ab4326 100644 (file)
@@ -9,20 +9,14 @@ from django.utils.translation import ugettext_lazy as _
 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):