Files
mytest/mainProject/views.py
T
2024-06-05 11:36:16 +08:00

300 lines
12 KiB
Python

import os
from datetime import datetime
from pathlib import Path
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.decorators import login_required
from django.views.decorators.csrf import csrf_exempt
from mainProject.models import UserPlus, corretingWord, Wrong
from django.http import JsonResponse, Http404, StreamingHttpResponse, FileResponse
from django.shortcuts import render, HttpResponse, redirect
from mainProject.models import simdFiles
from zhipuai import ZhipuAI
from docx import Document
from docx.shared import Pt
def index(request):
username = request.session.get("username")
word_list = simdFiles.objects.filter(user_id=username).values()
profession = request.session.get("profession")
return render(request, "index.html", {'word_list': word_list, "username": username, "profession": profession})
def login_page(request):
return render(request, "login.html")
def upload(request):
username = request.session.get("username")
word_list = list(simdFiles.objects.filter(user_id=username).values('id', 'title'))
returnData = {}
for item in word_list:
temp = corretingWord.objects.filter(word_id=item['id']).values()
for item_x in temp:
returnData['id'] = item['id']
returnData['score'] = item_x['score']
returnData['title'] = item['title']
profession = request.session.get("profession")
return render(request, "upload.html", {'word_list': returnData, "username": username, "profession": profession})
@csrf_exempt
def change(request):
if request.method == 'POST':
data = request.POST.get('password') # 获取 Ajax 请求中的数据
username = request.session.get("username")
UserPlus.objects.filter(username=username).update(password=data)
return JsonResponse({"result": 1}) # 返回处理结果
def logout_x(request):
logout(request)
request.session.clear()
return redirect("/index/")
@login_required
def user_page(request):
username = request.session.get("username")
profession = request.session.get("profession")
number = corretingWord.objects.filter(student_id=username).count()
data = {"username": username, "profession": profession, "number": number}
return render(request, "user.html", data)
def static_page(request):
profession = request.session.get("profession")
username = request.session.get("username")
scores = [
corretingWord.objects.filter(score__range=(0, 10)).count(),
corretingWord.objects.filter(score__range=(11, 20)).count(),
corretingWord.objects.filter(score__range=(21, 30)).count(),
corretingWord.objects.filter(score__range=(31, 40)).count(),
corretingWord.objects.filter(score__range=(41, 50)).count(),
corretingWord.objects.filter(score__range=(51, 60)).count(),
corretingWord.objects.filter(score__range=(61, 70)).count(),
corretingWord.objects.filter(score__range=(71, 80)).count(),
corretingWord.objects.filter(score__range=(81, 90)).count(),
corretingWord.objects.filter(score__range=(91, 100)).count(),
]
all_type = Wrong.objects.values('title').distinct()
type_a = []
number = []
for i in all_type:
count = Wrong.objects.filter(title=i['title']).count()
number.append(count)
type_a.append(i['title'])
return render(request, "statical.html",
{"username": username, "profession": profession, "scores": scores, "all_type": type_a,
"number": number})
@csrf_exempt
def login_x(request):
if request.method == 'GET':
return render(
request,
'login.html',
)
elif request.method == 'POST':
# 获取参数
user_name = request.POST.get('username', '')
pwd = request.POST.get('password', '')
# 用户已存在
if UserPlus.objects.filter(username=user_name):
# 使用内置方法验证
user = authenticate(username=user_name, password=pwd)
usern = UserPlus.objects.get(username=user_name)
profession = usern.profession
# 验证通过
if user:
# 用户已激活
if user.is_active:
login(request, usern)
request.session["username"] = user_name
request.session["profession"] = profession
return redirect("/index/")
# 未激活
else:
return JsonResponse({
'code': 200,
'msg': '用户未激活'
})
# 验证失败
else:
return JsonResponse({
'code': 403,
'msg': '用户认证失败'
})
# 用户不存在
else:
return redirect('/login_page')
def register_page(request):
return render(request, "register.html")
def register(request):
if request.method == 'GET':
return render(
request,
'register.html'
)
elif request.method == 'POST':
# 获取参数
user_name = request.POST.get('username', '')
pwd = request.POST.get('password', '')
pparameter = request.POST.getlist('select')
# 将数组转化为字符串
pparameter = ','.join(pparameter)
# 用户已存在
if UserPlus.objects.filter(username=user_name):
return JsonResponse({
'code': 200,
'msg': '用户已存在'
})
# 用户不存在
else:
# 使用User内置方法创建用户
user = UserPlus.objects.create_user(
username=user_name,
password=pwd,
profession=pparameter,
email='123@qq.com',
is_staff=1,
is_active=1,
is_superuser=0
)
usern = UserPlus.objects.get(username=user_name)
login(request, usern)
request.session["username"] = user_name
request.session["profession"] = pparameter
print(pparameter)
return redirect("/index/")
else:
return JsonResponse({
'code': 403,
'msg': '被禁止的请求'
})
# 这是一个迭代器,减少内存占用
def read_file(url, chunk_size=512):
with open(url, "rb") as f:
while True:
c = f.read(chunk_size)
if c:
yield c
else:
break
@login_required
def download(request):
path = corretingWord.objects.filter(word_id=request.GET.get('id')).first()
file = Path(str(path.file_correting.name)).resolve()
if file.is_file():
response = FileResponse(open(file, 'rb'), as_attachment=True)
return response
else:
return HttpResponse('文件不存在')
@login_required
def word_upload(request):
if request.method == 'POST':
username = request.session.get('username')
profession = UserPlus.objects.filter(username=username).values('profession')
profession_x = profession[0].get('profession')
files = request.FILES.getlist('words')
word_list = simdFiles.objects.filter(user_id=username).values()
if profession_x == 0 and len(files) > 1:
return render(request, 'upload.html', {'word_list': word_list})
time = "D:\\upload" + datetime.now().strftime(
'%Y-%m-%d-%H-%M-%S') + username
# 遍历写入到数据库中
for word in files:
if not os.path.exists('D:\\upload'):
os.mkdir('D:\\upload')
# 写入到数据库中
simdFiles.objects.create(title=word.name,
file_upload=time + word.name,
user_id=request.session.get('username'))
doc = Document(word)
s = ''
for para in doc.paragraphs:
s += para.text
client = ZhipuAI(api_key="a8d31831195a45a1570692903062a660.zxJIB74Ibupbpdqh")
response = client.chat.completions.create(
model="glm-4",
messages=[
{"role": "system", "content":
"你现在是一名教授python课程的大学老师,现在你要参考标准答案,结合自身知识储备批阅学生的作业,你很清楚Python"
"编程类填空题具有一定的主观性,与标准答案稍有差别的学生答案也有可能正确,需要你谨慎批改。"},
{"role": "system",
"content": "请你批改作业中的填空题,给出该学生的最终得分,并按照文本格式返回给我"},
{
"role": "system",
"content": "请在最后以"
"学生成绩:"
"所有错误题号:"
"的形式严格发给我,在最后不需要你的提示或者注意!!!学生成绩后面只需要分数,例如学生成绩:3"
},
{
"role": "user",
"content": "以下是学生的作业:"
},
{
"role": "user",
"content": s
}
],
stream=True
)
file = Document()
file.encoding = 'utf-8'
var = ''
for chunk in response:
var += chunk.choices[0].delta.content
pg = file.add_paragraph(var)
response = client.chat.completions.create(
model="glm-4",
messages=[
{"role": "user", "content": var},
{"role": "user",
"content": "请提取上文中学生的成绩 以及错误题号 只需要返回给我 成绩: 错误题号:,以下为返回样例 成绩:3 错误题号:19,20"}
],
stream=True
)
x = ''
for chunk in response:
x += chunk.choices[0].delta.content
temp = x.split("\n")
score = temp[0].split(":")[1]
ti = temp[1].split(":")[1].split(",")
for i in ti:
Wrong.objects.create(student_id=username, title=i)
run = pg.runs[0]
run.font.name = '宋体'
run.font.size = Pt(12)
word_ixd = simdFiles.objects.filter(
file_upload=time + word.name).values(
'id')
word_realid = word_ixd[0].get('id')
corretingWord.objects.create(word_id=word_realid, file_correting="D:\\download\\" +
datetime.now().strftime(
'%Y-%m-%d-%H-%M-%S') +
username + word.name,
student_id=username,
cor_time=datetime.now(), score=score)
if not os.path.exists('D:\\download'):
os.mkdir('D:\\download')
file.save("D:\\download\\" + datetime.now().strftime('%Y-%m-%d-%H-%M-%S') + username + word.name)
return redirect('/upload/')