diff --git a/requirements/requirements.txt b/requirements/requirements.txt index 84841b0bf..395c8d38c 100644 --- a/requirements/requirements.txt +++ b/requirements/requirements.txt @@ -26,6 +26,9 @@ unipath==1.1 WeasyPrint==44 Pillow==5.1.0 gunicorn==19.9.0 +celery>=4.0 +celery-haystack==0.10 +redis>=2.10.5 pysolr==3.6.0 diff --git a/sapl/__init__.py b/sapl/__init__.py index e69de29bb..9e0d95fd7 100644 --- a/sapl/__init__.py +++ b/sapl/__init__.py @@ -0,0 +1,3 @@ +from .celery import app as celery_app + +__all__ = ('celery_app',) \ No newline at end of file diff --git a/sapl/base/email_utils.py b/sapl/base/email_utils.py index 7c23dd2da..baebea842 100644 --- a/sapl/base/email_utils.py +++ b/sapl/base/email_utils.py @@ -13,6 +13,7 @@ from sapl.settings import EMAIL_SEND_USER from sapl.utils import mail_service_configured from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import ugettext_lazy as _ def load_email_templates(templates, context={}): @@ -115,8 +116,9 @@ def do_envia_email_confirmacao(base_url, casa, tipo, doc_mat, destinatario): # Envia email de confirmacao para atualizações de tramitação # + logger = logging.getLogger(__name__) + if not mail_service_configured(): - logger = logging.getLogger(__name__) logger.warning(_('Servidor de email não configurado.')) return @@ -264,4 +266,5 @@ def do_envia_email_tramitacao(base_url, tipo, doc_mat, status, unidade_destino): raise Exception( 'Erro ao enviar e-mail de acompanhamento de matéria.') + connection.close() diff --git a/sapl/base/receivers.py b/sapl/base/receivers.py index a45c0bc44..7df85c9a2 100644 --- a/sapl/base/receivers.py +++ b/sapl/base/receivers.py @@ -1,11 +1,12 @@ from django.db.models.signals import post_delete from django.dispatch import receiver -from sapl.base.email_utils import do_envia_email_tramitacao from sapl.base.signals import tramitacao_signal from sapl.protocoloadm.models import TramitacaoAdministrativo from sapl.utils import get_base_url +from .tasks import task_envia_email_tramitacao + @receiver(tramitacao_signal) def handle_tramitacao_signal(sender, **kwargs): @@ -18,12 +19,8 @@ def handle_tramitacao_signal(sender, **kwargs): tipo = "materia" doc_mat = tramitacao.materia - do_envia_email_tramitacao( - get_base_url(request), - tipo, - doc_mat, - tramitacao.status, - tramitacao.unidade_tramitacao_destino) + task_envia_email_tramitacao.delay(get_base_url(request), tipo, doc_mat.id, + tramitacao.status.id, tramitacao.unidade_tramitacao_destino.id) @receiver(post_delete) diff --git a/sapl/base/search_indexes.py b/sapl/base/search_indexes.py index 359fbd44b..d2acb7c8e 100644 --- a/sapl/base/search_indexes.py +++ b/sapl/base/search_indexes.py @@ -8,9 +8,10 @@ from django.template import loader from haystack import connections from haystack.constants import Indexable from haystack.fields import CharField -from haystack.indexes import SearchIndex from haystack.utils import get_model_ct_tuple +from celery_haystack.indexes import CelerySearchIndex + from sapl.compilacao.models import (STATUS_TA_IMMUTABLE_PUBLIC, STATUS_TA_PUBLIC, Dispositivo) from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa @@ -117,7 +118,7 @@ class TextExtractField(CharField): 'extracted': self.extract_data(obj)}) -class DocumentoAcessorioIndex(SearchIndex, Indexable): +class DocumentoAcessorioIndex(CelerySearchIndex, Indexable): model = DocumentoAcessorio text = TextExtractField( document=True, use_template=True, diff --git a/sapl/base/tasks.py b/sapl/base/tasks.py new file mode 100644 index 000000000..e477767ac --- /dev/null +++ b/sapl/base/tasks.py @@ -0,0 +1,21 @@ +from sapl.celery import app +from sapl.base.email_utils import do_envia_email_tramitacao +from sapl.materia.models import StatusTramitacao, UnidadeTramitacao, MateriaLegislativa +from sapl.protocoloadm.models import StatusTramitacaoAdministrativo, DocumentoAdministrativo + + +@app.task(queue='email_queue') +def task_envia_email_tramitacao(base_url, tipo, doc_mat_id, + tramitacao_status_id, tramitacao_unidade_tramitacao_destino_id): + if tipo == 'documento': + doc_mat = DocumentoAdministrativo.objects.get(id=doc_mat_id) + status = StatusTramitacaoAdministrativo.objects.get(id=tramitacao_status_id) + + elif tipo == 'materia': + doc_mat = MateriaLegislativa.objects.get(id=doc_mat_id) + status = StatusTramitacao.objects.get(id=tramitacao_status_id) + + unidade_destino = UnidadeTramitacao.objects.get(id=tramitacao_unidade_tramitacao_destino_id) + + do_envia_email_tramitacao(base_url, tipo, doc_mat, status, unidade_destino) + diff --git a/sapl/celery.py b/sapl/celery.py new file mode 100644 index 000000000..4495c0620 --- /dev/null +++ b/sapl/celery.py @@ -0,0 +1,10 @@ +import os +from celery import Celery +from django.conf import settings + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sapl.settings') +app = Celery('sapl') +app.config_from_object('django.conf:settings', namespace='CELERY') + + +app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) \ No newline at end of file diff --git a/sapl/settings.py b/sapl/settings.py index c7647242b..2f257a4e3 100644 --- a/sapl/settings.py +++ b/sapl/settings.py @@ -94,7 +94,10 @@ INSTALLED_APPS = ( 'reversion', 'reversion_compare', + 'django_celery_results', 'haystack', + 'celery_haystack', + 'whoosh', 'speedinfo', 'webpack_loader', @@ -116,7 +119,7 @@ SOLR_URL = config('SOLR_URL', cast=str, default='http://localhost:8983') SOLR_COLLECTION = config('SOLR_COLLECTION', cast=str, default='sapl') if USE_SOLR: - HAYSTACK_SIGNAL_PROCESSOR = 'haystack.signals.RealtimeSignalProcessor' # enable auto-index + HAYSTACK_SIGNAL_PROCESSOR = 'celery_haystack.signals.CelerySignalProcessor' # enable auto-index SEARCH_BACKEND = 'haystack.backends.solr_backend.SolrEngine' SEARCH_URL = ('URL', '{}/solr/{}'.format(SOLR_URL, SOLR_COLLECTION)) @@ -130,6 +133,11 @@ HAYSTACK_CONNECTIONS = { }, } +CELERY_BROKER_URL = 'redis://localhost:6379' + +CELERY_RESULT_BACKEND = 'django-db' + + MIDDLEWARE = [ 'reversion.middleware.RevisionMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware',