X-Git-Url: http://git.ithinksw.org/philo.git/blobdiff_plain/7902f12cf4e054ee4dae904687ac97d5e2f7360a..61b73fe068172f02d6c47e2b5387161919ec9618:/philo/models/fields/__init__.py diff --git a/philo/models/fields/__init__.py b/philo/models/fields/__init__.py index 0003575..7ab4326 100644 --- a/philo/models/fields/__init__.py +++ b/philo/models/fields/__init__.py @@ -7,21 +7,16 @@ from django.utils.text import capfirst 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): @@ -77,7 +72,7 @@ class JSONField(models.TextField): class SlugMultipleChoiceField(models.Field): - """Stores a selection of multiple items with unique slugs in the form of a comma-separated list.""" + """Stores a selection of multiple items with unique slugs in the form of a comma-separated list. Also knows how to correctly handle :class:`RegistryIterator`\ s passed in as choices.""" __metaclass__ = models.SubfieldBase description = _("Comma-separated slug field") @@ -133,6 +128,16 @@ class SlugMultipleChoiceField(models.Field): if invalid_values: # should really make a custom message. raise ValidationError(self.error_messages['invalid_choice'] % invalid_values) + + def _get_choices(self): + if isinstance(self._choices, RegistryIterator): + return self._choices.copy() + elif hasattr(self._choices, 'next'): + choices, self._choices = itertools.tee(self._choices) + return choices + else: + return self._choices + choices = property(_get_choices) try: