260 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			260 lines
		
	
	
		
			8.6 KiB
		
	
	
	
		
			Python
		
	
	
	
from django.shortcuts import render
 | 
						||
from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet
 | 
						||
from .models import Mroom, MroomBooking, MroomSlot, LendingSeal, Vehicle, FileRecord, BorrowRecord, Publicity, PatentInfo
 | 
						||
                    # Publicity, , PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo)
 | 
						||
from .serializers import (MroomSerializer, MroomBookingSerializer, MroomSlotSerializer, LendingSealSerializer, 
 | 
						||
                          VehicleSerializer, FileRecordSerializer, BorrowRecordSerializer, PublicitySerializer, PatentInfoSerializer)
 | 
						||
    #                       ,SealSerializer, 
 | 
						||
    # LendingSealSerializer, FileRecordSerializer, BorrowRecordSerializer, PublicitySerializer, 
 | 
						||
    # PatentInfoSerializer, PaperSerializer, PlatformSerializer, ProjectSerializer, ProjectMemberSerializer, PaperRecordSerializer, ProjectApprovalSerializer, ProjectInfoSerializer)
 | 
						||
from rest_framework.decorators import action
 | 
						||
from apps.utils.mixins import CustomListModelMixin
 | 
						||
from rest_framework.exceptions import ParseError
 | 
						||
from apps.ofm.filters import MroomBookingFilterset, SealFilter, BorrowRecordFilter
 | 
						||
 | 
						||
 | 
						||
class MroomViewSet(CustomModelViewSet):
 | 
						||
    """list: 会议室
 | 
						||
 | 
						||
    会议室
 | 
						||
    """
 | 
						||
    queryset = Mroom.objects.all()
 | 
						||
    serializer_class = MroomSerializer
 | 
						||
 | 
						||
 | 
						||
class MroomBookingViewSet(CustomModelViewSet):
 | 
						||
    """list: 会议室预订
 | 
						||
 | 
						||
    会议室预订
 | 
						||
    """
 | 
						||
    queryset = MroomBooking.objects.all()
 | 
						||
    serializer_class = MroomBookingSerializer
 | 
						||
    select_related_fields = ["create_by", "ticket", "belong_dept"]
 | 
						||
    filterset_class = MroomBookingFilterset
 | 
						||
 | 
						||
    def add_info_for_list(self, data):
 | 
						||
        booking_ids = [d["id"] for d in data]
 | 
						||
        slots = MroomSlot.objects.filter(booking__in=booking_ids).order_by("booking", "mroom", "mdate", "slot")
 | 
						||
        booking_info = {}
 | 
						||
        for slot in slots:
 | 
						||
            booking_id = slot.booking.id
 | 
						||
            
 | 
						||
            if booking_id not in booking_info:
 | 
						||
                booking_info[booking_id] = {
 | 
						||
                    "mdate": slot.mdate.strftime("%Y-%m-%d"),  # 格式化日期
 | 
						||
                    "mroom": slot.mroom.id,
 | 
						||
                    "mroom_name": slot.mroom.name,  # 会议室名称
 | 
						||
                    "time_ranges": [],  # 存储时间段(如 ["8:00-9:00", "10:00-11:30"])
 | 
						||
                    "current_slots": [],  # 临时存储连续的slot(用于合并)
 | 
						||
                }
 | 
						||
            
 | 
						||
            # 检查是否连续(当前slot是否紧接上一个slot)
 | 
						||
            current_slots = booking_info[booking_id]["current_slots"]
 | 
						||
            if not current_slots or slot.slot == current_slots[-1] + 1:
 | 
						||
                current_slots.append(slot.slot)
 | 
						||
            else:
 | 
						||
                # 如果不连续,先把当前连续的slot转换成时间段
 | 
						||
                if current_slots:
 | 
						||
                    start_time = self._slot_to_time(current_slots[0])
 | 
						||
                    end_time = self._slot_to_time(current_slots[-1] + 1)
 | 
						||
                    booking_info[booking_id]["time_ranges"].append(f"{start_time}-{end_time}")
 | 
						||
                    current_slots.clear()
 | 
						||
                current_slots.append(slot.slot)
 | 
						||
        
 | 
						||
        # 处理最后剩余的连续slot
 | 
						||
        for info in booking_info.values():
 | 
						||
            if info["current_slots"]:
 | 
						||
                start_time = self._slot_to_time(info["current_slots"][0])
 | 
						||
                end_time = self._slot_to_time(info["current_slots"][-1] + 1)
 | 
						||
                info["time_ranges"].append(f"{start_time}-{end_time}")
 | 
						||
                info["slots"] = info.pop("current_slots")  # 清理临时数据
 | 
						||
        
 | 
						||
        for item in data:
 | 
						||
            item.update(booking_info.get(item["id"], {}))
 | 
						||
        return data
 | 
						||
 | 
						||
    @staticmethod
 | 
						||
    def _slot_to_time(slot):
 | 
						||
        """将slot (0-47) 转换为 HH:MM 格式的时间字符串"""
 | 
						||
        hours = slot // 2
 | 
						||
        minutes = (slot % 2) * 30
 | 
						||
        return f"{hours:02d}:{minutes:02d}"
 | 
						||
 | 
						||
    def perform_update(self, serializer):
 | 
						||
        ins:MroomBooking = self.get_object()
 | 
						||
        ticket = ins.ticket
 | 
						||
        if ticket is None or ticket.state.type == 1:
 | 
						||
            pass
 | 
						||
        else:
 | 
						||
            raise ParseError("存在审批单,不允许修改")
 | 
						||
        if ins.create_by and ins.create_by != self.request.user:
 | 
						||
            raise ParseError("只允许创建者修改")
 | 
						||
        return super().perform_update(serializer)
 | 
						||
    
 | 
						||
    def perform_destroy(self, instance):
 | 
						||
        if instance.create_by and instance.create_by != self.request.user:
 | 
						||
            raise ParseError("只允许创建者删除")
 | 
						||
        ticket = instance.ticket
 | 
						||
        if ticket is None or ticket.state.type == 1:
 | 
						||
            pass
 | 
						||
        else:
 | 
						||
            raise ParseError("存在审批单,不允许删除")
 | 
						||
        if ticket:
 | 
						||
            ticket.delete()
 | 
						||
        instance.delete()
 | 
						||
 | 
						||
 | 
						||
class MroomSlotViewSet(CustomListModelMixin, CustomGenericViewSet):
 | 
						||
    """list: 
 | 
						||
 | 
						||
    会议室预订时段
 | 
						||
    """
 | 
						||
    queryset = MroomSlot.objects.all()
 | 
						||
    serializer_class = MroomSlotSerializer
 | 
						||
    filterset_fields = ["mroom", "mdate", "booking", "is_inuse"]
 | 
						||
 | 
						||
 | 
						||
class LendingSealViewSet(CustomModelViewSet):
 | 
						||
    """list: 印章外出
 | 
						||
 | 
						||
    印章外出
 | 
						||
    """
 | 
						||
    perms_map = {'get': '*', 'post': 'seal.update',
 | 
						||
                 'put': 'seal.update', 'delete': 'seal.delete'}
 | 
						||
    queryset = LendingSeal.objects.all()
 | 
						||
    serializer_class = LendingSealSerializer
 | 
						||
    filterset_class = SealFilter
 | 
						||
    ordering = ["-create_time"]
 | 
						||
    data_filter = True
 | 
						||
 | 
						||
 | 
						||
class VehicleViewSet(CustomModelViewSet):
 | 
						||
    """list: 车辆
 | 
						||
 | 
						||
    车辆
 | 
						||
    """
 | 
						||
    queryset = Vehicle.objects.all()
 | 
						||
    serializer_class = VehicleSerializer
 | 
						||
    ordering = ["-create_time"]
 | 
						||
 | 
						||
 | 
						||
class FilerecordViewSet(CustomModelViewSet):
 | 
						||
    """list: 文件
 | 
						||
 | 
						||
    文件
 | 
						||
    """
 | 
						||
    queryset = FileRecord.objects.all()
 | 
						||
    serializer_class = FileRecordSerializer
 | 
						||
    filterset_fields = [ "name", "number"]
 | 
						||
    ordering = ["-create_time", "number", "name"]
 | 
						||
 | 
						||
 | 
						||
class FileborrowViewSet(CustomModelViewSet):
 | 
						||
    """list: 文件借阅
 | 
						||
 | 
						||
    文件借阅
 | 
						||
    """
 | 
						||
    queryset = BorrowRecord.objects.all()
 | 
						||
    serializer_class = BorrowRecordSerializer
 | 
						||
    filterset_class = BorrowRecordFilter
 | 
						||
    ordering = ["-create_time"]
 | 
						||
 | 
						||
 | 
						||
class PublicityViewSet(CustomModelViewSet):
 | 
						||
    """list: 公告
 | 
						||
 | 
						||
    公告
 | 
						||
    """
 | 
						||
    queryset = Publicity.objects.all()
 | 
						||
    serializer_class = PublicitySerializer
 | 
						||
    filterset_fields = ["title","number"]
 | 
						||
    ordering = ["-create_time", "number"]
 | 
						||
 | 
						||
 | 
						||
class PatentInfoViewSet(CustomModelViewSet):
 | 
						||
    """list: 专利
 | 
						||
 | 
						||
    专利
 | 
						||
    """
 | 
						||
    queryset = PatentInfo.objects.all()
 | 
						||
    serializer_class = PatentInfoSerializer
 | 
						||
    filterset_fields = ["name", "author", "type"]
 | 
						||
    ordering = ["-create_time", "name", "author", "type"]
 | 
						||
 | 
						||
 | 
						||
# class PaperViewSet(CustomModelViewSet):
 | 
						||
#     """list: 论文申密审批
 | 
						||
 | 
						||
#     论文申密审批
 | 
						||
#     """
 | 
						||
#     queryset = PaperOfm.objects.all()
 | 
						||
#     serializer_class = PaperSerializer
 | 
						||
#     filterset_fields = ["name", "author"]
 | 
						||
#     ordering = ["create_time", "name"]
 | 
						||
 | 
						||
 | 
						||
# class PlatformViewSet(CustomModelViewSet):
 | 
						||
#     """list: 平台
 | 
						||
 | 
						||
#     平台
 | 
						||
#     """
 | 
						||
#     queryset = Platform.objects.all()
 | 
						||
#     serializer_class = PlatformSerializer
 | 
						||
#     filterset_fields = ["name"]
 | 
						||
#     ordering = ["create_time", "name"]
 | 
						||
 | 
						||
 | 
						||
# class ProjectViewSet(CustomModelViewSet):
 | 
						||
#     """list: 项目
 | 
						||
 | 
						||
#     项目
 | 
						||
#     """
 | 
						||
#     queryset = Project.objects.all()
 | 
						||
#     serializer_class = ProjectSerializer
 | 
						||
#     filterset_fields = ["name"]
 | 
						||
#     ordering = ["create_time", "name"]
 | 
						||
 | 
						||
 | 
						||
# class PatentRecordViewSet(CustomModelViewSet):
 | 
						||
#     """list: 专利台账登记
 | 
						||
 | 
						||
#     专利台账登记
 | 
						||
#     """
 | 
						||
#     queryset = PatentRecord.objects.all()
 | 
						||
#     serializer_class = ProjectMemberSerializer
 | 
						||
#     filterset_fields = ["patent", "type"]
 | 
						||
#     ordering = ["create_time", "patent", "type"]
 | 
						||
 | 
						||
 | 
						||
# class PaperRecordViewSet(CustomModelViewSet):
 | 
						||
#     """list: 论文台账登记
 | 
						||
 | 
						||
#     论文台账登记
 | 
						||
#     """
 | 
						||
#     queryset = PaperRecord.objects.all()
 | 
						||
#     serializer_class = ProjectMemberSerializer
 | 
						||
#     filterset_fields = ["index", "title", "paper_code","paper_type", "authors"]
 | 
						||
#     ordering = ["create_time", "paper", "type"]
 | 
						||
 | 
						||
 | 
						||
# class ProjectApprovalViewSet(CustomModelViewSet):
 | 
						||
#     """list: 立项审批表
 | 
						||
 | 
						||
#     立项审批表
 | 
						||
#     """
 | 
						||
#     queryset = ProjectApproval.objects.all()
 | 
						||
#     serializer_class = ProjectApprovalSerializer
 | 
						||
#     filterset_fields = ["project_start_date"]
 | 
						||
#     ordering = ["project_start_date"]
 | 
						||
 | 
						||
 | 
						||
# class ProjectInfoViewSet(CustomModelViewSet):
 | 
						||
#     """list: 项目信息
 | 
						||
 | 
						||
#     项目信息
 | 
						||
#     """
 | 
						||
#     queryset = ProjectInfo.objects.all()
 | 
						||
#     serializer_class = ProjectInfoSerializer
 | 
						||
#     filterset_fields = ["serial_number", "name", "platform", "project_source"]
 | 
						||
#     ordering = ["serial_number", "name"]
 |