#8 tagged object list for audiobooks
authorJan Szejko <j-sz@o2.pl>
Wed, 10 Feb 2016 13:02:10 +0000 (14:02 +0100)
committerJan Szejko <j-sz@o2.pl>
Wed, 10 Feb 2016 13:05:19 +0000 (14:05 +0100)
src/catalogue/models/tag.py
src/catalogue/templates/catalogue/inline_tag_list.html
src/catalogue/templates/catalogue/plain_list.html
src/catalogue/templates/catalogue/tag_list.html
src/catalogue/templates/catalogue/tagged_object_list.html
src/catalogue/templatetags/catalogue_tags.py
src/catalogue/urls.py
src/catalogue/views.py

index 57935f8..06aa7a1 100644 (file)
@@ -9,6 +9,7 @@ from django.db import models
 from django.db.models import permalink
 from django.dispatch import Signal
 from django.utils.translation import ugettext_lazy as _
 from django.db.models import permalink
 from django.dispatch import Signal
 from django.utils.translation import ugettext_lazy as _
+
 from newtagging.models import TagBase
 from ssify import flush_ssi_includes
 
 from newtagging.models import TagBase
 from ssify import flush_ssi_includes
 
@@ -48,7 +49,9 @@ class Tag(TagBase):
     after_change = Signal(providing_args=['instance', 'languages'])
 
     class UrlDeprecationWarning(DeprecationWarning):
     after_change = Signal(providing_args=['instance', 'languages'])
 
     class UrlDeprecationWarning(DeprecationWarning):
-        pass
+        def __init__(self, tags=None):
+            super(Tag.UrlDeprecationWarning, self).__init__()
+            self.tags = tags
 
     categories_rev = {
         'autor': 'author',
 
     categories_rev = {
         'autor': 'author',
@@ -189,9 +192,7 @@ class Tag(TagBase):
                 e.ambiguous_slugs = ambiguous_slugs
                 raise e
             if deprecated:
                 e.ambiguous_slugs = ambiguous_slugs
                 raise e
             if deprecated:
-                e = Tag.UrlDeprecationWarning()
-                e.tags = real_tags
-                raise e
+                raise Tag.UrlDeprecationWarning(tags=real_tags)
             return real_tags
         else:
             return TagBase.get_tag_list(tags)
             return real_tags
         else:
             return TagBase.get_tag_list(tags)
index 920b555..cf53e2d 100755 (executable)
@@ -1,37 +1,29 @@
 {% load i18n %}
 {% load catalogue_tags %}
 {% load i18n %}
 {% load catalogue_tags %}
-       {% if choices %}
-        {% if category_choices %}
-            <ul>
-            <li class="header">{% trans "Chosen" %}:</li>
-            {% for tag in category_choices %}
-                <li class="active">{{ tag }} <a href="{% if gallery %}{% catalogue_url_gallery choices -tag %}{% else %}{% catalogue_url choices -tag %}{% endif %}">X</a></li>
-            {% endfor %}
-            </ul>
-        {% endif %}
-        {% if tags %}
+
+{% if choices %}
+    {% if category_choices %}
         <ul>
         <ul>
-        <li class="header">{% trans "Available" %}:</li>
-        {% for tag in tags %}
-            <li><a href="{% if gallery %}{% catalogue_url_gallery choices tag %}{% else %}{% catalogue_url choices tag %}{% endif %}">{{ tag }}{% if tag.count %}&nbsp;({{ tag.count }}){% endif %}</a></li>
+        <li class="header">{% trans "Chosen" %}:</li>
+        {% for tag in category_choices %}
+            <li class="active">{{ tag }} <a href="{% catalogue_url list_type choices -tag %}">X</a></li>
         {% endfor %}
         </ul>
         {% endfor %}
         </ul>
-        {% endif %}
-    {% else %}
-        {% if tags %}
-        <ul>
+    {% endif %}
+{% endif %}
+{% if tags %}
+    <ul>
         <li class="header">{% trans "Available" %}:</li>
         {% for tag in tags %}
         <li class="header">{% trans "Available" %}:</li>
         {% for tag in tags %}
-            <li><a href="{% if gallery %}{{ tag.get_absolute_gallery_url }}{% else %}{{ tag.get_absolute_url }}{% endif %}">{{ tag }} {% if tag.count %}&nbsp;({{ tag.count }}){% endif %}</a></li>
+            <li><a href="{% catalogue_url list_type choices tag %}">{{ tag }}{% if tag.count %}&nbsp;({{ tag.count }}){% endif %}</a></li>
         {% endfor %}
         {% endfor %}
-        </ul>
-        {% endif %}
-    {% endif %}
-    {% if other %}
-       <ul>
+    </ul>
+{% endif %}
+{% if other %}
+    <ul>
         <li class="header">{% trans "Other" %}:</li>
         {% for tag in other %}
         <li class="header">{% trans "Other" %}:</li>
         {% for tag in other %}
-            <li class="other"><a href="{% if gallery %}{{ tag.get_absolute_gallery_url }}{% else %}{{ tag.get_absolute_url }}{% endif %}">{{ tag }}</a></li>
+            <li class="other"><a href="{% catalogue_url list_type tag %}">{{ tag }}</a></li>
         {% endfor %}
     </ul>
         {% endfor %}
     </ul>
-    {% endif %}
+{% endif %}
index 3d46368..fb2abe0 100644 (file)
@@ -10,7 +10,7 @@
         <p class="header">{{ initial }}</p>
     {% endif %}
     {% for item in object_list %}
         <p class="header">{{ initial }}</p>
     {% endif %}
     {% for item in object_list %}
-        <p><a href="{% if book %}{% url 'book_fragments' book.slug item.slug %}{% elif choice %}{% if gallery %}{% catalogue_url_gallery choice item %}{% else %}{% catalogue_url choice item %}{% endif %}{% elif gallery %}{{ item.get_absolute_gallery_url }}{% else %}{{ item.get_absolute_url }}{% endif %}">{{ item }}{% if item.count %}&nbsp;({{ item.count}}){% endif %}</a></p>
+        <p><a href="{% if book %}{% url 'book_fragments' book.slug item.slug %}{% elif choice %}{% catalogue_url list_type choice item %}{% elif list_type == 'gallery' and item.get_absolute_gallery_url %}{{ item.get_absolute_gallery_url }}{% else %}{{ item.get_absolute_url }}{% endif %}">{{ item }}{% if item.count %}&nbsp;({{ item.count}}){% endif %}</a></p>
     {% endfor %}
     {% if initial_blocks %}</div>{% endif %}
 {% endfor %}
     {% endfor %}
     {% if initial_blocks %}</div>{% endif %}
 {% endfor %}
index e0fecc0..2a7fd6a 100644 (file)
@@ -3,12 +3,12 @@
 {% load i18n %}
 {% load catalogue_tags %}
 {% if one_tag %}
 {% load i18n %}
 {% load catalogue_tags %}
 {% if one_tag %}
-    <p>{% trans "See full category" %} <a href="{% catalogue_url one_tag %}">{{ one_tag }}</a></p>
+    <p>{% trans "See full category" %} <a href="{% catalogue_url 'default' one_tag %}">{{ one_tag }}</a></p>
 {% else %}
     <ul>
         {% if choices %}
         {% for tag in tags %}
 {% else %}
     <ul>
         {% if choices %}
         {% for tag in tags %}
-            <li><a href="{% catalogue_url choices tag %}">{{ tag }}{% if tag.count %}&nbsp;({{ tag.count }}){% endif %}</a></li>
+            <li><a href="{% catalogue_url 'default' choices tag %}">{{ tag }}{% if tag.count %}&nbsp;({{ tag.count }}){% endif %}</a></li>
         {% endfor %}
         {% else %}
         {% for tag in tags %}
         {% endfor %}
         {% else %}
         {% for tag in tags %}
index 9a3455d..e663486 100644 (file)
@@ -3,7 +3,7 @@
 {% load catalogue_tags switch_tag social_tags %}
 {% load ssi_include from ssify %}
 
 {% load catalogue_tags switch_tag social_tags %}
 {% load ssi_include from ssify %}
 
-{% block titleextra %}{% if tags %}{% title_from_tags tags %}{% elif gallery %}{% trans "Gallery" %}{% else %}{% trans "Literature" %}{% endif %}{% endblock %}
+{% block titleextra %}{% if tags %}{% title_from_tags tags %}{% elif list_type == 'gallery' %}{% trans "Gallery" %}{% elif list_type == 'audiobooks' %}{% trans "Audiobooks" %}{% else %}{% trans "Literature" %}{% endif %}{% endblock %}
 
 {% block bodyid %}tagged-object-list{% endblock %}
 
 
 {% block bodyid %}tagged-object-list{% endblock %}
 
@@ -11,7 +11,7 @@
 <div class="tabbed-filter">
     <h1>{% if tags %}
         {% html_title_from_tags tags %}
 <div class="tabbed-filter">
     <h1>{% if tags %}
         {% html_title_from_tags tags %}
-        {% elif gallery %}{% trans "Gallery" %}{% else %}{% trans "Literature" %}
+        {% elif list_type == 'gallery' %}{% trans "Gallery" %}{% elif list_type == 'audiobooks' %}{% trans "Audiobooks" %}{% else %}{% trans "Literature" %}
         {% endif %}
     </h1>
 
         {% endif %}
     </h1>
 
         <a class="tab white-box" data-id="genres">{% trans "Genres" %}</a>
         <a class="tab white-box" data-id="kinds">{% trans "Kinds" %}</a>
         {% if theme_is_set %}
         <a class="tab white-box" data-id="genres">{% trans "Genres" %}</a>
         <a class="tab white-box" data-id="kinds">{% trans "Kinds" %}</a>
         {% if theme_is_set %}
-        <a class="tab white-box" data-id="themes">{% trans "Themes" %}</a>
+            <a class="tab white-box" data-id="themes">{% trans "Themes" %}</a>
         {% endif %}
     </div>
         {% endif %}
     </div>
-
 </div>
 </div>
+
 <div class="tabbed-filter-contents">
     <div id="authors" class="white-box normal-text tab-content">
 <div class="tabbed-filter-contents">
     <div id="authors" class="white-box normal-text tab-content">
-        {% inline_tag_list categories.author tags 'author' gallery=gallery %}
+        {% inline_tag_list categories.author tags 'author' list_type=list_type %}
     </div>
     <div id="epochs" class="white-box normal-text tab-content">
     </div>
     <div id="epochs" class="white-box normal-text tab-content">
-        {% inline_tag_list categories.epoch tags 'epoch' gallery=gallery %}
+        {% inline_tag_list categories.epoch tags 'epoch' list_type=list_type %}
     </div>
     <div id="genres" class="white-box normal-text tab-content">
     </div>
     <div id="genres" class="white-box normal-text tab-content">
-        {% inline_tag_list categories.genre tags 'genre' gallery=gallery %}
+        {% inline_tag_list categories.genre tags 'genre' list_type=list_type %}
     </div>
     <div id="kinds" class="white-box normal-text tab-content">
     </div>
     <div id="kinds" class="white-box normal-text tab-content">
-        {% inline_tag_list categories.kind tags 'kind' gallery=gallery %}
+        {% inline_tag_list categories.kind tags 'kind' list_type=list_type %}
     </div>
     {% if theme_is_set %}
         <div id="themes" class="white-box normal-text tab-content">
     </div>
     {% if theme_is_set %}
         <div id="themes" class="white-box normal-text tab-content">
-            {% inline_tag_list categories.theme tags 'theme' gallery=gallery %}
+            {% inline_tag_list categories.theme tags 'theme' list_type=list_type %}
         </div>
     {% endif %}
 </div>
 
         </div>
     {% endif %}
 </div>
 
-
-
-
-    {% if theme_is_set %}
-        {% work_list object_list %}
-    {% else %}
+{% if theme_is_set %}
+    {% work_list object_list %}
+{% else %}
     <div id="books-list">
         {% if object_list %}
             {% work_list best %}
             {% if tags %}
                 <h2>{% trans "All matching works" %}</h2>
             {% else %}
     <div id="books-list">
         {% if object_list %}
             {% work_list best %}
             {% if tags %}
                 <h2>{% trans "All matching works" %}</h2>
             {% else %}
-                <h2>{% trans "All works" %}</h2>
+                {% if list_type == 'audiobooks' %}
+                    <h2>{% trans "Listing of all audiobooks" %}</h2>
+                {% else %}
+                    <h2>{% trans "All works" %}</h2>
+                 {% endif %}
+            {% endif %}
+            {% plain_list object_list by_author=True list_type=list_type %}
+            {% if daisy %}
+                <h2>{% trans "DAISY files" %}</h2>
+                {% plain_list daisy by_author=True %}
             {% endif %}
             {% endif %}
-            {% plain_list object_list by_author=True gallery=gallery %}
         {% else %}
             {% trans "Sorry! Search cirteria did not match any resources." %}
             {% include "info/join_us.html" %}
         {% endif %}
     </div>
 
         {% else %}
             {% trans "Sorry! Search cirteria did not match any resources." %}
             {% include "info/join_us.html" %}
         {% endif %}
     </div>
 
-
-
-
-{% if categories.theme %}
-    <h2>{% trans "Motifs and themes" %}</h2>
-    {% plain_list categories.theme choice=tags gallery=gallery %}
-{% endif %}
-
-
+    {% if categories.theme and list_type != 'audiobooks' %}
+        <h2>{% trans "Motifs and themes" %}</h2>
+        {% plain_list categories.theme choice=tags list_type=list_type %}
+    {% endif %}
 
 {% endif %}
 
 
 {% endif %}
 
-
-
-    {% for tag in tags %}
+{% for tag in tags %}
     {% if tag.category != 'set' %}
     {% if tag.category != 'set' %}
-    <h2>{% trans tag.category as c %}{{ c|capfirst }}: {{ tag }}</h2>
+        <h2>{% trans tag.category as c %}{{ c|capfirst }}: {{ tag }}</h2>
         <div class="white-box">
         <div class="white-box">
-        {% if tag.has_description %}
-            {{ tag.description|safe }}
-        {% else %}
-            <em>{% trans "No description." %}</em>
-        {% endif %}
+            {% if tag.has_description %}
+                {{ tag.description|safe }}
+            {% else %}
+                <em>{% trans "No description." %}</em>
+            {% endif %}
         </div>
 
         {% if tag.gazeta_link %}
         </div>
 
         {% if tag.gazeta_link %}
-        <div class="white-box"><a href="{{ tag.gazeta_link }}">
-            {{ tag }} {% trans "in Lektury.Gazeta.pl" %}
-        </a></div>
+            <div class="white-box"><a href="{{ tag.gazeta_link }}">
+                {{ tag }} {% trans "in Lektury.Gazeta.pl" %}
+            </a></div>
         {% endif %}
         {% if tag.wiki_link %}
         {% endif %}
         {% if tag.wiki_link %}
-        <div class="white-box">
-        <a href="{{ tag.wiki_link }}">
-            {{ tag }} {% trans "in Wikipedia" %}
-        </a></div>
+            <div class="white-box">
+            <a href="{{ tag.wiki_link }}">
+                {{ tag }} {% trans "in Wikipedia" %}
+            </a></div>
         {% endif %}
         {% if tag.culturepl_link %}
         {% endif %}
         {% if tag.culturepl_link %}
-        <div class="white-box">
-        <a href="{{ tag.culturepl_link }}">
-            {{ tag }} {% trans "in Culture.pl" %}
-        </a></div>
+            <div class="white-box">
+            <a href="{{ tag.culturepl_link }}">
+                {{ tag }} {% trans "in Culture.pl" %}
+            </a></div>
         {% endif %}
     {% endif %}
         {% endif %}
     {% endif %}
-    {% endfor %}
-
-
-
-
+{% endfor %}
 
 {% endblock %}
 
 {% endblock %}
index 16d5de7..fa6436f 100644 (file)
@@ -8,6 +8,7 @@ from django.contrib.contenttypes.models import ContentType
 
 from django.conf import settings
 from django import template
 
 from django.conf import settings
 from django import template
+from django.core.cache import cache
 from django.template import Node, Variable, Template, Context
 from django.core.urlresolvers import reverse
 from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
 from django.template import Node, Variable, Template, Context
 from django.core.urlresolvers import reverse
 from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
@@ -242,37 +243,23 @@ def catalogue_url(parser, token):
 
     tags_to_add = []
     tags_to_remove = []
 
     tags_to_add = []
     tags_to_remove = []
-    for bit in bits[1:]:
+    for bit in bits[2:]:
         if bit[0] == '-':
             tags_to_remove.append(bit[1:])
         else:
             tags_to_add.append(bit)
 
         if bit[0] == '-':
             tags_to_remove.append(bit[1:])
         else:
             tags_to_add.append(bit)
 
-    return CatalogueURLNode(tags_to_add, tags_to_remove)
-
-
-@register.tag
-def catalogue_url_gallery(parser, token):
-    bits = token.split_contents()
-
-    tags_to_add = []
-    tags_to_remove = []
-    for bit in bits[1:]:
-        if bit[0] == '-':
-            tags_to_remove.append(bit[1:])
-        else:
-            tags_to_add.append(bit)
-
-    return CatalogueURLNode(tags_to_add, tags_to_remove, gallery=True)
+    return CatalogueURLNode(bits[1], tags_to_add, tags_to_remove)
 
 
 class CatalogueURLNode(Node):
 
 
 class CatalogueURLNode(Node):
-    def __init__(self, tags_to_add, tags_to_remove, gallery=False):
+    def __init__(self, list_type, tags_to_add, tags_to_remove):
         self.tags_to_add = [Variable(tag) for tag in tags_to_add]
         self.tags_to_remove = [Variable(tag) for tag in tags_to_remove]
         self.tags_to_add = [Variable(tag) for tag in tags_to_add]
         self.tags_to_remove = [Variable(tag) for tag in tags_to_remove]
-        self.gallery = gallery
+        self.list_type_var = Variable(list_type)
 
     def render(self, context):
 
     def render(self, context):
+        list_type = self.list_type_var.resolve(context)
         tags_to_add = []
         tags_to_remove = []
 
         tags_to_add = []
         tags_to_remove = []
 
@@ -298,16 +285,23 @@ class CatalogueURLNode(Node):
                 pass
 
         if len(tag_slugs) > 0:
                 pass
 
         if len(tag_slugs) > 0:
-            if self.gallery:
+            if list_type == 'gallery':
                 return reverse('tagged_object_list_gallery', kwargs={'tags': '/'.join(tag_slugs)})
                 return reverse('tagged_object_list_gallery', kwargs={'tags': '/'.join(tag_slugs)})
+            elif list_type == 'audiobooks':
+                return reverse('tagged_object_list_audiobooks', kwargs={'tags': '/'.join(tag_slugs)})
             else:
                 return reverse('tagged_object_list', kwargs={'tags': '/'.join(tag_slugs)})
         else:
             else:
                 return reverse('tagged_object_list', kwargs={'tags': '/'.join(tag_slugs)})
         else:
-            return reverse('book_list')
+            if list_type == 'gallery':
+                return reverse('gallery')
+            elif list_type == 'audiobooks':
+                return reverse('audiobook_list')
+            else:
+                return reverse('book_list')
 
 
 # @register.inclusion_tag('catalogue/tag_list.html')
 
 
 # @register.inclusion_tag('catalogue/tag_list.html')
-def tag_list(tags, choices=None, category=None, gallery=False):
+def tag_list(tags, choices=None, category=None, list_type='default'):
     # print(tags, choices, category)
     if choices is None:
         choices = []
     # print(tags, choices, category)
     if choices is None:
         choices = []
@@ -326,22 +320,36 @@ def tag_list(tags, choices=None, category=None, gallery=False):
         other = Tag.objects.filter(category=category).exclude(pk__in=[t.pk for t in tags])\
             .exclude(pk__in=[t.pk for t in category_choices])
         # Filter out empty tags.
         other = Tag.objects.filter(category=category).exclude(pk__in=[t.pk for t in tags])\
             .exclude(pk__in=[t.pk for t in category_choices])
         # Filter out empty tags.
-        ct = ContentType.objects.get_for_model(Picture if gallery else Book)
+        ct = ContentType.objects.get_for_model(Picture if list_type == 'gallery' else Book)
         other = other.filter(items__content_type=ct).distinct()
         other = other.filter(items__content_type=ct).distinct()
+        if list_type == 'audiobooks':
+            audiobook_tag_ids = cache.get('audiobook_tags')
+            if audiobook_tag_ids is None:
+                books_with_audiobook = Book.objects.filter(media__type__in=('mp3', 'ogg'))\
+                    .distinct().values_list('pk', flat=True)
+                audiobook_tag_ids = Tag.objects.filter(
+                    items__content_type=ct,
+                    items__object_id__in=list(books_with_audiobook)).distinct().values_list('pk', flat=True)
+                audiobook_tag_ids = list(audiobook_tag_ids)
+                cache.set('audiobook_tags', audiobook_tag_ids)
+
+            other = other.filter(id__in=audiobook_tag_ids)
     else:
         other = []
 
     return {
         'one_tag': one_tag,
         'choices': choices,
     else:
         other = []
 
     return {
         'one_tag': one_tag,
         'choices': choices,
+        'category_choices': category_choices,
         'tags': tags,
         'other': other,
         'tags': tags,
         'other': other,
+        'list_type': list_type,
     }
 
 
 @register.inclusion_tag('catalogue/inline_tag_list.html')
     }
 
 
 @register.inclusion_tag('catalogue/inline_tag_list.html')
-def inline_tag_list(tags, choices=None, category=None, gallery=False):
-    return tag_list(tags, choices, category, gallery)
+def inline_tag_list(tags, choices=None, category=None, list_type='default'):
+    return tag_list(tags, choices, category, list_type)
 
 
 @register.inclusion_tag('catalogue/collection_list.html')
 
 
 @register.inclusion_tag('catalogue/collection_list.html')
@@ -364,7 +372,7 @@ def work_list(context, object_list):
 
 
 @register.inclusion_tag('catalogue/plain_list.html', takes_context=True)
 
 
 @register.inclusion_tag('catalogue/plain_list.html', takes_context=True)
-def plain_list(context, object_list, with_initials=True, by_author=False, choice=None, book=None, gallery=False,
+def plain_list(context, object_list, with_initials=True, by_author=False, choice=None, book=None, list_type='default',
                paged=True, initial_blocks=False):
     names = [('', [])]
     last_initial = None
                paged=True, initial_blocks=False):
     names = [('', [])]
     last_initial = None
@@ -386,7 +394,7 @@ def plain_list(context, object_list, with_initials=True, by_author=False, choice
         'names': names,
         'initial_blocks': initial_blocks,
         'book': book,
         'names': names,
         'initial_blocks': initial_blocks,
         'book': book,
-        'gallery': gallery,
+        'list_type': list_type,
         'choice': choice,
     }
 
         'choice': choice,
     }
 
index bc9f78d..016db40 100644 (file)
@@ -43,12 +43,12 @@ urlpatterns += patterns(
     url(r'^rodzaj/$', 'tag_catalogue', {'category': 'kind'}, name='kind_catalogue'),
     url(r'^motyw/$', 'tag_catalogue', {'category': 'theme'}, name='theme_catalogue'),
 
     url(r'^rodzaj/$', 'tag_catalogue', {'category': 'kind'}, name='kind_catalogue'),
     url(r'^motyw/$', 'tag_catalogue', {'category': 'theme'}, name='theme_catalogue'),
 
-    url(r'^galeria/$', 'tagged_object_list', {'gallery': True}, name='gallery'),
+    url(r'^galeria/$', 'tagged_object_list', {'list_type': 'gallery'}, name='gallery'),
     url(r'^kolekcje/$', 'collections', name='catalogue_collections'),
 
     url(r'^lektury/$', 'tagged_object_list', name='book_list'),
     url(r'^lektury/(?P<slug>[a-zA-Z0-9-]+)/$', 'collection', name='collection'),
     url(r'^kolekcje/$', 'collections', name='catalogue_collections'),
 
     url(r'^lektury/$', 'tagged_object_list', name='book_list'),
     url(r'^lektury/(?P<slug>[a-zA-Z0-9-]+)/$', 'collection', name='collection'),
-    url(r'^audiobooki/$', 'audiobook_list', name='audiobook_list'),
+    url(r'^audiobooki/$', 'tagged_object_list', {'list_type': 'audiobooks'}, name='audiobook_list'),
     url(r'^daisy/$', 'daisy_list', name='daisy_list'),
     url(r'^tags/$', 'tags_starting_with', name='hint'),
     url(r'^jtags/?$', 'json_tags_starting_with', name='jhint'),
     url(r'^daisy/$', 'daisy_list', name='daisy_list'),
     url(r'^tags/$', 'tags_starting_with', name='hint'),
     url(r'^jtags/?$', 'json_tags_starting_with', name='jhint'),
@@ -93,7 +93,9 @@ urlpatterns += patterns(
     url(r'^c/(?P<pk>.+)/box\.(?P<lang>.+)\.html', 'collection_box', name='catalogue_collection_box'),
 
     # This should be the last pattern.
     url(r'^c/(?P<pk>.+)/box\.(?P<lang>.+)\.html', 'collection_box', name='catalogue_collection_box'),
 
     # This should be the last pattern.
-    url(r'^galeria/(?P<tags>[a-zA-Z0-9-/]*)/$', 'tagged_object_list', {'gallery': True},
+    url(r'^galeria/(?P<tags>[a-zA-Z0-9-/]*)/$', 'tagged_object_list', {'list_type': 'gallery'},
         name='tagged_object_list_gallery'),
         name='tagged_object_list_gallery'),
+    url(r'^audiobooki/(?P<tags>[a-zA-Z0-9-/]*)/$', 'tagged_object_list', {'list_type': 'audiobooks'},
+        name='tagged_object_list_audiobooks'),
     url(r'^(?P<tags>[a-zA-Z0-9-/]*)/$', 'tagged_object_list', name='tagged_object_list'),
 )
     url(r'^(?P<tags>[a-zA-Z0-9-/]*)/$', 'tagged_object_list', name='tagged_object_list'),
 )
index 17b46cc..8f1ca2f 100644 (file)
@@ -107,9 +107,11 @@ def differentiate_tags(request, tags, ambiguous_slugs):
 
 
 # TODO: Rewrite this hellish piece of code which tries to do everything
 
 
 # TODO: Rewrite this hellish piece of code which tries to do everything
-def tagged_object_list(request, tags='', gallery=False):
+def tagged_object_list(request, tags='', list_type='default'):
     raw_tags = tags
     # preliminary tests and conditions
     raw_tags = tags
     # preliminary tests and conditions
+    gallery = list_type == 'gallery'
+    audiobooks = list_type == 'audiobooks'
     try:
         tags = Tag.get_tag_list(tags)
     except Tag.DoesNotExist:
     try:
         tags = Tag.get_tag_list(tags)
     except Tag.DoesNotExist:
@@ -134,14 +136,16 @@ def tagged_object_list(request, tags='', gallery=False):
         pass
 
     # beginning of digestion
         pass
 
     # beginning of digestion
-    theme_is_set = [tag for tag in tags if tag.category == 'theme']
-    shelf_is_set = [tag for tag in tags if tag.category == 'set']
+    theme_is_set = any(tag.category == 'theme' for tag in tags)
+    shelf_is_set = any(tag.category == 'set' for tag in tags)
     only_shelf = shelf_is_set and len(tags) == 1
     only_shelf = shelf_is_set and len(tags) == 1
-    only_my_shelf = only_shelf and request.user.is_authenticated() and request.user == tags[0].user
+    only_my_shelf = only_shelf and request.user == tags[0].user
     tags_pks = [tag.pk for tag in tags]
 
     tags_pks = [tag.pk for tag in tags]
 
-    objects = None
+    if gallery and shelf_is_set:
+        raise Http404
 
 
+    daisy = None
     if theme_is_set:
         # Only fragments (or pirctureareas) here.
         shelf_tags = [tag for tag in tags if tag.category == 'set']
     if theme_is_set:
         # Only fragments (or pirctureareas) here.
         shelf_tags = [tag for tag in tags if tag.category == 'set']
@@ -152,12 +156,9 @@ def tagged_object_list(request, tags='', gallery=False):
             fragments = Fragment.tagged.with_all(fragment_tags)
 
         if shelf_tags:
             fragments = Fragment.tagged.with_all(fragment_tags)
 
         if shelf_tags:
-            if gallery:
-                # TODO: Pictures on shelves not supported yet.
-                raise Http404
-            else:
-                books = Book.tagged.with_all(shelf_tags).order_by()
-                fragments = fragments.filter(Q(book__in=books) | Q(book__ancestor__in=books))
+            # TODO: Pictures on shelves not supported yet.
+            books = Book.tagged.with_all(shelf_tags).order_by()
+            fragments = fragments.filter(Q(book__in=books) | Q(book__ancestor__in=books))
 
         categories = split_tags(
             Tag.objects.usage_for_queryset(fragments, counts=True).exclude(pk__in=tags_pks),
 
         categories = split_tags(
             Tag.objects.usage_for_queryset(fragments, counts=True).exclude(pk__in=tags_pks),
@@ -166,14 +167,11 @@ def tagged_object_list(request, tags='', gallery=False):
         objects = fragments
     else:
         if gallery:
         objects = fragments
     else:
         if gallery:
-            if shelf_is_set:
-                # TODO: Pictures on shelves not supported yet.
-                raise Http404
+            # TODO: Pictures on shelves not supported yet.
+            if tags:
+                objects = Picture.tagged.with_all(tags)
             else:
             else:
-                if tags:
-                    objects = Picture.tagged.with_all(tags)
-                else:
-                    objects = Picture.objects.all()
+                objects = Picture.objects.all()
             areas = PictureArea.objects.filter(picture__in=objects)
             categories = split_tags(
                 Tag.objects.usage_for_queryset(
             areas = PictureArea.objects.filter(picture__in=objects)
             categories = split_tags(
                 Tag.objects.usage_for_queryset(
@@ -201,6 +199,14 @@ def tagged_object_list(request, tags='', gallery=False):
                 # WTF: was outside if, overwriting value assigned if shelf_is_set
                 related_book_tags = get_top_level_related_tags(tags)
 
                 # WTF: was outside if, overwriting value assigned if shelf_is_set
                 related_book_tags = get_top_level_related_tags(tags)
 
+            if audiobooks:
+                if objects != all_books:
+                    all_books = all_books.filter(media__type__in=('mp3', 'ogg')).distinct()
+                    objects = objects.filter(media__type__in=('mp3', 'ogg')).distinct()
+                else:
+                    all_books = objects = objects.filter(media__type__in=('mp3', 'ogg')).distinct()
+                daisy = objects.filter(media__type='daisy').distinct().order_by('sort_key_author', 'sort_key')
+
             fragments = Fragment.objects.filter(book__in=all_books)
 
             categories = split_tags(
             fragments = Fragment.objects.filter(book__in=all_books)
 
             categories = split_tags(
@@ -219,7 +225,8 @@ def tagged_object_list(request, tags='', gallery=False):
 
     if not gallery and not objects and len(tags) == 1:
         tag = tags[0]
 
     if not gallery and not objects and len(tags) == 1:
         tag = tags[0]
-        if (tag.category in ('theme', 'thing') and PictureArea.tagged.with_any([tag]).exists() or
+        if tag.category in ('theme', 'thing') and (
+                PictureArea.tagged.with_any([tag]).exists() or
                 Picture.tagged.with_any([tag]).exists()):
             return redirect('tagged_object_list_gallery', raw_tags, permanent=False)
 
                 Picture.tagged.with_any([tag]).exists()):
             return redirect('tagged_object_list_gallery', raw_tags, permanent=False)
 
@@ -235,7 +242,8 @@ def tagged_object_list(request, tags='', gallery=False):
             'tag_ids': tags_pks,
             'theme_is_set': theme_is_set,
             'best': best,
             'tag_ids': tags_pks,
             'theme_is_set': theme_is_set,
             'best': best,
-            'gallery': gallery,
+            'list_type': list_type,
+            'daisy': daisy,
         },
         context_instance=RequestContext(request))
 
         },
         context_instance=RequestContext(request))