From 0c2d73f892351aeb43adb746df5022fc169f6bdc Mon Sep 17 00:00:00 2001 From: behruz-dev Date: Fri, 31 Oct 2025 21:49:47 +0500 Subject: [PATCH] wherehouse: add sender field to stock movemend model --- .../commands/import_stock_movemend.py | 2 ++ .../migrations/0019_stockmovemend_sender.py | 21 +++++++++++++++ core/apps/wherehouse/models/stock_movemend.py | 3 +++ .../wherehouse/serializers/stock_movmend.py | 27 ++++++++++++++++--- core/apps/wherehouse/views/stock_movemend.py | 2 +- 5 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 core/apps/wherehouse/migrations/0019_stockmovemend_sender.py diff --git a/core/apps/wherehouse/management/commands/import_stock_movemend.py b/core/apps/wherehouse/management/commands/import_stock_movemend.py index a00b1da..fb619ba 100644 --- a/core/apps/wherehouse/management/commands/import_stock_movemend.py +++ b/core/apps/wherehouse/management/commands/import_stock_movemend.py @@ -47,12 +47,14 @@ class Command(BaseCommand): user = None if item.get('recieved_user'): user = User.objects.filter(full_name=item['recieved_user']['full_name']).first() + sender_user = User.objects.filter(full_name=item['sender_user']['full_name']).first() stock_movemend, created = StockMovemend.objects.get_or_create( number=item['id'], defaults={ "wherehouse_to": recieved_warehouse, "wherehouse_from": sender_warehouse, "recipient": user, + "sender": sender_user, "project_folder": project_folder, "movemend_type": movemend_types.get(item['status']), "date": datetime.strptime(item['date'], "%d.%m.%Y"), diff --git a/core/apps/wherehouse/migrations/0019_stockmovemend_sender.py b/core/apps/wherehouse/migrations/0019_stockmovemend_sender.py new file mode 100644 index 0000000..cea0703 --- /dev/null +++ b/core/apps/wherehouse/migrations/0019_stockmovemend_sender.py @@ -0,0 +1,21 @@ +# Generated by Django 5.2.4 on 2025-10-31 21:35 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wherehouse', '0018_alter_invalidproduct_project_folder'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='stockmovemend', + name='sender', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='stock_sender', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/core/apps/wherehouse/models/stock_movemend.py b/core/apps/wherehouse/models/stock_movemend.py index 790986b..a5dd6d1 100644 --- a/core/apps/wherehouse/models/stock_movemend.py +++ b/core/apps/wherehouse/models/stock_movemend.py @@ -27,6 +27,9 @@ class StockMovemend(BaseModel): recipient = models.ForeignKey( User, on_delete=models.SET_NULL, related_name='stock_movmends', null=True, blank=True ) + sender = models.ForeignKey( + User, on_delete=models.SET_NULL, related_name='stock_sender', null=True, blank=True + ) project_folder = models.ForeignKey( ProjectFolder, on_delete=models.SET_NULL, related_name='stock_movmends', null=True, blank=True ) diff --git a/core/apps/wherehouse/serializers/stock_movmend.py b/core/apps/wherehouse/serializers/stock_movmend.py index 86e2a62..9b8bd44 100644 --- a/core/apps/wherehouse/serializers/stock_movmend.py +++ b/core/apps/wherehouse/serializers/stock_movmend.py @@ -9,6 +9,7 @@ from core.apps.wherehouse.models import ( StockMovmendProduct, WhereHouse, ) +from core.apps.accounts.models import User class StockMovmendProductSerializer(serializers.Serializer): @@ -31,6 +32,7 @@ class StockMovmendCreateSerializer(serializers.Serializer): wherehouse_from_id = serializers.UUIDField() date = serializers.DateField(required=False) comment = serializers.CharField(required=False) + recipient_id = serializers.UUIDField(required=False) def validate(self, data): if data.get("project_folder_id"): @@ -53,6 +55,11 @@ class StockMovmendCreateSerializer(serializers.Serializer): ).first() if not wherehouse_from: raise serializers.ValidationError("WhereHouse from not found") + if data.get('recipient'): + recipient = User.objects.filter(id=data.get('recipient_id')).first() + if not recipient: + raise serializers.ValidationError("Recipient not found") + data['recipient'] = recipient data["wherehouse_to"] = wherehouse_to data["wherehouse_from"] = wherehouse_from return data @@ -67,7 +74,8 @@ class StockMovmendCreateSerializer(serializers.Serializer): comment=validated_data.get("comment"), wherehouse_to=validated_data.get("wherehouse_to"), wherehouse_from=validated_data.get("wherehouse_from"), - recipient=self.context.get("user"), + sender=self.context.get("user"), + recipient=validated_data.get('recipient'), ) movmend_products = [] for product in products: @@ -97,7 +105,7 @@ class StockMovemendProductListSerializer(serializers.ModelSerializer): "type": obj.inventory.product.type, "name": obj.inventory.product.name, } - if obj.inventory.product + if obj.inventory and obj.inventory.product else None ) @@ -107,7 +115,7 @@ class StockMovemendProductListSerializer(serializers.ModelSerializer): "id": obj.inventory.unity.id, "value": obj.inventory.unity.value, } - if obj.inventory.unity + if obj.inventory and obj.inventory.unity else None ) @@ -119,6 +127,7 @@ class StockMovemendListSerializer(serializers.ModelSerializer): method_name="get_wherehouse_from" ) recipient = serializers.SerializerMethodField(method_name="get_recipient") + sender = serializers.SerializerMethodField(method_name="get_sender") project_folder = serializers.SerializerMethodField(method_name="get_project_folder") project = serializers.SerializerMethodField(method_name="get_project") @@ -130,6 +139,7 @@ class StockMovemendListSerializer(serializers.ModelSerializer): "wherehouse_to", "wherehouse_from", "recipient", + "sender", "project_folder", "project", "movemend_type", @@ -168,6 +178,17 @@ class StockMovemendListSerializer(serializers.ModelSerializer): else None ) + + def get_sender(self, obj): + return ( + { + "id": obj.sender.id, + "full_name": obj.sender.full_name, + } + if obj.sender + else None + ) + def get_project_folder(self, obj): return ( {"id": obj.project_folder.id, "name": obj.project_folder.name} diff --git a/core/apps/wherehouse/views/stock_movemend.py b/core/apps/wherehouse/views/stock_movemend.py index 9499fbb..8d036a8 100644 --- a/core/apps/wherehouse/views/stock_movemend.py +++ b/core/apps/wherehouse/views/stock_movemend.py @@ -35,7 +35,7 @@ class StockMovemendCreateApiView(generics.GenericAPIView): class StockMovemendListApiView(generics.GenericAPIView): serializer_class = serializers.StockMovemendListSerializer queryset = StockMovemend.objects.select_related( - 'wherehouse_to', 'wherehouse_from', 'recipient', 'project_folder', 'project' + 'wherehouse_to', 'wherehouse_from', 'recipient', 'project_folder', 'project', 'sender' ).prefetch_related('movemend_products') permission_classes = [HasRolePermission] filter_backends = [DjangoFilterBackend, filters.SearchFilter]