Appointment.appoint.judge 源代码
from django.db import transaction
from Appointment.models import User, Participant, Appoint
from Appointment.utils.log import get_user_logger, logger
[文档]
@logger.secure_func('无法设置违规原因', fail_value=False)
def set_appoint_reason(input_appoint: Appoint, reason: Appoint.Reason) -> bool:
'''预约的过程中检查迟到,先记录原因,并且进入到进行中状态,不一定扣分'''
with transaction.atomic():
appoint: Appoint = Appoint.objects.select_for_update().get(
Aid=input_appoint.Aid)
if appoint.Astatus == Appoint.Status.APPOINTED:
appoint.Astatus = Appoint.Status.PROCESSING # 避免重复调用本函数
appoint.Areason = reason
appoint.save()
log_msg = f"预约{appoint.Aid}出现违约:{appoint.get_Areason_display()}"
get_user_logger(appoint).info(log_msg)
return True
[文档]
@logger.secure_func('无法设置违规', fail_value=False)
def appoint_violate(input_appoint: Appoint, reason: Appoint.Reason) -> bool:
'''将一个预约设为违约'''
with transaction.atomic():
appoint: Appoint = Appoint.objects.select_related(
'major_student').select_for_update().get(Aid=input_appoint.Aid)
major_student: Participant = Participant.objects.select_for_update().get(
pk=appoint.major_student.pk)
if appoint.Astatus == Appoint.Status.VIOLATED:
return True
# 不出现负分;如果已经是violated了就不重复扣分了
deduct = -User.objects.modify_credit(major_student.Sid, -1, '地下室:违规')
appoint.Astatus = Appoint.Status.VIOLATED
appoint.Areason = reason
appoint.save()
log_msg = f"预约{appoint.Aid}出现违约:{appoint.get_Areason_display()};"
log_msg += f"扣除信用分:{deduct};剩余信用分:{major_student.credit}"
get_user_logger(major_student).info(log_msg)
return True