diff --git a/apps/core/mixins/search_mixin.py b/apps/core/mixins/search_mixin.py index d26c5cb..d3c90a8 100644 --- a/apps/core/mixins/search_mixin.py +++ b/apps/core/mixins/search_mixin.py @@ -58,4 +58,4 @@ class ExcelDynamicSearchMixin: start=start, end=end, date_field=date_field - ).apply() \ No newline at end of file + ).apply() diff --git a/apps/notification/migrations/0002_notification_device.py b/apps/notification/migrations/0002_notification_device.py new file mode 100644 index 0000000..b72cea5 --- /dev/null +++ b/apps/notification/migrations/0002_notification_device.py @@ -0,0 +1,20 @@ +# Generated by Django 5.0 on 2025-10-07 05:35 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('notification', '0001_initial'), + ('pos_device', '0075_posfreeproducts_company_fee'), + ] + + operations = [ + migrations.AddField( + model_name='notification', + name='device', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='notifications', to='pos_device.device'), + ), + ] diff --git a/apps/notification/models.py b/apps/notification/models.py index b4df564..81568be 100644 --- a/apps/notification/models.py +++ b/apps/notification/models.py @@ -1,5 +1,6 @@ from apps.core.models import BaseModel from apps.authentication.models import Organization +from apps.pos_device.models import Device from django.db import models @@ -10,7 +11,12 @@ class Notification(BaseModel): ('transaction', 'Transaction'), ('system', 'System'), ) - + device = models.ForeignKey( + Device, + on_delete=models.CASCADE, + related_name='notifications', + null=True + ) organization = models.ForeignKey( Organization, on_delete=models.CASCADE, diff --git a/apps/notification/pos/api/v1/api.py b/apps/notification/pos/api/v1/api.py index 4f251e1..3d97ebd 100644 --- a/apps/notification/pos/api/v1/api.py +++ b/apps/notification/pos/api/v1/api.py @@ -20,7 +20,10 @@ class NotificationViewSet(SoftDeleteMixin, POSDeviceMixin, DynamicSearchMixin, v """ show all notification of device """ organization = self.get_device_organization() + device = self.get_pos_device() + queryset = self.queryset.filter( + device=device, organization=organization, delivered=False, is_read=False diff --git a/apps/notification/signals.py b/apps/notification/signals.py index 2df3d40..35fa917 100644 --- a/apps/notification/signals.py +++ b/apps/notification/signals.py @@ -2,6 +2,7 @@ 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 apps.pos_device.models import Device from .models import Notification from django.db import transaction @@ -15,29 +16,37 @@ def create_inventory_entry_notification(sender, instance, created, **kwargs): def _create_notification(): # create notification for organization on pos device - Notification.objects.create( - organization=instance.organization, - title=f" {instance.distribution.distribution_id} ورودی جدید به انبار از توزیع با کد ", # noqa - message=f' مقدار {instance.distribution.weight} کیلوگرم' # noqa - f' از توزیع با کد {instance.distribution.distribution_id} به انبار ورود خورده است ', # noqa - type='inventory', - ) + devices = Device.objects.filter(assignment__client__organization=instance.organization) + for device in devices: + Notification.objects.create( + device=device, + organization=instance.organization, + title=f" {instance.distribution.distribution_id} ورودی جدید به انبار از توزیع با کد ", # noqa + message=f' مقدار {instance.distribution.weight} کیلوگرم' # noqa + f' از توزیع با کد {instance.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): + """ Create notification for organization for quota distribution creation """ + if not created: return def _create_notification(): # create notification for organization on pos device - Notification.objects.create( - organization=instance.assigned_organization, - title=f" {instance.quota.quota_id} توزیع جدید به شما از سهمیه با کد ", # noqa - message=f' مقدار {instance.weight} کیلوگرم' # noqa - f' از سهمیه با کد {instance.quota.quota_id} به شما توزیع شده است ', # noqa - type='inventory', - ) + devices = Device.objects.filter(assignment__client__organization=instance.organization) + for device in devices: + Notification.objects.create( + device=device, + organization=instance.assigned_organization, + title=f" {instance.quota.quota_id} توزیع جدید به شما از سهمیه با کد ", # noqa + message=f' مقدار {instance.weight} کیلوگرم' # noqa + f' از سهمیه با کد {instance.quota.quota_id} به شما توزیع شده است ', # noqa + type='inventory', + ) transaction.on_commit(_create_notification)