examtest/test_server/analyse/views.py

116 lines
4.8 KiB
Python

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 Consumer
from examtest.models import ExamTest
from question.models import Question
import pickle
import requests
from lxml import etree
from django.db.models import Count
from rbac.models import UserProfile
# Create your views here.
class BasicCount(APIView):
'''
获取基本统计数据
'''
def get(self, request, format=None):
ret={}
ret['consumer1_count'] = Consumer.objects.filter(is_delete=False).count()
ret['consumer2_count'] = Consumer.objects.filter(is_delete=False).exclude(create_admin=None).count()
ret['test_count'] = ExamTest.objects.filter(is_delete=False).count()
ret['question_count'] = Question.objects.filter(is_delete=False).count()
return Response(ret)
class Admindata1(APIView):
"""
各管理员录入学员数-柱状图
"""
def get(self, request, format=None):
ret = {'x':{'name':'管理员', 'data':[]}, 's':[{'name':'学员数', 'data':[]}], 't':'各管理员录入学员数'}
tmp = UserProfile.objects.filter(is_delete=False).annotate(total=Count('consumer_create_admin')).order_by('-total').values('username', 'total')
for i in tmp:
ret['x']['data'].append(i['username'])
ret['s'][0]['data'].append(i['total'])
return Response(ret)
class Companydis(APIView):
"""
单位分布
"""
def get(self, request, format=None):
ret = {'s':[{'name':'浙江', 'value':5000}], 't':'单位分布'}
# tmp = UserProfile.objects.filter(is_delete=False).annotate(total=Count('consumer_create_admin')).order_by('-total').values('username', 'total')
# for i in tmp:
# ret['x']['data'].append(i['username'])
# ret['s'][0]['data'].append(i['total'])
return Response(ret)
class Consumerdis(APIView):
"""
学员分布
"""
def get(self, request, format=None):
ret = {'s':[{'name':'河北', 'value':5000}], 't':'学员分布'}
# tmp = UserProfile.objects.filter(is_delete=False).annotate(total=Count('consumer_create_admin')).order_by('-total').values('username', 'total')
# for i in tmp:
# ret['x']['data'].append(i['username'])
# ret['s'][0]['data'].append(i['total'])
return Response(ret)
class Quota(APIView):
'''
获取考试名额
'''
def get(self, request, format=None):
with open('quota.dat','rb') as f:
data = pickle.load(f)
return Response(data)
class SearchCandidates(APIView):
perms_map = [
{'post': 'candidate_search'}]
def post(self, request, *args, **kwargs):
names = request.data['names']
numbers = request.data['numbers']
names_ = names.split('\n')
numbers_ = numbers.split('\n')
names_l = [i.replace(' ', '') for i in names_ if i!='']
numbers_l = [i.replace(' ', '') for i in numbers_ if i!='']
candidates = []
if len(names_l)>60:
return Response({'error':'单次批量查询不允许超过60'})
if len(names_l) == len(numbers_l):
for i in range(len(names_l)):
payload = {'IndexModel[name]': names_l[i], 'IndexModel[identityNumber]': numbers_l[i], 'IndexModel[certNumber]':'', 'IndexModel[candidateNumber]':''}
try:
r = requests.post('https://fushe.chinansc.cn/open/candidate-list',data=payload, timeout=5)
r.raise_for_status()
r.close()
html = etree.HTML(r.text)
results = html.xpath("//table[@class='cert-table']")
try:
for i in results:
url = i.xpath('tr/td/a/@href')
name = i.xpath('tr[1]/td[1]/text()')
ID_number = i.xpath('tr[1]/td[2]/text()')
report_number = i.xpath('tr[2]/td[1]/text()')
issue_date = i.xpath('tr[2]/td[2]/text()')
jsondata = {
'name':name[0],
'ID_number':ID_number[0],
'report_number':report_number[0],
'issue_date':issue_date[0],
'url':'https://fushe.chinansc.cn'+ url[0]
}
candidates.append(jsondata)
except:
pass
except:
pass
return Response(candidates)
else:
return Response({'error':'姓名列和身份证列不匹配!'})