Create Warehouses

This commit is contained in:
Léo 2025-01-24 01:23:41 +01:00
parent 8290dda9cf
commit 5251a74855
4 changed files with 48 additions and 4 deletions

View File

@ -2,6 +2,16 @@ from django.db import models
from django.contrib.auth.models import User from django.contrib.auth.models import User
class Warehouse(models.Model):
name = 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)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="warehouses", null=False, blank=False)
def __str__(self):
return self.name
class Product(models.Model): class Product(models.Model):
name = models.CharField(null=False, max_length=30, blank=False) name = models.CharField(null=False, max_length=30, blank=False)
description = models.CharField(default=None, null=True, blank=True, max_length=120) description = models.CharField(default=None, null=True, blank=True, max_length=120)
@ -12,6 +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 = models.ManyToManyField(Warehouse, related_name="products")
@property @property
def is_stock_low(self): def is_stock_low(self):
return self.alert_enabled and self.stock_limit is not None and self.quantity < self.stock_limit return self.alert_enabled and self.stock_limit is not None and self.quantity < self.stock_limit

View File

@ -34,7 +34,10 @@ 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 = serializers.PrimaryKeyRelatedField(
queryset=Warehouse.objects.all(),
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({
@ -44,8 +47,13 @@ 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"] fields = ["id", "name", "description", "quantity", "creation_date", "modification_date", "user","stock_limit","alert_enabled","is_stock_low","image","warehouse"]
def validate_warehouse(self, value):
if not value:
raise serializers.ValidationError("Un produit doit être associé à au moins un entrepôt.")
return value
def validate_quantity(self, value): def validate_quantity(self, value):
if value < 0: if value < 0:
raise serializers.ValidationError("La quantité ne peut pas être négative.") raise serializers.ValidationError("La quantité ne peut pas être négative.")
@ -54,4 +62,16 @@ class ProductSerializer(serializers.ModelSerializer):
def get_is_stock_low(self, obj): def get_is_stock_low(self, obj):
if not isinstance(obj, Product): if not isinstance(obj, Product):
return None return None
return obj.is_stock_low return obj.is_stock_low
class WarehouseSerializer(serializers.ModelSerializer):
user = serializers.PrimaryKeyRelatedField(read_only=True)
class Meta:
model = Warehouse
fields = ["id", "name", "location", "max_capacity","user"]
def validate_max_capacity(self, value):
if value < 0:
raise serializers.ValidationError("La capacité maximale ne peut pas être négative.")
return value

View File

@ -4,12 +4,13 @@ from rest_framework import routers
from .views import * from .views import *
from . import views from . import views
from rest_framework_simplejwt.views import * from rest_framework_simplejwt.views import *
from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView from drf_spectacular.views import SpectacularAPIView
##juge pas les noms d'acces OK ?## ##juge pas les noms d'acces OK ?##
router = routers.DefaultRouter() router = routers.DefaultRouter()
router.register(r'products', ProductView, basename='product') router.register(r'products', ProductView, basename='product')
router.register(r'warehouses', WarehouseView, basename='warehouse')
urlpatterns = [ urlpatterns = [
path('api/', include(router.urls)), path('api/', include(router.urls)),

View File

@ -53,3 +53,15 @@ class ProductView(viewsets.ModelViewSet):
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)
class WarehouseView(viewsets.ModelViewSet):
permission_classes = [IsAuthenticated]
throttle_classes = [UserRateThrottle]
serializer_class = WarehouseSerializer
queryset = Warehouse.objects.all()
def perform_create(self, serializer):
serializer.save(user=self.request.user)
def get_queryset(self):
return Warehouse.objects.filter(user_id=self.request.user)