from django.shortcuts import render from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet from .models import Mroom, MroomBooking, MroomSlot, LendingSeal, Vehicle, FileRecord, BorrowRecord, Publicity from .serializers import (MroomSerializer, MroomBookingSerializer, MroomSlotSerializer, LendingSealSerializer, VehicleSerializer, FileRecordSerializer, BorrowRecordSerializer, PublicitySerializer) from apps.utils.mixins import CustomListModelMixin from rest_framework.exceptions import ParseError from apps.ofm.filters import MroomBookingFilterset, SealFilter, BorrowRecordFilter from rest_framework.response import Response 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 PapersecretViewSet(CustomModelViewSet): # """list: 论文申密审批 # 论文申密审批 # """ # queryset = Papersecret.objects.all() # serializer_class = PaperSeSerializer # filterset_fields = ["paper_name", "author"] # ordering = ["-create_time", "paper_name"] # class PatentRecordViewSet(CustomModelViewSet): # """list: 专利台账登记 # 专利台账登记 # """ # queryset = PatentRecord.objects.all() # serializer_class = PatentRecordSerializer # select_related_fields = ["patent"] # filterset_fields = ["title", "volume_number","inventors"] # ordering = ["-create_time", "title", "type"] # search_fields = ["title", "volume_number", "inventors"] # def get_queryset(self): # qs = super().get_queryset() # patent_type = self.request.query_params.get('patent_type', None) # if patent_type: # qs = qs.filter(patent__type=patent_type) # return qs # @action(detail=False, methods=['get']) # def patent_name(self, request): # """获取专利列表""" # search = request.query_params.get('search', '') # queryset = PatentInfo.objects.all() # if search: # queryset = queryset.filter(name__icontains=search) # patents = [{'id': patent.id, 'name': patent.name} for patent in queryset] # return Response(patents) # 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"]