From 83a20df7f43616f45188dd1c7f68b63597281ad9 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 2 Jan 2024 15:22:32 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0course=20api?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/edu/urls.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) 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))] From 6d647ee574cff95b888bc2c0f543593d24dc53ff Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 2 Jan 2024 15:35:29 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0certificate?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/edu/views.py | 66 ++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/server/apps/edu/views.py b/server/apps/edu/views.py index d7bd095..d352246 100644 --- a/server/apps/edu/views.py +++ b/server/apps/edu/views.py @@ -10,75 +10,75 @@ 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 + + # 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() From 5058c17177886ab82ab2c72c7b34c5cc47e6d476 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 2 Jan 2024 17:09:59 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20202312=E8=AF=81=E4=B9=A6=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/edu/views.py | 46 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/server/apps/edu/views.py b/server/apps/edu/views.py index d352246..95881fd 100644 --- a/server/apps/edu/views.py +++ b/server/apps/edu/views.py @@ -10,6 +10,8 @@ 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. @@ -82,3 +84,47 @@ class CertificateViewSet(CreateUpdateCustomMixin, ModelViewSet): 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()