fix:exam 修改考试的证书
This commit is contained in:
parent
aa37c99ac4
commit
03b273d6cd
|
@ -688,33 +688,38 @@ class ExamRecordViewSet(ListModelMixin, DestroyModelMixin, RetrieveModelMixin, G
|
||||||
courese_ids = [i.id for i in course]
|
courese_ids = [i.id for i in course]
|
||||||
current_date = now_data.strftime('%Y-%m-%d')
|
current_date = now_data.strftime('%Y-%m-%d')
|
||||||
cer_number = now_data.strftime('%Y%m%d')
|
cer_number = now_data.strftime('%Y%m%d')
|
||||||
# redis 连接并获取锁
|
# 获取锁
|
||||||
cache.set("certificate", str(uuid.uuid4()), timeout=60)
|
iden = acquire_lock('certificate')
|
||||||
# 查询证明编号创建时间为最后一个
|
if iden is None:
|
||||||
cer = Certificate.objects.latest('证书编号')
|
raise ParseError("系统忙,请稍后再试。", status=503)
|
||||||
if cer:
|
try:
|
||||||
cer_number = int(cer.证书编号[5:]) + 1
|
# 查询证明编号创建时间为最后一个
|
||||||
cer_number = 'CTCZL' + str(cer_number)
|
cer = Certificate.objects.latest('证书编号')
|
||||||
data_dict = {
|
if cer:
|
||||||
'姓名': request.user.name,
|
cer_number = int(cer.证书编号[5:]) + 1
|
||||||
'用户ID': request.user.id,
|
cer_number = 'CTCZL' + str(cer_number)
|
||||||
'证书编号': cer_number,
|
data_dict = {
|
||||||
'证书方案': '202312',
|
'姓名': request.user.name,
|
||||||
'单位名称': request.user.dept.full_name,
|
'用户ID': request.user.id,
|
||||||
'所属单位': '国检测试控股集团'+request.user.dept.name,
|
'证书编号': cer_number,
|
||||||
'发证日期': current_date,
|
'证书方案': '202312',
|
||||||
'培训日期':current_date,
|
'单位名称': request.user.dept.full_name,
|
||||||
'培训结束日期': current_date,
|
'所属单位': '国检测试控股集团'+request.user.dept.name,
|
||||||
'课程列表': courese_ids,
|
'发证日期': current_date,
|
||||||
'examrecord': er.id,
|
'培训日期':current_date,
|
||||||
}
|
'培训结束日期': current_date,
|
||||||
serializer = CertificateSerializer(data=data_dict)
|
'课程列表': courese_ids,
|
||||||
serializer.is_valid(raise_exception=True)
|
'examrecord': er.id,
|
||||||
serializer.save()
|
}
|
||||||
val = cache.get("certificate")
|
serializer = CertificateSerializer(data=data_dict)
|
||||||
if val: # 如果存在,则删除
|
serializer.is_valid(raise_exception=True)
|
||||||
# 释放锁
|
serializer.save()
|
||||||
cache.delete("certificate")
|
except Exception as e:
|
||||||
|
import traceback
|
||||||
|
raise ParseError(traceback.print_exc())
|
||||||
|
finally:
|
||||||
|
release_lock('certificate', iden)
|
||||||
|
|
||||||
er.took = (now - er.create_time).total_seconds()
|
er.took = (now - er.create_time).total_seconds()
|
||||||
er.end_time = now
|
er.end_time = now
|
||||||
er.belong_dept=request.user.dept
|
er.belong_dept=request.user.dept
|
||||||
|
@ -723,31 +728,14 @@ class ExamRecordViewSet(ListModelMixin, DestroyModelMixin, RetrieveModelMixin, G
|
||||||
return Response(ExamRecordListSerializer(instance=er).data)
|
return Response(ExamRecordListSerializer(instance=er).data)
|
||||||
|
|
||||||
|
|
||||||
def acquire_lock(redis_conn, lock_name, ttl):
|
def acquire_lock(lock_name, timeout=60):
|
||||||
identifier = str(uuid.uuid4())
|
identifier = str(uuid.uuid4())
|
||||||
lock = redis_conn.set(lock_name, identifier, nx=True, ex=ttl)
|
lock = cache.add(lock_name, identifier, timeout=timeout, nx=True)
|
||||||
return identifier if lock else None
|
return identifier if lock else None
|
||||||
|
|
||||||
|
def release_lock(lock_name, identifier):
|
||||||
import redis
|
if cache.get(lock_name) == identifier:
|
||||||
def release_lock(redis_conn, lock_name, identifier):
|
cache.delete(lock_name)
|
||||||
with redis_conn.pipeline() as pipe:
|
return True
|
||||||
try:
|
else:
|
||||||
while True:
|
raise ParseError('Lock identifier does not match')
|
||||||
try:
|
|
||||||
pipe.watch(lock_name)
|
|
||||||
# 使用 multi/exec 模式来确保原子性
|
|
||||||
if pipe.get(lock_name) == identifier:
|
|
||||||
pipe.multi()
|
|
||||||
pipe.delete(lock_name)
|
|
||||||
pipe.execute()
|
|
||||||
return True
|
|
||||||
# 如果锁已经被修改,取消监视
|
|
||||||
pipe.unwatch()
|
|
||||||
return False
|
|
||||||
except redis.exceptions.WatchError:
|
|
||||||
# 如果在监视期间锁被修改,重试
|
|
||||||
continue
|
|
||||||
except redis.exceptions.RedisError as e:
|
|
||||||
print(f"Error releasing lock: {e}")
|
|
||||||
return False
|
|
|
@ -1,5 +1,5 @@
|
||||||
from .settings import *
|
from .settings import *
|
||||||
DEBUG = True
|
DEBUG = False
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
# 'default': {
|
# 'default': {
|
||||||
# 'ENGINE': 'django.db.backends.postgresql',
|
# 'ENGINE': 'django.db.backends.postgresql',
|
||||||
|
|
Loading…
Reference in New Issue