65 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
from .models import Mroom, MroomBooking, MroomSlot
 | 
						|
from apps.utils.serializers import CustomModelSerializer
 | 
						|
from rest_framework import serializers
 | 
						|
from django.db import transaction
 | 
						|
from rest_framework.exceptions import ParseError
 | 
						|
from apps.utils.constants import EXCLUDE_FIELDS
 | 
						|
 | 
						|
 | 
						|
class MroomSerializer(CustomModelSerializer):
 | 
						|
    class Meta:
 | 
						|
        model = Mroom
 | 
						|
        fields = '__all__'
 | 
						|
 | 
						|
 | 
						|
class MroomBookingSerializer(CustomModelSerializer):
 | 
						|
    mroom = serializers.PrimaryKeyRelatedField(queryset=Mroom.objects.all(), write_only=True, label="会议室")
 | 
						|
    mdate = serializers.DateField(write_only=True, label="预订日期")
 | 
						|
    slots = serializers.ListField(child=serializers.IntegerField(), write_only=True, label="时段索引")
 | 
						|
    create_by_name = serializers.CharField(source='create_by.username', read_only=True)
 | 
						|
    class Meta:
 | 
						|
        model = MroomBooking
 | 
						|
        fields = '__all__'
 | 
						|
        read_only_fields = EXCLUDE_FIELDS
 | 
						|
    
 | 
						|
    @transaction.atomic
 | 
						|
    def create(self, validated_data):
 | 
						|
        mroom = validated_data.pop('mroom')
 | 
						|
        slots = validated_data.pop('slots')
 | 
						|
        mdate = validated_data.pop('mdate')
 | 
						|
        booking = MroomBooking.objects.create(**validated_data)
 | 
						|
        MroomSlot.objects.filter(booking=booking).delete()
 | 
						|
        for slot in slots:
 | 
						|
            if slot < 0 or slot > 47:
 | 
						|
                raise ParseError("时段索引超出范围")
 | 
						|
            try:
 | 
						|
                MroomSlot.objects.create(booking=booking, slot=slot, mdate=mdate, mroom=mroom)
 | 
						|
            except Exception as e:
 | 
						|
                raise ParseError(f"时段已预订,请刷新重选-{e}")
 | 
						|
        return booking
 | 
						|
 | 
						|
    @transaction.atomic
 | 
						|
    def update(self, instance, validated_data):
 | 
						|
        mroom = validated_data.pop('mroom')
 | 
						|
        slots = validated_data.pop('slots')
 | 
						|
        mdate = validated_data.pop('mdate')
 | 
						|
        booking = super().update(instance, validated_data)
 | 
						|
        MroomSlot.objects.filter(booking=instance).delete()
 | 
						|
        for slot in slots:
 | 
						|
            if slot < 0 or slot > 47:
 | 
						|
                raise ParseError("时段索引超出范围")
 | 
						|
            try:
 | 
						|
                MroomSlot.objects.create(booking=booking, slot=slot, mdate=mdate, mroom=mroom)
 | 
						|
            except Exception as e:
 | 
						|
                raise ParseError(f"时段已预订,请刷新重选-{e}")
 | 
						|
        return booking
 | 
						|
        
 | 
						|
 | 
						|
 | 
						|
class MroomSlotSerializer(CustomModelSerializer):
 | 
						|
    booking_title = serializers.CharField(source='booking.title', read_only=True)
 | 
						|
    class Meta:
 | 
						|
        model = MroomSlot
 | 
						|
        fields = '__all__'
 | 
						|
 |