diff --git a/django_geosource/models.py b/django_geosource/models.py index d85695f..466208b 100644 --- a/django_geosource/models.py +++ b/django_geosource/models.py @@ -1,4 +1,6 @@ import json +import sys +from io import BytesIO from datetime import datetime, timedelta from enum import Enum, IntEnum, auto @@ -6,6 +8,7 @@ import psycopg2 import pyexcel from celery.result import AsyncResult +from celery.utils.log import LoggingProxy from django.conf import settings from django.contrib.gis.gdal.error import GDALException from django.contrib.gis.geos import GEOSGeometry @@ -400,6 +403,18 @@ class CommandSource(Source): def refresh_data(self): layer = self.get_layer() begin_date = datetime.now() + + try: + # wheter we are in a celery task ? + if isinstance(sys.stdout, LoggingProxy): + # Hack to be able to launch command with mondrian logging + sys.stdout.buffer = BytesIO() + sys.stdout.encoding = None + sys.stderr.buffer = BytesIO() + sys.stderr.encoding = None + except AttributeError: + pass + call_command(self.command) self.clear_features(layer, begin_date) diff --git a/django_geosource/tasks.py b/django_geosource/tasks.py index 907b3f9..17046a3 100644 --- a/django_geosource/tasks.py +++ b/django_geosource/tasks.py @@ -29,7 +29,10 @@ def run_model_object_method(self, app, model, pk, method, success_state=states.S try: obj = Model.objects.get(pk=pk) + + logger.info(f"Call method {method} on {obj}") state = {"action": method, **getattr(obj, method)()} + logger.info(f"Method {method} on {obj} ended") self.update_state(state=success_state, meta=state) diff --git a/django_geosource/views.py b/django_geosource/views.py index 6ca138f..a9e288d 100644 --- a/django_geosource/views.py +++ b/django_geosource/views.py @@ -41,7 +41,9 @@ def refresh(self, request, pk): source = self.get_object() - refresh_job = source.run_async_method("refresh_data") + force_refresh = request.query_params.get("force") + + refresh_job = source.run_async_method("refresh_data", force=force_refresh) if refresh_job: return Response(data=source.get_status(), status=status.HTTP_202_ACCEPTED)