From d27ba0021a79801e257b500e4dbe79167406027d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o?= Date: Wed, 29 Jan 2025 20:49:46 +0100 Subject: [PATCH] ADDED warehouse quantity/capacity management --- StockSeeker/models.py | 7 ++---- StockSeeker/serializers.py | 46 ++++++++++++++++++++++++++++++++------ StockSeeker/views.py | 11 ++++++--- 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/StockSeeker/models.py b/StockSeeker/models.py index a6ba5a8..290fc52 100644 --- a/StockSeeker/models.py +++ b/StockSeeker/models.py @@ -7,7 +7,7 @@ class Warehouse(models.Model): location = models.CharField(null=False, max_length=30, blank=False) max_capacity = models.IntegerField(null=False, default=0, blank=False) user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="warehouses", null=False, blank=False) - + actual_capacity = models.IntegerField(default=0, null=False, blank=False) def __str__(self): return self.name @@ -22,10 +22,7 @@ class Product(models.Model): stock_limit = models.IntegerField(null=True, blank=True) alert_enabled = models.BooleanField(default=False) image = models.CharField(null=True, blank=True) - warehouse_ids = models.ManyToManyField(Warehouse, related_name="products") - @property - def is_stock_low(self): - return self.alert_enabled and self.stock_limit is not None and self.quantity < self.stock_limit + warehouses = models.ManyToManyField(Warehouse, related_name="products") def __str__(self): return self.name \ No newline at end of file diff --git a/StockSeeker/serializers.py b/StockSeeker/serializers.py index c8e8abe..e93544d 100644 --- a/StockSeeker/serializers.py +++ b/StockSeeker/serializers.py @@ -34,10 +34,11 @@ class UserSerializer(serializers.ModelSerializer): class ProductSerializer(serializers.ModelSerializer): user = serializers.PrimaryKeyRelatedField(read_only=True) is_stock_low = serializers.SerializerMethodField() - warehouse_ids = serializers.PrimaryKeyRelatedField( + warehouses = serializers.PrimaryKeyRelatedField( queryset=Warehouse.objects.all(), many=True ) + def validate(self, data): if data.get('alert_enabled') and data.get('stock_limit') is None: raise serializers.ValidationError({ @@ -47,9 +48,42 @@ class ProductSerializer(serializers.ModelSerializer): class Meta: model = Product - fields = ["id", "name", "description", "quantity", "creation_date", "modification_date", "user","stock_limit","alert_enabled","is_stock_low","image","warehouse_ids"] + fields = ["id", "name", "description", "quantity", "creation_date", "modification_date", "user","stock_limit","alert_enabled","is_stock_low","image","warehouses",] + + 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() + return product - def validate_warehouse_ids(self, value): + 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() + + for warehouse in product.warehouses.all(): + warehouse.actual_capacity = warehouse.max_capacity + warehouse.actual_capacity -= instance.quantity + warehouse.save() + 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() + instance.delete() + return instance + + def validate_warehouses(self, value): if not value: raise serializers.ValidationError("Un produit doit être associé à au moins un entrepôt.") return value @@ -60,16 +94,14 @@ class ProductSerializer(serializers.ModelSerializer): return value def get_is_stock_low(self, obj): - if not isinstance(obj, Product): - return None - return obj.is_stock_low + 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) class Meta: model = Warehouse - fields = ["id", "name", "location", "max_capacity","user"] + fields = ["id", "name", "location", "max_capacity","user","actual_capacity"] def validate_max_capacity(self, value): if value < 0: diff --git a/StockSeeker/views.py b/StockSeeker/views.py index 786f134..b2263fe 100644 --- a/StockSeeker/views.py +++ b/StockSeeker/views.py @@ -49,7 +49,10 @@ class ProductView(viewsets.ModelViewSet): def perform_create(self, serializer): serializer.save(user=self.request.user) - + + def perform_update(self, serializer): + serializer.save(user=self.request.user) + def get_queryset(self): return Product.objects.filter(user_id=self.request.user) @@ -62,6 +65,8 @@ class WarehouseView(viewsets.ModelViewSet): def perform_create(self, serializer): serializer.save(user=self.request.user) + def perform_update(self, serializer): + serializer.save(user=self.request.user) + def get_queryset(self): - return Warehouse.objects.filter(user_id=self.request.user) - + return Warehouse.objects.filter(user_id=self.request.user) \ No newline at end of file