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
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):
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):
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