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, PaperSe
 | ||
|                     # Publicity, , PaperOfm, Platform, Project, PatentRecord, PaperRecord, ProjectApproval, ProjectInfo)
 | ||
| from .serializers import (MroomSerializer, MroomBookingSerializer, MroomSlotSerializer, LendingSealSerializer, 
 | ||
|                           VehicleSerializer, FileRecordSerializer, BorrowRecordSerializer, PublicitySerializer, PatentInfoSerializer, PaperSeSerializer)
 | ||
|     #                       ,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 PaperSeViewSet(CustomModelViewSet):
 | ||
|     """list: 论文申密审批
 | ||
| 
 | ||
|     论文申密审批
 | ||
|     """
 | ||
|     queryset = PaperSe.objects.all()
 | ||
|     serializer_class = PaperSeSerializer
 | ||
|     filterset_fields = ["paper_name", "author"]
 | ||
|     ordering = ["create_time", "paper_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"]
 |