diff --git a/docs/citing.md b/docs/citing.md new file mode 100644 index 0000000..54d5d56 --- /dev/null +++ b/docs/citing.md @@ -0,0 +1,2 @@ +# Zitieren + diff --git a/docs/elsa.md b/docs/elsa.md new file mode 100644 index 0000000..2eec8c6 --- /dev/null +++ b/docs/elsa.md @@ -0,0 +1,25 @@ +# ELSA + +![ELSA](images/elsa_main.png) + +## ELSA anlegen +Um einen ELSA zu erstellen, muss der Knopf **Neuer Auftrag** gedrückt werden. Das Feld *Auftragsdaten* wird zum bearbeiten freigeschaltet, der Fokus wird automatisch auf das Feld **Prof.** gesetzt. + +Hier werden automatisch alle bereits vorhandenen Professoren der Semesterapparate eingetragen. Sollte der Professor noch keinen Apparat haben, so kann der Name manuell eingetragen werden. Die ELSA Profs werden in einer anderen Tabelle der Datenbank gespeichert, als die Professoren der Semesterapparate. Deshalb kann hier keine [Mail](mail.md) an den Professor geschickt werden. + +### Dokumente hinzufügen + +![Dokumenttabelle](images/elsa_docs.png) + +Um den ELSA zu speichern, müssen alle Felder ausgefüllt sein. Nach dem Speichern wird der ELSA in der Tabelle angezeigt. Über das Icon ![Icon](images/icon_cal.png) können der aktuelle Tag und das aktuelle Semester eingetragen werden. + +Hat der Professor ein passendes Formular geliefert, so kann dieses über den Knopf **Dokument hinzufügen** hinzugefügt werden. Das Dokument wird in der Datenbank gespeichert und kann über den Knopf **Dokument öffnen** geöffnet werden. Über den Knopf **Medien aus Dokument hinzufügen** werden alle erkannten Medien aus dem Dokument in die Tabelle eingetragen und können zitiert werden. + +!!! Info + Durch den Klick auf den Knopf **Medien aus Dokument hinzufügen** wird der Auftrag automatisch gespeichert. + +### Einträge zitieren + +Da alle gescannten Dokumente später auf Illias hochgeladen werden, gibt es die Funktion **Eintrag zitieren**. Für diese Funktion muss ein Eintrag in der Tabelle ausgewählt werden. Über den Knopf **Eintrag zitieren** wird ein Dialog geöffnet, in dem der Eintrag zitiert werden kann. +Genauere Beschreibung: [Zitieren](citing.md) + diff --git a/docs/extend.md b/docs/extend.md new file mode 100644 index 0000000..abe685b --- /dev/null +++ b/docs/extend.md @@ -0,0 +1,12 @@ +# Verlängerung + +Ein Dialog zum Verlängern eines Apparates. + +![Verlängerung](images/extend.png) + +Zum Verlängern muss ein Semester ausgewählt, und ein Jahr eingetragen sein. Die Checkbox für den Dauerapparat kann angekreuzt werden, um den Apparat als Dauerapparat zu markieren. + +!!! Info "Info Dauerapparat" + Damit der Apparat als Dauerapparat verlängert werden kann, muss ein Semester angegeben werden. + +Nach dem Speichern wird das Semester automatisch angepasst und in den entsprechenden Tabellen angezeigt. \ No newline at end of file diff --git a/docs/images/elsa_data.png b/docs/images/elsa_data.png new file mode 100644 index 0000000..be171fd Binary files /dev/null and b/docs/images/elsa_data.png differ diff --git a/docs/images/elsa_docs.png b/docs/images/elsa_docs.png new file mode 100644 index 0000000..343c3d4 Binary files /dev/null and b/docs/images/elsa_docs.png differ diff --git a/docs/images/elsa_main.png b/docs/images/elsa_main.png new file mode 100644 index 0000000..57333ee Binary files /dev/null and b/docs/images/elsa_main.png differ diff --git a/docs/images/elsa_stats_graph.png b/docs/images/elsa_stats_graph.png new file mode 100644 index 0000000..575b20d Binary files /dev/null and b/docs/images/elsa_stats_graph.png differ diff --git a/docs/images/elsa_stats_table.png b/docs/images/elsa_stats_table.png new file mode 100644 index 0000000..477b32f Binary files /dev/null and b/docs/images/elsa_stats_table.png differ diff --git a/docs/images/extend.png b/docs/images/extend.png new file mode 100644 index 0000000..a79c9b7 Binary files /dev/null and b/docs/images/extend.png differ diff --git a/docs/images/icon_cal.png b/docs/images/icon_cal.png new file mode 100644 index 0000000..ed73d0c Binary files /dev/null and b/docs/images/icon_cal.png differ diff --git a/docs/search.md b/docs/search.md index 6416cfe..91e1907 100644 --- a/docs/search.md +++ b/docs/search.md @@ -57,6 +57,17 @@ Mit dem Klick auf den Button wird ein neues Fenster geöffnet: Bevor die Mail abgeschickt werden kann, muss die Anrede konfiguriert werden. Weitere Infors finden Sie im Abschnitt [Mails](mail.md). +#### Kontextmenü + +Diese Tabelle bietet auch ein Rechtsklickmenu mit folgenden Optionen: + +- **Verlängern**: Öffnet den [Verlängerungsdialog](extend.md) +- **Wiederherstellen**: Stellt einen gelöschten Apparat wieder her + +!!! Info "Info: Wiederherstellen" + Diese Option kann für einen oder mehrere gelöschte Apparate verwendet werden. Für mehrere Apprate müssen die entsprechenden Zeilen mit Strg+Klick auf die Zeilennummer markiert werden. + + ### Apparatsstatistik Rechts neben der Tabelle wird die Statistik der gefundenen Apparate angezeigt: ![Statistiksuchergebnisse](images/ss_stats_table.png) @@ -90,4 +101,3 @@ Der Suchbereich kann verwendet werden, um zu prüfen, ob ein Exemplar in einem A !!! Info "Info: Exemplarsuche" Im Vergleich zur Apparatssuche kann hier keine Leere Suche durchgeführt werden, da ggf. zu viele Ergebnisse angezeigt werden können. - \ No newline at end of file diff --git a/icons/icons.yaml b/icons/icons.yaml index cdb3a5e..5303e45 100644 --- a/icons/icons.yaml +++ b/icons/icons.yaml @@ -1,6 +1,6 @@ icon_path: icons/ -dark_color: '#75FB4C' +dark_color: '#75FB4Cmail' light_color: '#EA3323' icons: locked: locked.svg @@ -24,4 +24,5 @@ icons: valid_true: check_success.svg valid_false: check_fail.svg edit: edit.svg - important_warn : red_warn.svg \ No newline at end of file + important_warn : red_warn.svg + person: person_add.svg \ No newline at end of file diff --git a/icons/person_add.svg b/icons/person_add.svg new file mode 100644 index 0000000..9c516a8 --- /dev/null +++ b/icons/person_add.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/backend/database.py b/src/backend/database.py index b5873ce..669ce69 100644 --- a/src/backend/database.py +++ b/src/backend/database.py @@ -11,7 +11,6 @@ from omegaconf import OmegaConf from src.backend.db import ( CREATE_ELSA_FILES_TABLE, CREATE_ELSA_MEDIA_TABLE, - CREATE_ELSA_PROF_TABLE, CREATE_ELSA_TABLE, CREATE_TABLE_APPARAT, CREATE_TABLE_APPKONTOS, @@ -1203,7 +1202,8 @@ class Database: Returns: list[str]: a list of all the roles """ - return self.query_db("SELECT role FROM user") + roles = self.query_db("SELECT role FROM user") + return [i[0] for i in roles] def checkUsername(self, user) -> bool: """a check to see if the username is already present in the database @@ -1311,26 +1311,29 @@ class Database: ) # ELSA - def createElsaProf(self, name): - """create a new professor in the database for the ELSA system - Args: - name (str): the name of the professor - """ - self.query_db("INSERT INTO elsa_prof (name) VALUES (?)", (name,)) - - def createElsaApparat(self, date, prof_id, semester): + def createElsaApparat(self, date, prof_id, semester) -> int: """create a new apparat in the database for the ELSA system Args: date (str): the name of the apparat prof_id (int): the id of the professor semester (str): the semester the apparat is created in + + Returns: + int: the id of the apparat """ self.query_db( "INSERT OR IGNORE INTO elsa (date, prof_id, semester) VALUES (?,?,?)", (date, prof_id, semester), ) + # get the id of the apparat + apparat_id = self.query_db( + "SELECT id FROM elsa WHERE date=? AND prof_id=? AND semester=?", + (date, prof_id, semester), + one=True, + )[0] + return apparat_id def updateElsaApparat(self, date, prof_id, semester, elsa_id): """update an ELSA apparat in the database @@ -1446,9 +1449,13 @@ class Database: Returns: int: the id of the ELSA apparat """ + prof_id = self.getElsaProfId(prof) + if prof_id is None: + return None + data = self.query_db( "SELECT id FROM elsa WHERE prof_id=? AND semester=? AND date=?", - (prof, semester, date), + (prof_id, semester, date), one=True, ) if data is None: @@ -1497,22 +1504,7 @@ class Database: if data: return data[0][0] else: return None - - def createElsaProf(self, profname)-> int: - pId = self.getElsaProfId(profname) - if pId: - return pId - query = f"INSERT INTO elsa_prof (fullname) VALUES ('{profname}')" - self.query_db(query) - return self.getElsaProfId(profname) - - def getElsaProf(self, prof_id)->str: - query = f"SELECT fullname FROM elsa_prof WHERE id = '{prof_id}'" - data = self.query_db(query) - if data: - return data[0][0] - else: return None - + def getElsaProfs(self)->list[str]: query = f"SELECT fullname FROM elsa_prof" data = self.query_db(query) @@ -1521,6 +1513,14 @@ class Database: else: return [] def getProfId(self, profdata: dict|Prof): + """Get the prof ID based on the profdata + + Args: + profdata (dict | Prof): either a dictionary containing the prof data or a Prof object + + Returns: + int | None: The id of the prof or None if not found + """ conn = self.connect() cursor = conn.cursor() if isinstance(profdata, Prof): @@ -1557,8 +1557,61 @@ class Database: if result: return Prof().from_tuple(result) else: return Prof() - def getProfNameByApparat(self, apprarat_id): - query = f"SELECT prof_id from semesterapparat WHERE appnr = '{apprarat_id}'" + + def getProfIDByApparat(self, apprarat_id): + """Get the prof id based on the semesterapparat id from the database + + Args: + apprarat_id (int): Number of the apparat + + Returns: + int | None: The id of the prof or None if not found + """ + query = f"SELECT prof_id from semesterapparat WHERE id = '{apprarat_id}' and deletion_status = 0" + data = self.query_db(query) + if data: + return data[0][0] + else: + return None + + def copyBookToApparat(self, book_id, apparat): + # get book data + new_apparat_id = apparat + new_prof_id = self.getProfIDByApparat(new_apparat_id) + query = f""" + INSERT INTO media (bookdata, app_id, prof_id, deleted, available, reservation) + SELECT + bookdata, + '{new_apparat_id}', + '{new_prof_id}', + 0, + available, + reservation + FROM media + where id = '{book_id}'""" + connection = self.connect() + cursor = connection.cursor() + cursor.execute(query) + connection.commit() + connection.close() + + def moveBookToApparat(self, book_id, appratat): + """Move the book to the new apparat + + Args: + book_id (int): the ID of the book + appratat (int): the ID of the new apparat + """ + # get book data + query = f"UPDATE media SET app_id = '{appratat}' WHERE id = '{book_id}'" + connection = self.connect() + cursor = connection.cursor() + cursor.execute(query) + connection.commit() + connection.close() + + def getApparatNameByAppNr(self, appnr): + query = f"SELECT name FROM semesterapparat WHERE appnr = '{appnr}' and deletion_status = 0" data = self.query_db(query) if data: return data[0][0] diff --git a/src/backend/semester.py b/src/backend/semester.py index f848087..379621b 100644 --- a/src/backend/semester.py +++ b/src/backend/semester.py @@ -5,6 +5,7 @@ def generateSemesterByDate(next:bool = False): currentYear = datetime.datetime.now().year currentYear = int(str(currentYear)[-2:]) month = datetime.datetime.now().month + # month = month + 1 if next: month += 1 if month > 12: @@ -13,7 +14,7 @@ def generateSemesterByDate(next:bool = False): if month >= 4 and month <= 9: return "SoSe " + str(currentYear) else: - if month == 10 or month == 11: + if month == any([10, 11, 12]): return f"WiSe {currentYear}/{currentYear+1}" else: return f"WiSe {currentYear-1}/{currentYear}" @@ -38,4 +39,8 @@ def generateSemesterByOffset(offset): else: return f"WiSe {currentYear+1}/{currentYear+2}" else: - return f"WiSe {currentYear+offset//2}/{currentYear+1+offset//2}" \ No newline at end of file + return f"WiSe {currentYear+offset//2}/{currentYear+1+offset//2}" + + +if __name__ == "__main__": + print(generateSemesterByDate(next=True)) \ No newline at end of file diff --git a/src/logic/dataclass.py b/src/logic/dataclass.py index f7f51a1..3720269 100644 --- a/src/logic/dataclass.py +++ b/src/logic/dataclass.py @@ -30,6 +30,11 @@ class Prof: setattr(self, "telnr", data[6]) return self + def name(self, comma=False): + if comma: + return f"{self.lastname}, {self.firstname}" + return f"{self.lastname} {self.firstname}" + @dataclass class ApparatData: diff --git a/src/logic/threads_autoadder.py b/src/logic/threads_autoadder.py index 4ba2fb1..231d131 100644 --- a/src/logic/threads_autoadder.py +++ b/src/logic/threads_autoadder.py @@ -33,15 +33,11 @@ class AutoAdder(QThread): item = 0 for entry in self.data: try: - # webdata = WebRequest().get_ppn(entry).get_data() - # bd = BibTextTransformer("ARRAY").get_data(webdata).return_data() - # bd.signature = entry + self.updateSignal.emit(item) self.setTextSignal.emit(entry) - # qsleep item += 1 self.progress.emit(item) - # print(item, len(self.data)) time.sleep(1) except Exception as e: