X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/075fb07f19c2f20cd3b6818b973e7aebebdacc9f..0e79f07515678e3e678c3637124a27cb81ee8a94:/apps/catalogue/forms.py diff --git a/apps/catalogue/forms.py b/apps/catalogue/forms.py index b7bf249f8..d52310bd3 100644 --- a/apps/catalogue/forms.py +++ b/apps/catalogue/forms.py @@ -4,11 +4,12 @@ # from django import forms from django.utils.translation import ugettext_lazy as _ -from slughifi import slughifi -from catalogue.models import Tag, Book -from catalogue.fields import JQueryAutoCompleteSearchField -from catalogue import utils +from catalogue.models import Book +from waiter.models import WaitedFile +from django.core.exceptions import ValidationError +from catalogue.utils import get_customized_pdf_path +from catalogue.tasks import build_custom_pdf class BookImportForm(forms.Form): @@ -30,59 +31,6 @@ class BookImportForm(forms.Form): return Book.from_xml_file(self.cleaned_data['book_xml_file'], overwrite=True, **kwargs) -class SearchForm(forms.Form): - q = JQueryAutoCompleteSearchField('/newsearch/hint/') # {'minChars': 2, 'selectFirst': True, 'cacheLength': 50, 'matchContains': "word"}) - tags = forms.CharField(widget=forms.HiddenInput, required=False) - - book = forms.IntegerField(widget=forms.HiddenInput, min_value=0, required=False) - - def __init__(self, *args, **kwargs): - tags = kwargs.pop('tags', []) - book = kwargs.pop('book', None) - super(SearchForm, self).__init__(*args, **kwargs) - self.fields['q'].widget.attrs['title'] = _('title, author, theme/topic, epoch, kind, genre, phrase') - #self.fields['q'].widget.attrs['style'] = '' - self.fields['tags'].initial = '/'.join(tag.url_chunk for tag in Tag.get_tag_list(tags)) - if book is not None: - self.fields['book'].initial = book.id - - -class UserSetsForm(forms.Form): - def __init__(self, book, user, *args, **kwargs): - super(UserSetsForm, self).__init__(*args, **kwargs) - self.fields['set_ids'] = forms.ChoiceField( - choices=[(tag.id, tag.name) for tag in Tag.objects.filter(category='set', user=user)], - ) - - -class ObjectSetsForm(forms.Form): - def __init__(self, obj, user, *args, **kwargs): - super(ObjectSetsForm, self).__init__(*args, **kwargs) - self.fields['set_ids'] = forms.MultipleChoiceField( - label=_('Shelves'), - required=False, - choices=[(tag.id, "%s (%s)" % (tag.name, tag.book_count)) for tag in Tag.objects.filter(category='set', user=user)], - initial=[tag.id for tag in obj.tags.filter(category='set', user=user)], - widget=forms.CheckboxSelectMultiple - ) - - -class NewSetForm(forms.Form): - name = forms.CharField(max_length=50, required=True) - - def __init__(self, *args, **kwargs): - super(NewSetForm, self).__init__(*args, **kwargs) - self.fields['name'].widget.attrs['title'] = _('Name of the new shelf') - - 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 - - FORMATS = [(f, f.upper()) for f in Book.ebook_formats] @@ -91,54 +39,70 @@ class DownloadFormatsForm(forms.Form): widget=forms.CheckboxSelectMultiple) def __init__(self, *args, **kwargs): - super(DownloadFormatsForm, self).__init__(*args, **kwargs) - + super(DownloadFormatsForm, self).__init__(*args, **kwargs) -PDF_PAGE_SIZES = ( - ('a4paper', _('A4')), - ('a5paper', _('A5')), -) - -PDF_LEADINGS = ( - ('', _('Normal leading')), - ('onehalfleading', _('One and a half leading')), - ('doubleleading', _('Double leading')), +CUSTOMIZATION_FLAGS = ( + ('nofootnotes', _("Don't show footnotes")), + ('nothemes', _("Don't disply themes")), + ('nowlfont', _("Don't use our custom font")), + ('no-cover', _("Without cover")), ) - -PDF_FONT_SIZES = ( - ('11pt', _('Default')), - ('13pt', _('Big')) +CUSTOMIZATION_OPTIONS = ( + ('leading', _("Leading"), ( + ('', _('Normal leading')), + ('onehalfleading', _('One and a half leading')), + ('doubleleading', _('Double leading')), + )), + ('fontsize', _("Font size"), ( + ('', _('Default')), + ('13pt', _('Big')) + )), +# ('pagesize', _("Paper size"), ( +# ('a4paper', _('A4')), +# ('a5paper', _('A5')), +# )), ) class CustomPDFForm(forms.Form): - nofootnotes = forms.BooleanField(required=False, label=_("Don't show footnotes")) - nothemes = forms.BooleanField(required=False, label=_("Don't disply themes")) - nowlfont = forms.BooleanField(required=False, label=_("Don't use our custom font")) - ## pagesize = forms.ChoiceField(PDF_PAGE_SIZES, required=True, label=_("Paper size")) - leading = forms.ChoiceField(PDF_LEADINGS, required=False, label=_("Leading")) - fontsize = forms.ChoiceField(PDF_FONT_SIZES, required=True, label=_("Font size")) + def __init__(self, book, *args, **kwargs): + super(CustomPDFForm, self).__init__(*args, **kwargs) + self.book = book + for name, label in CUSTOMIZATION_FLAGS: + self.fields[name] = forms.BooleanField(required=False, label=label) + for name, label, choices in CUSTOMIZATION_OPTIONS: + self.fields[name] = forms.ChoiceField(choices, required=False, label=label) + + def clean(self): + self.cleaned_data['cust'] = self.customizations + self.cleaned_data['path'] = get_customized_pdf_path(self.book, + self.cleaned_data['cust']) + if not WaitedFile.can_order(self.cleaned_data['path']): + raise ValidationError(_('Queue is full. Please try again later.')) + return self.cleaned_data @property def customizations(self): c = [] - if self.cleaned_data['nofootnotes']: - c.append('nofootnotes') - - if self.cleaned_data['nothemes']: - c.append('nothemes') - - if self.cleaned_data['nowlfont']: - c.append('nowlfont') - - ## c.append(self.cleaned_data['pagesize']) - c.append(self.cleaned_data['fontsize']) - - if self.cleaned_data['leading']: - c.append(self.cleaned_data['leading']) - + for name, label in CUSTOMIZATION_FLAGS: + if self.cleaned_data.get(name): + c.append(name) + for name, label, choices in CUSTOMIZATION_OPTIONS: + option = self.cleaned_data.get(name) + if option: + c.append(option) c.sort() - return c + def save(self, *args, **kwargs): + if not self.cleaned_data['cust'] and self.book.pdf_file: + # Don't build with default options, just redirect to the standard file. + return {"redirect": self.book.pdf_file.url} + url = WaitedFile.order(self.cleaned_data['path'], + lambda p, waiter_id: build_custom_pdf.delay(self.book.id, + self.cleaned_data['cust'], p, waiter_id), + self.book.pretty_title() + ) + #return redirect(url) + return {"redirect": url}