# 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: build_custom_pdf.delay(self.book.id,
- self.cleaned_data['cust'], p),
+ 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)
from celery.task import task
from django.conf import settings
from wolnelektury.utils import localtime_to_utc
+from waiter.models import WaitedFile
# TODO: move to model?
@task(ignore_result=True, rate_limit=settings.CATALOGUE_CUSTOMPDF_RATE_LIMIT)
-def build_custom_pdf(book_id, customizations, file_name):
+def build_custom_pdf(book_id, customizations, file_name, waiter_id=None):
"""Builds a custom PDF file."""
- from django.core.files import File
- from django.core.files.storage import DefaultStorage
- from catalogue.models import Book
-
- print "will gen %s" % DefaultStorage().path(file_name)
- if not DefaultStorage().exists(file_name):
- kwargs = {
- 'cover': True,
- }
- if 'no-cover' in customizations:
- kwargs['cover'] = False
- customizations.remove('no-cover')
- pdf = Book.objects.get(pk=book_id).wldocument().as_pdf(
- customizations=customizations,
- morefloats=settings.LIBRARIAN_PDF_MOREFLOATS,
- **kwargs)
- DefaultStorage().save(file_name, File(open(pdf.get_filename())))
+ try:
+ from django.core.files import File
+ from django.core.files.storage import DefaultStorage
+ from catalogue.models import Book
+
+ print "will gen %s" % DefaultStorage().path(file_name)
+ if not DefaultStorage().exists(file_name):
+ kwargs = {
+ 'cover': True,
+ }
+ if 'no-cover' in customizations:
+ kwargs['cover'] = False
+ customizations.remove('no-cover')
+ pdf = Book.objects.get(pk=book_id).wldocument().as_pdf(
+ customizations=customizations,
+ morefloats=settings.LIBRARIAN_PDF_MOREFLOATS,
+ **kwargs)
+ DefaultStorage().save(file_name, File(open(pdf.get_filename())))
+ finally:
+ if waiter_id is not None:
+ WaitedFile.objects.filter(pk=waiter_id).delete()
cls.objects.count() < WAITER_MAX_QUEUE
)
- def is_stale(self):
- if self.task is None:
- # Race; just let the other task roll.
- return False
- if self.task.status not in (u'PENDING', u'STARTED', u'SUCCESS', u'RETRY'):
- return True
- return False
-
@classmethod
def order(cls, path, task_creator, description=None):
"""
if not already:
waited, created = cls.objects.get_or_create(path=path)
if created or waited.is_stale():
- waited.task = task_creator(check_abspath(path))
+ waited.task = task_creator(check_abspath(path), waited.pk)
waited.task_id = waited.task.task_id
waited.description = description
waited.save()