From aae8a623a8d2fbc6edf6cfc5f070c161084f37be Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Wed, 24 Sep 2014 10:18:57 +0200 Subject: [PATCH] Make custom PDF task clean up after itself. --- apps/catalogue/forms.py | 4 ++-- apps/catalogue/tasks.py | 41 +++++++++++++++++++++++------------------ apps/waiter/models.py | 10 +--------- apps/waiter/views.py | 2 -- 4 files changed, 26 insertions(+), 31 deletions(-) diff --git a/apps/catalogue/forms.py b/apps/catalogue/forms.py index 480eddff7..d52310bd3 100644 --- a/apps/catalogue/forms.py +++ b/apps/catalogue/forms.py @@ -100,8 +100,8 @@ class CustomPDFForm(forms.Form): # 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) diff --git a/apps/catalogue/tasks.py b/apps/catalogue/tasks.py index 159494e0f..e392ae2da 100644 --- a/apps/catalogue/tasks.py +++ b/apps/catalogue/tasks.py @@ -7,6 +7,7 @@ from traceback import print_exc 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? @@ -30,22 +31,26 @@ def index_book(book_id, book_info=None, **kwargs): @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() diff --git a/apps/waiter/models.py b/apps/waiter/models.py index e64e4dbba..bffaf7f8a 100644 --- a/apps/waiter/models.py +++ b/apps/waiter/models.py @@ -39,14 +39,6 @@ class WaitedFile(models.Model): 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): """ @@ -61,7 +53,7 @@ class WaitedFile(models.Model): 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() diff --git a/apps/waiter/views.py b/apps/waiter/views.py index 0892ca91b..b951cc4c8 100644 --- a/apps/waiter/views.py +++ b/apps/waiter/views.py @@ -17,8 +17,6 @@ def wait(request, path): else: file_url = "" waiting = get_object_or_404(WaitedFile, path=path) - if waiting.is_stale(): - waiting = None if request.is_ajax(): return HttpResponse(file_url) -- 2.20.1