X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/c7c8dfb7ad2240ffc0135dbd9dd871c85f211a29..82fa12952975d2857e2eb02d66a7f133fd4d5e2e:/apps/catalogue/models.py diff --git a/apps/catalogue/models.py b/apps/catalogue/models.py index feccaedf4..f31dbe632 100644 --- a/apps/catalogue/models.py +++ b/apps/catalogue/models.py @@ -6,6 +6,7 @@ from django.contrib.auth.models import User from django.core.files import File from django.template.loader import render_to_string from django.utils.safestring import mark_safe +from django.core.urlresolvers import reverse from newtagging.models import TagBase from newtagging import managers @@ -33,13 +34,14 @@ class TagSubcategoryManager(models.Manager): class Tag(TagBase): - name = models.CharField(_('name'), max_length=50, unique=True, db_index=True) + name = models.CharField(_('name'), max_length=50, db_index=True) slug = models.SlugField(_('slug'), max_length=120, unique=True, 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) - description = models.TextField(blank=True) - + description = models.TextField(_('description'), blank=True) + main_page = models.BooleanField(_('main page'), default=False, db_index=True, help_text=_('Show tag on main page')) + user = models.ForeignKey(User, blank=True, null=True) def has_description(self): @@ -68,18 +70,26 @@ class Tag(TagBase): return TagBase.get_tag_list(tags) +def book_upload_path(ext): + def get_dynamic_path(book, filename): + return 'lektura/%s.%s' % (book.slug, ext) + return get_dynamic_path + + class Book(models.Model): title = models.CharField(_('title'), max_length=120) slug = models.SlugField(_('slug'), max_length=120, unique=True, db_index=True) description = models.TextField(_('description'), blank=True) created_at = models.DateTimeField(_('creation date'), auto_now=True) _short_html = models.TextField(_('short HTML'), editable=False) + parent_number = models.IntegerField(_('parent number'), default=0) # Formats - xml_file = models.FileField(_('XML file'), upload_to='books/xml', blank=True) - pdf_file = models.FileField(_('PDF file'), upload_to='books/pdf', blank=True) - odt_file = models.FileField(_('ODT file'), upload_to='books/odt', blank=True) - html_file = models.FileField(_('HTML file'), upload_to='books/html', blank=True) + xml_file = models.FileField(_('XML file'), upload_to=book_upload_path('xml'), blank=True) + html_file = models.FileField(_('HTML file'), upload_to=book_upload_path('html'), blank=True) + pdf_file = models.FileField(_('PDF file'), upload_to=book_upload_path('pdf'), blank=True) + odt_file = models.FileField(_('ODT file'), upload_to=book_upload_path('odt'), blank=True) + txt_file = models.FileField(_('TXT file'), upload_to=book_upload_path('txt'), blank=True) parent = models.ForeignKey('self', blank=True, null=True, related_name='children') @@ -96,14 +106,14 @@ class Book(models.Model): formats = [] if self.html_file: - formats.append(u'Czytaj online' % self.html_file.url) + formats.append(u'Czytaj online' % reverse('book_text', kwargs={'slug': self.slug})) if self.pdf_file: formats.append(u'Plik PDF' % self.pdf_file.url) if self.odt_file: formats.append(u'Plik ODT' % self.odt_file.url) - self._short_html = render_to_string('catalogue/book_short.html', - {'book': self, 'tags': tags, 'formats': formats}) + self._short_html = unicode(render_to_string('catalogue/book_short.html', + {'book': self, 'tags': tags, 'formats': formats})) self.save() return mark_safe(self._short_html) @@ -135,7 +145,8 @@ class Book(models.Model): # Read book metadata book_info = dcparser.parse(xml_file) - book = Book(title=book_info.title, slug=slughifi(book_info.title)) + book_base, book_slug = book_info.url.rsplit('/', 1) + book = Book(title=book_info.title, slug=book_slug) book.save() book_tags = [] @@ -145,17 +156,21 @@ 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(name=tag_name, - slug=slughifi(tag_name), sort_key=slughifi(tag_sort_key), category=category) - tag.save() + tag, created = Tag.objects.get_or_create(slug=slughifi(tag_name)) + if created: + tag.name = tag_name + tag.sort_key = slughifi(tag_sort_key) + tag.category = category + tag.save() book_tags.append(tag) book.tags = book_tags if hasattr(book_info, 'parts'): - for part_url in book_info.parts: + for part_url, n in enumerate(book_info.parts): base, slug = part_url.rsplit('/', 1) child_book = Book.objects.get(slug=slug) child_book.parent = book + child_book.parent_number = n child_book.save() # Save XML and HTML files @@ -174,13 +189,19 @@ class Book(models.Model): if (len(MarkupString(text)) > 240): short_text = unicode(MarkupString(text)[:160]) new_fragment = Fragment(text=text, short_text=short_text, anchor=fragment.id, book=book) - - theme_names = [s.strip() for s in fragment.themes.split(',')] + + try: + theme_names = [s.strip() for s in fragment.themes.split(',')] + except AttributeError: + continue themes = [] for theme_name in theme_names: - tag, created = Tag.objects.get_or_create(name=theme_name, - slug=slughifi(theme_name), sort_key=slughifi(theme_name), category='theme') - tag.save() + tag, created = Tag.objects.get_or_create(slug=slughifi(theme_name)) + if created: + tag.name = theme_name + tag.sort_key = slughifi(theme_name) + tag.category = 'theme' + tag.save() themes.append(tag) new_fragment.save() new_fragment.tags = list(book.tags) + themes @@ -207,7 +228,7 @@ class Fragment(models.Model): text = models.TextField() short_text = models.TextField(editable=False) _short_html = models.TextField(editable=False) - anchor = models.IntegerField() + anchor = models.CharField(max_length=120) book = models.ForeignKey(Book, related_name='fragments') objects = models.Manager() @@ -221,11 +242,14 @@ class Fragment(models.Model): book_authors = [u'%s' % (tag.get_absolute_url(), tag.name) for tag in self.book.tags if tag.category == 'author'] - self._short_html = render_to_string('catalogue/fragment_short.html', - {'fragment': self, 'book': self.book, 'book_authors': book_authors}) + self._short_html = unicode(render_to_string('catalogue/fragment_short.html', + {'fragment': self, 'book': self.book, 'book_authors': book_authors})) self.save() return mark_safe(self._short_html) - + + def get_absolute_url(self): + return '%s#m%s' % (self.book.html_file.url, self.anchor) + class Meta: ordering = ('book', 'anchor',) verbose_name = _('fragment')