def save(self, user, commit=True): name = self.cleaned_data['name'] new_set = Tag(name=name, slug=utils.get_random_hash(name), sort_key=name.lower(), category='set', user=user) new_set.save() return new_set
def analyse_tags(request, tag_str): try: tags = Tag.get_tag_list(tag_str) except Tag.DoesNotExist: # Perhaps the user is asking about an author in Public Domain # counter (they are not represented in tags) chunks = tag_str.split('/') if len(chunks) == 2 and chunks[0] == 'autor': raise ResponseInstead(pdcounter_views.author_detail(request, chunks[1])) else: raise Http404 except Tag.MultipleObjectsReturned as e: # Ask the user to disambiguate raise ResponseInstead(differentiate_tags(request, e.tags, e.ambiguous_slugs)) except Tag.UrlDeprecationWarning as e: raise ResponseInstead(HttpResponsePermanentRedirect( reverse('tagged_object_list', args=['/'.join(tag.url_chunk for tag in e.tags)]))) try: if len(tags) > settings.MAX_TAG_LIST: raise Http404 except AttributeError: pass return tags
def search(request): tags = request.GET.get('tags', '') prefix = request.GET.get('q', '') try: tag_list = Tag.get_tag_list(tags) except (Tag.DoesNotExist, Tag.MultipleObjectsReturned, Tag.UrlDeprecationWarning): tag_list = [] try: result = find_best_matches(prefix, request.user) except ValueError: return render_to_response( 'catalogue/search_too_short.html', {'tags': tag_list, 'prefix': prefix}, context_instance=RequestContext(request)) if len(result) == 1: return HttpResponseRedirect(_get_result_link(result[0], tag_list)) elif len(result) > 1: return render_to_response( 'catalogue/search_multiple_hits.html', { 'tags': tag_list, 'prefix': prefix, 'results': ((x, _get_result_link(x, tag_list), _get_result_type(x)) for x in result) }, context_instance=RequestContext(request)) else: form = PublishingSuggestForm(initial={"books": prefix + ", "}) return render_to_response( 'catalogue/search_no_hits.html', {'tags': tag_list, 'prefix': prefix, "pubsuggest_form": form}, context_instance=RequestContext(request))
def analyse_tags(request, tag_str): try: tags = Tag.get_tag_list(tag_str) except Tag.DoesNotExist: # Perhaps the user is asking about an author in Public Domain # counter (they are not represented in tags) chunks = tag_str.split('/') if len(chunks) == 2 and chunks[0] == 'autor': raise ResponseInstead(pdcounter_views.author_detail(request, chunks[1])) else: raise Http404 except Tag.MultipleObjectsReturned, e: # Ask the user to disambiguate raise ResponseInstead(differentiate_tags(request, e.tags, e.ambiguous_slugs))
def pretty_title(self, html_links=False): book = self rel_info = book.related_info() names = [(name, Tag.create_url('author', slug)) for name, slug in rel_info['tags']['author']] if 'parents' in rel_info: books = [(name, Book.create_url(slug)) for name, slug in rel_info['parents']] names.extend(reversed(books)) names.append((self.title, self.get_absolute_url())) if html_links: names = ['<a href="%s">%s</a>' % (tag[1], tag[0]) for tag in names] else: names = [tag[0] for tag in names] return ', '.join(names)
def analyse_tags(request, tag_str): try: tags = Tag.get_tag_list(tag_str) except Tag.DoesNotExist: # Perhaps the user is asking about an author in Public Domain # counter (they are not represented in tags) chunks = tag_str.split('/') if len(chunks) == 2 and chunks[0] == 'autor': raise ResponseInstead( pdcounter_views.author_detail(request, chunks[1])) else: raise Http404 except Tag.MultipleObjectsReturned, e: # Ask the user to disambiguate raise ResponseInstead( differentiate_tags(request, e.tags, e.ambiguous_slugs))
def search(request): tags = request.GET.get('tags', '') prefix = request.GET.get('q', '') try: tag_list = Tag.get_tag_list(tags) except (Tag.DoesNotExist, Tag.MultipleObjectsReturned, Tag.UrlDeprecationWarning): tag_list = [] try: result = find_best_matches(prefix, request.user) except ValueError: return render_to_response('catalogue/search_too_short.html', { 'tags': tag_list, 'prefix': prefix }, context_instance=RequestContext(request)) if len(result) == 1: return HttpResponseRedirect(_get_result_link(result[0], tag_list)) elif len(result) > 1: return render_to_response('catalogue/search_multiple_hits.html', { 'tags': tag_list, 'prefix': prefix, 'results': ((x, _get_result_link(x, tag_list), _get_result_type(x)) for x in result) }, context_instance=RequestContext(request)) else: form = PublishingSuggestForm(initial={"books": prefix + ", "}) return render_to_response('catalogue/search_no_hits.html', { 'tags': tag_list, 'prefix': prefix, "pubsuggest_form": form }, context_instance=RequestContext(request))
def hint(request): prefix = request.GET.get('term', '') if len(prefix) < 2: return JSONResponse([]) JVM.attachCurrentThread() search = get_search() hint = search.hint() try: tags = request.GET.get('tags', '') hint.tags(Tag.get_tag_list(tags)) except: pass # tagi beda ograniczac tutaj # ale tagi moga byc na ksiazce i na fragmentach # jezeli tagi dot tylko ksiazki, to wazne zeby te nowe byly w tej samej ksiazce # jesli zas dotycza themes, to wazne, zeby byly w tym samym fragmencie. tags = search.hint_tags(prefix, pdcounter=True) books = search.hint_books(prefix) def category_name(c): if c.startswith('pd_'): c = c[len('pd_'):] return _(c) return JSONResponse( [{'label': t.name, 'category': category_name(t.category), 'id': t.id, 'url': t.get_absolute_url()} for t in tags] + \ [{'label': b.title, 'category': _('book'), 'id': b.id, 'url': b.get_absolute_url()} for b in books])
def from_text_and_meta(cls, raw_file, book_info, overwrite=False, dont_build=None, search_index=True, search_index_tags=True, remote_gallery_url=None): if dont_build is None: dont_build = set() dont_build = set.union(set(dont_build), set(app_settings.DONT_BUILD)) # check for parts before we do anything children = [] if hasattr(book_info, 'parts'): for part_url in book_info.parts: try: children.append(Book.objects.get(slug=part_url.slug)) except Book.DoesNotExist: raise Book.DoesNotExist(_('Book "%s" does not exist.') % part_url.slug) # Read book metadata book_slug = book_info.url.slug if re.search(r'[^a-z0-9-]', book_slug): raise ValueError('Invalid characters in slug') book, created = Book.objects.get_or_create(slug=book_slug) if created: book_shelves = [] old_cover = None else: if not overwrite: raise Book.AlreadyExists(_('Book %s already exists') % book_slug) # Save shelves for this book book_shelves = list(book.tags.filter(category='set')) old_cover = book.cover_info() # Save XML file book.xml_file.save('%s.xml' % book.slug, raw_file, save=False) book.language = book_info.language book.title = book_info.title if book_info.variant_of: book.common_slug = book_info.variant_of.slug else: book.common_slug = book.slug book.extra_info = book_info.to_dict() book.save() meta_tags = Tag.tags_from_info(book_info) book.tags = set(meta_tags + book_shelves) cover_changed = old_cover != book.cover_info() obsolete_children = set(b for b in book.children.all() if b not in children) notify_cover_changed = [] for n, child_book in enumerate(children): new_child = child_book.parent != book child_book.parent = book child_book.parent_number = n child_book.save() if new_child or cover_changed: notify_cover_changed.append(child_book) # Disown unfaithful children and let them cope on their own. for child in obsolete_children: child.parent = None child.parent_number = 0 child.save() if old_cover: notify_cover_changed.append(child) cls.repopulate_ancestors() tasks.update_counters.delay() if remote_gallery_url: book.download_pictures(remote_gallery_url) # No saves beyond this point. # Build cover. if 'cover' not in dont_build: book.cover.build_delay() book.cover_thumb.build_delay() # Build HTML and ebooks. book.html_file.build_delay() if not children: for format_ in constants.EBOOK_FORMATS_WITHOUT_CHILDREN: if format_ not in dont_build: getattr(book, '%s_file' % format_).build_delay() for format_ in constants.EBOOK_FORMATS_WITH_CHILDREN: if format_ not in dont_build: getattr(book, '%s_file' % format_).build_delay() if not settings.NO_SEARCH_INDEX and search_index: tasks.index_book.delay(book.id, book_info=book_info, index_tags=search_index_tags) for child in notify_cover_changed: child.parent_cover_changed() book.save() # update sort_key_author cls.published.send(sender=cls, instance=book) return book
def tag_url(category, slug): return Tag.create_url(category, slug)
def __init__(self, *args, **kwargs): tags = kwargs.pop('tags', []) super(SearchForm, self).__init__(*args, **kwargs) self.fields['q'].widget.attrs['title'] = _('title, author, theme/topic, epoch, kind, genre') #self.fields['q'].widget.attrs['style'] = '' self.fields['tags'].initial = '/'.join(tag.url_chunk for tag in Tag.get_tag_list(tags))