diff --git a/apps/documents/views.py b/apps/documents/views.py index 193da2293c..57afa89990 100644 --- a/apps/documents/views.py +++ b/apps/documents/views.py @@ -22,9 +22,8 @@ from converter import TRANFORMATION_CHOICES from filetransfers.api import serve_file from filesystem_serving.api import document_create_fs_links, document_delete_fs_links from filesystem_serving.conf.settings import FILESERVING_ENABLE -from ocr.models import add_document_to_queue from permissions.api import check_permissions - +from ocr.views import submit_document_to_queue from documents.conf.settings import DELETE_STAGING_FILE_AFTER_UPLOAD from documents.conf.settings import USE_STAGING_DIRECTORY @@ -107,9 +106,7 @@ def document_create_sibling(request, document_id, multiple=True): def _handle_save_document(request, document, form=None): if AUTOMATIC_OCR: - document_queue = add_document_to_queue(document) - messages.success(request, _(u'Document: %(document)s was added to the OCR queue: %(queue)s.') % { - 'document':document, 'queue':document_queue.label}) + submit_document_to_queue(request, document) if form and 'document_type_available_filenames' in form.cleaned_data: if form.cleaned_data['document_type_available_filenames']: diff --git a/apps/ocr/exceptions.py b/apps/ocr/exceptions.py new file mode 100644 index 0000000000..388e83c978 --- /dev/null +++ b/apps/ocr/exceptions.py @@ -0,0 +1,2 @@ +class AlreadyQueued(Exception): + pass diff --git a/apps/ocr/models.py b/apps/ocr/models.py index 1bd5b350ee..3344016341 100644 --- a/apps/ocr/models.py +++ b/apps/ocr/models.py @@ -8,14 +8,23 @@ from documents.models import Document from literals import DOCUMENTQUEUE_STATE_STOPPED,\ DOCUMENTQUEUE_STATE_CHOICES, QUEUEDOCUMENT_STATE_PENDING,\ QUEUEDOCUMENT_STATE_CHOICES +from exceptions import AlreadyQueued - -def add_document_to_queue(document, queue_name='default'): - document_queue = DocumentQueue.objects.get(name=queue_name) - queue_document = QueueDocument(document_queue=document_queue, document=document) - queue_document.save() - return document_queue +class DocumentQueueManager(models.Manager): + def queue_document(self, document, queue_name='default'): + print 'self', self + print 'document', document + print 'queue_name', queue_name + document_queue = DocumentQueue.objects.get(name=queue_name) + if QueueDocument.objects.filter(document_queue=document_queue, document=document).count(): + raise AlreadyQueued + + queue_document = QueueDocument(document_queue=document_queue, document=document) + queue_document.save() + + return document_queue + class DocumentQueue(models.Model): name = models.CharField(max_length=64, unique=True, verbose_name=_(u'name')) @@ -25,17 +34,15 @@ class DocumentQueue(models.Model): default=DOCUMENTQUEUE_STATE_STOPPED, verbose_name=_(u'state')) + objects = DocumentQueueManager() + class Meta: verbose_name = _(u'document queue') verbose_name_plural = _(u'document queues') def __unicode__(self): return self.label - - def add_document(self, document): - queue_document = QueueDocument(document_queue=self, document=document) - queue_document.save() - + class QueueDocument(models.Model): document_queue = models.ForeignKey(DocumentQueue, verbose_name=_(u'document queue')) diff --git a/apps/ocr/views.py b/apps/ocr/views.py index 76c46c89ef..13217fbd65 100644 --- a/apps/ocr/views.py +++ b/apps/ocr/views.py @@ -15,10 +15,11 @@ from documents.models import Document from ocr import PERMISSION_OCR_DOCUMENT, PERMISSION_OCR_DOCUMENT_DELETE, \ PERMISSION_OCR_QUEUE_ENABLE_DISABLE -from models import DocumentQueue, QueueDocument, add_document_to_queue +from models import DocumentQueue, QueueDocument from literals import QUEUEDOCUMENT_STATE_PENDING, \ QUEUEDOCUMENT_STATE_PROCESSING, QUEUEDOCUMENT_STATE_ERROR, \ DOCUMENTQUEUE_STATE_STOPPED, DOCUMENTQUEUE_STATE_ACTIVE +from exceptions import AlreadyQueued def queue_document_list(request, queue_name='default'): @@ -72,19 +73,30 @@ def queue_document_delete(request, queue_document_id): }) - -def submit_document(request, document_id, queue_name='default'): +def submit_document(request, document_id): check_permissions(request.user, 'ocr', [PERMISSION_OCR_DOCUMENT]) document = get_object_or_404(Document, pk=document_id) + return submit_document_to_queue(request, document=document, + post_submit_redirect=request.META['HTTP_REFERER']) + + +def submit_document_to_queue(request, document, post_submit_redirect=None): + """This view is meant to be reusable""" - document_queue = get_object_or_404(DocumentQueue, name=queue_name) - add_document_to_queue(document, document_queue.name) - - messages.success(request, _(u'Document: %(document)s was added to the OCR queue: %(queue)s.') % { - 'document':document, 'queue':document_queue.label}) - return HttpResponseRedirect(request.META['HTTP_REFERER']) + try: + document_queue = DocumentQueue.objects.queue_document(document) + messages.success(request, _(u'Document: %(document)s was added to the OCR queue: %(queue)s.') % { + 'document':document, 'queue':document_queue.label}) + except AlreadyQueued: + messages.warning(request, _(u'Document: %(document)s is already queued.') % { + 'document':document}) + except Exception, e: + messages.error(request, e) + if post_submit_redirect: + return HttpResponseRedirect(post_submit_redirect) + def re_queue_document(request, queue_document_id): check_permissions(request.user, 'ocr', [PERMISSION_OCR_DOCUMENT]) diff --git a/docs/Changelog.txt b/docs/Changelog.txt index de77026ad2..25f7d27698 100644 --- a/docs/Changelog.txt +++ b/docs/Changelog.txt @@ -1,3 +1,6 @@ +2011-Mar-11 +* Don't allow duplicate documents in queues + 2011-Mar-10 * Added new setting: side bar search box diff --git a/docs/TODO b/docs/TODO index b047bbaf12..f46e8d9423 100644 --- a/docs/TODO +++ b/docs/TODO @@ -52,6 +52,7 @@ Main ==== * Diagnostics (document file <-> document db entry mismatches, orphan files) * Sidebar search - DONE +* Convert home and about views to use generic_template Common ====== @@ -63,6 +64,7 @@ Common * Default button linking to 'Enter' and ESC key for cancel * Dismiss all messages * Sidebar multi item action box +* Show big icons in confirmation prompts (ie: document delete) Permissions =========== @@ -151,4 +153,7 @@ OCR * Allow for OCR document requeue on error and requeue limit * Multiple ocr queue support - STARTED * Add per node max ocr concurrent execution +* Don't allow duplicate documents in queues - STARTED +* OCR queue schedule support +* Make automatic OCR a function of OCR app and not of Documents app (via signals)