from UserDict import DictMixin
+class Tag(models.Model):
+ name = models.CharField(max_length=250)
+ slug = models.SlugField(unique=True)
+
+ def __unicode__(self):
+ return self.name
+
+ class Meta:
+ app_label = 'philo'
+
+
+class Titled(models.Model):
+ title = models.CharField(max_length=255)
+ slug = models.SlugField(max_length=255)
+
+ def __unicode__(self):
+ return self.title
+
+ class Meta:
+ abstract = True
+
+
class Attribute(models.Model):
entity_content_type = models.ForeignKey(ContentType, verbose_name='Entity type')
entity_object_id = models.PositiveIntegerField(verbose_name='Entity ID')
def relationships(self):
return QuerySetMapper(self.relationship_set)
+ @property
+ def _added_attribute_registry(self):
+ if not hasattr(self, '_real_added_attribute_registry'):
+ self._real_added_attribute_registry = {}
+ return self._real_added_attribute_registry
+
+ @property
+ def _removed_attribute_registry(self):
+ if not hasattr(self, '_real_removed_attribute_registry'):
+ self._real_removed_attribute_registry = []
+ return self._real_removed_attribute_registry
+
+ @property
+ def _added_relationship_registry(self):
+ if not hasattr(self, '_real_added_relationship_registry'):
+ self._real_added_relationship_registry = {}
+ return self._real_added_relationship_registry
+
+ @property
+ def _removed_relationship_registry(self):
+ if not hasattr(self, '_real_removed_relationship_registry'):
+ self._real_removed_relationship_registry = []
+ return self._real_removed_relationship_registry
+
+ def save(self, *args, **kwargs):
+ super(Entity, self).save(*args, **kwargs)
+
+ for key in self._removed_attribute_registry:
+ self.attribute_set.filter(key__exact=key).delete()
+ del self._removed_attribute_registry[:]
+
+ for key, value in self._added_attribute_registry.items():
+ try:
+ attribute = self.attribute_set.get(key__exact=key)
+ except Attribute.DoesNotExist:
+ attribute = Attribute()
+ attribute.entity = self
+ attribute.key = key
+ attribute.value = value
+ attribute.save()
+ self._added_attribute_registry.clear()
+
+ for key in self._removed_relationship_registry:
+ self.relationship_set.filter(key__exact=key).delete()
+ del self._removed_relationship_registry[:]
+
+ for key, value in self._added_relationship_registry.items():
+ try:
+ relationship = self.relationship_set.get(key__exact=key)
+ except Relationship.DoesNotExist:
+ relationship = Relationship()
+ relationship.entity = self
+ relationship.key = key
+ relationship.value = value
+ relationship.save()
+ self._added_relationship_registry.clear()
+
class Meta:
abstract = True
- app_label = 'philo'
class TreeManager(models.Manager):
parent = models.ForeignKey('self', related_name='children', null=True, blank=True)
slug = models.SlugField()
- def get_path(self, pathsep='/', field='slug'):
- path = getattr(self, field, '?')
- parent = self.parent
+ def has_ancestor(self, ancestor):
+ parent = self
while parent:
- path = getattr(parent, field, '?') + pathsep + path
+ if parent == ancestor:
+ return True
parent = parent.parent
- return path
+ return False
+
+ def get_path(self, root=None, pathsep='/', field='slug'):
+ if root is not None and self.has_ancestor(root):
+ path = ''
+ parent = self
+ while parent and parent != root:
+ path = getattr(parent, field, '?') + pathsep + path
+ parent = parent.parent
+ return path
+ else:
+ path = getattr(self, field, '?')
+ parent = self.parent
+ while parent and parent != root:
+ path = getattr(parent, field, '?') + pathsep + path
+ parent = parent.parent
+ return path
path = property(get_path)
def __unicode__(self):
class Meta:
unique_together = (('parent', 'slug'),)
abstract = True
- app_label = 'philo'
class TreeEntity(TreeModel, Entity):
return super(TreeEntity, self).relationships
class Meta:
- abstract = True
- app_label = 'philo'
\ No newline at end of file
+ abstract = True
\ No newline at end of file