ADDED warehouse quantity/capacity management
This commit is contained in:
parent
a914d59589
commit
d27ba0021a
@ -7,7 +7,7 @@ class Warehouse(models.Model):
|
|||||||
location = models.CharField(null=False, max_length=30, blank=False)
|
location = models.CharField(null=False, max_length=30, blank=False)
|
||||||
max_capacity = models.IntegerField(null=False, default=0, 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)
|
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):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
@ -22,10 +22,7 @@ class Product(models.Model):
|
|||||||
stock_limit = models.IntegerField(null=True, blank=True)
|
stock_limit = models.IntegerField(null=True, blank=True)
|
||||||
alert_enabled = models.BooleanField(default=False)
|
alert_enabled = models.BooleanField(default=False)
|
||||||
image = models.CharField(null=True, blank=True)
|
image = models.CharField(null=True, blank=True)
|
||||||
warehouse_ids = models.ManyToManyField(Warehouse, related_name="products")
|
warehouses = 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
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
@ -34,10 +34,11 @@ class UserSerializer(serializers.ModelSerializer):
|
|||||||
class ProductSerializer(serializers.ModelSerializer):
|
class ProductSerializer(serializers.ModelSerializer):
|
||||||
user = serializers.PrimaryKeyRelatedField(read_only=True)
|
user = serializers.PrimaryKeyRelatedField(read_only=True)
|
||||||
is_stock_low = serializers.SerializerMethodField()
|
is_stock_low = serializers.SerializerMethodField()
|
||||||
warehouse_ids = serializers.PrimaryKeyRelatedField(
|
warehouses = serializers.PrimaryKeyRelatedField(
|
||||||
queryset=Warehouse.objects.all(),
|
queryset=Warehouse.objects.all(),
|
||||||
many=True
|
many=True
|
||||||
)
|
)
|
||||||
|
|
||||||
def validate(self, data):
|
def validate(self, data):
|
||||||
if data.get('alert_enabled') and data.get('stock_limit') is None:
|
if data.get('alert_enabled') and data.get('stock_limit') is None:
|
||||||
raise serializers.ValidationError({
|
raise serializers.ValidationError({
|
||||||
@ -47,9 +48,42 @@ class ProductSerializer(serializers.ModelSerializer):
|
|||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Product
|
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:
|
if not value:
|
||||||
raise serializers.ValidationError("Un produit doit être associé à au moins un entrepôt.")
|
raise serializers.ValidationError("Un produit doit être associé à au moins un entrepôt.")
|
||||||
return value
|
return value
|
||||||
@ -60,16 +94,14 @@ class ProductSerializer(serializers.ModelSerializer):
|
|||||||
return value
|
return value
|
||||||
|
|
||||||
def get_is_stock_low(self, obj):
|
def get_is_stock_low(self, obj):
|
||||||
if not isinstance(obj, Product):
|
return obj.alert_enabled and obj.stock_limit is not None and obj.quantity < obj.stock_limit
|
||||||
return None
|
|
||||||
return obj.is_stock_low
|
|
||||||
|
|
||||||
class WarehouseSerializer(serializers.ModelSerializer):
|
class WarehouseSerializer(serializers.ModelSerializer):
|
||||||
user = serializers.PrimaryKeyRelatedField(read_only=True)
|
user = serializers.PrimaryKeyRelatedField(read_only=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Warehouse
|
model = Warehouse
|
||||||
fields = ["id", "name", "location", "max_capacity","user"]
|
fields = ["id", "name", "location", "max_capacity","user","actual_capacity"]
|
||||||
|
|
||||||
def validate_max_capacity(self, value):
|
def validate_max_capacity(self, value):
|
||||||
if value < 0:
|
if value < 0:
|
||||||
|
@ -49,7 +49,10 @@ class ProductView(viewsets.ModelViewSet):
|
|||||||
|
|
||||||
def perform_create(self, serializer):
|
def perform_create(self, serializer):
|
||||||
serializer.save(user=self.request.user)
|
serializer.save(user=self.request.user)
|
||||||
|
|
||||||
|
def perform_update(self, serializer):
|
||||||
|
serializer.save(user=self.request.user)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return Product.objects.filter(user_id=self.request.user)
|
return Product.objects.filter(user_id=self.request.user)
|
||||||
|
|
||||||
@ -62,6 +65,8 @@ class WarehouseView(viewsets.ModelViewSet):
|
|||||||
def perform_create(self, serializer):
|
def perform_create(self, serializer):
|
||||||
serializer.save(user=self.request.user)
|
serializer.save(user=self.request.user)
|
||||||
|
|
||||||
|
def perform_update(self, serializer):
|
||||||
|
serializer.save(user=self.request.user)
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return Warehouse.objects.filter(user_id=self.request.user)
|
return Warehouse.objects.filter(user_id=self.request.user)
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user