import traceback
import re
import itertools
-from operator import itemgetter
+from operator import itemgetter
from django.conf import settings
from django.template import RequestContext
'tags': [tag]
})
return render_to_response('catalogue/differentiate_tags.html',
- {'tags': tags, 'options': options, 'unparsed': ambiguous_slugs[1:]},
+ {'tags': tags, 'options': options, 'unparsed': ambiguous_slugs[1:]},
context_instance=RequestContext(request))
raise Http404
theme_is_set = [tag for tag in tags if tag.category == 'theme']
- shelf_is_set = len(tags) == 1 and tags[0].category == 'set'
- my_shelf_is_set = shelf_is_set and request.user.is_authenticated() and request.user == tags[0].user
+ shelf_is_set = [tag for tag in tags if tag.category == 'set']
+ 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
objects = only_author = pd_counter = None
categories = {}
fragments = models.Fragment.tagged.with_any(l_tags, fragments)
# newtagging goes crazy if we just try:
- #related_tags = models.Tag.objects.usage_for_queryset(fragments, counts=True,
+ #related_tags = models.Tag.objects.usage_for_queryset(fragments, counts=True,
# extra={'where': ["catalogue_tag.category != 'book'"]})
fragment_keys = [fragment.pk for fragment in fragments]
if fragment_keys:
else:
# get relevant books and their tags
objects = models.Book.tagged.with_all(tags).order_by()
- l_tags = [book.book_tag() for book in objects]
- # eliminate descendants
- descendants_keys = [book.pk for book in models.Book.tagged.with_any(l_tags)]
- if descendants_keys:
- objects = objects.exclude(pk__in=descendants_keys)
-
+ if not shelf_is_set:
+ # eliminate descendants
+ l_tags = [book.book_tag() for book in objects]
+ descendants_keys = [book.pk for book in models.Book.tagged.with_any(l_tags)]
+ if descendants_keys:
+ objects = objects.exclude(pk__in=descendants_keys)
+
# get related tags from `tag_counter` and `theme_counter`
related_counts = {}
tags_pks = [tag.pk for tag in tags]
related_tags = [tag for tag in related_tags if tag not in tags]
for tag in related_tags:
tag.count = related_counts[tag.pk]
-
+
categories = split_tags(related_tags)
del related_tags
template_name='catalogue/tagged_object_list.html',
extra_context={
'categories': categories,
- 'shelf_is_set': shelf_is_set,
+ 'only_shelf': only_shelf,
'only_author': only_author,
'pd_counter': pd_counter,
- 'user_is_owner': my_shelf_is_set,
+ 'only_my_shelf': only_my_shelf,
'formats_form': forms.DownloadFormatsForm(),
'tags': tags,
def _no_diacritics_regexp(query):
""" returns a regexp for searching for a query without diacritics
-
+
should be locale-aware """
names = {
u'a':u'aąĄ', u'c':u'cćĆ', u'e':u'eęĘ', u'l': u'lłŁ', u'n':u'nńŃ', u'o':u'oóÓ', u's':u'sśŚ', u'z':u'zźżŹŻ',
def _word_starts_with(name, prefix):
"""returns a Q object getting models having `name` contain a word
starting with `prefix`
-
+
We define word characters as alphanumeric and underscore, like in JS.
-
+
Works for MySQL, PostgreSQL, Oracle.
For SQLite, _sqlite* version is substituted for this.
"""
kwargs = {}
prefix = _no_diacritics_regexp(unicode_re_escape(prefix))
- # can't use [[:<:]] (word start),
+ # can't use [[:<:]] (word start),
# but we want both `xy` and `(xy` to catch `(xyz)`
kwargs['%s__iregex' % name] = u"(^|[^[:alnum:]_])%s" % prefix
def _sqlite_word_starts_with(name, prefix):
- """ version of _word_starts_with for SQLite
-
+ """ version of _word_starts_with for SQLite
+
SQLite in Django uses Python re module
"""
kwargs = {}
def find_best_matches(query, user=None):
""" Finds a Book, Tag or Bookstub best matching a query.
-
+
Returns a with:
- zero elements when nothing is found,
- one element when a best result is found,
- more then one element on multiple exact matches
-
+
Raises a ValueError on too short a query.
"""
""""
Create a ZIP archive on disk and transmit it in chunks of 8KB,
without loading the whole file into memory. A similar approach can
- be used for large dynamic PDF files.
+ be used for large dynamic PDF files.
"""
shelf = get_object_or_404(models.Tag, slug=slug, category='set')
info = sys.exc_info()
exception = pprint.pformat(info[1])
tb = '\n'.join(traceback.format_tb(info[2]))
- _('Today is %(month)s, %(day)s.') % {'month': m, 'day': d}
return HttpResponse(_("An error occurred: %(exception)s\n\n%(tb)s") % {'exception':exception, 'tb':tb}, mimetype='text/plain')
return HttpResponse(_("Book imported successfully"))
else: