From 7737915e358bfda96d4fae06b54fb735abe31fcd Mon Sep 17 00:00:00 2001 From: Marcel Gansfusz Date: Mon, 24 Feb 2025 01:28:09 +0100 Subject: [PATCH] implemented saving of files and inputting new stuff into the database --- .gitignore | 1 + app/__pycache__/main.cpython-313.pyc | Bin 11503 -> 18670 bytes app/main.py | 159 +++++++++++++++++++++++++-- static/app.js | 20 +++- test_session.py | 64 +++++------ 5 files changed, 202 insertions(+), 42 deletions(-) diff --git a/.gitignore b/.gitignore index 24ba8e3..c183f01 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ app/venv/ app/files/ app/pwfile.json +app/dest diff --git a/app/__pycache__/main.cpython-313.pyc b/app/__pycache__/main.cpython-313.pyc index a5ecf3d0e768c027db301e055782967522933d8b..7d8bf330f697e0d7c5a6bd5f12a8236bd5bd2f6e 100644 GIT binary patch literal 18670 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 delta 3418 zcmZ`)U2s#!72f+N3H|y<7P7Eq*)q0e0|F#t8)JiP8E^^?_@V$~r5;5;#$ZdDy>cMV zWL#*PI;GQ!Y)B!rQ>INHm`*#%c-jnoGtfS?FL9d(=1x14PCD)I(uz8r;i>I8S3ed8 zR-_Yvnq*UbYX2w9!xGhLaq1LGOTm8>}9{ z)!VlAaz&G})3sr}xvcj#R`jl@JIKr1T;#l1*+olv-jSyAJU5Yt<>shcc1JyOOO%fa zQIMkUoq9royadkhAJoYnv~-@U*lI1?I@wxf>!4<<4Q%Pr!c$hk?k1}S*}KVVTiNP- z`-W9FDgNX`o2+lI`01!f)#rHDqgn3UO_VT=?p31x( zQ4XSI*|_Io#N?eX;CH=%_rHMO{XBjN!n)^q3gGv?fDgQY4?dp{*2%q39lk@}2Px7A z|3Gw!hb-Zvo#ouXUhXetPG?ol7~}yoLc8Ssu&^cS3ySif#&pXEO7ow&p-K)uqk+{! zxLQYhX7s+$${(d3j$2^=)kUq%um$QyXaQi?_3uetAat`GhDp5$UyPS{*s(yj#JNd? zW7&|SE<%D_FAtNTd4Qa>vCB2Cy|NCElNP3GH4T8Qj|f&0;LDfZPFl&7uB@Fju!F9~ zqx_Vq%*cF%ub%HAQ?PA% z-8kz?!wBJS)Q8OE=dB>En(d(>Vb$Xd^$V;063Rou2wC~J={Ro>zG%Z}?+7j2nP#feNhN%ykf zy8l57 zQqckSqixP%ID7;~sy?1c=aT7M(X4(h6GzM1q3Iw_;Aaymmr|Y%0IO+o8snh;8T^$1 z+uQU}^B4A}hc%5iMy^>O+G-!`MYFCzL`nB}53zZkuveRVS+qH{Gz$x^*vAaq2i&Md z{6RlRt2OnbHnQ4Y9~Q`JUkfnz9ChJ7;a*n<$oFmbFcI#1ouh-o{Xq%j2Sfn=fnW~@ zg$G-mVZZReFQFXN_&(#9r2j3ahdGM|KU~lJY|gI=kbV%gCCCg_O5rD?>M*3^2~|*% z^Qxre-pD3Zee%+DB9=?45>3W)ifYWpW|B%g2C7hA+48_s;le$p~vGjHqwN{*TRud#8dy1bY}=1t|rG(mg7 z2Hk;Bm2)`Ui-6l+bnf!Uve{As#*=9!Lz9VJ*+fbe6OghhpSj>OX$hu^=ao!amF6<28xrf z-p_QlDr>dEn2jCFol~qZx%}xC`(ll>VvQ`OM{YKgrmw@i-@#w`6aXvbR~{l6m%aJO z?ZC$kpNpgH)7De2Ka1AoOP@6cK0f`qc;unEE+1YV{!DCq@|BHUGws{m4QsE2Y@<+4 z>*`0$WOaKd$oI_lks;xp$2rn3-0PQ69uk13XIK8w_I1Jh2vg?~2K$k~PIfFhq9EdD z9naB45b2u;{p_zDGoiC6UPRDBaS0?7f_{VpsW_M@4R^3B zBi~*67HDV|;fDyAN2&n+RcSu6kj`l}ERC_k>ZckoIsrXtZGgpiZzEgBN0v@XL z{2rLkBo^k9!}M3cVJww*1XdUB5ec~&6nOX~aBn`yk$j5I6Z|%!pSTna3wjgOF zusp!-9yZP5(7b7(1xYKhZp|wD^OTUs*Oi7I>)twa7b2 gt*e@^)va#@9*^bFj!+n8Q%9~E|05YWn-;|X19ObfDgXcg diff --git a/app/main.py b/app/main.py index 98640a9..24e0a1c 100644 --- a/app/main.py +++ b/app/main.py @@ -11,7 +11,7 @@ import json import re -# import os +import os import mariadb @@ -32,6 +32,10 @@ CATEGORIES = [ "Multimedia", ] SUBCAT_CATEGORIES = ["Klausuren", "Übungen", "Labore"] +SUBCAT_CATEGORIES_I = [1, 2, 3] +EX_DATE_CATEGORIES = ["Prüfungen", "Klausuren"] +EX_DATE_CATEGORIES_I = [0, 1] +UNIZEUG_PATH = "./app/dest/" # cur = db.cursor() @@ -46,6 +50,10 @@ async def get_index(): @app.get("/files/{file_id}") async def get_file(file_id: str): + if file_id == "unsupported": + return FileResponse(".app/files/unsupported.pdf") + if file_id == "empty": + return FileResponse(".app/files/empty.pdf") cur = db.cursor() try: cur.execute("Select filename from FIP where id=?", (file_id,)) @@ -188,22 +196,29 @@ async def create_upload_file(file: UploadFile): f.write(content) # app.mount("/files", StaticFiles(directory="./app/files/"), name="files") db.commit() + fname = "".join(filename.split(".")[0:-1]) + ftype = filename.split(".")[-1] return { - "filename": filename, + "filename": fname, + "filetype": ftype, "path": "/files/" + id, "fid": id, } @app.post("/submit/") -async def get_submittion( +async def get_submission( lva: Annotated[str, Form()], # LVA Name and Number prof: Annotated[str, Form()], # Vortragender fname: Annotated[str, Form()], # Path to pdf File - fileId: Annotated[str, Form()], + fileId: Annotated[str, Form()], # UUID of file in FIP table sem: Annotated[str, Form()], # Semester eg. 2024W stype: Annotated[str, Form()], # Type of File eg. Prüfung=>0 - ex_date: Annotated[str, Form()], # Date of Exam only when type is exam + subcat: Annotated[str, Form()], # Subcategory of file if the category has subcats + ex_date: Annotated[ + str, Form() + ], # Date of Exam only when type is exam(Klausur/Prüfung) + ftype: Annotated[str, Form()], # type of File rects: Annotated[ str, Form() ], # Rechtangles # List[List[Tuple[float, float, float, float]]], @@ -211,7 +226,7 @@ async def get_submittion( str, Form() ], # Scales of Pages # Annotated[List[Dict[str, float]], Form()], ): - print(lva, prof, fname, stype, sem, ex_date, rects, pagescales) + print(lva, prof, fname, stype, subcat, sem, ex_date, rects, pagescales) rects_p = json.loads(rects) scales_p = json.loads(pagescales) cur = db.cursor() @@ -223,7 +238,11 @@ async def get_submittion( status_code=500, detail="Somethings wrong with the database" ) filepath = "./app/files/" + cur.fetchone()[0] - censor_pdf(filepath, "./app/files/censored.pdf", rects_p, scales_p) + try: + dest = make_savepath(lva, prof, stype, subcat, sem, ex_date, fname, ftype) + except ValueError as e: + raise HTTPException(status_code=400, detail=str(e)) + censor_pdf(filepath, dest, rects_p, scales_p) return {"done": "ok"} @@ -287,6 +306,132 @@ def remove_duplicates( return res +def make_savepath( + lva: str, + prof: str, + cat: str, + subcat: str, + sem: str, + ex_date: str, + fname: str, + ftype: str, +) -> str: + lv = get_lvpath(lva) + lvpath = lv[1] + "/" + pf = get_profpath(prof, lv[0]) + pfpath = pf[1] + "/" + catpath = CATEGORIES[int(cat)] + "/" + scpath = "" + if int(cat) in SUBCAT_CATEGORIES_I: + sc = get_subcatpath(subcat, int(cat), pf[0], lv[0]) + scpath = sc[1] + "/" + savepath = UNIZEUG_PATH + lvpath + pfpath + catpath + scpath + os.makedirs(savepath) + filename = sem + "_" + if int(cat) in EX_DATE_CATEGORIES_I: + _, mm, dd = ex_date.split("-") + filename += mm + "_" + dd + "_" + filename += fname + "." + ftype + return savepath + filename + + +def get_lvpath(lva: str) -> Tuple[int, str]: + cur = db.cursor() + lvid = re.search(r"[a-zA-Z0-9]{3}\.[a-zA-Z0-9]{3}", lva) + if lvid is not None: + cur.execute( + "SELECT id,lvpath FROM LVAs WHERE lvid=?", + (lvid.group()[:3] + lvid.group()[4:],), + ) + res = cur.fetchone() + if res is not None: + return res + else: + return makenew(lva, "LVAs") + else: + cur.execute("SELECT id,lvpath FROM LVAs WHERE lvname=?", (lva,)) + res = cur.fetchone() + if res is not None: + return res + else: + return makenew(lva, "LVAs") + + +def get_profpath(prof: str, lid: int) -> Tuple[int, str]: + cur = db.cursor() + prof = prof.replace("_", " ") + cur.execute("SELECT id,name FROM Profs WHERE name=?", (prof,)) + res = cur.fetchall() + if res is not None: + ret = (res[0][0], res[0][1].replace(" ", "_")) + cur.execute("SELECT * FROM LPLink WHERE LId=? AND PId=?", (lid, ret[0])) + if cur.fetchall() is None: + linkLP(lid, ret[0]) + return ret + fname, lname = prof.split(" ") + cur.execute("SELECT id,name FROM Profs WHERE name like ?", (lname + " " + fname,)) + res = cur.fetchall() + if res is not None: + ret = (res[0][0], res[0][1].replace(" ", "_")) + cur.execute("SELECT * FROM LPLink WHERE LId=? AND PId=?", (lid, ret[0])) + if cur.fetchall() is None: + linkLP(lid, ret[0]) + return ret + ret = makenew(prof, "Profs") + linkLP(lid, ret[0]) + return ret + + +def get_subcatpath(subcat: str, cat: int, pid: int, lid: int) -> Tuple[int, str]: + cur = db.cursor() + cur.execute( + "SELECT id,name FROM SubCats WHERE LId=? AND PId=? AND cat=? AND name=?", + (lid, pid, cat, subcat), + ) + res = cur.fetchone() + if res is None: + return makenew(subcat, "SubCats", LId=lid, PId=pid, cat=cat) + return res + + +def makenew(input: str, table: str, **kwargs) -> Tuple[int, str]: + cur = db.cursor() + if table == "LVAs": + lvaid = re.search(r"[a-zA-Z0-9]{3}\.[a-zA-Z0-9]{3}", input) + if lvaid is None: + raise ValueError("LVA needs to have a LVA ID to be inserted into the table") + lvid = lvaid.group()[:3] + lvaid.group()[4:] + lvname = re.sub(r"[_ -]*[a-zA-Z0-9]{3}\.[a-zA-Z0-9]{3}[_ -]*", "", input) + lvpath = lvname + "_" + lvaid.group() + cur.execute( + "INSERT INTO LVAs(lvid,lvname,lvpath) VALUES(?,?,?)", (lvid, lvname, lvpath) + ) + cur.execute("SELECT id,lvpath FROM LVAs WHERE lvid=?", (lvid,)) + db.commit() + return cur.fetchone() + querry = "INSERT INTO " + table + "(name" + values = [input] + nvals = 0 + for k, v in kwargs.items(): + values.append(v) + querry += "," + k + nvals += 1 + querry += ") VALUES(?" + nvals * ",?" + ")" + cur.execute(querry, tuple(values)) + cur.execute("SELECT id,name FROM " + table + " WHERE name=?", (input,)) + res = cur.fetchone() + db.commit() + if table == "Profs": + return (res[0], res[1].replace(" ", "_")) + return res + + +def linkLP(lid: int, pid: int): + cur = db.cursor() + cur.execute("INSERT INTO LPLink(LId,PId) VALUES(?,?)", (lid, pid)) + db.commit() + + # async def get_submittion(request: Request): # reqJson = await request.form() # print(reqJson) diff --git a/static/app.js b/static/app.js index d5fc6fc..632d281 100644 --- a/static/app.js +++ b/static/app.js @@ -111,8 +111,13 @@ class Rectangle { } } class PDFDocument { - constructor(filename, fileID) { - this.pdf = new PDFView(filename); + constructor(filename, fileID, filetype) { + if (filetype === "pdf") { + this.pdf = new PDFView(filename); + } else { + this.pdf = new PDFView("/files/unsupported"); + } + this.filetype = filetype; this.fname = filename; this.fID = fileID; this.rects = []; @@ -266,7 +271,8 @@ function submitPdf(eve) { formdata.append("rects", JSON.stringify(doc.paramRects)); formdata.append("pagescales", JSON.stringify(doc.pagescales.slice(1))); formdata.append("fileId", doc.fID); - formdata.append("filename", doc.filename); + //formdata.append("filename", doc.filename); + formdata.append("ftype", doc.filetype); console.log(formdata); submitForm(formdata); } @@ -312,7 +318,12 @@ async function uploadFile(formData) { console.log(response); delete doc.pdf; delete doc; - doc = new PDFDocument(responseJSON.path, responseJSON.fid); + document.getElementById("fname").value = responseJSON.filename; + doc = new PDFDocument( + responseJSON.path, + responseJSON.fid, + responseJSON.filetype, + ); } else { console.log("upload failed"); } @@ -343,6 +354,7 @@ const startPdf = () => { doc = new PDFDocument( "./files/b78c869f-e0bb-11ef-9b58-84144d05d665", "b78c869f-e0bb-11ef-9b58-84144d05d665", + "pdf", ); //pdf = new PDFView("./VO_Mathematik_3.pdf"); initDraw(); diff --git a/test_session.py b/test_session.py index 37b754a..8ae5c82 100644 --- a/test_session.py +++ b/test_session.py @@ -1,33 +1,35 @@ # coding: utf-8 import mariadb -db=mariadb.connect(host="localhost",user="wildserver",password:"DBPassword",database="Unizeug") -db=mariadb.connect(host="localhost",user="wildserver",password="DBPassword",database="Unizeug") -cur=db.cursor() -cur.execute("Select id form FIP where filename='VO_Mathematik_3.pdf';") -cur.execute("Select id form FIP where filename=?;",("VO_Mathematik_3.pdf")) -cur.execute("Select id form FIP where filename=?;",("VO_Mathematik_3.pdf",)) -cur.execute("Select id form FIP Where filename=?;",("VO_Mathematik_3.pdf",)) -cur.execute("Select id form FIP Where filename=?;",("VO_Mathematik_3.pdf")) -cur.execute("Select id form FIP Where filename=?;",("VO_Mathematik_3.pdf",)) -cur.execute("Select id from FIP Where filename=?;",("VO_Mathematik_3.pdf",)) -cur.fetchone() -cur.fetchone() -cur.execute("show tables;") -cur.fetchone() -cur.fetchone() -cur.fetchone()# -cur.fetchone()# -cur.fetchone()# -cur.fetchone()# -cur.fetchone()# -cur.fetchone()# -cur.fetchone()# -cur.fetchone()# -cur.execute("insert into FIP filename Values(?);",("test",)) -cur.execute("insert into FIP (filename) Values(?);",("test",)) -cur.fetchone() -cur.execute("Select * from FIP Where filename=?;",("VO_Mathematik_3.pdf",)) -cur.fetchone() -cur.execute("Select * from FIP Where id=?;",("b78c869f-e0bb-11ef-9b58-84144d05d665",)) -cur.fetchone() -get_ipython().run_line_magic('save', '') + +db = mariadb.connect( + host="localhost", user="wildserver", password="DBPassword", database="Unizeug" +) +cur = db.cursor() +# cur.execute("Select id form FIP where filename='VO_Mathematik_3.pdf';") +# cur.execute("Select id form FIP where filename=?;", ("VO_Mathematik_3.pdf")) +# cur.execute("Select id form FIP where filename=?;", ("VO_Mathematik_3.pdf",)) +# cur.execute("Select id form FIP Where filename=?;", ("VO_Mathematik_3.pdf",)) +# cur.execute("Select id form FIP Where filename=?;", ("VO_Mathematik_3.pdf")) +# cur.execute("Select id form FIP Where filename=?;", ("VO_Mathematik_3.pdf",)) +# cur.execute("Select id from FIP Where filename=?;", ("VO_Mathematik_3.pdf",)) +# cur.fetchone() +# cur.fetchone() +# cur.execute("show tables;") +# cur.fetchone() +# cur.fetchone() +# cur.fetchone() # +# cur.fetchone() # +# cur.fetchone() # +# cur.fetchone() # +# cur.fetchone() # +# cur.fetchone() # +# cur.fetchone() # +# cur.fetchone() # +# cur.execute("insert into FIP filename Values(?);", ("test",)) +# cur.execute("insert into FIP (filename) Values(?);", ("test",)) +# cur.fetchone() +# cur.execute("Select * from FIP Where filename=?;", ("VO_Mathematik_3.pdf",)) +# cur.fetchone() +# cur.execute("Select * from FIP Where id=?;", ("b78c869f-e0bb-11ef-9b58-84144d05d665",)) +# cur.fetchone() +# get_ipython().run_line_magic("save", "")