Merge branch 'develop' into syndication
[philo.git] / philo / models / base.py
index 0218261..2f798ae 100644 (file)
@@ -1,7 +1,7 @@
 from django import forms
 from django.contrib.contenttypes.models import ContentType
 from django.contrib.contenttypes import generic
 from django import forms
 from django.contrib.contenttypes.models import ContentType
 from django.contrib.contenttypes import generic
-from django.core.exceptions import ObjectDoesNotExist
+from django.core.exceptions import ValidationError
 from django.core.validators import RegexValidator
 from django.db import models
 from django.utils import simplejson as json
 from django.core.validators import RegexValidator
 from django.db import models
 from django.utils import simplejson as json
@@ -16,7 +16,7 @@ from philo.utils.entities import AttributeMapper, TreeAttributeMapper
 from philo.validators import json_validator
 
 
 from philo.validators import json_validator
 
 
-__all__ = ('Tag', 'value_content_type_limiter', 'register_value_model', 'unregister_value_model', 'JSONValue', 'ForeignKeyValue', 'ManyToManyValue', 'Attribute', 'Entity', 'TreeEntity')
+__all__ = ('Tag', 'value_content_type_limiter', 'register_value_model', 'unregister_value_model', 'JSONValue', 'ForeignKeyValue', 'ManyToManyValue', 'Attribute', 'Entity', 'TreeEntity', 'SlugTreeEntity')
 
 
 class Tag(models.Model):
 
 
 class Tag(models.Model):
@@ -319,7 +319,12 @@ class Entity(models.Model):
                
                """
                return mapper(self)
                
                """
                return mapper(self)
-       attributes = property(get_attribute_mapper)
+       
+       @property
+       def attributes(self):
+               if not hasattr(self, '_attributes'):
+                       self._attributes = self.get_attribute_mapper()
+               return self._attributes
        
        class Meta:
                abstract = True
        
        class Meta:
                abstract = True
@@ -500,7 +505,6 @@ class TreeEntity(Entity, MPTTModel):
                        else:
                                mapper = AttributeMapper
                return super(TreeEntity, self).get_attribute_mapper(mapper)
                        else:
                                mapper = AttributeMapper
                return super(TreeEntity, self).get_attribute_mapper(mapper)
-       attributes = property(get_attribute_mapper)
        
        def __unicode__(self):
                return self.path
        
        def __unicode__(self):
                return self.path
@@ -522,6 +526,15 @@ class SlugTreeEntity(TreeEntity):
                return super(SlugTreeEntity, self).get_path(root, pathsep, field)
        path = property(get_path)
        
                return super(SlugTreeEntity, self).get_path(root, pathsep, field)
        path = property(get_path)
        
+       def clean(self):
+               if self.parent is None:
+                       try:
+                               self._default_manager.exclude(pk=self.pk).get(slug=self.slug, parent__isnull=True)
+                       except self.DoesNotExist:
+                               pass
+                       else:
+                               raise ValidationError(self.unique_error_message(self.__class__, ('parent', 'slug')))
+       
        class Meta:
                unique_together = ('parent', 'slug')
                abstract = True
\ No newline at end of file
        class Meta:
                unique_together = ('parent', 'slug')
                abstract = True
\ No newline at end of file