diff --git a/server/apps/edu/urls.py b/server/apps/edu/urls.py index 103b7ef..4753873 100644 --- a/server/apps/edu/urls.py +++ b/server/apps/edu/urls.py @@ -1,11 +1,10 @@ from django.urls import path, include from rest_framework import routers -from apps.edu.views import CertificateViewSet +from apps.edu.views import CertificateViewSet, CourseViewSet -API_BASE_URL = 'api/edu/' -HTML_BASE_URL = 'edu/' +API_BASE_URL = "api/edu/" +HTML_BASE_URL = "edu/" router = routers.DefaultRouter() -router.register('certificate', CertificateViewSet, basename="certificate") -urlpatterns = [ - path(API_BASE_URL, include(router.urls)) -] \ No newline at end of file +router.register("certificate", CertificateViewSet, basename="certificate") +router.register("course", CourseViewSet, basename="course") +urlpatterns = [path(API_BASE_URL, include(router.urls))] diff --git a/server/apps/edu/views.py b/server/apps/edu/views.py index d7bd095..95881fd 100644 --- a/server/apps/edu/views.py +++ b/server/apps/edu/views.py @@ -10,75 +10,121 @@ from openpyxl import load_workbook from rest_framework.serializers import Serializer from rest_framework.permissions import AllowAny from apps.edu.services import make_img_x +from django.db import transaction +import datetime + + # Create your views here. class CourseViewSet(CreateUpdateCustomMixin, ModelViewSet): - perms_map = {'get': '*', 'post': 'course', - 'put': 'course', 'delete': 'course'} + perms_map = {"get": "*", "post": "course", "put": "course", "delete": "course"} queryset = Course.objects.all() serializer_class = CourseSerializer - search_fields = ['name'] - ordering = ['create_time'] + search_fields = ["name"] + ordering = ["create_time"] class CertificateViewSet(CreateUpdateCustomMixin, ModelViewSet): - perms_map = {'get': '*', 'post': 'certificate', - 'put': 'certificate', 'delete': 'certificate'} + perms_map = {"get": "*", "post": "certificate", "put": "certificate", "delete": "certificate"} queryset = Certificate.objects.all() serializer_class = CertificateSerializer - search_fields = ['姓名', '证书编号', '所属单位'] - filterset_fields = ['是否内审员','是否授权签字人', '是否质量负责人', '是否最高管理者', '姓名', '证书编号', '所属单位', '单位名称', '课程列表'] - ordering = ['-create_time', '证书编号'] + search_fields = ["姓名", "证书编号", "所属单位"] + filterset_fields = ["是否内审员", "是否授权签字人", "是否质量负责人", "是否最高管理者", "姓名", "证书编号", "所属单位", "单位名称", "课程列表", "证书方案"] + ordering = ["-create_time", "证书编号"] def get_authenticators(self): - if self.request.method == 'GET': + if self.request.method == "GET": return [] return super().get_authenticators() - + def get_permissions(self): - if self.request.method == 'GET': + if self.request.method == "GET": return [AllowAny()] return super().get_permissions() def retrieve(self, request, *args, **kwargs): - regen_img = request.query_params.get('regen_img', False) + regen_img = request.query_params.get("regen_img", False) instance = self.get_object() if not instance.证书地址 or regen_img: make_img_x(instance) serializer = self.get_serializer(instance) return Response(serializer.data) - + def make_data(self, data, sheet, i): - data['证书编号'] = sheet['b'+str(i)].value - data['所属单位'] = sheet['c'+str(i)].value - data['单位名称'] = sheet['d'+str(i)].value - data['姓名'] = sheet['e'+str(i)].value - data['性别'] = sheet['f'+str(i)].value - data['职务'] = sheet['g'+str(i)].value - data['手机号'] = sheet['h'+str(i)].value - data['是否内审员'] = True if sheet['i'+str(i)].value else False - data['是否授权签字人'] = True if sheet['j'+str(i)].value else False - data['是否质量负责人'] = True if sheet['k'+str(i)].value else False - data['是否最高管理者'] = True if sheet['l'+str(i)].value else False - data['是否需要集团证书'] = True if sheet['m'+str(i)].value else False - data['是否需要北京标研培训合格'] = True if sheet['n'+str(i)].value else False + data["证书编号"] = sheet["b" + str(i)].value + data["所属单位"] = sheet["c" + str(i)].value + data["单位名称"] = sheet["d" + str(i)].value + data["姓名"] = sheet["e" + str(i)].value + data["性别"] = sheet["f" + str(i)].value + data["职务"] = sheet["g" + str(i)].value + data["手机号"] = sheet["h" + str(i)].value + data["是否内审员"] = True if sheet["i" + str(i)].value else False + data["是否授权签字人"] = True if sheet["j" + str(i)].value else False + data["是否质量负责人"] = True if sheet["k" + str(i)].value else False + data["是否最高管理者"] = True if sheet["l" + str(i)].value else False + data["是否需要集团证书"] = True if sheet["m" + str(i)].value else False + data["是否需要北京标研培训合格"] = True if sheet["n" + str(i)].value else False return data - @action(methods=['post'], detail=False, perms_map = {'post':'certificate'}, serializer_class=Serializer) + @action(methods=["post"], detail=False, perms_map={"post": "certificate"}, serializer_class=Serializer) def imp(self, request, *args, **kwargs): """导入表格 导入表格 """ - path = request.data.get('path', '') + path = request.data.get("path", "") full_path = settings.BASE_DIR + path - if not path.endswith('.xlsx'): - raise ParseError('请提供xlsx格式文件') + if not path.endswith(".xlsx"): + raise ParseError("请提供xlsx格式文件") wb = load_workbook(full_path, data_only=True) sheet = wb.worksheets[0] i = 3 - while sheet['b'+str(i)].value: + while sheet["b" + str(i)].value: data = {} data = self.make_data(data, sheet, i) - obj, created = Certificate.objects.update_or_create(defaults=data, 证书编号=data['证书编号']) + obj, created = Certificate.objects.update_or_create(defaults=data, 证书编号=data["证书编号"]) i = i + 1 return Response() + + @action(methods=["post"], detail=False, perms_map={"post": "certificate"}, serializer_class=Serializer) + @transaction.atomic + def imp_202312(self, request, *args, **kwargs): + """导入202312版本表格 + + 导入表格 + """ + path = request.data.get("path", "") + full_path = settings.BASE_DIR + path + if not path.endswith(".xlsx"): + raise ParseError("请提供xlsx格式文件") + wb = load_workbook(full_path, data_only=True) + sheet = wb.worksheets[0] + courses_str = sheet["b1"].value + courses = courses_str.split(";") + courses_list = [] + for course in courses: + try: + course_obj = Course.objects.get(name=course) + courses_list.append(course_obj.id) + except Course.DoesNotExist: + raise ParseError("课程不存在") + att_date = sheet["b2"].value + att_date2 = sheet["b3"].value + issue_date = sheet["b4"].value + i = 6 + while sheet[f"a{i}"].value: + number = sheet[f"a{i}"].value.replace("\n", "").replace(" ", "") + name = sheet[f"b{i}"].value.replace("\n", "").replace(" ", "") + print(number) + obj, created = Certificate.objects.update_or_create( + defaults={ + "证书编号": number, + "姓名": name, + "培训日期": att_date, + "培训结束日期": att_date2, + "发证日期": issue_date, + }, + 证书编号=number, + ) + obj.课程列表.set(Course.objects.filter(id__in=courses_list)) + i += 1 + return Response()