Added AttributeForm to elegantly handle all the fields that should be displayed in...
[philo.git] / forms.py
index bf498fa..c864f31 100644 (file)
--- a/forms.py
+++ b/forms.py
@@ -7,8 +7,7 @@ from django.forms.formsets import TOTAL_FORM_COUNT
 from django.template import loader, loader_tags, TemplateDoesNotExist, Context, Template as DjangoTemplate
 from django.utils.datastructures import SortedDict
 from philo.admin.widgets import ModelLookupWidget
-from philo.models import Entity, Template, Contentlet, ContentReference
-from philo.models.fields import RelationshipField
+from philo.models import Entity, Template, Contentlet, ContentReference, Attribute
 from philo.utils import fattr
 
 
@@ -96,35 +95,33 @@ class EntityForm(EntityFormBase): # Would inherit from ModelForm directly if it
                return instance
 
 
-def validate_template(template):
-       """
-       Makes sure that the template and all included or extended templates are valid.
-       """ 
-       for node in template.nodelist:
-               try:
-                       if isinstance(node, loader_tags.ExtendsNode):
-                               extended_template = node.get_parent(Context())
-                               validate_template(extended_template)
-                       elif isinstance(node, loader_tags.IncludeNode):
-                               included_template = loader.get_template(node.template_name.resolve(Context()))
-                               validate_template(extended_template)
-               except Exception, e:
-                       raise ValidationError("Template code invalid. Error was: %s: %s" % (e.__class__.__name__, e))
-
-
-class TemplateForm(ModelForm):
-       def clean_code(self):
-               code = self.cleaned_data['code']
-               try:
-                       t = DjangoTemplate(code)
-               except Exception, e:
-                       raise ValidationError("Template code invalid. Error was: %s: %s" % (e.__class__.__name__, e))
-
-               validate_template(t)
-               return code
-
+class AttributeForm(ModelForm):
+       def __init__(self, *args, **kwargs):
+               super(AttributeForm, self).__init__(*args, **kwargs)
+               if self.instance.value is not None:
+                       value_field = self.instance.value.value_formfield()
+                       if value_field:
+                               self.fields['value'] = value_field
+                       if hasattr(self.instance.value, 'content_type'):
+                               self.fields['content_type'] = self.instance.value._meta.get_field('content_type').formfield(initial=getattr(self.instance.value.content_type, 'pk', None))
+       
+       def save(self, *args, **kwargs):
+               instance = super(AttributeForm, self).save(*args, **kwargs)
+               
+               if self.cleaned_data['value_content_type'] != self.instance.value_content_type:
+                       if self.instance.value is not None:
+                               self.instance.value.delete()
+                               del(self.cleaned_data['value'])
+               elif 'content_type' in self.cleaned_data and self.cleaned_data['content_type'] != self.instance.value.content_type:
+                       self.instance.value.content_type = self.cleaned_data['content_type']
+                       self.instance.value.save()
+               elif 'value' in self.cleaned_data:
+                       self.instance.set_value(self.cleaned_data['value'])
+               
+               return instance
+       
        class Meta:
-               model = Template
+               model = Attribute
 
 
 class ContainerForm(ModelForm):
@@ -134,14 +131,14 @@ class ContainerForm(ModelForm):
 
 
 class ContentletForm(ContainerForm):
-       content = forms.CharField(required=False, widget=AdminTextareaWidget)
+       content = forms.CharField(required=False, widget=AdminTextareaWidget, label='Content')
        
        def should_delete(self):
                return not bool(self.cleaned_data['content'])
        
        class Meta:
                model = Contentlet
-               fields = ['name', 'content', 'dynamic']
+               fields = ['name', 'content']
 
 
 class ContentReferenceForm(ContainerForm):
@@ -163,8 +160,8 @@ class ContentReferenceForm(ContainerForm):
 
 class ContainerInlineFormSet(BaseInlineFormSet):
        def __init__(self, containers, data=None, files=None, instance=None, save_as_new=False, prefix=None, queryset=None):
-               # Unfortunately, I need to add some things to BaseInline between its __init__ and its super call, so
-               # a lot of this is repetition.
+               # Unfortunately, I need to add some things to BaseInline between its __init__ and its
+               # super call, so a lot of this is repetition.
                
                # Start cribbed from BaseInline
                from django.db.models.fields.related import RelatedObject