Merge branch 'master' of http://github.com/fnp/wolnelektury
[wolnelektury.git] / apps / catalogue / models.py
index 37e6c2e..2008f09 100644 (file)
@@ -43,7 +43,7 @@ class TagSubcategoryManager(models.Manager):
 
 class Tag(TagBase):
     name = models.CharField(_('name'), max_length=50, db_index=True)
-    slug = models.SlugField(_('slug'), max_length=120, unique=True, db_index=True)
+    slug = models.SlugField(_('slug'), max_length=120, db_index=True)
     sort_key = models.SlugField(_('sort key'), max_length=120, db_index=True)
     category = models.CharField(_('category'), max_length=50, blank=False, null=False,
         db_index=True, choices=TAG_CATEGORIES)
@@ -55,11 +55,22 @@ class Tag(TagBase):
     death = models.IntegerField(_(u'year of death'), blank=True, null=True)
     gazeta_link = models.CharField(blank=True, max_length=240)
     wiki_link = models.CharField(blank=True, max_length=240)
+    
+    categories_rev = {
+        'autor': 'author',
+        'epoka': 'epoch',
+        'rodzaj': 'kind',
+        'gatunek': 'genre',
+        'motyw': 'theme',
+        'polka': 'set',
+    }
+    categories_dict = dict((item[::-1] for item in categories_rev.iteritems()))
 
     class Meta:
         ordering = ('sort_key',)
         verbose_name = _('tag')
         verbose_name_plural = _('tags')
+        unique_together = (("slug", "category"),)
 
     def __unicode__(self):
         return self.name
@@ -69,7 +80,7 @@ class Tag(TagBase):
 
     @permalink
     def get_absolute_url(self):
-        return ('catalogue.views.tagged_object_list', [self.slug])
+        return ('catalogue.views.tagged_object_list', [self.url_chunk])
 
     def has_description(self):
         return len(self.description) > 0
@@ -90,10 +101,40 @@ class Tag(TagBase):
     @staticmethod
     def get_tag_list(tags):
         if isinstance(tags, basestring):
-            tag_slugs = tags.split('/')
-            return [Tag.objects.get(slug=slug) for slug in tag_slugs]
+            real_tags = []
+            ambiguous_slugs = []
+            category = None
+            tags_splitted = tags.split('/')
+            for index, name in enumerate(tags_splitted):
+                if name in Tag.categories_rev:
+                    category = Tag.categories_rev[name]
+                else:
+                    if category:
+                        real_tags.append(Tag.objects.get(slug=name, category=category))
+                        category = None
+                    else:
+                        try:
+                            real_tags.append(Tag.objects.exclude(category='book').get(slug=name))
+                        except Tag.MultipleObjectsReturned, e:
+                            ambiguous_slugs.append(name)
+                            
+            if category:
+                # something strange left off
+                raise Tag.DoesNotExist()
+            if ambiguous_slugs:
+                # some tags should be qualified
+                e = Tag.MultipleObjectsReturned()
+                e.tags = real_tags
+                e.ambiguous_slugs = ambiguous_slugs
+                raise e
+            else:
+                return real_tags
         else:
             return TagBase.get_tag_list(tags)
+    
+    @property
+    def url_chunk(self):
+        return '/'.join((Tag.categories_dict[self.category], self.slug))
 
 
 # TODO: why is this hard-coded ? 
@@ -172,11 +213,10 @@ class Book(models.Model):
     
     def book_tag(self):
         slug = ('l-' + self.slug)[:120]
-        book_tag, created = Tag.objects.get_or_create(slug=slug)
+        book_tag, created = Tag.objects.get_or_create(slug=slug, category='book')
         if created:
             book_tag.name = self.title[:50]
             book_tag.sort_key = slug
-            book_tag.category = 'book'
             book_tag.save()
         return book_tag
 
@@ -289,11 +329,10 @@ class Book(models.Model):
             if category == 'author':
                 tag_sort_key = tag_name.last_name
                 tag_name = ' '.join(tag_name.first_names) + ' ' + tag_name.last_name
-            tag, created = Tag.objects.get_or_create(slug=slughifi(tag_name))
+            tag, created = Tag.objects.get_or_create(slug=slughifi(tag_name), category=category)
             if created:
                 tag.name = tag_name
                 tag.sort_key = slughifi(tag_sort_key)
-                tag.category = category
                 tag.save()
             book_tags.append(tag)
 
@@ -345,11 +384,10 @@ class Book(models.Model):
                     continue
                 themes = []
                 for theme_name in theme_names:
-                    tag, created = Tag.objects.get_or_create(slug=slughifi(theme_name))
+                    tag, created = Tag.objects.get_or_create(slug=slughifi(theme_name), category='theme')
                     if created:
                         tag.name = theme_name
                         tag.sort_key = slughifi(theme_name)
-                        tag.category = 'theme'
                         tag.save()
                     themes.append(tag)
                 new_fragment.save()