X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/9a6638c3bf05511aa43d6511436014921f00b169..cb5f5e940b246fe7ae76206bf2aa27c78a82a1aa:/apps/catalogue/models.py?ds=inline diff --git a/apps/catalogue/models.py b/apps/catalogue/models.py index 9c943ca75..8411f477e 100644 --- a/apps/catalogue/models.py +++ b/apps/catalogue/models.py @@ -8,7 +8,6 @@ from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.models import User from django.core.files import File from django.template.loader import render_to_string -from django.template.defaultfilters import slugify from django.utils.safestring import mark_safe from django.utils.translation import get_language from django.core.urlresolvers import reverse @@ -22,6 +21,7 @@ from catalogue.fields import JSONField from librarian import dcparser, html, epub, NoDublinCore from mutagen import id3 +from slughifi import slughifi TAG_CATEGORIES = ( @@ -156,16 +156,16 @@ class Tag(TagBase): # TODO: why is this hard-coded ? -def book_upload_path(ext=None): +def book_upload_path(ext=None, maxlen=100): def get_dynamic_path(media, filename, ext=ext): # how to put related book's slug here? if not ext: ext = media.type if not media.name: - name = slugify(filename.split(".")[0]) + name = slughifi(filename.split(".")[0]) else: - name = slugify(media.name) - return 'lektura/%s.%s' % (name, ext) + name = slughifi(media.name) + return 'lektura/%s.%s' % (name[:(maxlen-len('lektura/.%s' % ext))], ext) return get_dynamic_path @@ -184,14 +184,14 @@ class BookMedia(models.Model): verbose_name = _('book media') verbose_name_plural = _('book media') - def save(self, force_insert=False, force_update=False): - media = super(BookMedia, self).save(force_insert, force_update) + def save(self, force_insert=False, force_update=False, **kwargs): + media = super(BookMedia, self).save(force_insert, force_update, **kwargs) if self.type == 'mp3': file = self.file extra_info = self.get_extra_info_value() extra_info.update(self.get_mp3_info()) self.set_extra_info_value(extra_info) - media = super(BookMedia, self).save(force_insert, force_update) + media = super(BookMedia, self).save(force_insert, force_update, **kwargs) return media def get_mp3_info(self): @@ -479,7 +479,7 @@ class Book(models.Model): @classmethod - def from_xml_file(cls, xml_file, overwrite=False, build_epub=True): + def from_xml_file(cls, xml_file, **kwargs): # use librarian to parse meta-data book_info = dcparser.parse(xml_file) @@ -487,14 +487,14 @@ class Book(models.Model): xml_file = File(open(xml_file)) try: - return cls.from_text_and_meta(xml_file, book_info, overwrite, build_epub=build_epub) + return cls.from_text_and_meta(xml_file, book_info, **kwargs) finally: xml_file.close() @classmethod def from_text_and_meta(cls, raw_file, book_info, overwrite=False, build_epub=True, build_txt=True): + import re from tempfile import NamedTemporaryFile - from slughifi import slughifi from markupstring import MarkupString from django.core.files.storage import default_storage @@ -511,6 +511,8 @@ class Book(models.Model): # Read book metadata book_base, book_slug = book_info.url.rsplit('/', 1) + if re.search(r'[^a-zA-Z0-9-]', book_slug): + raise ValueError('Invalid characters in slug') book, created = Book.objects.get_or_create(slug=book_slug) if created: