From b97a9a26aeeaae4e7e3a673e5a11f2fd531c5f9a Mon Sep 17 00:00:00 2001 From: helllllllder Date: Mon, 31 Jul 2023 13:32:58 -0300 Subject: [PATCH] Revert "Feateure/metrics tasks (#248)" This reverts commit 086d8fb603089eb22da1ddc5a26c8e8a747b4fc4. --- chats/__init__.py | 5 - chats/apps/api/v1/external/rooms/viewsets.py | 6 - chats/apps/api/v1/rooms/viewsets.py | 41 +++- chats/apps/dashboard/tasks.py | 36 --- chats/apps/rooms/views.py | 12 - chats/celery.py | 22 -- chats/settings.py | 25 +- poetry.lock | 229 +------------------ pyproject.toml | 3 - 9 files changed, 48 insertions(+), 331 deletions(-) delete mode 100644 chats/apps/dashboard/tasks.py delete mode 100644 chats/celery.py diff --git a/chats/__init__.py b/chats/__init__.py index 5568b6d7..e69de29b 100644 --- a/chats/__init__.py +++ b/chats/__init__.py @@ -1,5 +0,0 @@ -# This will make sure the app is always imported when -# Django starts so that shared_task will use this app. -from .celery import app as celery_app - -__all__ = ("celery_app",) diff --git a/chats/apps/api/v1/external/rooms/viewsets.py b/chats/apps/api/v1/external/rooms/viewsets.py index 58767370..ee0ac7b3 100644 --- a/chats/apps/api/v1/external/rooms/viewsets.py +++ b/chats/apps/api/v1/external/rooms/viewsets.py @@ -1,6 +1,5 @@ import json -from django.conf import settings from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.db import IntegrityError from django.utils import timezone @@ -16,7 +15,6 @@ from chats.apps.dashboard.models import RoomMetrics from chats.apps.rooms.models import Room from chats.apps.rooms.views import ( - close_room, get_editable_custom_fields_room, update_custom_fields, update_flows_custom_fields, @@ -69,10 +67,6 @@ def close( instance.close(None, "agent") serialized_data = RoomFlowSerializer(instance=instance) instance.notify_queue("close") - if not settings.ACTIVATE_CALC_METRICS: - return Response(serialized_data.data, status=status.HTTP_200_OK) - - 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 09f6ade1..4cd3b9a5 100644 --- a/chats/apps/api/v1/rooms/viewsets.py +++ b/chats/apps/api/v1/rooms/viewsets.py @@ -18,9 +18,9 @@ TransferRoomSerializer, ) from chats.apps.dashboard.models import RoomMetrics +from chats.apps.msgs.models import Message from chats.apps.rooms.models import Room from chats.apps.rooms.views import ( - close_room, get_editable_custom_fields_room, update_custom_fields, update_flows_custom_fields, @@ -116,7 +116,44 @@ def close( if not settings.ACTIVATE_CALC_METRICS: return Response(serialized_data.data, status=status.HTTP_200_OK) - close_room(str(instance.pk)) + messages_contact = ( + Message.objects.filter(room=instance, contact__isnull=False) + .order_by("created_on") + .first() + ) + messages_agent = ( + Message.objects.filter(room=instance, user__isnull=False) + .order_by("created_on") + .first() + ) + + time_message_contact = 0 + time_message_agent = 0 + + if messages_agent and messages_contact: + time_message_agent = messages_agent.created_on.timestamp() + time_message_contact = messages_contact.created_on.timestamp() + else: + time_message_agent = 0 + time_message_contact = 0 + + difference_time = time_message_agent - time_message_contact + + interation_time = ( + Room.objects.filter(pk=instance.pk) + .aggregate( + avg_time=Sum( + F("ended_at") - F("created_on"), + ) + )["avg_time"] + .total_seconds() + ) + + metric_room = RoomMetrics.objects.get_or_create(room=instance)[0] + metric_room.message_response_time = difference_time + metric_room.interaction_time = interation_time + metric_room.save() + 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 deleted file mode 100644 index 726ccd07..00000000 --- a/chats/apps/dashboard/tasks.py +++ /dev/null @@ -1,36 +0,0 @@ -from chats.apps.dashboard.models import RoomMetrics -from chats.apps.rooms.models import Room -from chats.celery import app - - -def generate_metrics(room: str): - room = Room.objects.get(pk=room) - messages_contact = ( - room.messages.filter(contact__isnull=False).order_by("created_on").first() - ) - messages_agent = ( - room.messages.filter(user__isnull=False).order_by("created_on").first() - ) - - time_message_contact = 0 - time_message_agent = 0 - - if messages_agent and messages_contact: - time_message_agent = messages_agent.created_on.timestamp() - time_message_contact = messages_contact.created_on.timestamp() - else: - time_message_agent = 0 - time_message_contact = 0 - - difference_time = time_message_agent - time_message_contact - interaction_time = room.ended_at - room.created_on - - metric_room = RoomMetrics.objects.get_or_create(room=room)[0] - 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 index 639c7fb8..8c8902ce 100644 --- a/chats/apps/rooms/views.py +++ b/chats/apps/rooms/views.py @@ -1,22 +1,10 @@ from rest_framework import status from rest_framework.exceptions import APIException -from django.conf import settings -from django.db import transaction -from chats.apps.dashboard.tasks import close_metrics, generate_metrics from chats.apps.api.v1.internal.rest_clients.flows_rest_client import FlowRESTClient from chats.apps.rooms.models import Room -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) - def update_custom_fields(room: Room, custom_fields_update: dict): room.custom_fields.update(custom_fields_update) room.save() diff --git a/chats/celery.py b/chats/celery.py deleted file mode 100644 index 7147f189..00000000 --- a/chats/celery.py +++ /dev/null @@ -1,22 +0,0 @@ -import os - -from celery import Celery - -# Set the default Django settings module for the "celery" program. -os.environ.setdefault("DJANGO_SETTINGS_MODULE", "chats.settings") - -app = Celery("chats") - -# Using a string here means the worker doesn't have to serialize -# the configuration object to child processes. -# - namespace="CELERY" means all celery-related configuration keys -# should have a `CELERY_` prefix. -app.config_from_object("django.conf:settings", namespace="CELERY") - -# Load task modules from all registered Django apps. -app.autodiscover_tasks() - - -@app.task(bind=True) -def debug_task(self): - print("Request: {0!r}".format(self.request)) diff --git a/chats/settings.py b/chats/settings.py index e8571da5..d3e9ccb0 100644 --- a/chats/settings.py +++ b/chats/settings.py @@ -72,8 +72,6 @@ "rest_framework", "rest_framework.authtoken", "corsheaders", - "django_celery_beat", - "django_celery_results", ] MIDDLEWARE = [ @@ -107,17 +105,16 @@ WSGI_APPLICATION = "chats.wsgi.application" -ASGI_APPLICATION = "chats.asgi.application" - -REDIS_URL = env.str("CHANNEL_LAYERS_REDIS", default="redis://localhost:6379/1") - # channels +ASGI_APPLICATION = "chats.asgi.application" CHANNEL_LAYERS = { "default": { "BACKEND": "channels_redis.pubsub.RedisPubSubChannelLayer", "CONFIG": { - "hosts": [REDIS_URL], + "hosts": [ + env.str("CHANNEL_LAYERS_REDIS", default="redis://127.0.0.1:6379/1") + ], }, }, } @@ -125,7 +122,7 @@ CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", - "LOCATION": REDIS_URL, + "LOCATION": env.str("CHANNEL_LAYERS_REDIS", default="redis://127.0.0.1:6379/1"), "OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient"}, } } @@ -356,15 +353,3 @@ CHATS_FLOWS_TAG = env.str("CHATS_FLOWS_TAG", default="chats") CHATS_CACHE_TIME = env.int("CHATS_CACHE_TIME", default=1 * 60 * 60) - -# Celery - -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"] -CELERY_TASK_SERIALIZER = "json" -CELERY_RESULT_SERIALIZER = "json" -CELERY_TIMEZONE = TIME_ZONE diff --git a/poetry.lock b/poetry.lock index e1b0062f..dee022de 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,14 +1,3 @@ -[[package]] -name = "amqp" -version = "5.1.1" -description = "Low-level AMQP client for Python (fork of amqplib)." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -vine = ">=5.0.0" - [[package]] name = "anyio" version = "3.6.1" @@ -117,9 +106,6 @@ category = "main" optional = false python-versions = ">=3.6" -[package.dependencies] -tzdata = {version = "*", optional = true, markers = "extra == \"tzdata\""} - [package.extras] tzdata = ["tzdata"] @@ -143,14 +129,6 @@ test = ["coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "stestr toml = ["tomli (>=1.1.0)"] yaml = ["pyyaml"] -[[package]] -name = "billiard" -version = "4.1.0" -description = "Python multiprocessing fork with improvements and bugfixes" -category = "main" -optional = false -python-versions = ">=3.7" - [[package]] name = "black" version = "22.10.0" @@ -205,59 +183,6 @@ urllib3 = ">=1.25.4,<1.27" [package.extras] crt = ["awscrt (==0.14.0)"] -[[package]] -name = "celery" -version = "5.3.1" -description = "Distributed Task Queue." -category = "main" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -"backports.zoneinfo" = {version = ">=0.2.1", markers = "python_version < \"3.9\""} -billiard = ">=4.1.0,<5.0" -click = ">=8.1.2,<9.0" -click-didyoumean = ">=0.3.0" -click-plugins = ">=1.1.1" -click-repl = ">=0.2.0" -kombu = ">=5.3.1,<6.0" -python-dateutil = ">=2.8.2" -tzdata = ">=2022.7" -vine = ">=5.0.0,<6.0" - -[package.extras] -arangodb = ["pyArango (>=2.0.1)"] -auth = ["cryptography (==41.0.1)"] -azureblockblob = ["azure-storage-blob (>=12.15.0)"] -brotli = ["brotli (>=1.0.0)", "brotlipy (>=0.7.0)"] -cassandra = ["cassandra-driver (>=3.25.0,<4)"] -consul = ["python-consul2 (==0.1.5)"] -cosmosdbsql = ["pydocumentdb (==2.3.5)"] -couchbase = ["couchbase (>=3.0.0)"] -couchdb = ["pycouchdb (==1.14.2)"] -django = ["Django (>=2.2.28)"] -dynamodb = ["boto3 (>=1.26.143)"] -elasticsearch = ["elasticsearch (<8.0)"] -eventlet = ["eventlet (>=0.32.0)"] -gevent = ["gevent (>=1.5.0)"] -librabbitmq = ["librabbitmq (>=2.0.0)"] -memcache = ["pylibmc (==1.6.3)"] -mongodb = ["pymongo[srv] (>=4.0.2)"] -msgpack = ["msgpack (==1.0.5)"] -pymemcache = ["python-memcached (==1.59)"] -pyro = ["pyro4 (==4.82)"] -pytest = ["pytest-celery (==0.0.0)"] -redis = ["redis (>=4.5.2,!=4.5.5)"] -s3 = ["boto3 (>=1.26.143)"] -slmq = ["softlayer-messaging (>=1.0.3)"] -solar = ["ephem (==4.1.4)"] -sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] -sqs = ["boto3 (>=1.26.143)", "kombu[sqs] (>=5.3.0)", "urllib3 (>=1.26.16)", "pycurl (>=7.43.0.5)"] -tblib = ["tblib (>=1.3.0)", "tblib (>=1.5.0)"] -yaml = ["PyYAML (>=3.10)"] -zookeeper = ["kazoo (>=1.3.1)"] -zstd = ["zstandard (==0.21.0)"] - [[package]] name = "certifi" version = "2022.9.24" @@ -341,46 +266,6 @@ python-versions = ">=3.7" [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} -[[package]] -name = "click-didyoumean" -version = "0.3.0" -description = "Enables git-like *did-you-mean* feature in click" -category = "main" -optional = false -python-versions = ">=3.6.2,<4.0.0" - -[package.dependencies] -click = ">=7" - -[[package]] -name = "click-plugins" -version = "1.1.1" -description = "An extension module for click to enable registering CLI commands via setuptools entry-points." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -click = ">=4.0" - -[package.extras] -dev = ["pytest (>=3.6)", "pytest-cov", "wheel", "coveralls"] - -[[package]] -name = "click-repl" -version = "0.3.0" -description = "REPL plugin for Click" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -click = ">=7.0" -prompt-toolkit = ">=3.0.36" - -[package.extras] -testing = ["pytest-cov (>=4.0.0)", "pytest (>=7.2.1)", "tox (>=4.4.3)"] - [[package]] name = "colorama" version = "0.4.5" @@ -425,17 +310,6 @@ python-versions = ">=3.7" [package.extras] toml = ["tomli"] -[[package]] -name = "cron-descriptor" -version = "1.4.0" -description = "A Python library that converts cron expressions into human readable strings." -category = "main" -optional = false -python-versions = "*" - -[package.extras] -dev = ["polib"] - [[package]] name = "cryptography" version = "38.0.1" @@ -489,35 +363,6 @@ tzdata = {version = "*", markers = "sys_platform == \"win32\""} argon2 = ["argon2-cffi (>=19.1.0)"] bcrypt = ["bcrypt"] -[[package]] -name = "django-celery-beat" -version = "2.5.0" -description = "Database-backed Periodic Tasks." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -"backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} -celery = ">=5.2.3,<6.0" -cron-descriptor = ">=1.2.32" -Django = ">=2.2,<5.0" -django-timezone-field = ">=5.0" -python-crontab = ">=2.3.4" -tzdata = "*" - -[[package]] -name = "django-celery-results" -version = "2.5.1" -description = "Celery result backends for Django." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -celery = ">=5.2.7,<6.0" -Django = ">=3.2.18" - [[package]] name = "django-cors-headers" version = "3.13.0" @@ -908,37 +753,6 @@ dev = ["pytest", "tox"] docs = ["Sphinx (>=1.0)", "sphinx-rtd-theme (>=1.0)"] tests = ["coverage (>=4.0)", "flake8 (<4)", "isort", "mypy", "pytest-cov", "pytest-flake8 (>=0.5)", "pytest (>=2.8.0)", "types-pyopenssl", "types-pyrfc3339", "types-requests", "types-setuptools"] -[[package]] -name = "kombu" -version = "5.3.1" -description = "Messaging library for Python." -category = "main" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -amqp = ">=5.1.1,<6.0.0" -"backports.zoneinfo" = {version = ">=0.2.1", extras = ["tzdata"], markers = "python_version < \"3.9\""} -typing-extensions = {version = "*", markers = "python_version < \"3.10\""} -vine = "*" - -[package.extras] -azureservicebus = ["azure-servicebus (>=7.10.0)"] -azurestoragequeues = ["azure-identity (>=1.12.0)", "azure-storage-queue (>=12.6.0)"] -confluentkafka = ["confluent-kafka (==2.1.1)"] -consul = ["python-consul2"] -librabbitmq = ["librabbitmq (>=2.0.0)"] -mongodb = ["pymongo (>=4.1.1)"] -msgpack = ["msgpack"] -pyro = ["pyro4"] -qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"] -redis = ["redis (>=4.5.2)"] -slmq = ["softlayer-messaging (>=1.0.3)"] -sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] -sqs = ["boto3 (>=1.26.143)", "urllib3 (>=1.26.16)", "pycurl (>=7.43.0.5)"] -yaml = ["PyYAML (>=3.10)"] -zookeeper = ["kazoo (>=2.8.0)"] - [[package]] name = "lazy-object-proxy" version = "1.9.0" @@ -1244,7 +1058,7 @@ twisted = ["twisted"] name = "prompt-toolkit" version = "3.0.38" description = "Library for building powerful interactive command lines in Python" -category = "main" +category = "dev" optional = false python-versions = ">=3.7.0" @@ -1410,21 +1224,6 @@ wcwidth = "*" checkqa-mypy = ["mypy (==v0.761)"] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] -[[package]] -name = "python-crontab" -version = "2.7.1" -description = "Python Crontab API" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -python-dateutil = "*" - -[package.extras] -cron-description = ["cron-descriptor"] -cron-schedule = ["croniter"] - [[package]] name = "python-dateutil" version = "2.8.2" @@ -1694,7 +1493,7 @@ python-versions = ">=3.7" [[package]] name = "tzdata" -version = "2022.7" +version = "2022.4" description = "Provider of IANA time zone data" category = "main" optional = false @@ -1756,14 +1555,6 @@ dev = ["Cython (>=0.29.32,<0.30.0)", "pytest (>=3.6.0)", "Sphinx (>=4.1.2,<4.2.0 docs = ["Sphinx (>=4.1.2,<4.2.0)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)", "sphinx-rtd-theme (>=0.5.2,<0.6.0)"] test = ["flake8 (>=3.9.2,<3.10.0)", "psutil", "pycodestyle (>=2.7.0,<2.8.0)", "pyOpenSSL (>=22.0.0,<22.1.0)", "mypy (>=0.800)", "Cython (>=0.29.32,<0.30.0)", "aiohttp"] -[[package]] -name = "vine" -version = "5.0.0" -description = "Promises, promises, promises." -category = "main" -optional = false -python-versions = ">=3.6" - [[package]] name = "virtualenv" version = "20.21.0" @@ -1796,7 +1587,7 @@ anyio = ">=3.0.0,<4" name = "wcwidth" version = "0.2.5" description = "Measures the displayed width of unicode strings in a terminal" -category = "main" +category = "dev" optional = false python-versions = "*" @@ -1827,10 +1618,9 @@ python-versions = ">=3.6" [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "993ed6fb432a336721275dbda4dfd9ae8252f6cc8a33642db003a6c37681318b" +content-hash = "f80642b458f4d6362efb80fb3e2bd1d4141fdc66d3cd0c7f9b274006505eec1f" [metadata.files] -amqp = [] anyio = [] appnope = [] asgiref = [] @@ -1842,11 +1632,9 @@ attrs = [] backcall = [] "backports.zoneinfo" = [] bandit = [] -billiard = [] black = [] boto3 = [] botocore = [] -celery = [] certifi = [] cffi = [] cfgv = [] @@ -1854,20 +1642,14 @@ channels = [] channels-redis = [] charset-normalizer = [] click = [] -click-didyoumean = [] -click-plugins = [] -click-repl = [] colorama = [] coreapi = [] coreschema = [] coverage = [] -cron-descriptor = [] cryptography = [] decorator = [] distlib = [] django = [] -django-celery-beat = [] -django-celery-results = [] django-cors-headers = [] django-csp = [] django-environ = [] @@ -1897,7 +1679,6 @@ jedi = [] jinja2 = [] jmespath = [] josepy = [] -kombu = [] lazy-object-proxy = [] markdown-it-py = [] markupsafe = [] @@ -1939,7 +1720,6 @@ pymongo = [] pyopenssl = [] pyparsing = [] pytest = [] -python-crontab = [] python-dateutil = [] python-dotenv = [] python-magic = [] @@ -1968,7 +1748,6 @@ uritemplate = [] urllib3 = [] uvicorn = [] uvloop = [] -vine = [] virtualenv = [] watchfiles = [] wcwidth = [] diff --git a/pyproject.toml b/pyproject.toml index 8bb612f8..79e19aec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,9 +55,6 @@ openpyxl = "^3.1.2" XlsxWriter = "^3.1.0" django-redis = "^5.2.0" elastic-apm = "^6.10.1" -celery = "^5.3.1" -django-celery-results = "^2.5.1" -django-celery-beat = "^2.5.0" [tool.poetry.dev-dependencies] pytest = "^5.2"