From da55220db2a74abd50897569d0ded37fb59e564e Mon Sep 17 00:00:00 2001 From: Mojtaba-z Date: Mon, 6 Oct 2025 15:24:55 +0330 Subject: [PATCH] notification deployment - v3 --- apps/notification/pos/api/v1/api.py | 7 +-- apps/notification/signals.py | 43 +++++++++++++++++++ .../api/v1/viewsets/quota_distribution_api.py | 8 ---- apps/warehouse/web/api/v1/api.py | 22 +++------- 4 files changed, 54 insertions(+), 26 deletions(-) diff --git a/apps/notification/pos/api/v1/api.py b/apps/notification/pos/api/v1/api.py index 6756ed1..4f251e1 100644 --- a/apps/notification/pos/api/v1/api.py +++ b/apps/notification/pos/api/v1/api.py @@ -26,11 +26,12 @@ class NotificationViewSet(SoftDeleteMixin, POSDeviceMixin, DynamicSearchMixin, v is_read=False ) - # set notifications delivered status to true - # queryset.update(delivered=True) - # paginate & response page = self.paginate_queryset(queryset) + + # set notifications delivered status to true + queryset.update(delivered=True) + if page is not None: serializer = self.get_serializer(page, many=True) return self.get_paginated_response(serializer.data) diff --git a/apps/notification/signals.py b/apps/notification/signals.py index e69de29..8ba4aaa 100644 --- a/apps/notification/signals.py +++ b/apps/notification/signals.py @@ -0,0 +1,43 @@ +from django.db.models.signals import post_save +from django.dispatch import receiver +from apps.warehouse.models import InventoryEntry +from apps.warehouse.models import product_models +from .models import Notification +from django.db import transaction + + +@receiver(post_save, sender=InventoryEntry) +def create_inventory_entry_notification(sender, instance, created, **kwargs): + """ Create notification for organization after inventory entry creation """ + + if not created: + return + + def _create_notification(): + # create notification for organization on pos device + Notification.objects.create( + organization=instance.organization, + title=f" {inventory_entry.distribution.distribution_id} ورودی جدید به انبار از توزیع با کد ", # noqa + message=f' مقدار {inventory_entry.distribution.weight} کیلوگرم' # noqa + f' از توزیع با کد {inventory_entry.distribution.distribution_id} به انبار ورود خورده است ', # noqa + type='inventory', + ) + + transaction.on_commit(_create_notification) + +@receiver(post_save, sender=product_models.QuotaDistribution) # noqa +def create_quota_distribution_notification(sender, instance, created, **kwargs): + if not created: + return + + def _create_notification(): + # create notification for organization on pos device + Notification.objects.create( + organization=instance.assigned_organization, + title=f" {distribution.quota.quota_id} توزیع جدید به شما از سهمیه با کد ", # noqa + message=f' مقدار {distribution.weight} کیلوگرم' # noqa + f' از سهمیه با کد {distribution.quota.quota_id} به شما توزیع شده است ', # noqa + type='inventory', + ) + + transaction.on_commit(_create_notification) diff --git a/apps/product/web/api/v1/viewsets/quota_distribution_api.py b/apps/product/web/api/v1/viewsets/quota_distribution_api.py index bca1f70..88a75a4 100644 --- a/apps/product/web/api/v1/viewsets/quota_distribution_api.py +++ b/apps/product/web/api/v1/viewsets/quota_distribution_api.py @@ -64,14 +64,6 @@ class QuotaDistributionViewSet(SoftDeleteMixin, viewsets.ModelViewSet, DynamicSe if serializer.is_valid(): distribution = serializer.save() - # create notification for organization on pos device - Notification.objects.create( - organization=organization, - title=f" {distribution.quota.quota_id} توزیع جدید به شما از سهمیه با کد ", # noqa - message=f' مقدار {distribution.weight} کیلوگرم' # noqa - f' از سهمیه با کد {distribution.quota.quota_id} به شما توزیع شده است ', # noqa - type='inventory', - ) return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN) diff --git a/apps/warehouse/web/api/v1/api.py b/apps/warehouse/web/api/v1/api.py index aa18c0a..0d22072 100644 --- a/apps/warehouse/web/api/v1/api.py +++ b/apps/warehouse/web/api/v1/api.py @@ -62,25 +62,17 @@ class InventoryEntryViewSet(SoftDeleteMixin, viewsets.ModelViewSet, DynamicSearc 'organization': organization.id, 'balance': inventory_balance }) + serializer = self.serializer_class(data=request.data) - if serializer.is_valid(): - inventory_entry = serializer.save() + serializer.is_valid(raise_exception=True) - # upload document for confirmation entry - if 'document' in request.data.keys(): - self.upload_confirmation_document(request, inventory=inventory_entry.id) + inventory_entry = serializer.save() - # create notification for organization on pos device - Notification.objects.create( - organization=organization, - title=f" {inventory_entry.distribution.distribution_id} ورودی جدید به انبار از توزیع با کد ", # noqa - message=f' مقدار {inventory_entry.distribution.weight} کیلوگرم' # noqa - f' از توزیع با کد {inventory_entry.distribution.distribution_id} به انبار ورود خورده است ', # noqa - type='inventory', - ) + # upload document for confirmation entry + if 'document' in request.data.keys(): + self.upload_confirmation_document(request, inventory=inventory_entry.id) - return Response(serializer.data, status=status.HTTP_201_CREATED) - return Response(serializer.errors, status=status.HTTP_403_FORBIDDEN) + return Response(serializer.data, status=status.HTTP_201_CREATED) @transaction.atomic def update(self, request, pk=None, *args, **kwargs):