From 938f1d633539fea01b478605f402809f678a7cf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o?= Date: Thu, 30 Jan 2025 14:50:23 +0100 Subject: [PATCH] Modified quantity logic --- StockSeeker/serializers.py | 51 +++++++++++++++++++++++++------------- StockSeeker/views.py | 4 +++ 2 files changed, 38 insertions(+), 17 deletions(-) diff --git a/StockSeeker/serializers.py b/StockSeeker/serializers.py index e93544d..4a1b9be 100644 --- a/StockSeeker/serializers.py +++ b/StockSeeker/serializers.py @@ -1,7 +1,7 @@ from rest_framework import serializers from .models import * from django.contrib.auth.models import User - +from django.db.models import F class UserSerializer(serializers.ModelSerializer): password = serializers.CharField(write_only=True) @@ -50,38 +50,38 @@ class ProductSerializer(serializers.ModelSerializer): model = Product fields = ["id", "name", "description", "quantity", "creation_date", "modification_date", "user","stock_limit","alert_enabled","is_stock_low","image","warehouses",] + #GERER les nombres négatifs impossible # def create(self, validated_data): warehouses = validated_data.pop('warehouses', []) product = Product.objects.create(**validated_data) product.warehouses.set(warehouses) for warehouse in product.warehouses.all(): - print(f'capacité actuelle {warehouse.actual_capacity}, - {product.quantity}') - warehouse.actual_capacity -= product.quantity - warehouse.save() + warehouse.actual_capacity = F('actual_capacity') - product.quantity + warehouse.save(update_fields=['actual_capacity']) + return product def update(self,instance, validated_data): - product = Product.objects.get(id=instance.id) instance.name = validated_data.get("name", instance.name) instance.description = validated_data.get("description", instance.description) - instance.quantity = validated_data.get("quantity", instance.quantity) - instance.save() + new_quantity = validated_data.get("quantity", instance.quantity) - for warehouse in product.warehouses.all(): - warehouse.actual_capacity = warehouse.max_capacity - warehouse.actual_capacity -= instance.quantity - warehouse.save() + quantity_difference = new_quantity - instance.quantity + instance.quantity = new_quantity + instance.save() + instance.refresh_from_db() + + for warehouse in instance.warehouses.all(): + warehouse.actual_capacity = F('actual_capacity') - quantity_difference + warehouse.save(update_fields=['actual_capacity']) return instance def destroy(self, instance): - product = Product.objects.get(id=instance.id) - - for warehouse in product.warehouses.all(): - warehouse.actual_capacity += instance.quantity - warehouse.save() + for warehouse in instance.warehouses.all(): + warehouse.actual_capacity = F('actual_capacity') + instance.quantity + warehouse.save(update_fields=['actual_capacity']) instance.delete() - return instance def validate_warehouses(self, value): if not value: @@ -96,13 +96,30 @@ class ProductSerializer(serializers.ModelSerializer): def get_is_stock_low(self, obj): return obj.alert_enabled and obj.stock_limit is not None and obj.quantity < obj.stock_limit + class WarehouseSerializer(serializers.ModelSerializer): user = serializers.PrimaryKeyRelatedField(read_only=True) + def update(self, instance, validated_data): + old_max_capacity = instance.max_capacity + instance.name = validated_data.get("name", instance.name) + instance.location = validated_data.get("location", instance.location) + new_max_capacity = validated_data.get("max_capacity", instance.max_capacity) + capacity_difference = new_max_capacity - old_max_capacity + + instance.actual_capacity = F('actual_capacity') + capacity_difference + instance.max_capacity = new_max_capacity + + instance.save() + instance.refresh_from_db() + + return instance + class Meta: model = Warehouse fields = ["id", "name", "location", "max_capacity","user","actual_capacity"] + def validate_max_capacity(self, value): if value < 0: raise serializers.ValidationError("La capacité maximale ne peut pas être négative.") diff --git a/StockSeeker/views.py b/StockSeeker/views.py index b2263fe..e6b9d6d 100644 --- a/StockSeeker/views.py +++ b/StockSeeker/views.py @@ -53,6 +53,10 @@ class ProductView(viewsets.ModelViewSet): def perform_update(self, serializer): serializer.save(user=self.request.user) + def perform_destroy(self, instance): + serializer = self.get_serializer(instance) + serializer.destroy(instance) + def get_queryset(self): return Product.objects.filter(user_id=self.request.user)