196 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Python
		
	
	
	
| from .models import (Mroom, MroomBooking, MroomSlot,  LendingSeal, Vehicle, FileRecord, BorrowRecord, Publicity, PatentInfo, Papersecret)
 | |
| # Publicity, PatetInfo, PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo)
 | |
| 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
 | |
| from apps.wf.serializers import TicketSimpleSerializer
 | |
| 
 | |
| 
 | |
| 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)
 | |
|     create_by_phone = serializers.CharField(source='create_by.phone', read_only=True)
 | |
|     belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True)
 | |
|     ticket_ = TicketSimpleSerializer(source='ticket', read_only=True)
 | |
|     class Meta:
 | |
|         model = MroomBooking
 | |
|         fields = '__all__'
 | |
|         read_only_fields = EXCLUDE_FIELDS
 | |
|         extra_kwargs = {'belong_dept': {'required': True}}
 | |
|     
 | |
|     def create(self, validated_data):
 | |
|         mroom = validated_data.pop('mroom')
 | |
|         slots = validated_data.pop('slots')
 | |
|         mdate = validated_data.pop('mdate')
 | |
|         booking = super().create(validated_data)
 | |
|         MroomSlot.objects.filter(booking=booking).delete()
 | |
|         for slot in slots:
 | |
|             if slot < 0 or slot > 47:
 | |
|                 raise ParseError("时段索引超出范围")
 | |
|             ms_exists = MroomSlot.objects.filter(mroom=mroom, mdate=mdate, slot=slot, is_inuse=True).exists()
 | |
|             if ms_exists:
 | |
|                 raise ParseError("时段已预订,请刷新重选")
 | |
|             MroomSlot.objects.create(booking=booking, slot=slot, mdate=mdate, mroom=mroom, is_inuse=True)
 | |
|         return booking
 | |
| 
 | |
|     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("时段索引超出范围")
 | |
|             ms_exists = MroomSlot.objects.filter(mroom=mroom, mdate=mdate, slot=slot, is_inuse=True).exists()
 | |
|             if ms_exists:
 | |
|                 raise ParseError("时段已预订,请刷新重选")
 | |
|             MroomSlot.objects.create(booking=booking, slot=slot, mdate=mdate, mroom=mroom, is_inuse=True)
 | |
|         return booking
 | |
|         
 | |
| 
 | |
| class MroomSlotSerializer(CustomModelSerializer):
 | |
|     booking_title = serializers.CharField(source='booking.title', read_only=True)
 | |
|     class Meta:
 | |
|         model = MroomSlot
 | |
|         fields = '__all__'
 | |
| 
 | |
| 
 | |
| class LendingSealSerializer(CustomModelSerializer):
 | |
|     create_by_name = serializers.CharField(source='create_by.name', read_only=True)
 | |
|     belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True)
 | |
|     ticket_ = TicketSimpleSerializer(source='ticket', read_only=True)
 | |
|     class Meta:
 | |
|         model = LendingSeal
 | |
|         fields = '__all__'
 | |
|         read_only_fields = EXCLUDE_FIELDS
 | |
| 
 | |
|     
 | |
| class VehicleSerializer(CustomModelSerializer):
 | |
|     create_by_name = serializers.CharField(source='create_by.name', read_only=True)
 | |
|     belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True)
 | |
|     ticket_ = TicketSimpleSerializer(source='ticket', read_only=True)
 | |
|     class Meta:
 | |
|         model = Vehicle
 | |
|         fields = '__all__'
 | |
|         read_only_fields = EXCLUDE_FIELDS + ['actual_km']
 | |
| 
 | |
| 
 | |
| class FileRecordSerializer(CustomModelSerializer):
 | |
|     create_by_name = serializers.CharField(source='create_by.name', read_only=True)
 | |
|     belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True)
 | |
|     ticket_ = TicketSimpleSerializer(source='ticket', read_only=True)
 | |
|     class Meta:
 | |
|         model = FileRecord
 | |
|         fields = '__all__'
 | |
|         read_only_fields = EXCLUDE_FIELDS
 | |
| 
 | |
| 
 | |
| class BorrowRecordSerializer(CustomModelSerializer):
 | |
|     create_by_name = serializers.CharField(source='create_by.name', read_only=True)
 | |
|     belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True)
 | |
|     borrow_file = serializers.PrimaryKeyRelatedField(queryset=FileRecord.objects.all(), many=True, write_only=True, label="借阅文件")
 | |
|     file_detail = FileRecordSerializer(source='borrow_file', many=True, read_only=True, label="借阅文件详情")
 | |
|     file_name = serializers.SerializerMethodField()
 | |
|     ticket_ = TicketSimpleSerializer(source='ticket', read_only=True)
 | |
|     class Meta:
 | |
|         model = BorrowRecord
 | |
|         fields = '__all__'
 | |
|         read_only_fields = EXCLUDE_FIELDS 
 | |
| 
 | |
|     def get_file_name(self, obj):
 | |
|         return [file.name for file in obj.borrow_file.all()]
 | |
| 
 | |
| 
 | |
| class PublicitySerializer(CustomModelSerializer):
 | |
|     create_by_name = serializers.CharField(source='create_by.name', read_only=True)
 | |
|     belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True)
 | |
|     ticket_ = TicketSimpleSerializer(source='ticket', read_only=True)
 | |
|     class Meta:
 | |
|         model = Publicity
 | |
|         fields = '__all__'
 | |
|         read_only_fields = EXCLUDE_FIELDS
 | |
| 
 | |
| 
 | |
| class PatentInfoSerializer(CustomModelSerializer):
 | |
|     create_by_name = serializers.CharField(source='create_by.name', read_only=True)
 | |
|     belong_dept_name = serializers.CharField(source='belong_dept.name', read_only=True)
 | |
|     ticket_ = TicketSimpleSerializer(source='ticket', read_only=True)
 | |
|     class Meta:
 | |
|         model = PatentInfo
 | |
|         fields = '__all__'
 | |
|         read_only_fields = EXCLUDE_FIELDS
 | |
| 
 | |
| 
 | |
| class PaperSeSerializer(CustomModelSerializer):
 | |
|     class Meta:
 | |
|         model = Papersecret
 | |
|         fields = '__all__'
 | |
|         read_only_fields = EXCLUDE_FIELDS
 | |
| 
 | |
| 
 | |
| # class PlatformSerializer(serializers.ModelSerializer):
 | |
| #     class Meta:
 | |
| #         model = Platform
 | |
| #         fields = ['id', 'name']
 | |
| 
 | |
| 
 | |
| # class ProjectSerializer(serializers.ModelSerializer):
 | |
| #     class Meta:
 | |
| #         model = Project
 | |
| #         fields = ['id', 'name']
 | |
| 
 | |
| 
 | |
| # class ProjectMemberSerializer(CustomModelSerializer):
 | |
| #     affiliated_platforms = serializers.PrimaryKeyRelatedField(
 | |
| #         many=True,
 | |
| #         queryset=Platform.objects.all(),
 | |
| #         write_only=True
 | |
| #     )
 | |
| #     affiliated_platforms_detail = PlatformSerializer(
 | |
| #         source='affiliated_platforms', many=True, read_only=True
 | |
| #     )
 | |
| 
 | |
| #     affiliated_projects = serializers.PrimaryKeyRelatedField(
 | |
| #         many=True,
 | |
| #         queryset=Project.objects.all(),
 | |
| #         write_only=True
 | |
| #     )
 | |
| #     affiliated_projects_detail = ProjectSerializer(
 | |
| #         source='affiliated_projects', many=True, read_only=True
 | |
| #     )
 | |
| #     class Meta:
 | |
| #         model = PatentRecord
 | |
| #         fields = '__all__'
 | |
| 
 | |
| 
 | |
| # class PaperRecordSerializer(CustomModelSerializer):
 | |
| #     class Meta:
 | |
| #         model = PaperRecord
 | |
| #         fields = '__all__'
 | |
| #         read_only_fields = EXCLUDE_FIELDS
 | |
| 
 | |
| 
 | |
| # class ProjectApprovalSerializer(CustomModelSerializer):
 | |
| #     class Meta:
 | |
| #         model = ProjectApproval
 | |
| #         fields = '__all__'
 | |
| #         read_only_fields = EXCLUDE_FIELDS
 | |
| 
 | |
| 
 | |
| # class ProjectInfoSerializer(CustomModelSerializer):
 | |
| #     class Meta:
 | |
| #         model = ProjectInfo
 | |
| #         fields = '__all__'
 | |
| #         read_only_fields = EXCLUDE_FIELDS
 | |
|          |