From: Stephen Burrows Date: Fri, 15 Jul 2011 19:08:23 +0000 (-0400) Subject: Reverted TemplateField parent to models.TextField and moved EmbedWidget into philo... X-Git-Tag: philo-0.9.1^2~3^2~5 X-Git-Url: http://git.ithinksw.org/philo.git/commitdiff_plain/a6694613ce70707661b795a121ef126b11c1777a Reverted TemplateField parent to models.TextField and moved EmbedWidget into philo.admin.widgets. Added EmbedWidget use on the appropriate ModelAdmins. Cleaned up ContentletAdmin and ContentReferenceAdmin. --- diff --git a/philo/admin/pages.py b/philo/admin/pages.py index 3e8f0f1..96951c9 100644 --- a/philo/admin/pages.py +++ b/philo/admin/pages.py @@ -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',) diff --git a/philo/admin/widgets.py b/philo/admin/widgets.py index c753850..7fda164 100644 --- a/philo/admin/widgets.py +++ b/philo/admin/widgets.py @@ -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"); });\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 diff --git a/philo/contrib/penfield/admin.py b/philo/contrib/penfield/admin.py index d350303..4cfa1a6 100644 --- a/philo/contrib/penfield/admin.py +++ b/philo/contrib/penfield/admin.py @@ -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()]) diff --git a/philo/contrib/penfield/models.py b/philo/contrib/penfield/models.py index b22dfa1..6eef5df 100644 --- a/philo/contrib/penfield/models.py +++ b/philo/contrib/penfield/models.py @@ -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 index d223605..0000000 --- a/philo/forms/widgets.py +++ /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 diff --git a/philo/models/fields/__init__.py b/philo/models/fields/__init__.py index 575b3a4..7ab4326 100644 --- a/philo/models/fields/__init__.py +++ b/philo/models/fields/__init__.py @@ -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):