From d6508c739d77b0b9753dd24c15c55a705f7131be Mon Sep 17 00:00:00 2001 From: Marcel Gansfusz Date: Tue, 28 Oct 2025 19:32:01 +0100 Subject: [PATCH] in between state before converting to pathlib --- .gitignore | 1 + Dockerfile | 27 +++++++++- app/__pycache__/main.cpython-313.pyc | Bin 35835 -> 36981 bytes app/init.py | 17 +++--- app/main.py | 74 ++++++++++++++++----------- app/static/app.js | 6 +-- app/static/autocomplete.js | 2 +- compose.yml | 27 ++++++---- requirements.txt | 1 + 9 files changed, 104 insertions(+), 51 deletions(-) diff --git a/.gitignore b/.gitignore index 585c4f0..7a5882c 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ app/dest app.log init.log app/__pycache__/ +mariadb/* diff --git a/Dockerfile b/Dockerfile index 636dedd..4b9069f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,29 @@ -FROM python:3 +FROM python:3.13-rc-alpine WORKDIR /usr/src/ COPY requirements.txt /usr/src/requirements.txt +COPY entrypoint.sh /usr/src/entrypoint.sh +RUN apk add --no-cache \ + gcc \ + g++ \ + musl-dev \ + python3-dev \ + libffi-dev \ + openssl-dev \ + cargo \ + make \ + mariadb-connector-c-dev \ + jpeg-dev \ + zlib-dev \ + freetype-dev \ + lcms2-dev \ + openjpeg-dev \ + tiff-dev \ + tk-dev \ + tcl-dev \ + libwebp-dev +RUN python -m ensurepip --upgrade +RUN pip install setuptools wheel RUN pip install -r requirements.txt +WORKDIR /python +CMD /bin/sh /usr/src/entrypoint.sh +# ENTRYPOINT ["/usr/src/entrypoint.sh"] diff --git a/app/__pycache__/main.cpython-313.pyc b/app/__pycache__/main.cpython-313.pyc index 098bd0564940a80d154e7ba45b66adaf6ec2b140..942d41778899274e4b5ce50472fb5943d77aeca7 100644 GIT binary patch delta 8568 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 KsXa2kZu}px4#aQ( diff --git a/app/init.py b/app/init.py index a638b1d..7ee455c 100644 --- a/app/init.py +++ b/app/init.py @@ -10,7 +10,8 @@ import mariadb import logging import schedule -import time +import time +import pytz CATEGORIES = [ "Prüfungen", @@ -22,7 +23,7 @@ CATEGORIES = [ "Multimedia", ] SUBCAT_CATEGORIES = ["Klausuren", "Übungen", "Labore"] -unizeug_path = os.environ.get("UNIZEUG_PATH","./unizeug") +unizeug_path = os.environ.get("UNIZEUG_PATH", "./unizeug") log = logging.getLogger(__name__) logging.basicConfig( @@ -39,7 +40,6 @@ db = mariadb.connect( user=os.environ.get("DB_USER", "user"), password=os.environ.get("DB_PASSWORD", "DBPASSWORD"), database=os.environ.get("DB_DATABASE", "unizeug"), - ) c = db.cursor() try: @@ -71,7 +71,9 @@ c.execute( "CREATE TABLE SubCats(id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,LId BIGINT(20),PId BIGINT(20),cat TINYINT UNSIGNED,name VARCHAR(256), PRIMARY KEY(id))" ) try: - c.execute("CREATE TABLE FIP(id UUID DEFAULT(UUID()), filename VARCHAR(256), filetype VARCHAR(8),initTimeStamp DATETIME, PRIMARY KEY(id))") + c.execute( + "CREATE TABLE FIP(id UUID DEFAULT(UUID()), filename VARCHAR(256), filetype VARCHAR(8),initTimeStamp DATETIME, PRIMARY KEY(id))" + ) except mariadb.OperationalError: pass db.commit() @@ -79,7 +81,7 @@ db.commit() def get_dirstruct(): # with open("app/pwfile.json", "r") as f: - # cred = json.load(f) + # cred = json.load(f) # ssh = paramiko.SSHClient() # print(cred["sftpurl"]) # ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) @@ -88,7 +90,7 @@ def get_dirstruct(): # ssh.connect(cred["sftpurl"], username=cred["sftpuser"], password=cred["sftpPW"]) # sftp = ssh.open_sftp() # folders = sftp.listdir_attr(unizeug_path) - folders=pathlib.Path(unizeug_path) + folders = pathlib.Path(unizeug_path) for entry in folders.iterdir(): if entry is None: continue @@ -173,7 +175,8 @@ def link_prof(firstname, lastname, lid): if __name__ == "__main__": get_dirstruct() - schedule.every.day.at("04:00","Europe/Vienna").do(get_dirstruct) + info("Database updated") + schedule.every().day.at("04:00", "Europe/Vienna").do(get_dirstruct) while True: schedule.run_pending() time.sleep(1) diff --git a/app/main.py b/app/main.py index e98dbb9..ee3acc6 100644 --- a/app/main.py +++ b/app/main.py @@ -3,7 +3,7 @@ from typing import List, Dict, Tuple, Sequence from starlette.responses import StreamingResponse from annotated_types import IsDigit -from fastapi import FastAPI, File, HTTPException, UploadFile, Request, Form +from fastapi import FastAPI, File, HTTPException, Path, UploadFile, Request, Form from fastapi.responses import FileResponse # import multiprocessing @@ -28,6 +28,7 @@ import filetype import logging import pathlib +from pathlib import Path from starlette.types import HTTPExceptionHandler @@ -54,16 +55,6 @@ info("App Started") # startup() app = FastAPI() -app.mount( - "/favicon", - StaticFiles(directory=os.environ.get("FAVICON_PATH", ".app/favicon")), - name="favicon", -) -app.mount( - "/static", - StaticFiles(directory=os.environ.get("STATIC_PATH", "./static")), - name="static", -) CATEGORIES = [ @@ -75,16 +66,18 @@ CATEGORIES = [ "Zusammenfassungen", "Multimedia", ] -APP_ROOT_PATH = os.environ.get("APP_ROOT_PATH", "./app") +APP_ROOT_PATH = Path(os.environ.get("APP_ROOT_PATH", "./app")) 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 = os.environ.get("UNIZEUG_PATH", "./app/dest") -FILES_IN_PROGRESS = f"{APP_ROOT_PATH}/files/" -EMPTYFILE = f"{APP_ROOT_PATH}/graphics/empty.pdf" -UNSUPPORTEDFILE = f"{APP_ROOT_PATH}/graphics/unsupported.pdf" -GREETINGFILE = f"{APP_ROOT_PATH}/graphics/greeting.pdf" +UNIZEUG_PATH = Path(os.environ.get("UNIZEUG_PATH", "./app/dest")) +FILES_IN_PROGRESS = APP_ROOT_PATH / "files/" +EMPTYFILE = APP_ROOT_PATH / "graphics/empty.pdf" +UNSUPPORTEDFILE = APP_ROOT_PATH / "graphics/unsupported.pdf" +GREETINGFILE = APP_ROOT_PATH / "graphics/greeting.pdf" +FAVICON = APP_ROOT_PATH / "favicon" +STATIC_FILES = APP_ROOT_PATH / "static" # cur = db.cursor() @@ -158,10 +151,22 @@ def sqlT( # ) +app.mount( + "/favicon", + StaticFiles(directory=os.environ.get("FAVICON_PATH", FAVICON)), + name="favicon", +) +app.mount( + "/static", + StaticFiles(directory=os.environ.get("STATIC_PATH", STATIC_FILES)), + name="static", +) + + @app.get("/") async def get_index(): """gives the Index.html file""" - return FileResponse(f"{APP_ROOT_PATH}/index.html") + return FileResponse(APP_ROOT_PATH / "index.html") @app.get("/files/{file_id}") @@ -234,6 +239,9 @@ async def search_lva( ) # res += cur.fetchall() res = remove_duplicates(res + zw) + info( + f"LVA Search: {searchterm}; Result: {res[: (searchlim if searchlim != 0 else -1)]}" + ) if searchlim == 0: return res else: @@ -268,6 +276,9 @@ async def search_profs( ) # res += cur.fetchall() res = remove_duplicates(res + zw) + info( + f"Prof Search: {searchterm}; Result: {res[: (searchlim if searchlim != 0 else -1)]}" + ) if searchlim == 0: return res else: @@ -308,6 +319,9 @@ async def search_subcats( ) # res += cur.fetchall() res = remove_duplicates(res + rest) + info( + f"Subcatrgory Search: {searchterm}; Result: {res[: (searchlim if searchlim != 0 else -1)]}" + ) if searchlim == 0: return res else: @@ -364,7 +378,7 @@ async def create_upload_file(files: List[UploadFile], c2pdf: bool = True): content = doc.tobytes() if ft != "dir": filename = make_filename_unique(filename) - locpath = FILES_IN_PROGRESS + filename + locpath = FILES_IN_PROGRESS / filename # locpaths.append(locpath) # cur = db.cursor() # try: @@ -448,7 +462,7 @@ async def get_submission( error(f"User tried to upload a file without specifying the {th[1]}") raise HTTPException(400, f"You need to specify a {th[1]}") - filepath = "./app/files/" + res[0][0] + filepath = FILES_IN_PROGRESS / res[0][0] # except mariadb.Error as e: # print(f"Mariadb Error: {e}") # raise HTTPException( @@ -675,7 +689,7 @@ def make_savepath( ex_date: str, fname: str, ftype: str, -) -> str: +) -> os.PathLike: """Generates the path, the file is saved to after the upload process is finished. It creates all nessecery directories.""" lv = get_lvpath(lva) lvpath = lv[1] + "/" @@ -687,9 +701,9 @@ def make_savepath( sc = get_subcatpath(subcat, int(cat), pf[0], lv[0]) scpath = sc[1] + "/" if int(cat) == 6: - savepath = UNIZEUG_PATH + lv[1] + "_Multimedia_only/" + pfpath + savepath = UNIZEUG_PATH / (lv[1] + "_Multimedia_only/") / pfpath else: - savepath = UNIZEUG_PATH + lvpath + pfpath + catpath + scpath + savepath = UNIZEUG_PATH / lvpath / pfpath / catpath / scpath os.makedirs(savepath, exist_ok=True) filename = sem + "_" if int(cat) in EX_DATE_CATEGORIES_I: @@ -707,14 +721,14 @@ def make_savepath( filename += fname file = filename + "." + ftype - destpath = pathlib.Path(savepath + file) + destpath = savepath / file i = 0 while destpath.is_file(): file = filename + f"_{i}." + ftype i += 1 - destpath = pathlib.Path(savepath + file) + destpath = savepath / file destpath.touch() - return savepath + file + return savepath / file def get_lvpath(lva: str) -> Tuple[int, str]: @@ -907,10 +921,10 @@ async def save_files_to_folder(files: List[UploadFile]) -> str: if filename == "": filename = "None" filename = make_filename_unique(filename) - os.mkdir(FILES_IN_PROGRESS + filename) + os.mkdir(FILES_IN_PROGRESS / filename) for idx, file in enumerate(files): fn = file.filename if file.filename is not None else "None" + str(idx) - with open(FILES_IN_PROGRESS + filename + "/" + fn, "wb") as f: + with open(FILES_IN_PROGRESS / filename / fn, "wb") as f: f.write(await file.read()) return filename @@ -938,13 +952,13 @@ async def remove_old_FIP_entrys(): info(f"Remove Files: {files}") for file in files: sql("DELETE FROM FIP WHERE id=?", (file["id"]), return_result=False) - os.remove(FILES_IN_PROGRESS + file["filename"]) + os.remove(FILES_IN_PROGRESS / file["filename"]) # sql( # "DELETE FROM FIP WHERE HOUR(TIMEDIFF(NOW(),initTimeStamp)) > 24", # return_result=False, # ) db.commit() - return FileResponse("./index.html") + return FileResponse(APP_ROOT_PATH / "/index.html") def delete_from_FIP(uuid: str): diff --git a/app/static/app.js b/app/static/app.js index f654998..0c56705 100644 --- a/app/static/app.js +++ b/app/static/app.js @@ -285,7 +285,7 @@ function submitPdf(eve) { async function submitForm(formData) { try { const updateEventSource = new EventSource( - "http://127.0.0.1:8000/get_censor_status/" + doc.fID, + window.location + "get_censor_status/" + doc.fID, ); modal.style.display = "flex"; // console.log("http://127.0.0.1:8000/get_censor_status/" + doc.fID); @@ -295,7 +295,7 @@ async function submitForm(formData) { upload_status.innerText = "Censoring Page " + data.page + "/" + data.pages; }); - const response = await fetch("http://127.0.0.1:8000/submit", { + const response = await fetch(window.location + "submit", { method: "POST", body: formData, }); @@ -338,7 +338,7 @@ function uploadPdf(eve) { } async function uploadFile(formData) { try { - const response = await fetch("http://127.0.0.1:8000/uploadfile", { + const response = await fetch(window.location + "uploadfile", { method: "POST", body: formData, }); diff --git a/app/static/autocomplete.js b/app/static/autocomplete.js index 959a694..e3f04fc 100644 --- a/app/static/autocomplete.js +++ b/app/static/autocomplete.js @@ -1,4 +1,4 @@ -var url = "http://127.0.0.1:8000/search/"; +var url = window.location + "search/"; var lid = null; var pid = null; var activeAutocompletion = null; diff --git a/compose.yml b/compose.yml index 4a27c7b..48f3172 100644 --- a/compose.yml +++ b/compose.yml @@ -2,17 +2,18 @@ version: "3" services: app: container_name: python-app - command: python -m uvicorn app.main:app --host 0.0.0.0 --port 80 - biuld: + # command: python -m uvicorn app.main:app --host 0.0.0.0 --port 80 + build: context: . - dockerfile: DOCKERFILE + dockerfile: Dockerfile volumes: - ./app:/python - - ./unizeug:/unizeug + - ./unizeug:/unizeug:source ports: - 80:80 restart: unless-stopped environment: + ENTRY_COMMAND: python -m uvicorn main:app --host 0.0.0.0 --port 80 APP_LOG_PATH: /python/app.log APP_ROOT_PATH: /python UNIZEUG_PATH: /unizeug @@ -30,24 +31,32 @@ services: image: mariadb restart: unless-stopped environment: - MARAIDB_ROOT_PASSWORD: DBPassword + MARIADB_ROOT_PASSWORD: DBPassword MARIADB_USER: app + UNIZEUG_PATH: /unizeug MARIADB_PASSWORD: DBPassword MARIADB_DATABASE: Unizeug TZ: "Europe/Vienna" + healthcheck: + test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] + start_period: 10s + interval: 10s + timeout: 5s + retries: 3 volumes: - ./mariadb:/var/lib/mysql scaner: container_name: python-scaner - command: python /python/init.py - biuld: + # command: python /python/init.py + build: context: . - dockerfile: DOCKERFILE + dockerfile: Dockerfile volumes: - ./app:/python - - ./unizeug + - ./unizeug:/unizeug:source restart: unless-stopped environment: + ENTRY_COMMAND: python /python/init.py UNIZEUG_PATH: /unizeug DB_HOST: db DB_USER: app diff --git a/requirements.txt b/requirements.txt index 501bd21..9971752 100644 --- a/requirements.txt +++ b/requirements.txt @@ -44,6 +44,7 @@ pypdf==5.2.0 pytesseract==0.3.13 python-dotenv==1.0.1 python-multipart==0.0.20 +pytz==2025.2 PyYAML==6.0.2 requests==2.32.3 rich==13.9.4