X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/cc9a57b827d7303c37f3b2d271e7c2f661d30e45..a6145bb10676f304d4a3de6789c383f1f9326055:/apps/waiter/models.py?ds=inline diff --git a/apps/waiter/models.py b/apps/waiter/models.py index 59eeea682..e64e4dbba 100644 --- a/apps/waiter/models.py +++ b/apps/waiter/models.py @@ -1,21 +1,25 @@ +# -*- coding: utf-8 -*- +# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# from os.path import join, isfile from django.core.urlresolvers import reverse from django.db import models -from djcelery.models import TaskMeta -from waiter.settings import WAITER_URL +from waiter.settings import WAITER_URL, WAITER_MAX_QUEUE from waiter.utils import check_abspath from picklefield import PickledObjectField class WaitedFile(models.Model): path = models.CharField(max_length=255, unique=True, db_index=True) + task_id = models.CharField(max_length=128, db_index=True, null=True, blank=True) task = PickledObjectField(null=True, editable=False) description = models.CharField(max_length=255, null=True, blank=True) @classmethod def exists(cls, path): """Returns opened file or None. - + `path` is relative to WAITER_ROOT. Won't open a path leading outside of WAITER_ROOT. """ @@ -28,9 +32,16 @@ class WaitedFile(models.Model): else: return False + @classmethod + def can_order(cls, path): + return (cls.objects.filter(path=path).exists() or + cls.exists(path) or + cls.objects.count() < WAITER_MAX_QUEUE + ) + def is_stale(self): if self.task is None: - # Race; just let the other task roll. + # 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 @@ -51,6 +62,7 @@ class WaitedFile(models.Model): waited, created = cls.objects.get_or_create(path=path) if created or waited.is_stale(): waited.task = task_creator(check_abspath(path)) + waited.task_id = waited.task.task_id waited.description = description waited.save() return reverse("waiter", args=[path])