164 lines
7.8 KiB
Python
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()
|
|
|