diff --git a/chats/apps/api/v1/external/rooms/viewsets.py b/chats/apps/api/v1/external/rooms/viewsets.py index 5652cd78..aafe78b5 100644 --- a/chats/apps/api/v1/external/rooms/viewsets.py +++ b/chats/apps/api/v1/external/rooms/viewsets.py @@ -2,7 +2,7 @@ from django.conf import settings from django.core.exceptions import ObjectDoesNotExist, ValidationError -from django.db import IntegrityError, transaction +from django.db import IntegrityError from django.utils import timezone from rest_framework import status, viewsets from rest_framework.decorators import action @@ -15,8 +15,8 @@ from chats.apps.api.v1.external.rooms.serializers import RoomFlowSerializer from chats.apps.api.v1.internal.rest_clients.flows_rest_client import FlowRESTClient from chats.apps.dashboard.models import RoomMetrics -from chats.apps.dashboard.tasks import close_metrics from chats.apps.rooms.models import Room +from chats.apps.rooms.views import close_room def add_user_or_queue_to_room(instance, request): @@ -68,11 +68,7 @@ def close( if not settings.ACTIVATE_CALC_METRICS: return Response(serialized_data.data, status=status.HTTP_200_OK) - transaction.on_commit( - lambda: close_metrics.apply_async( - args=[str(instance.pk)], queue=settings.METRICS_CUSTOM_QUEUE - ) - ) + close_room(str(instance.pk)) return Response(serialized_data.data, status=status.HTTP_200_OK) def create(self, request, *args, **kwargs): diff --git a/chats/apps/api/v1/rooms/viewsets.py b/chats/apps/api/v1/rooms/viewsets.py index 4e298ee8..13a167bd 100644 --- a/chats/apps/api/v1/rooms/viewsets.py +++ b/chats/apps/api/v1/rooms/viewsets.py @@ -19,7 +19,7 @@ ) from chats.apps.dashboard.models import RoomMetrics from chats.apps.rooms.models import Room -from chats.celery import app as celery_app +from chats.apps.rooms.views import close_room class RoomViewset( @@ -111,8 +111,7 @@ def close( if not settings.ACTIVATE_CALC_METRICS: return Response(serialized_data.data, status=status.HTTP_200_OK) - close_metrics = celery_app.send_task("close_metrics", args=[str(instance.pk)]) - close_metrics.wait() + close_room(str(instance.pk)) return Response(serialized_data.data, status=status.HTTP_200_OK) def perform_create(self, serializer): diff --git a/chats/apps/dashboard/tasks.py b/chats/apps/dashboard/tasks.py index ea0f79ce..726ccd07 100644 --- a/chats/apps/dashboard/tasks.py +++ b/chats/apps/dashboard/tasks.py @@ -3,8 +3,7 @@ from chats.celery import app -@app.task(name="close_metrics") -def close_metrics(room: str): +def generate_metrics(room: str): room = Room.objects.get(pk=room) messages_contact = ( room.messages.filter(contact__isnull=False).order_by("created_on").first() @@ -30,3 +29,8 @@ def close_metrics(room: str): metric_room.message_response_time = difference_time metric_room.interaction_time = interaction_time.total_seconds() metric_room.save() + + +@app.task(name="close_metrics") +def close_metrics(room: str): + generate_metrics(room) diff --git a/chats/apps/rooms/views.py b/chats/apps/rooms/views.py new file mode 100644 index 00000000..95b28d92 --- /dev/null +++ b/chats/apps/rooms/views.py @@ -0,0 +1,14 @@ +from django.conf import settings +from django.db import transaction + +from chats.apps.dashboard.tasks import close_metrics, generate_metrics + + +def close_room(room_pk: str): + if settings.USE_CELERY: + transaction.on_commit( + lambda: close_metrics.apply_async( + args=[room_pk], queue=settings.METRICS_CUSTOM_QUEUE + ) + ) + generate_metrics(room_pk) diff --git a/chats/settings.py b/chats/settings.py index 4a6d647f..f4c18996 100644 --- a/chats/settings.py +++ b/chats/settings.py @@ -366,6 +366,7 @@ METRICS_CUSTOM_QUEUE = env("METRICS_CUSTOM_QUEUE", default="celery") +USE_CELERY = env.bool("USE_CELERY", default=False) CELERY_BROKER_URL = env.str("CELERY_BROKER_URL", default=REDIS_URL) CELERY_RESULT_BACKEND = env.str("CELERY_RESULT_BACKEND", default="django-db") CELERY_ACCEPT_CONTENT = ["application/json"]