X-Git-Url: http://git.ithinksw.org/philo.git/blobdiff_plain/24677328851cc04e6b15254606dfadd8af8a2432..d7d4d16a3aaf6d572e86c78b45d93b8bb065d23d:/forms.py diff --git a/forms.py b/forms.py index 3c6ed1a..c864f31 100644 --- 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,7 +131,7 @@ 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']) @@ -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