from django import forms
from django.contrib.admin.widgets import AdminTextareaWidget
from django.core.exceptions import ValidationError, ObjectDoesNotExist
+from django.db.models import Q
from django.forms.models import model_to_dict, fields_for_model, ModelFormMetaclass, ModelForm, BaseInlineFormSet
from django.forms.formsets import TOTAL_FORM_COUNT
from django.template import loader, loader_tags, TemplateDoesNotExist, Context, Template as DjangoTemplate
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 Meta:
- model = Template
-
-
class ContainerForm(ModelForm):
def __init__(self, *args, **kwargs):
super(ContainerForm, self).__init__(*args, **kwargs)
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
super(ContentReferenceInlineFormSet, self).__init__(containers, data, files, instance, save_as_new, prefix, queryset)
def get_container_instances(self, containers, qs):
- qs = qs.filter(name__in=[c[0] for c in containers])
+ filter = Q()
+
+ for name, ct in containers:
+ filter |= Q(name=name, content_type=ct)
+
+ qs = qs.filter(filter)
container_instances = []
for container in qs:
container_instances.append(container)