diff --git a/.trunk/configs/ruff.toml b/.trunk/configs/ruff.toml index 2bac1c8..bd7929d 100644 --- a/.trunk/configs/ruff.toml +++ b/.trunk/configs/ruff.toml @@ -20,3 +20,11 @@ exclude = [ ] line-length = 88 indent-width = 4 +target-version = "py312" +[lint] +# 1. Enable flake8-bugbear (`B`) rules, in addition to the defaults. +select = ["E4", "E7", "E9", "F", "B"] +dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" +[lint.per-file-ignores] +"__init__.py" = ["E402"] +"**/{tests,docs,tools}/*" = ["E402"] diff --git a/semap.db b/semap.db new file mode 100644 index 0000000..e69de29 diff --git a/src/backend/database.py b/src/backend/database.py index 21bea2b..7266201 100644 --- a/src/backend/database.py +++ b/src/backend/database.py @@ -8,12 +8,12 @@ from typing import Any from omegaconf import OmegaConf -from src.backend.db import main as template + # from src.data import pickles import pickle from src.logic.constants import SEMAP_MEDIA_ACCOUNTS from src.logic.dataclass import ApparatData, BookData -from log import MyLogger +from src.logic.log import MyLogger from icecream import ic config = OmegaConf.load("config.yaml") @@ -35,7 +35,6 @@ class Database: pass def create_database(self): #create database from template - template(self.database_path) subjects = config.subjects for subject in subjects: self.cur.execute(f"INSERT INTO subjects (name) VALUES ('{subject}')") diff --git a/src/backend/database_rewrite.py b/src/backend/database_rewrite.py new file mode 100644 index 0000000..2ecc6df --- /dev/null +++ b/src/backend/database_rewrite.py @@ -0,0 +1,87 @@ +import datetime +import os +import re +import sqlite3 as sql +import tempfile +import pickle +from src.logic.log import MyLogger +from icecream import ic +from typing import List, Tuple, Dict, Any, Optional, Union +from omegaconf import OmegaConf +from src.backend.db import CREATE_TABLE_APPARAT, CREATE_TABLE_MESSAGES, CREATE_TABLE_MEDIA, CREATE_TABLE_APPKONTOS, CREATE_TABLE_FILES, CREATE_TABLE_MESSAGES, CREATE_TABLE_PROF, CREATE_TABLE_USER, CREATE_TABLE_SUBJECTS +from src.logic.constants import SEMAP_MEDIA_ACCOUNTS +from src.logic.dataclass import ApparatData, BookData + +config = OmegaConf.load("config.yaml") +logger = MyLogger(__name__) + +def load_pickle(data): + return pickle.loads(data) +def dump_pickle(data): + return pickle.dumps(data) +def create_blob(data): + with open(data, "rb") as f: + return f.read() +def create_file(filename:str, blob): + with tempfile.TemporaryDirectory(delete=False) as tmpdir: + filepath = os.path.join(tmpdir, filename) + with open(filepath, "wb") as f: + f.write(blob) + return filepath + +class Database: + def __init__(self, db_path: str = None): + if db_path is None: + self.db_path = config.database.path + else: + self.db_path = db_path + if self.get_db_contents() is None: + self.create_tables() + + def get_db_contents(self): + try: + with sql.connect(self.db_path) as conn: + cursor = conn.cursor() + cursor.execute("SELECT * FROM sqlite_master WHERE type='table'") + return cursor.fetchall() + except sql.OperationalError: + return None + + def connect(self): + return sql.connect(self.db_path) + + def close_connection(self, conn: sql.Connection): + conn.close() + + def create_tables(self): + conn = self.connect() + cursor = conn.cursor() + cursor.execute(CREATE_TABLE_APPARAT) + cursor.execute(CREATE_TABLE_MESSAGES) + cursor.execute(CREATE_TABLE_MEDIA) + cursor.execute(CREATE_TABLE_APPKONTOS) + cursor.execute(CREATE_TABLE_FILES) + cursor.execute(CREATE_TABLE_PROF) + cursor.execute(CREATE_TABLE_USER) + cursor.execute(CREATE_TABLE_SUBJECTS) + conn.commit() + self.close_connection(conn) + + def query_db(self, query: str, args: Tuple = (), one: bool = False): + conn = self.connect() + cursor = conn.cursor() + cursor.execute(query, args) + rv = cursor.fetchall() + conn.commit() + self.close_connection(conn) + return (rv[0] if rv else None) if one else rv + + + + + + + + + + \ No newline at end of file diff --git a/src/backend/db.py b/src/backend/db.py index 8fb0e02..3b12ad8 100644 --- a/src/backend/db.py +++ b/src/backend/db.py @@ -1,73 +1,4 @@ -import sqlite3 -from omegaconf import OmegaConf -config = OmegaConf.load("config.yaml") -subjects = config.subjects - -# Connect to the database -def main(database): - conn = sqlite3.connect(database) - conn.execute( - """CREATE TABLE app_kontos ( - id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - app_id INTEGER, - konto INTEGER, - passwort TEXT, - FOREIGN KEY (app_id) REFERENCES semesterapparat (id) - )""" - ) - - conn.execute( - """CREATE TABLE files ( - id INTEGER PRIMARY KEY, - filename TEXT, - fileblob BLOB, - app_id INTEGER, - filetyp TEXT, - prof_id INTEGER REFERENCES prof (id), - FOREIGN KEY (app_id) REFERENCES semesterapparat (id) - )""" - ) - - conn.execute( - """CREATE TABLE media ( - id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - bookdata BLOB, - app_id INTEGER, - prof_id INTEGER, - deleted INTEGER DEFAULT (0), - available BOOLEAN, - reservation BOOLEAN, - FOREIGN KEY (prof_id) REFERENCES prof (id), - FOREIGN KEY (app_id) REFERENCES semesterapparat (id) - )""" - ) - - conn.execute( - """CREATE TABLE messages ( - id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - created_at date NOT NULL DEFAULT CURRENT_TIMESTAMP, - message TEXT NOT NULL, - remind_at date NOT NULL DEFAULT CURRENT_TIMESTAMP, - user_id INTEGER NOT NULL, - appnr INTEGER, - FOREIGN KEY (user_id) REFERENCES user (id) - )""" - ) - - conn.execute( - """CREATE TABLE prof ( - id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - titel TEXT, - fname TEXT, - lname TEXT, - fullname TEXT NOT NULL UNIQUE, - mail TEXT, - telnr TEXT - )""" - ) - - conn.execute( - """CREATE TABLE semesterapparat ( +CREATE_TABLE_APPARAT = """CREATE TABLE semesterapparat ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT, prof_id INTEGER, @@ -84,10 +15,52 @@ def main(database): konto INTEGER REFERENCES app_kontos (id), FOREIGN KEY (prof_id) REFERENCES prof (id) )""" - ) - - conn.execute( - """CREATE TABLE user ( +CREATE_TABLE_MEDIA = """CREATE TABLE media ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + bookdata BLOB, + app_id INTEGER, + prof_id INTEGER, + deleted INTEGER DEFAULT (0), + available BOOLEAN, + reservation BOOLEAN, + FOREIGN KEY (prof_id) REFERENCES prof (id), + FOREIGN KEY (app_id) REFERENCES semesterapparat (id) + )""" +CREATE_TABLE_APPKONTOS = """CREATE TABLE app_kontos ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + app_id INTEGER, + konto INTEGER, + passwort TEXT, + FOREIGN KEY (app_id) REFERENCES semesterapparat (id) + )""" +CREATE_TABLE_FILES = """CREATE TABLE files ( + id INTEGER PRIMARY KEY, + filename TEXT, + fileblob BLOB, + app_id INTEGER, + filetyp TEXT, + prof_id INTEGER REFERENCES prof (id), + FOREIGN KEY (app_id) REFERENCES semesterapparat (id) + )""" +CREATE_TABLE_MESSAGES = """CREATE TABLE messages ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + created_at date NOT NULL DEFAULT CURRENT_TIMESTAMP, + message TEXT NOT NULL, + remind_at date NOT NULL DEFAULT CURRENT_TIMESTAMP, + user_id INTEGER NOT NULL, + appnr INTEGER, + FOREIGN KEY (user_id) REFERENCES user (id) + )""" +CREATE_TABLE_PROF = """CREATE TABLE prof ( + id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, + titel TEXT, + fname TEXT, + lname TEXT, + fullname TEXT NOT NULL UNIQUE, + mail TEXT, + telnr TEXT + )""" +CREATE_TABLE_USER = """CREATE TABLE user ( id integer NOT NULL PRIMARY KEY AUTOINCREMENT, created_at datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, username TEXT NOT NULL UNIQUE, @@ -97,34 +70,9 @@ def main(database): email TEXT UNIQUE, name TEXT )""" - ) - conn.execute( - """ -CREATE TABLE subjects ( +CREATE_TABLE_SUBJECTS = """CREATE TABLE subjects ( id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT NOT NULL UNIQUE -) -""" - ) - - conn.execute( - """ - CREATE TABLE aliases ( - id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, - name TEXT NOT NULL UNIQUE, - subject_id INTEGER, - FOREIGN KEY (subject_id) REFERENCES subjects (id) -) -""" - ) - - # Commit the changes and close the connection - conn.commit() - #insert subjects - - - conn.close() +)""" -if __name__ == "__main__": - main() diff --git a/log.py b/src/logic/log.py similarity index 100% rename from log.py rename to src/logic/log.py diff --git a/src/logic/threads.py b/src/logic/threads.py index 7cc7e99..3c7c324 100644 --- a/src/logic/threads.py +++ b/src/logic/threads.py @@ -4,7 +4,7 @@ import time from PyQt6.QtCore import QThread, pyqtSignal from src.backend.database import Database -from log import MyLogger +from src.logic.log import MyLogger from src.transformers import RDS_AVAIL_DATA from src.logic.webrequest import BibTextTransformer, WebRequest import sqlite3 diff --git a/src/logic/userInterface.py b/src/logic/userInterface.py index a24622a..7ea8911 100644 --- a/src/logic/userInterface.py +++ b/src/logic/userInterface.py @@ -18,7 +18,7 @@ from src.logic import c_sort from src.backend.database import Database from src.logic.constants import APP_NRS, PROF_TITLES from src.logic.dataclass import ApparatData, BookData, MailData -from log import MyLogger +from src.logic.log import MyLogger from src.logic.threads import BookGrabber,AvailChecker from src.ui import ( App_Ext_Dialog, diff --git a/src/logic/webrequest.py b/src/logic/webrequest.py index 455718e..603bc0e 100644 --- a/src/logic/webrequest.py +++ b/src/logic/webrequest.py @@ -3,7 +3,7 @@ from bs4 import BeautifulSoup from omegaconf import OmegaConf from src.logic.dataclass import BookData -from log import MyLogger +from src.logic.log import MyLogger from src.transformers import ARRAYData, BibTeXData, COinSData, RDSData, RISData #import sleep_and_retry decorator to retry requests from ratelimit import limits, sleep_and_retry diff --git a/src/transformers/__init__.py b/src/transformers/__init__.py index ea68985..c247740 100644 --- a/src/transformers/__init__.py +++ b/src/transformers/__init__.py @@ -1 +1,6 @@ -from .transformers import RDS_AVAIL_DATA, ARRAYData, COinSData, BibTeXData, RISData, RDSData \ No newline at end of file +from .transformers import (RDS_AVAIL_DATA, + ARRAYData, + COinSData, + BibTeXData, + RISData, + RDSData) \ No newline at end of file diff --git a/src/transformers/transformers.py b/src/transformers/transformers.py index 760afdd..d5f0667 100644 --- a/src/transformers/transformers.py +++ b/src/transformers/transformers.py @@ -9,7 +9,7 @@ from typing import Any, List, Optional from pydantic import BaseModel, Field from src.logic.dataclass import BookData -from log import MyLogger +from src.logic.log import MyLogger logger = MyLogger("transformers.py") diff --git a/src/ui/dialogs/Ui_parsed_titles.py b/src/ui/dialogs/Ui_parsed_titles.py index 8492d90..786c176 100644 --- a/src/ui/dialogs/Ui_parsed_titles.py +++ b/src/ui/dialogs/Ui_parsed_titles.py @@ -8,7 +8,7 @@ from PyQt6 import QtCore, QtGui, QtWidgets -from log import MyLogger +from src.logic.log import MyLogger from src.logic.threads import AutoAdder logger = MyLogger("AutoTitleAdder") diff --git a/test.py b/test.py index e691e9e..d689d8d 100644 --- a/test.py +++ b/test.py @@ -125,11 +125,18 @@ # data = ['YH 6876 S344', 'YM 3500 L925', 'CU 3200 W862', 'CW 6940 W842', 'CZ 1360 M379', 'CU 3800 V445', 'CU 3100 L948', 'CU 3200 H379 (3)', 'YC 7093 K95', 'CU 8590 E34 (2)', 'MS 6410 L744 (2)+1', 'CUS778', 'Psy K 120: 125 b', 'Psy L 170: 66', 'MR 2600 M474 (12)+16', 'Psy K 760: 19', 'Psy K 110: 92', 'Psy K 400: 45 a', 'CD 20/10,6'] # main(data) -from src.backend.database import Database -import pickle -db = Database() +# from src.backend.database import Database +# import pickle +# db = Database() -query="SELECT * from media where id=1" -_data = db.database.execute(query).fetchall() -var = _data[0][1] -print(pickle.loads(var)) \ No newline at end of file +# query="SELECT * from media where id=1" +# _data = db.database.execute(query).fetchall() +# var = _data[0][1] +# print(pickle.loads(var)) +from src.backend.database_rewrite import Database +from omegaconf import OmegaConf + +config = OmegaConf.load("config.yaml") + +subjects = [subject["name"] for subject in config.subjects] +print(subjects) \ No newline at end of file diff --git a/test/test_database.py b/test/test_database.py new file mode 100644 index 0000000..9f05014 --- /dev/null +++ b/test/test_database.py @@ -0,0 +1,5 @@ +from src.backend.database_rewrite import Database + + +db = Database("semap.db") +print(db.query_db("SELECT * FROM subjects WHERE id=1")) \ No newline at end of file