from django.contrib import admin
from django.contrib.contenttypes import generic
from philo.models import Tag, Attribute
+from philo.forms import AttributeForm
COLLAPSE_CLASSES = ('collapse', 'collapse-closed', 'closed',)
ct_fk_field = 'entity_object_id'
model = Attribute
extra = 1
- template = 'admin/philo/edit_inline/tabular_collapse.html'
+ template = 'admin/philo/edit_inline/tabular_attribute.html'
allow_add = True
classes = COLLAPSE_CLASSES
-
-
-#class RelationshipInline(generic.GenericTabularInline):
-# ct_field = 'entity_content_type'
-# ct_fk_field = 'entity_object_id'
-# model = Relationship
-# extra = 1
-# template = 'admin/philo/edit_inline/tabular_collapse.html'
-# allow_add = True
-# classes = COLLAPSE_CLASSES
+ form = AttributeForm
+ exclude = ['value_object_id']
class EntityAdmin(admin.ModelAdmin):
- inlines = [AttributeInline] #, RelationshipInline]
+ inlines = [AttributeInline]
save_on_top = True
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 import Entity, Template, Contentlet, ContentReference, Attribute
from philo.utils import fattr
return instance
+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 = Attribute
+
+
class ContainerForm(ModelForm):
def __init__(self, *args, **kwargs):
super(ContainerForm, self).__init__(*args, **kwargs)
+from django import forms
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
def __unicode__(self):
return self.value_json
+ def value_formfield(self, *args, **kwargs):
+ kwargs['initial'] = self.value_json
+ return self._meta.get_field('value').formfield(*args, **kwargs)
+
class Meta:
app_label = 'philo'
def __unicode__(self):
return unicode(self.value)
+ def value_formfield(self, form_class=forms.ModelChoiceField, **kwargs):
+ if self.content_type is None:
+ return None
+ kwargs.update({'initial': self.object_id, 'required': False})
+ return form_class(self.content_type.model_class()._default_manager.all(), **kwargs)
+
class Meta:
app_label = 'philo'
def get_value_class(self, value):
if isinstance(value, models.query.QuerySet):
return ManyToManyValue
- elif isinstance(value, models.Model):
+ elif isinstance(value, models.Model) or (value is None and self.value_content_type.model_class() is ForeignKeyValue):
return ForeignKeyValue
else:
return JSONValue
<th{% if forloop.first %} colspan="2"{% endif %}{% if field.required %} class="required"{% endif %}>{{ field.label|capfirst }}</th>
{% endif %}
{% endfor %}
+ <th>Content Type</th>
+ <th>Value</th>
{% if inline_admin_formset.formset.can_delete %}<th>{% trans "Delete?" %}</th>{% endif %}
</tr></thead>
{% endfor %}
{% endfor %}
{% endfor %}
+ <td>{{ inline_admin_form.form.content_type }}</td>
+ <td>{{ inline_admin_form.form.value }}</td>
{% if inline_admin_formset.formset.can_delete %}
<td class="delete">{% if inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}{% endif %}</td>
{% endif %}