from django.contrib.contenttypes import generic
from django.utils import simplejson as json
from django.core.exceptions import ObjectDoesNotExist
+from philo.utils import ContentTypeRegistryLimiter
from UserDict import DictMixin
-def register_value_model(model):
- pass
+class Tag(models.Model):
+ name = models.CharField(max_length=250)
+ slug = models.SlugField()
+
+ def __unicode__(self):
+ return self.name
-def unregister_value_model(model):
- pass
+class Titled(models.Model):
+ title = models.CharField(max_length=255)
+ slug = models.SlugField()
+
+ def __unicode__(self):
+ return self.title
+
+ class Meta:
+ abstract = True
class Attribute(models.Model):
app_label = 'philo'
+value_content_type_limiter = ContentTypeRegistryLimiter()
+
+
+def register_value_model(model):
+ value_content_type_limiter.register_class(model)
+
+
+def unregister_value_model(model):
+ value_content_type_limiter.unregister_class(model)
+
+
+
class Relationship(models.Model):
entity_content_type = models.ForeignKey(ContentType, related_name='relationship_entity_set', verbose_name='Entity type')
entity_object_id = models.PositiveIntegerField(verbose_name='Entity ID')
entity = generic.GenericForeignKey('entity_content_type', 'entity_object_id')
key = models.CharField(max_length=255)
- value_content_type = models.ForeignKey(ContentType, related_name='relationship_value_set', verbose_name='Value type')
+ value_content_type = models.ForeignKey(ContentType, related_name='relationship_value_set', limit_choices_to=value_content_type_limiter, verbose_name='Value type')
value_object_id = models.PositiveIntegerField(verbose_name='Value ID')
value = generic.GenericForeignKey('value_content_type', 'value_object_id')
def __init__(self, queryset, passthrough=None):
self.queryset = queryset
self.passthrough = passthrough
+
def __getitem__(self, key):
try:
return self.queryset.get(key__exact=key).value
except ObjectDoesNotExist:
- if self.passthrough:
+ if self.passthrough is not None:
return self.passthrough.__getitem__(key)
raise KeyError
+
def keys(self):
keys = set(self.queryset.values_list('key', flat=True).distinct())
- if self.passthrough:
- keys += set(self.passthrough.keys())
+ if self.passthrough is not None:
+ keys |= set(self.passthrough.keys())
return list(keys)
return self.path
class Meta:
+ unique_together = (('parent', 'slug'),)
abstract = True
app_label = 'philo'
return QuerySetMapper(self.relationship_set, passthrough=self.parent.relationships)
return super(TreeEntity, self).relationships
- 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)
-
class Meta:
abstract = True
app_label = 'philo'
\ No newline at end of file