diff --git a/Rasaddam_Backend/asgi.py b/Rasaddam_Backend/asgi.py index dff3d01..7a739a7 100644 --- a/Rasaddam_Backend/asgi.py +++ b/Rasaddam_Backend/asgi.py @@ -7,10 +7,27 @@ For more information on this file, see https://docs.djangoproject.com/en/5.2/howto/deployment/asgi/ """ +# import os +# +# from django.core.asgi import get_asgi_application +# +# os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Rasaddam_Backend.settings') +# +# application = get_asgi_application() + import os - +from channels.routing import ProtocolTypeRouter, URLRouter from django.core.asgi import get_asgi_application +from channels.auth import AuthMiddlewareStack +from apps.authentication.websocket import routing -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Rasaddam_Backend.settings') +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "your_project_name.settings") -application = get_asgi_application() +application = ProtocolTypeRouter({ + "http": get_asgi_application(), + "websocket": AuthMiddlewareStack( + URLRouter( + routing.websocket_urlpatterns + ) + ), +}) \ No newline at end of file diff --git a/Rasaddam_Backend/settings.py b/Rasaddam_Backend/settings.py index aec1d3c..74f9dff 100644 --- a/Rasaddam_Backend/settings.py +++ b/Rasaddam_Backend/settings.py @@ -44,6 +44,8 @@ sentry_sdk.init( profile_lifecycle="trace", ) +ASGI_APPLICATION = "Rasaddam_Backend.asgi.application" # noqa + ALLOWED_HOSTS = [ 'localhost', '127.0.0.1', diff --git a/apps/authentication/tasks.py b/apps/authentication/tasks.py index 8be0274..8d96e4a 100644 --- a/apps/authentication/tasks.py +++ b/apps/authentication/tasks.py @@ -4,9 +4,5 @@ from apps.product.models import SaleUnit @shared_task(bind=True) def task_func(self): - print("sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss") - sale_unit = SaleUnit.objects.get(id=1) - print(sale_unit.unit) - sale_unit.trash = True - sale_unit.save() + print("Task Is Running.....") return 'Done' diff --git a/apps/authentication/websocket/__init__.py b/apps/authentication/websocket/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/authentication/websocket/consumer.py b/apps/authentication/websocket/consumer.py new file mode 100644 index 0000000..b83f826 --- /dev/null +++ b/apps/authentication/websocket/consumer.py @@ -0,0 +1,30 @@ +from channels.generic.websocket import AsyncWebsocketConsumer +from apps.product.models import SaleUnit +from asgiref.sync import sync_to_async +import json + + +@sync_to_async +def get_unit(unit_id=None): + unit = SaleUnit.objects.get(id=int(unit_id)) + return unit + + +class MyConsumer(AsyncWebsocketConsumer): + async def connect(self): + await self.accept() + await self.send(text_data=json.dumps({"message": "Connected!"})) + + async def disconnect(self, close_code): + print("WebSocket disconnected!") + + async def receive(self, text_data): + data = json.loads(text_data) + message = data.get("message") + unit = await get_unit(int(message)) + print("Received:", message) + + # پاسخ به کلاینت + await self.send(text_data=json.dumps({ + "message": unit + })) diff --git a/apps/authentication/websocket/routing.py b/apps/authentication/websocket/routing.py new file mode 100644 index 0000000..039587f --- /dev/null +++ b/apps/authentication/websocket/routing.py @@ -0,0 +1,6 @@ +from django.urls import re_path +from apps.authentication.websocket import consumer + +websocket_urlpatterns = [ + re_path(r"ws/somepath/$", consumer.MyConsumer.as_asgi()), +] \ No newline at end of file diff --git a/apps/product/migrations/0050_remove_quotabrokervalue_value.py b/apps/product/migrations/0050_remove_quotabrokervalue_value.py new file mode 100644 index 0000000..e3bb31d --- /dev/null +++ b/apps/product/migrations/0050_remove_quotabrokervalue_value.py @@ -0,0 +1,17 @@ +# Generated by Django 5.0 on 2025-07-19 10:59 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('product', '0049_alter_quota_limit_by_organizations'), + ] + + operations = [ + migrations.RemoveField( + model_name='quotabrokervalue', + name='value', + ), + ] diff --git a/apps/product/migrations/0051_quotabrokervalue_value.py b/apps/product/migrations/0051_quotabrokervalue_value.py new file mode 100644 index 0000000..5f04a1a --- /dev/null +++ b/apps/product/migrations/0051_quotabrokervalue_value.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0 on 2025-07-19 10:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('product', '0050_remove_quotabrokervalue_value'), + ] + + operations = [ + migrations.AddField( + model_name='quotabrokervalue', + name='value', + field=models.PositiveBigIntegerField(default=0), + ), + ] diff --git a/apps/product/models.py b/apps/product/models.py index 203cf90..b445707 100644 --- a/apps/product/models.py +++ b/apps/product/models.py @@ -450,7 +450,7 @@ class QuotaBrokerValue(BaseModel): on_delete=models.CASCADE, related_name='values' ) - value = models.DecimalField(max_digits=12, decimal_places=2) + value = models.PositiveBigIntegerField(default=0) def __str__(self): return f"Quota ({self.quota.id}) for Broker({self.broker.organization.name})" diff --git a/requirements.txt b/requirements.txt index 8553987..059161d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -78,4 +78,7 @@ tinydb django-simple-history sentry_sdk django-celery-beat -django-celery-results \ No newline at end of file +django-celery-results +channels +channels_redis +daphne \ No newline at end of file