98 lines
3.0 KiB
Python
98 lines
3.0 KiB
Python
from __future__ import unicode_literals
|
|
|
|
import logging
|
|
|
|
from django.apps import apps
|
|
from django.db import OperationalError
|
|
|
|
from mayan.apps.lock_manager.exceptions import LockError
|
|
from mayan.celery import app
|
|
|
|
from .literals import RETRY_DELAY
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@app.task(bind=True, default_retry_delay=RETRY_DELAY, max_retries=None, ignore_result=True)
|
|
def task_delete_empty(self):
|
|
IndexInstanceNode = apps.get_model(
|
|
app_label='document_indexing', model_name='IndexInstanceNode'
|
|
)
|
|
|
|
try:
|
|
IndexInstanceNode.objects.delete_empty()
|
|
except LockError as exception:
|
|
raise self.retry(exc=exception)
|
|
|
|
|
|
@app.task(bind=True, default_retry_delay=RETRY_DELAY, max_retries=None, ignore_result=True)
|
|
def task_index_document(self, document_id):
|
|
Document = apps.get_model(
|
|
app_label='documents', model_name='Document'
|
|
)
|
|
Index = apps.get_model(
|
|
app_label='document_indexing', model_name='Index'
|
|
)
|
|
|
|
try:
|
|
document = Document.objects.get(pk=document_id)
|
|
except Document.DoesNotExist:
|
|
# Document was deleted before we could execute, abort about
|
|
# updating
|
|
pass
|
|
else:
|
|
try:
|
|
Index.objects.index_document(document=document)
|
|
except OperationalError as exception:
|
|
logger.warning(
|
|
'Operational error while trying to index document: '
|
|
'%s; %s', document, exception
|
|
)
|
|
raise self.retry(exc=exception)
|
|
except LockError as exception:
|
|
logger.warning(
|
|
'Unable to acquire lock for document %s; %s ',
|
|
document, exception
|
|
)
|
|
raise self.retry(exc=exception)
|
|
|
|
|
|
@app.task(bind=True, default_retry_delay=RETRY_DELAY, ignore_result=True)
|
|
def task_rebuild_index(self, index_id):
|
|
Index = apps.get_model(
|
|
app_label='document_indexing', model_name='Index'
|
|
)
|
|
|
|
try:
|
|
index = Index.objects.get(pk=index_id)
|
|
index.rebuild()
|
|
except LockError as exception:
|
|
# This index is being rebuilt by another task, retry later
|
|
raise self.retry(exc=exception)
|
|
|
|
|
|
@app.task(bind=True, default_retry_delay=RETRY_DELAY, max_retries=None, ignore_result=True)
|
|
def task_remove_document(self, document_id):
|
|
Document = apps.get_model(
|
|
app_label='documents', model_name='Document'
|
|
)
|
|
IndexInstanceNode = apps.get_model(
|
|
app_label='document_indexing', model_name='IndexInstanceNode'
|
|
)
|
|
|
|
try:
|
|
document = Document.objects.get(pk=document_id)
|
|
except Document.DoesNotExist:
|
|
# Document was deleted before we could execute
|
|
# Since it was automatically removed from the document M2M
|
|
# we just now delete the empty instance nodes
|
|
try:
|
|
IndexInstanceNode.objects.delete_empty()
|
|
except LockError as exception:
|
|
raise self.retry(exc=exception)
|
|
else:
|
|
try:
|
|
IndexInstanceNode.objects.remove_document(document=document)
|
|
except LockError as exception:
|
|
raise self.retry(exc=exception)
|