diff --git a/server/apps/edu/models.py b/server/apps/edu/models.py index adbf6d2..4f992e0 100644 --- a/server/apps/edu/models.py +++ b/server/apps/edu/models.py @@ -5,7 +5,7 @@ from apps.system.models import CommonADModel, CommonAModel class Course(CommonAModel): - name = models.CharField("课程名", max_length=20) + name = models.CharField("课程名", max_length=100) class Certificate(CommonADModel): diff --git a/server/apps/exam/views.py b/server/apps/exam/views.py index 14245a4..4e89fa1 100644 --- a/server/apps/exam/views.py +++ b/server/apps/exam/views.py @@ -695,7 +695,7 @@ class ExamRecordViewSet(ListModelMixin, DestroyModelMixin, RetrieveModelMixin, G '用户ID': request.user.id, '证书编号': cer_number, '证书方案': '202312', - '单位名称': request.user.dept.name, + '单位名称': request.user.dept.full_name, '所属单位': '国检测试控股集团'+request.user.dept.name, '发证日期': current_date, '培训日期':current_date, diff --git a/server/apps/system/migrations/0024_organization_full_name.py b/server/apps/system/migrations/0024_organization_full_name.py new file mode 100644 index 0000000..b9ed257 --- /dev/null +++ b/server/apps/system/migrations/0024_organization_full_name.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2024-07-23 00:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0023_alter_user_first_name'), + ] + + operations = [ + migrations.AddField( + model_name='organization', + name='full_name', + field=models.CharField(blank=True, max_length=100, null=True, verbose_name='全称'), + ), + ] diff --git a/server/apps/system/models.py b/server/apps/system/models.py index fd84af5..6fb4de3 100644 --- a/server/apps/system/models.py +++ b/server/apps/system/models.py @@ -62,6 +62,7 @@ class Organization(SoftModel): 组织架构 """ name = models.CharField('名称', max_length=60) + full_name = models.CharField('全称', max_length=100, null=True, blank=True) type = models.ForeignKey('system.dict', verbose_name='组织类型', null=True, blank=True, on_delete=models.SET_NULL) pid = models.ForeignKey('self', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='父') diff --git a/server/apps/system/views.py b/server/apps/system/views.py index 7e941a3..ff39898 100644 --- a/server/apps/system/views.py +++ b/server/apps/system/views.py @@ -110,8 +110,14 @@ class ImpMixin: serializer = mySerializer(data=data_list, many=True, context={'request': request}) if serializer.is_valid(): serializer.save() - else: - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + else: + err_msg = '' + if isinstance(serializer.errors, list): + for ind, val in enumerate(serializer.errors): + if val: + err_msg = f'第{ind+2}行: {str(val)}' + break + raise ParseError(err_msg) return Response({'uploaded': 'File uploaded successfully'}, status=status.HTTP_201_CREATED) @@ -344,17 +350,19 @@ class UserExamViewset(ImpMixin, ModelViewSet): data_list = [] exam_role = Role.objects.get(name='考试') if not exam_role: - return Response({'msg': '考试角色不存在'}) - for row in sheet.iter_rows(min_row=start, values_only=True): # 假设第一行是表头,从第二行开始读取数据 + raise ParseError('考试角色不存在') + depts_dict = {dept.name: dept for dept in Organization.objects.all()} + for ind, row in enumerate(sheet.iter_rows(min_row=start, values_only=True)): # 假设第一行是表头,从第二行开始读取数据 if row[0] is not None: - dept = Organization.objects.get(name=row[2]) - user_depts = get_child_queryset2(self.request.user.dept).order_by('sort') - depts = any(i.name==dept.name for i in user_depts) - if depts is False: - return Response({'msg': f'本公司下不存在此部门{row[2]}'}) + deptname = row[2].strip() + username = row[1].replace(' ', '').strip() + name = row[0].replace(' ', '').strip() + dept = depts_dict.get(deptname, None) + if dept is None: + raise ParseError(f'第{ind}行不存在此部门{deptname}') serializer_data = { - 'name': row[0], - 'username':row[1], + 'name': name, + 'username':username, 'dept':dept.id, 'roles':[exam_role.id], 'avatar': "/media/default/avatar.png"