Instead of inserting the path of the apps into the Python app, the apps are now referenced by their full import path. This solves name clashes with external or native Python libraries. Example: Mayan statistics app vs. Python new statistics library. Every app reference is now prepended with 'mayan.apps'. Existing config.yml files need to be updated manually. Signed-off-by: Roberto Rosario <roberto.rosario.gonzalez@gmail.com>
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 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)
|