feat: 会议室预定修改
This commit is contained in:
parent
54140ba742
commit
bdd686f50b
|
@ -0,0 +1,33 @@
|
||||||
|
# Generated by Django 3.2.12 on 2025-09-28 02:23
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('wf', '0003_workflow_view_path'),
|
||||||
|
('ofm', '0013_mroomslot_ticket'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='mroombooking',
|
||||||
|
name='ticket',
|
||||||
|
field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='mrooms_ticket', to='wf.ticket', verbose_name='关联会议室'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='mroomslot',
|
||||||
|
name='is_inuse',
|
||||||
|
field=models.BooleanField(default=True, verbose_name='是否占用'),
|
||||||
|
),
|
||||||
|
migrations.AlterUniqueTogether(
|
||||||
|
name='mroomslot',
|
||||||
|
unique_together={('mroom', 'mdate', 'slot', 'is_inuse')},
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='mroomslot',
|
||||||
|
name='ticket',
|
||||||
|
),
|
||||||
|
]
|
|
@ -28,6 +28,8 @@ class Mroom(CommonADModel):
|
||||||
class MroomBooking(CommonADModel):
|
class MroomBooking(CommonADModel):
|
||||||
"""TN: 会议室预定信息"""
|
"""TN: 会议室预定信息"""
|
||||||
title = models.CharField('会议主题', max_length=100)
|
title = models.CharField('会议主题', max_length=100)
|
||||||
|
ticket = models.ForeignKey('wf.ticket', verbose_name='关联会议室',
|
||||||
|
on_delete=models.SET_NULL, related_name='mrooms_ticket', null=True, blank=True, db_constraint=False)
|
||||||
|
|
||||||
|
|
||||||
class MroomSlot(BaseModel):
|
class MroomSlot(BaseModel):
|
||||||
|
@ -36,11 +38,10 @@ class MroomSlot(BaseModel):
|
||||||
booking = models.ForeignKey(MroomBooking, on_delete=models.CASCADE, related_name="slot_b")
|
booking = models.ForeignKey(MroomBooking, on_delete=models.CASCADE, related_name="slot_b")
|
||||||
mdate = models.DateField('会议日期', db_index=True)
|
mdate = models.DateField('会议日期', db_index=True)
|
||||||
slot = models.PositiveIntegerField('时段', help_text='0-47')
|
slot = models.PositiveIntegerField('时段', help_text='0-47')
|
||||||
ticket = models.ForeignKey('wf.ticket', verbose_name='关联会议室',
|
is_inuse = models.BooleanField('是否占用', default=True)
|
||||||
on_delete=models.SET_NULL, related_name='mrooms_ticket', null=True, blank=True, db_constraint=False)
|
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = ('mroom', 'mdate', 'slot')
|
unique_together = ('mroom', 'mdate', 'slot', 'is_inuse')
|
||||||
|
|
||||||
|
|
||||||
# class Seal(BaseModel):
|
# class Seal(BaseModel):
|
||||||
|
|
|
@ -5,6 +5,7 @@ from rest_framework import serializers
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
from rest_framework.exceptions import ParseError
|
from rest_framework.exceptions import ParseError
|
||||||
from apps.utils.constants import EXCLUDE_FIELDS
|
from apps.utils.constants import EXCLUDE_FIELDS
|
||||||
|
from apps.wf.serializers import TicketSimpleSerializer
|
||||||
|
|
||||||
|
|
||||||
class MroomSerializer(CustomModelSerializer):
|
class MroomSerializer(CustomModelSerializer):
|
||||||
|
@ -18,12 +19,12 @@ class MroomBookingSerializer(CustomModelSerializer):
|
||||||
mdate = serializers.DateField(write_only=True, label="预订日期")
|
mdate = serializers.DateField(write_only=True, label="预订日期")
|
||||||
slots = serializers.ListField(child=serializers.IntegerField(), 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_name = serializers.CharField(source='create_by.username', read_only=True)
|
||||||
|
ticket_ = TicketSimpleSerializer(source='ticket', read_only=True)
|
||||||
class Meta:
|
class Meta:
|
||||||
model = MroomBooking
|
model = MroomBooking
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
read_only_fields = EXCLUDE_FIELDS
|
read_only_fields = EXCLUDE_FIELDS
|
||||||
|
|
||||||
@transaction.atomic
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
mroom = validated_data.pop('mroom')
|
mroom = validated_data.pop('mroom')
|
||||||
slots = validated_data.pop('slots')
|
slots = validated_data.pop('slots')
|
||||||
|
@ -34,12 +35,11 @@ class MroomBookingSerializer(CustomModelSerializer):
|
||||||
if slot < 0 or slot > 47:
|
if slot < 0 or slot > 47:
|
||||||
raise ParseError("时段索引超出范围")
|
raise ParseError("时段索引超出范围")
|
||||||
try:
|
try:
|
||||||
MroomSlot.objects.create(booking=booking, slot=slot, mdate=mdate, mroom=mroom)
|
MroomSlot.objects.create(booking=booking, slot=slot, mdate=mdate, mroom=mroom, is_inuse=True)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ParseError(f"时段已预订,请刷新重选-{e}")
|
raise ParseError(f"时段已预订,请刷新重选-{e}")
|
||||||
return booking
|
return booking
|
||||||
|
|
||||||
@transaction.atomic
|
|
||||||
def update(self, instance, validated_data):
|
def update(self, instance, validated_data):
|
||||||
mroom = validated_data.pop('mroom')
|
mroom = validated_data.pop('mroom')
|
||||||
slots = validated_data.pop('slots')
|
slots = validated_data.pop('slots')
|
||||||
|
@ -50,7 +50,7 @@ class MroomBookingSerializer(CustomModelSerializer):
|
||||||
if slot < 0 or slot > 47:
|
if slot < 0 or slot > 47:
|
||||||
raise ParseError("时段索引超出范围")
|
raise ParseError("时段索引超出范围")
|
||||||
try:
|
try:
|
||||||
MroomSlot.objects.create(booking=booking, slot=slot, mdate=mdate, mroom=mroom)
|
MroomSlot.objects.create(booking=booking, slot=slot, mdate=mdate, mroom=mroom, is_inuse=True)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ParseError(f"时段已预订,请刷新重选-{e}")
|
raise ParseError(f"时段已预订,请刷新重选-{e}")
|
||||||
return booking
|
return booking
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
|
||||||
from apps.wf.models import Ticket
|
from apps.wf.models import Ticket
|
||||||
# TicketFlow, Transition, Workflow, CustomField, State,
|
# TicketFlow, Transition, Workflow, CustomField, State,
|
||||||
from apps.ofm.models import LendingSeal, Vehicle, BorrowRecord, Publicity, MroomSlot
|
from apps.ofm.models import LendingSeal, Vehicle, BorrowRecord, Publicity, MroomBooking, MroomSlot
|
||||||
from rest_framework.exceptions import ParseError
|
from rest_framework.exceptions import ParseError
|
||||||
|
|
||||||
|
|
||||||
|
@ -11,11 +11,11 @@ def seal_submit_validate(ins: LendingSeal):
|
||||||
if ins.mtask and ins.mtask.state == LendingSeal.MTASK_STOP:
|
if ins.mtask and ins.mtask.state == LendingSeal.MTASK_STOP:
|
||||||
raise ParseError('该任务已停止!')
|
raise ParseError('该任务已停止!')
|
||||||
|
|
||||||
def bind_mslot(ticket: Ticket, transition, new_ticket_data: dict):
|
def bind_mroombooking(ticket: Ticket, transition, new_ticket_data: dict):
|
||||||
ins = MroomSlot.objects.get(id=new_ticket_data['t_id'])
|
ins = MroomBooking.objects.get(id=new_ticket_data['t_id'])
|
||||||
ticket_data = ticket.ticket_data
|
ticket_data = ticket.ticket_data
|
||||||
ticket_data.update({
|
ticket_data.update({
|
||||||
't_model': 'mroomslot',
|
't_model': 'mroombooking',
|
||||||
't_id': ins.id,
|
't_id': ins.id,
|
||||||
})
|
})
|
||||||
ticket.ticket_data = ticket_data
|
ticket.ticket_data = ticket_data
|
||||||
|
@ -25,6 +25,10 @@ def bind_mslot(ticket: Ticket, transition, new_ticket_data: dict):
|
||||||
ins.ticket = ticket
|
ins.ticket = ticket
|
||||||
ins.save()
|
ins.save()
|
||||||
|
|
||||||
|
def mroombooking_reject(ticket: Ticket, transition, new_ticket_data: dict):
|
||||||
|
ins = MroomBooking.objects.get(id=new_ticket_data['t_id'])
|
||||||
|
MroomSlot.objects.filter(booking=ins).update(is_inuse=False)
|
||||||
|
|
||||||
def bind_lendingseal(ticket: Ticket, transition, new_ticket_data: dict):
|
def bind_lendingseal(ticket: Ticket, transition, new_ticket_data: dict):
|
||||||
ins = LendingSeal.objects.get(id=new_ticket_data['t_id'])
|
ins = LendingSeal.objects.get(id=new_ticket_data['t_id'])
|
||||||
ticket_data = ticket.ticket_data
|
ticket_data = ticket.ticket_data
|
||||||
|
|
|
@ -28,7 +28,7 @@ class MroomBookingViewSet(CustomModelViewSet):
|
||||||
"""
|
"""
|
||||||
queryset = MroomBooking.objects.all()
|
queryset = MroomBooking.objects.all()
|
||||||
serializer_class = MroomBookingSerializer
|
serializer_class = MroomBookingSerializer
|
||||||
select_related_fields = ["create_by"]
|
select_related_fields = ["create_by", "ticket"]
|
||||||
filterset_class = MroomBookingFilterset
|
filterset_class = MroomBookingFilterset
|
||||||
|
|
||||||
def add_info_for_list(self, data):
|
def add_info_for_list(self, data):
|
||||||
|
@ -81,6 +81,11 @@ class MroomBookingViewSet(CustomModelViewSet):
|
||||||
|
|
||||||
def perform_update(self, serializer):
|
def perform_update(self, serializer):
|
||||||
ins:MroomBooking = self.get_object()
|
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:
|
if ins.create_by and ins.create_by != self.request.user:
|
||||||
raise ParseError("只允许创建者修改")
|
raise ParseError("只允许创建者修改")
|
||||||
return super().perform_update(serializer)
|
return super().perform_update(serializer)
|
||||||
|
@ -88,7 +93,14 @@ class MroomBookingViewSet(CustomModelViewSet):
|
||||||
def perform_destroy(self, instance):
|
def perform_destroy(self, instance):
|
||||||
if instance.create_by and instance.create_by != self.request.user:
|
if instance.create_by and instance.create_by != self.request.user:
|
||||||
raise ParseError("只允许创建者删除")
|
raise ParseError("只允许创建者删除")
|
||||||
return super().perform_destroy(instance)
|
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):
|
class MroomSlotViewSet(CustomListModelMixin, CustomGenericViewSet):
|
||||||
|
@ -98,7 +110,7 @@ class MroomSlotViewSet(CustomListModelMixin, CustomGenericViewSet):
|
||||||
"""
|
"""
|
||||||
queryset = MroomSlot.objects.all()
|
queryset = MroomSlot.objects.all()
|
||||||
serializer_class = MroomSlotSerializer
|
serializer_class = MroomSlotSerializer
|
||||||
filterset_fields = ["mroom", "mdate", "booking"]
|
filterset_fields = ["mroom", "mdate", "booking", "is_inuse"]
|
||||||
|
|
||||||
|
|
||||||
class LendingSealViewSet(CustomModelViewSet):
|
class LendingSealViewSet(CustomModelViewSet):
|
||||||
|
|
Loading…
Reference in New Issue