This repository has been archived on 2024-06-23. You can view files and clone it, but cannot push or open issues or pull requests.
mathdeptv2/工具v4/个人使用记录导入.py

164 lines
7.8 KiB
Python

from PySide6.QtWidgets import QWidget, QApplication, QFileDialog, QTableWidgetItem
from PySide6.QtGui import QColor
from Ui_个人使用记录导入 import Ui_Form
from database_tools_2 import *
def getFilename(string):
filename = re.findall(r"\d{21}_([\s\S]*?)_高[一二三]_数学",string)[0]
return filename
def getFiledate(string):
date = re.findall(r"\((\d{8})\).zip",string)
if len(date) > 0:
return date[0]
else:
return ""
class MyWindow_grdr(QWidget,Ui_Form):
def __init__(self,database_name):
super().__init__()
self.setupUi(self)
self.database_name = database_name
self.bind()
def bind(self):
self.tableWidget_filelist.setColumnWidth(0,270)
self.tableWidget_result.setColumnWidth(0,195)
for i in range(1,4):
self.tableWidget_result.setColumnWidth(i,40)
self.pushButton_dirselect.clicked.connect(self.select_dir)
self.pushButton_fileselect.clicked.connect(self.select_file)
self.pushButton_exec.clicked.connect(self.exec)
def select_dir(self):
self.lineEdit_filepath.setText("未选择单一文件.")
dirpath = QFileDialog.getExistingDirectory(self,"选择文件夹")
self.lineEdit_dirpath.setText(dirpath)
self.filelist = [os.path.join(dirpath,f) for f in os.listdir(dirpath)]
self.tableWidget_filelist.setRowCount(len(self.filelist))
for i in range(len(self.filelist)):
self.tableWidget_filelist.setItem(i,0,QTableWidgetItem(f"{getFilename(self.filelist[i])} {getFiledate(self.filelist[i])}"))
def select_file(self):
self.lineEdit_dirpath.setText("未选择文件夹.")
self.tableWidget_filelist.setRowCount(1)
pathlist = QFileDialog.getOpenFileName(self,"选择文件",".","zip文件(*.zip);;所有文件(*)")
self.lineEdit_filepath.setText(pathlist[0])
self.filelist = [pathlist[0]]
for i in range(len(self.filelist)):
self.tableWidget_filelist.setItem(i,0,QTableWidgetItem(f"{getFilename(self.filelist[i])} {getFiledate(self.filelist[i])}"))
def exec(self):
tempdir = "临时文件/zips"
mydb = connect(hostname = db_host, port = db_port, username=db_user, pwd=db_pwd, db = self.database_name)
mycursor = mydb.cursor()
for zf in tqdm.tqdm(self.filelist,desc = "文件处理进度 "):
legalflag = True
if re.findall(r"\(\d{8}\)",zf) == []:
legalflag = False
else:
#如果文件名中有日期信息
udlist = []
filedate = getFiledate(zf)
ud = generateUsagedetail(zipfilepath=zf,tempdir=tempdir,cursor=mycursor,statsfilename=statsfilename,threshold=0.20,date=filedate)
if not ud == 1:
udlist += ud.copy()
else:
udlist = []
legalflag = False
#以下生成三个种类的使用记录
id_used_list = []
for u in udlist:
if not u["ID"] in id_used_list:
id_used_list.append(u["ID"])
if len(id_used_list) >= 1:
sql = "SELECT ID,date,studentid,studentname,diff,answersheet FROM usagedetail WHERE NOT obsolete AND ID in "
id_used_set = "("
for id in id_used_list:
id_used_set += ('"'+id+'",')
id_used_set = id_used_set[:-1] + ")"
mycursor.execute(sql+id_used_set+";")
used_info = mycursor.fetchall()
else:
used_info = []
used_info_short = [(u[0],u[2],u[4],u[5]) for u in used_info]
used_info_id_and_as = [(u[0],u[2],u[5]) for u in used_info]
repeat_list = []
to_flush_list = []
unused_list = []
for u in tqdm.tqdm(udlist):
datum = (u["ID"],u["date"],u["studentid"],u["studentname"],json.dumps(u["diff"]),u["answersheet"])
if datum in used_info:
repeat_list.append(datum)
else:
datum_short = (datum[0],datum[2],datum[4],datum[5])
datum_id_and_ans = (datum[0],datum[2],datum[5])
if datum_short in used_info_short:
repeat_list.append(datum)
elif datum_id_and_ans in used_info_id_and_as:
to_flush_list.append(datum)
else:
unused_list.append(datum)
current_row_count = self.tableWidget_result.rowCount()
self.tableWidget_result.insertRow(current_row_count)
self.tableWidget_result.setItem(current_row_count,0,QTableWidgetItem(getFilename(zf)))
if legalflag:
#修改部分批改情况改过的已有记录
for item in tqdm.tqdm(to_flush_list):
sql = "UPDATE usagedetail SET diff = %s WHERE ID = %s AND studentid = %s AND answersheet = %s AND NOT obsolete;"
val = (item[4],item[0],item[2],item[5])
mycursor.execute(sql,val)
sql = "INSERT INTO logs (DATE,TIME,username,action,id,db_content) VALUE (%s,%s,%s,%s,%s,%s);"
val = (GetDate(),GetTime(),get_git_username(),"修改个人答题情况",item[0],json.dumps(item,ensure_ascii = False))
mycursor.execute(sql,val)
mydb.commit()
#导入新使用记录
templist = unused_list.copy()
pieceslist = []
while len(templist) > 5000:
pieceslist.append((5000,templist[:5000].copy()))
templist = templist[5000:]
pieceslist.append((len(templist),templist))
if len(unused_list) >= 1:
for piece in tqdm.tqdm(pieceslist):
inssql = "INSERT INTO usagedetail (ID,date,studentid,studentname,diff,answersheet) VALUES "+",".join(["(%s,%s,%s,%s,%s,%s)"]*piece[0])+";"
insval = []
for item in piece[1]:
insval += list(item)
mycursor.execute(inssql,insval)
logsql = "INSERT INTO logs (DATE,TIME,username,action,db_content) VALUE (%s,%s,%s,%s,%s);"
log_content = f"答题纸: {set([u[-1] for u in unused_list])} 题目: {set([u[0] for u in unused_list])}, 学生账号: {set([u[2] for u in unused_list])}"
logval = (GetDate(),GetTime(),get_git_username(),"新增个人答题情况",log_content)
mycursor.execute(logsql,logval)
mydb.commit()
#正常讲义不染色
self.tableWidget_result.setItem(current_row_count,1,QTableWidgetItem(str(len(repeat_list))))
self.tableWidget_result.setItem(current_row_count,2,QTableWidgetItem(str(len(to_flush_list))))
self.tableWidget_result.setItem(current_row_count,3,QTableWidgetItem(str(len(unused_list))))
# print(len(repeat_list),len(to_flush_list),len(unused_list))
else:
#非正常讲义染色
self.tableWidget_result.item(current_row_count,0).setBackground(QColor("red"))
for i in range(1,4):
self.tableWidget_result.setItem(current_row_count,i,QTableWidgetItem(""))
self.tableWidget_result.item(current_row_count,i).setBackground(QColor("red"))
mydb.close()
if __name__ == '__main__':
app = QApplication([])
windows = MyWindow_grdr("tikutest")
windows.show()
app.exec()