X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/b2d342589a7889a3b096e7192453d53bd28eed7d..ca8f4e8fef80cb603117ed579da8554f503698e5:/src/pdcounter/models.py diff --git a/src/pdcounter/models.py b/src/pdcounter/models.py index 69c70c1c0..622dc46d1 100644 --- a/src/pdcounter/models.py +++ b/src/pdcounter/models.py @@ -1,48 +1,59 @@ -# -*- coding: utf-8 -*- -# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. -# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# This file is part of Wolne Lektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Wolne Lektury. See NOTICE for more information. # +from django.apps import apps from django.conf import settings from django.db import models -from django.db.models import permalink -from django.utils.translation import ugettext_lazy as _ +from django.urls import reverse from datetime import datetime from django.db.models.signals import post_save, post_delete +from search.utils import UnaccentSearchVector class Author(models.Model): - name = models.CharField(_('name'), max_length=50, db_index=True) - slug = models.SlugField(_('slug'), max_length=120, db_index=True, unique=True) - sort_key = models.CharField(_('sort key'), max_length=120, db_index=True) - description = models.TextField(_('description'), blank=True) - death = models.IntegerField(_(u'year of death'), blank=True, null=True) + name = models.CharField('imię i nazwisko', max_length=50, db_index=True) + slug = models.SlugField('slug', max_length=120, db_index=True, unique=True) + sort_key = models.CharField('klucz sortowania', max_length=120, db_index=True) + description = models.TextField('opis', blank=True) + death = models.IntegerField('rok śmierci', blank=True, null=True) gazeta_link = models.CharField(blank=True, max_length=240) wiki_link = models.CharField(blank=True, max_length=240) class Meta: ordering = ('sort_key',) - verbose_name = _('author') - verbose_name_plural = _('authors') + verbose_name = 'autor' + verbose_name_plural = 'autorzy' @property def category(self): return "author" - def __unicode__(self): + def __str__(self): return self.name def __repr__(self): return "Author(slug=%r)" % self.slug - @permalink def get_absolute_url(self): - return 'catalogue.views.tagged_object_list', [self.url_chunk] + return reverse('tagged_object_list', args=[self.url_chunk]) def has_description(self): return len(self.description) > 0 - has_description.short_description = _('description') + has_description.short_description = 'opis' has_description.boolean = True + @classmethod + def search(cls, query, qs=None): + Tag = apps.get_model('catalogue', 'Tag') + if qs is None: + qs = cls.objects.all() + pd_authors = qs.annotate(search_vector=UnaccentSearchVector('name')).filter(search_vector=query) + existing_slugs = Tag.objects.filter( + category='author', slug__in=list(pd_authors.values_list('slug', flat=True))) \ + .values_list('slug', flat=True) + pd_authors = pd_authors.exclude(slug__in=existing_slugs) + return pd_authors + def alive(self): return self.death is None @@ -60,23 +71,34 @@ class Author(models.Model): class BookStub(models.Model): - title = models.CharField(_('title'), max_length=120) - author = models.CharField(_('author'), max_length=120) - pd = models.IntegerField(_('goes to public domain'), null=True, blank=True) - slug = models.SlugField(_('slug'), max_length=120, unique=True, db_index=True) - translator = models.TextField(_('translator'), blank=True) + title = models.CharField('tytuł', max_length=120) + author = models.CharField('autor', max_length=120) + pd = models.IntegerField('trafia do domeny publicznej', null=True, blank=True) + slug = models.SlugField('slug', max_length=120, unique=True, db_index=True) + translator = models.TextField('tłumacz', blank=True) class Meta: ordering = ('title',) - verbose_name = _('book stub') - verbose_name_plural = _('book stubs') + verbose_name = 'zapowiedź książki' + verbose_name_plural = 'zapowiedzi książek' - def __unicode__(self): + def __str__(self): return self.title - @permalink + @classmethod + def search(cls, query, qs=None): + Book = apps.get_model('catalogue', 'Book') + if qs is None: + qs = cls.objects.all() + pd_books = qs.annotate(search_vector=UnaccentSearchVector('title')).filter(search_vector=query) + existing_slugs = Book.objects.filter( + slug__in=list(pd_books.values_list('slug', flat=True))) \ + .values_list('slug', flat=True) + pd_books = pd_books.exclude(slug__in=existing_slugs) + return pd_books + def get_absolute_url(self): - return 'catalogue.views.book_detail', [self.slug] + return reverse('book_detail', args=[self.slug]) def in_pd(self): return self.pd is not None and self.pd <= datetime.now().year @@ -87,15 +109,3 @@ class BookStub(models.Model): def pretty_title(self, html_links=False): return ', '.join((self.author, self.title)) - - -if not settings.NO_SEARCH_INDEX: - def update_index(sender, instance, **kwargs): - from search.index import Index - idx = Index() - idx.index_tags(instance, remove_only='created' not in kwargs) - - post_delete.connect(update_index, Author) - post_delete.connect(update_index, BookStub) - post_save.connect(update_index, Author) - post_save.connect(update_index, BookStub)