X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/ec3ed54f52c0551fab881e2fa6009cdd6469559f..d5036b0a2531a84a0381053b1927aa1a23984ed0:/apps/catalogue/models.py diff --git a/apps/catalogue/models.py b/apps/catalogue/models.py index d8565c4bc..b12f933eb 100644 --- a/apps/catalogue/models.py +++ b/apps/catalogue/models.py @@ -33,7 +33,7 @@ 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, @@ -69,6 +69,12 @@ 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) @@ -77,11 +83,11 @@ class Book(models.Model): _short_html = models.TextField(_('short HTML'), editable=False) # Formats - xml_file = models.FileField(_('XML file'), upload_to='books/xml', blank=True) - html_file = models.FileField(_('HTML file'), upload_to='books/html', 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) - txt_file = models.FileField(_('TXT file'), upload_to='books/txt', 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') @@ -137,7 +143,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 = [] @@ -147,9 +154,12 @@ 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 @@ -176,13 +186,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 @@ -227,7 +243,10 @@ class Fragment(models.Model): {'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')