Merge branch 'embed-widget' of git://github.com/lapilofu/philo into develop
[philo.git] / philo / models / fields / __init__.py
index efd315f..575b3a4 100644 (file)
@@ -7,15 +7,22 @@ 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.TextField):
+class TemplateField(models.Field):
        """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):
@@ -71,7 +78,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")
        
@@ -127,6 +134,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: