diff --git a/test_client/src/api/candidate.js b/test_client/src/api/candidate.js index 4374232..7847e2d 100644 --- a/test_client/src/api/candidate.js +++ b/test_client/src/api/candidate.js @@ -6,4 +6,21 @@ export function getCandidateList(query) { method: 'get', params:query }) +} + +export function createCandidate(data){ + + return request({ + url:'/crm/candidate/', + method: 'post', + data + }) +} + +export function updateCandidate(id, data) { + return request({ + url: `/crm/candidate/${id}/`, + method: 'put', + data + }) } \ No newline at end of file diff --git a/test_client/src/views/exam/issue.vue b/test_client/src/views/exam/issue.vue index d1a8618..ddf07db 100644 --- a/test_client/src/views/exam/issue.vue +++ b/test_client/src/views/exam/issue.vue @@ -1,96 +1,235 @@ - + diff --git a/test_server/crm/migrations/0036_auto_20220209_0912.py b/test_server/crm/migrations/0036_auto_20220209_0912.py new file mode 100644 index 0000000..3fb6712 --- /dev/null +++ b/test_server/crm/migrations/0036_auto_20220209_0912.py @@ -0,0 +1,35 @@ +# Generated by Django 3.0.4 on 2022-02-09 01:12 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('examtest', '0032_auto_20210613_2234'), + ('crm', '0035_auto_20210622_1420'), + ] + + operations = [ + migrations.AddField( + model_name='candidate', + name='examtest_date', + field=models.DateField(blank=True, null=True, verbose_name='考试时间'), + ), + migrations.AddField( + model_name='candidate', + name='is_manual', + field=models.BooleanField(default=False, verbose_name='是否手动创建'), + ), + migrations.AlterField( + model_name='candidate', + name='consumer', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='candidate_consumer', to='crm.Consumer'), + ), + migrations.AlterField( + model_name='candidate', + name='workscope', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='candidate_workscope', to='examtest.WorkScope'), + ), + ] diff --git a/test_server/crm/migrations/0037_candidate_photo.py b/test_server/crm/migrations/0037_candidate_photo.py new file mode 100644 index 0000000..0dbe28f --- /dev/null +++ b/test_server/crm/migrations/0037_candidate_photo.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.4 on 2022-02-09 02:15 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('crm', '0036_auto_20220209_0912'), + ] + + operations = [ + migrations.AddField( + model_name='candidate', + name='photo', + field=models.CharField(blank=True, max_length=200, null=True, verbose_name='照片'), + ), + ] diff --git a/test_server/crm/migrations/0038_candidate_gender.py b/test_server/crm/migrations/0038_candidate_gender.py new file mode 100644 index 0000000..6272c27 --- /dev/null +++ b/test_server/crm/migrations/0038_candidate_gender.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.4 on 2022-02-09 03:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('crm', '0037_candidate_photo'), + ] + + operations = [ + migrations.AddField( + model_name='candidate', + name='gender', + field=models.CharField(default='男', max_length=6, verbose_name='性别'), + ), + ] diff --git a/test_server/crm/migrations/0039_remove_candidate_gender.py b/test_server/crm/migrations/0039_remove_candidate_gender.py new file mode 100644 index 0000000..0515da4 --- /dev/null +++ b/test_server/crm/migrations/0039_remove_candidate_gender.py @@ -0,0 +1,17 @@ +# Generated by Django 3.0.4 on 2022-02-09 03:09 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('crm', '0038_candidate_gender'), + ] + + operations = [ + migrations.RemoveField( + model_name='candidate', + name='gender', + ), + ] diff --git a/test_server/crm/models.py b/test_server/crm/models.py index 48290f4..357c193 100644 --- a/test_server/crm/models.py +++ b/test_server/crm/models.py @@ -105,9 +105,10 @@ class SendCode(CommonModel): code = models.CharField(max_length=6, verbose_name= '验证码') class Candidate(CommonModel): - consumer = models.ForeignKey(Consumer, on_delete=models.DO_NOTHING, related_name='candidate_consumer') - workscope = models.ForeignKey(WorkScope, on_delete=models.DO_NOTHING, related_name='candidate_workscope') - + consumer = models.ForeignKey(Consumer, on_delete=models.DO_NOTHING, related_name='candidate_consumer', null=True, blank=True) + workscope = models.ForeignKey(WorkScope, on_delete=models.DO_NOTHING, related_name='candidate_workscope', null=True, blank=True) + examtest = models.OneToOneField(to='examtest.examtest', verbose_name='关联考试', null=True, blank=True, on_delete=models.DO_NOTHING) + is_manual = models.BooleanField('是否手动创建', default=False) # 下面是证书信息 number = models.CharField('报告单号', max_length=60, null=True, blank=True) @@ -119,8 +120,10 @@ class Candidate(CommonModel): issue_date = models.DateField('发证日期', null=True, blank=True) start_date = models.DateField('有效期始', null=True, blank=True) end_date = models.DateField('有效期止', null=True, blank=True) - examtest = models.OneToOneField(to='examtest.examtest', verbose_name='关联考试', null=True, blank=True, on_delete=models.DO_NOTHING) + examtest_date = models.DateField('考试时间', null=True, blank=True) + photo = models.CharField('照片', max_length=200, null=True, blank=True) create_admin = models.ForeignKey(UserProfile, verbose_name="创建管理员", null=True, blank=True, on_delete=models.SET_NULL) + class Meta: verbose_name = '证书' verbose_name_plural = verbose_name diff --git a/test_server/crm/serializers.py b/test_server/crm/serializers.py index f2f55cb..aef0459 100644 --- a/test_server/crm/serializers.py +++ b/test_server/crm/serializers.py @@ -1,3 +1,4 @@ +from operator import truediv from rest_framework import serializers from .models import Candidate, Company, Consumer, PaySubject, ConsumerPerm, ConsumerRole, SendCode from question.models import Question, Questioncat @@ -80,6 +81,16 @@ class CandidateSerializer(serializers.ModelSerializer): class Meta: model = Candidate fields = '__all__' + +class CandidateCreateSerializer(serializers.ModelSerializer): + class Meta: + model = Candidate + exclude = ['consumer', 'examtest', 'workscope', 'is_manual', 'create_admin'] + + def create(self, validated_data): + validated_data['is_manual'] = True + validated_data['create_admin'] = self.context['request'].user + return super().create(validated_data) class MsgSerializer(serializers.ModelSerializer): class Meta: diff --git a/test_server/crm/templates/index.html b/test_server/crm/templates/index.html index 7de1619..f87cf10 100644 --- a/test_server/crm/templates/index.html +++ b/test_server/crm/templates/index.html @@ -103,7 +103,12 @@
-
Ⅲ类射线装置辐射工作人员 +
+ {% if candidate.is_manual %} + 核技术利用辐射安全与防护考核 + {% else %} + Ⅲ类射线装置辐射工作人员 + {% endif %}
成绩报告单
- + draggable="true"> + {% endif %} +
{{candidate.consumer_name}}, - + {{candidate.msg.sex}}, + {{candidate.msg.year}}年{{candidate.msg.month}}月{{candidate.msg.day}}日生, 身份证{{candidate.ID_number}},于 - {{candidate.examtest.start_time|date}}参加  + {{candidate.examtest_date|date}}参加  {{candidate.workscope_name}} 辐射安全与防护考核,成绩合格。
diff --git a/test_server/crm/views.py b/test_server/crm/views.py index 70f4dc3..e183f31 100644 --- a/test_server/crm/views.py +++ b/test_server/crm/views.py @@ -11,7 +11,7 @@ from openpyxl import Workbook, load_workbook from rest_framework import status from rest_framework.decorators import action, authentication_classes, permission_classes from rest_framework.filters import OrderingFilter, SearchFilter -from rest_framework.mixins import CreateModelMixin, ListModelMixin, RetrieveModelMixin +from rest_framework.mixins import CreateModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView @@ -29,7 +29,7 @@ from utils.custom import CommonPagination from .filters import ConsumerFilter from .exports import export_consumer from .models import Candidate, Company, Consumer, PaySubject, SendCode, ConsumerPerm, ConsumerRole -from .serializers import CandidateSerializer, CompanySerializer, ConsumerSerializer, ConsumerPermSerializer, ConsumerRoleSerializer, ConsumerDetailSerializer, MsgSerializer +from .serializers import CandidateCreateSerializer, CandidateSerializer, CompanySerializer, ConsumerSerializer, ConsumerPermSerializer, ConsumerRoleSerializer, ConsumerDetailSerializer, MsgSerializer from lxml import etree from rbac.models import UserProfile from django.http import Http404 @@ -660,18 +660,31 @@ def candidate(request): if request.GET.get('id', None): try: candidate = Candidate.objects.get(id=request.GET.get('id'), number__isnull=False) + candidate.msg = get_msg_from_id(candidate.ID_number) return render(request, 'index.html', {"candidate":candidate}) except: raise Http404 raise Http404 +def get_msg_from_id(id_number): + year=id_number[6:10] + month=id_number[10:12] + day=id_number[12:14] + sex=id_number[16:17] + sex=int(sex) + if sex%2: + sex="男" + else: + sex="女" + return {'year':year, 'month':month, 'day':day, 'sex':sex} + from examtest.exports import exportw_test -class CandidateViewSet(RetrieveModelMixin, ListModelMixin, GenericViewSet): +class CandidateViewSet(RetrieveModelMixin, ListModelMixin, CreateModelMixin, UpdateModelMixin, GenericViewSet): """ 出征记录:列表 """ perms_map = [ - {'get': '*'}, {'post': 'candidate_issue'}, + {'get': '*'}, {'post': 'candidate_create'}, {'put': 'candidate_update'}, {'delete': 'candidate_delete'}] queryset = Candidate.objects.filter(number__isnull=False) serializer_class = CandidateSerializer @@ -682,11 +695,17 @@ class CandidateViewSet(RetrieveModelMixin, ListModelMixin, GenericViewSet): ordering_fields = ('-id', 'update_time') ordering = ['-update_time'] + def get_serializer_class(self): + if self.action in ['create', 'update']: + return CandidateCreateSerializer + return super().get_serializer_class() + def get_authenticators(self): - if self.detail: + if self.detail and self.request.method == 'GET': return [] return super().get_authenticators() + def get_permissions(self): if self.action == 'retrieve': return [] diff --git a/test_server/develop/__init__.py b/test_server/develop/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test_server/develop/admin.py b/test_server/develop/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/test_server/develop/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/test_server/develop/apps.py b/test_server/develop/apps.py new file mode 100644 index 0000000..444741b --- /dev/null +++ b/test_server/develop/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class DevelopConfig(AppConfig): + name = 'develop' diff --git a/test_server/develop/models.py b/test_server/develop/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/test_server/develop/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/test_server/develop/tests.py b/test_server/develop/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/test_server/develop/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/test_server/develop/urls.py b/test_server/develop/urls.py new file mode 100644 index 0000000..3bc7496 --- /dev/null +++ b/test_server/develop/urls.py @@ -0,0 +1,9 @@ +from django.urls import path,include +from .views import * + + + + +urlpatterns = [ + # path('correct_candidate/', CorrectCandidate.as_view()), +] diff --git a/test_server/develop/views.py b/test_server/develop/views.py new file mode 100644 index 0000000..1082697 --- /dev/null +++ b/test_server/develop/views.py @@ -0,0 +1,17 @@ +from django.shortcuts import render +from requests.api import request +from rest_framework.views import APIView +from rest_framework.response import Response + +from crm.models import Candidate + +class CorrectCandidate(APIView): + authentication_classes = [] + permission_classes = [] + def get(self, request, *args, **kwargs): + for i in Candidate.objects.all(): + if i.examtest: + i.examtest_date = i.examtest.start_time.date() + i.save() + + return Response() \ No newline at end of file diff --git a/test_server/examtest/views.py b/test_server/examtest/views.py index d3237b5..cd563c2 100644 --- a/test_server/examtest/views.py +++ b/test_server/examtest/views.py @@ -533,6 +533,7 @@ class ExamTestViewSet(PageOrNot, ModelViewSet): candidate.issue_date = now candidate.start_date = now candidate.end_date = now + timedelta(days=5*365) # 5年有效期 + candidate.examtest_date = obj.start_time.date() candidate.workscope_name = obj.workscope.name candidate.consumer_name = obj.consumer_detail['name'] candidate.ID_number = obj.consumer_detail['ID_number'] diff --git a/test_server/server/settings.py b/test_server/server/settings.py index e1d3c49..85d948e 100644 --- a/test_server/server/settings.py +++ b/test_server/server/settings.py @@ -48,7 +48,8 @@ INSTALLED_APPS = [ 'examtest', 'analyse', 'cms', - 'qtest' + 'qtest', + 'develop' ] MIDDLEWARE = [ diff --git a/test_server/server/urls.py b/test_server/server/urls.py index 9ecf85c..c6cc82f 100644 --- a/test_server/server/urls.py +++ b/test_server/server/urls.py @@ -25,6 +25,7 @@ from utils.view import redirect urlpatterns = [ path('rbac/', include('rbac.urls')), + path('develop/', include('develop.urls')), path('crm/', include('crm.urls')), path('question/', include('question.urls')), path('examtest/', include('examtest.urls')),