- class Meta:
- abstract = True
- app_label = 'philo'
-
-
-class InheritableTreeEntity(TreeEntity):
- instance_type = models.ForeignKey(ContentType, editable=False)
-
- def save(self, force_insert=False, force_update=False):
- if not hasattr(self, 'instance_type_ptr'):
- self.instance_type = ContentType.objects.get_for_model(self.__class__)
- super(InheritableTreeEntity, self).save(force_insert, force_update)
-
- @property
- def instance(self):
- try:
- return self.instance_type.get_object_for_this_type(id=self.id)
- except:
- return None
-
- def get_path(self, pathsep='/', field='slug'):
- path = getattr(self.instance, field, getattr(self.instance, 'slug', '?'))
- parent = self.parent
- while parent:
- path = getattr(parent.instance, field, getattr(parent.instance, 'slug', '?')) + pathsep + path
- parent = parent.parent
- return path
- path = property(get_path)
-
- @property
- def attributes(self):
- if self.parent:
- return QuerySetMapper(self.instance.attribute_set, passthrough=self.parent.instance.attributes)
- return QuerySetMapper(self.instance.attribute_set)
-
- @property
- def relationships(self):
- if self.parent:
- return QuerySetMapper(self.instance.relationship_set, passthrough=self.parent.instance.relationships)
- return QuerySetMapper(self.instance.relationship_set)
-