From f1ee4089a390cc48e5b6c6841c5386b1b9f3b1c7 Mon Sep 17 00:00:00 2001 From: WorldTeacher Date: Fri, 24 Jan 2025 10:17:16 +0100 Subject: [PATCH] update documentation, rework documentation thread, rework book dataclass, fix newentry bug --- docs/Allgemeines.md | 11 +++++++ docs/Einstellungen.md | 47 +++++++++++++++++++++++++++--- docs/images/restart.png | Bin 7352 -> 6980 bytes docs/index.md | 1 + src/__init__.py | 3 +- src/logic/documentation_thread.py | 6 ++-- src/schemas/book.py | 22 +++++++------- src/ui/main_ui.py | 28 +++++++++++++----- src/ui/newentry.py | 37 ++++++++++++++++------- 9 files changed, 117 insertions(+), 38 deletions(-) create mode 100644 docs/Allgemeines.md diff --git a/docs/Allgemeines.md b/docs/Allgemeines.md new file mode 100644 index 0000000..b963ff8 --- /dev/null +++ b/docs/Allgemeines.md @@ -0,0 +1,11 @@ +# Allgemeines + +Hier werden alle allgemeinen Informationen zur Anwendung aufgeführt, die nicht direkt in die anderen Bereiche passen. + +## Datenbankbackup + +Bei jedem schließen der Anwendung wird ein Backup der Datenbank erstellt. Dieses Backup wird im Sicherungspfad gespeichert, dieser ist in den Einstellungen einsehbar und änderbar. + +Sollte der normale Speicherpfad nicht existieren oder nicht erreichbar sein (im Falle eines Netzwerklaufwerks), wird der Backuppfad verwendet. Beim Schließen der Anwendung wird ein Fehler erscheinen, dass das erstellen des Backups nicht erfolgreich war. Solange der Originale Pfad nicht erreichbar ist, wird der Backuppfad verwendet. + +Sobald der Originale Pfad wieder erreichbar ist, wird die Datenbank in den Originalen Pfad kopiert, die veraltete Datenbank wird gelöscht und der Backuppfad wird wieder verwendet. diff --git a/docs/Einstellungen.md b/docs/Einstellungen.md index 19d3963..89bf84f 100644 --- a/docs/Einstellungen.md +++ b/docs/Einstellungen.md @@ -4,6 +4,48 @@ ## Bedienung Hier werden die Einstellungen geändert. Sobald ein Wert geändert wird, ist es möglich die Einstellungen rückgängig zu machen, oder die Änderungen zu speichern. +## Einstellungsoptionen + +### Name der Einrichtung +Hier kann der Name der Einrichtung geändert werden. Dieser wird in der Kopfzeile der Anwendung angezeigt, und im Katalog verwendet um Exemplare zu finden. + +### Leihdauer +Hier kann die Leihdauer festgelegt werden. Standardmäßig ist diese auf 7 Tage gesetzt + +### Inaktive Nutzer löschen +Hier kann festgelegt werden, wie lange Inaktive Nutzer im System bleiben. Dieser Zeitraum wird ab dem letzten Öffnen des Nutzerkontos berechnet. Standardmäßig ist dieser auf 365 Tage gesetzt. +### Erweiterter Rückgabemodus +Wird hier der Haken gesetzt, wird die Bedinung der Anwendung geändert. Anstatt dass F5 zwischen Ausleihe und Rückgabe wechselt, wird, wenn die Rückgabe offen und ein Nutzer Offen ist, die Rückgabe zurückgesetzt. Diese Aktion orientiert sich an aDIS, dem Ausleihsystem der Bibliothek + + + +### Datenbank +Hier werden die Datenbankoptionen geändert. + +- Speicherort: Hier wird der Speicherort der Datenbank geändert. Standardmäßig ist dieser auf den Ordner der Anwendung gesetzt (database) + +- Datenbankname: Hier wird der Name der Datenbank geändert. Standardmäßig ist dieser auf "library.db" gesetzt + +- Sicherungspfad: Hier wird der Pfad für die Sicherung der Datenbank geändert. Standardmäßig ist dieser auf den Ordner der Anwendung gesetzt (backup) + +### Bericht +Hier werden die Einstellungen für die Berichte geändert. + +- Tag: Der Wochentag, an dem die Berichte erstellt werden sollen +- Berichte erstellen: Ist der Haken gesetzt, werden Berichte erstellt +- Speicherpfad: Speicherort für Berichte, standardmäßig ist dieser auf den Ordner der Anwendung gesetzt (report) +!!! Info + Automatische Berichte werden in diesem Format erstellt: + `report__.tsv` + +Wird die Anwendung am Tag der Berichterstellung mehrfach geöffnet, wird nur ein Bericht erstellt + +### Shortcuts +Hier können die Shortcuts angepasst werden. Um einen Shortcut zu ändern, muss ein Doppelklick auf das entsprechende Feld in der Spalte "Aktuell" gemacht werden. +Anschließend kann der gewünschte Shortcut eingegeben werden. +(Eine Änderung der Shortcuts erfordert einen Neustart der Anwendung) + + ## Besonderheiten Der Knopf neben Speicherort, Datenbankname, Sicherungspfad und Speicherpfad kann verwendet werden, um den Pfad gezielt zu setzen. @@ -15,7 +57,4 @@ Einige Aktionen (bspw. Änderungen der Shortcuts) erfordern einen Neustart der A ![restart](images/restart.png) -Im Anschluss an diesen Dialog erscheint ein neuer Dialog: - -![restart Application](images/settings_changed_restart.png) - +Mit einem Klick auf "Ja" wird die Anwendung neu gestartet und die Änderungen übernommen. Mit einem Klick auf "Nein" werden die Änderungen nicht übernommen und die Anwendung bleibt im aktuellen Zustand. \ No newline at end of file diff --git a/docs/images/restart.png b/docs/images/restart.png index 249f44da1faeba213bac1d39a164dcd9b821ec88..71d3fdcc54fdbe50f151ebc683bf62620db20a63 100644 GIT binary patch literal 6980 zcmZX3Wl&sAw>1NU%OF95LjnXC2oNL;?mEq;-H|Q;LE?0RzpDna3SAAurQE!oN2ji zSO7pUJ>RM7y$Wq5N>)QAY4|a05G3NKmgDq8F`f|&QHMKbm_0yynDCoa-y%l z>eJZnt!48ddNp<8b#l_`(S3K9vnnFsc<{57kX15|Fg7-JYGZ@m&DB*kAVBQ$@^b3O z53D+PP+k3it^Ejxi`P2vi4Y5Tk=dPo@(?!*v$kd{EG||zH)r17*-_Kcp+pan;2Z&< zV*KhG@;q4)g!o*6IrQ6-$-r7Y08*d?Atwe`iMO}++gFwO?A0Bgt6DarA_5zmo7sYJO>qN1W)xg`igTX7q3GSQE5U@eY8WUpbPXlB9mSS~b{v!9t1 zv6e{ta|SCaz&T7)r$^O4cb9jr0yywT95d(keB@&8i^Ftj!9?jZ z3p<$4abt2$4h_MC*pqPa^1MY&&!9CB4qSs6PYh6NJ-(-RXw(0BhUlEr%O zi_b|UtMNN2nDW>b#LRgCb>=W`U-$tNa)uzl0Vb7hoP$)ouhiNO)Tv5ZE*NxLj;i;6 zFHh9i>?gmFi&ORR5C|7K?MRwAIsm}db!EQD6m&)?8jZ#O?71Qi@)wgnodzLoa0dkED3(K18 zm?|bcup`5dk&yzAH81!%a*~UZEQzwBJOLk3=hkOc9&+d=HNUQi%MZ=5%MtQOsVR_g za6aR!l$}gl=lUqx~iMjHu9PszgX6X=``4N6UgkNYcsr|G|=*ZgSj?fAXG0_mq zBg=cz{q*PvK@1(S-}Hj~#b0;bFz)L6UCtVD2V-T3$~-2$7aiJ1+0@Y0rLv#ts(uyz zchBWF08Hogn+Qf8n$b5)@6W{=7To)cwjmz=r^kykq)w$KK1d?e*hnRm%AteX_wS~3 zmu}92J9os+WS$flB1`{ajg!;9^>R-4d({HIzzQLmUPG(hGCvIS%I&uV*Qn@*Dct|L zF-=y^_i)fm=k*%Z36(7!BmQV@RuhByTUdxZ+-W)JCiBX^b(`!w4Qlj9j|@a(t~An)0irxfT>zX>=T?gG`st)Sp?(h_R=EMuYg8FLcU zlx3sXfQhD-gZ6NOsq*0+`SAXgO@*H6y0poBQUTV)B}JNJ5{|Fubkw=^0c&z;m3jq0 z@FTWJj(CD0phpex7Mpt(BQOPc2xqNfG}NZxUa7YLy=FnXJmRF3o<+fh(|U~5nT-t6 zpsk3QluC#jJ|C!;jMW4Rc=M>vt&t&mP9!B?<+QEW5N_$KhTbZ60Pad7(%AtaHZ6Y< z?W`VWm#+6c-BUi8k0}VD_2RBLe#qm2)WurwG1zgW`VK?P{1@F7o!@by7%>^o z$%%W~>f7CmKnw@WW2HV84u^^ci0QZF#N;^b?9?_1>#9)bpx@rk`7=(tjT5^?=XKy2 z4+YWPxJT38GYjC=$tqRb?M{~4&*v0q?UViqDs;==gE2%s53O|me)O2$F7Nu`@nZK4 zp*+@@627sN_(mUg@YleIfz0bQ_Ug{7OaTB1FOHwUPF^Lvm&4#%(_&t(hfurZ` z36el9y}?Gwz!8C*O*03osrCckvi|3#~+uMLs3{ z?+kq$A=#$+ndrrFwczD(lTuL?PVS}S6iC1Le&Hdr=(@g3HXUVa(apk&)pw79%5TT{5?pm4 zMWcb}GuX?x#wcY^m(RPv%l~G|1OpW6l&QYMUZQ}`5{vobIw>j_s}7=icbO&F-+Bp& zAntIXA;>*0iHif(z04>5WZ|4h#Kkud)hYw5CdZ9$so{bESOs@-+=r}hbRozQ5Jp zKHfe)hfx>3G$gF9J{2kGS8NTDAEq&Ns*}d)8^9S{GHp#@Xi3PfMh&&GjTzDDErT<# zrl=5noBZg}I1wC?GTD@tRoc3UGh4{UTK)MT>#&q(g6$W-GwnVra)e-kOl~Yq0rM3@wK@7BAY$G4aa^Uko zBU#qUq8)_7@K*FkzF!dLQ9of^t+A{e*E$1jsPI~0Soo?0*5}W!D_(hR0(^7Eg9~{_ z35hsKB>=Dk^n;hhYCaAT?)N7q&%VkWeU$Bl6<19zja6V7@GO^9^_}?VADNdG7c}@) zDwqU38*tPV*k*2TlQT%kIf?FT%86=gJ3H=Q3721*;nlR7&x~9WYZ%E$I`z=hlrdf2 zy1E3aF)A4uJfDBa)%ggwT*42qPqLfY;?{a_Bwr;xY-eogn;BUtPS(9{A?8w0ZgiCs zAZq%Oe4}MzpcS4)kx#lPe-Z9bl`B@3kYwEYIW>6kVBZi3G6M4@eG&EzQgJ8Hrpj=? zAh%p0=b+RqDqL}X;{lzVI&Orv7U?X(8fJFxC6x-cjR|?o4s4zXA zsR+yUFOsi~yR$7>*;!y7YqEqhOo{f}yq2``LZ21b`&oox&B?H|Y&q*-v!bYxK5-Z+ zs4x~L^wZsNb#$f6`#5~sI_J|wb=M$s|IGS2R7_ZL!dQ2!i#?bsm+A|+2L3oXG)IK7 zx~QgR1r~Oss!XXt(I(RrkAx;b%~@umvQ67|qIfky`%rx{o~n_7N`4K)Lk_~++TXm0 zA*$UE&KSsTZoq{`BSRTd+@R;TpSch0ioXrhQ0o@#VnSI`DVaWa$;H^Jt?#0%<5onz zd4$`fUKgtbg>93i6w9}OoR;cCwroZ7j+EW3`FUp$9EW*^Y-_TU)t6=}7`Tdz+vd&& zolUXaTwM{pY;|uQ9*!%zfh;X#TrqO90v_yu?=9qDCQ^D?TfSOq8EIvXMPha6f{;b{ zp3swD>SOIMFpcHu45L{}?SWRR&H`fk(lg_;Y&T?DLLbe=790atbiDLS=q@?y48&O) zLM{C+)4HT$ME7^tva^nhayhdk&r2jFg>g-?(k_-wbD;RaH+$$YYKniQbL`uUL6O~X zUpB<$*PHGOCk{jW%1&v8j+^m(GO7?JVdnfaltZ@jG`aTuv{U!Pma;g6HK}F`%_Y16 zZf8WL^>Jjp7v)%JZQ!g`7G@^WSu#J2ST~u?xB_H0~MjpZMM7ZPnfw7MJ?0 z?1id$a=f#(vH4#LAiRaFMvCr=eV%)$E{2|m`X{799`x z$AtsutTuwW?{*~#*^-#c$(|}g{OSf_p(lpCM$H8gbM~+EIqp|vSW`ak@h`q)FFZ(V zPE^23Qx-PNl1tHLEAg-ATn@BpCHd*@E_)zS0xozb(tO92DEulNQX6|0;_1@q%<_FF zE$iXSkl*E``#$rM?6MWdCa6g@@dd6eB#r@rTyIQ&`fy)|4v&nuxjNggyM10e)@1CD zSLxyBnQ&+L$PxR>X@!`1;e$ffUe0hza=EnaHc5*~K_$DXVI=y2Q$OOnoz;hs^vdyr z;z0*LoQyux9uA#lN!^{h7l3I{8W^c{PB?0=su=v^6J^lb`j(8bL9`kJIPHlY{d6|e zcq1u-Ltw);$G3FKGO538?Gj6|HiJ+a4bn@664Pjv8<$_$PYKH+eoYTH2D)9v$^t*h zU|5F%`x{>|3}yX`&g?993>pA9r z_-&{SdELg@wI$exp}KysM}g;**SRb>?1xUDChz9#ZKov6Tx`WS!@fyavE!}$wzg9U zlQlr$0HR3uFmegeBn-WcVIk*X*Nlv#)r*gLFVWF};*?paPw}0nuiuMui&CeW>@46A zG}kBrcYF@6wA=aCwx*Aihemp0k=@iJ1a*Pho5W8^D@1x zzbbBaM@cW$Zt_AD*vX1=6X>x}4})!zif-zj;oyUu%=Q%fH>aK0`=V=Z(pv_J`Sn32 zmdsT$3Gk`6bdp7>CA>UJ^Li;kd=i8}g{SnCU`6AR-4r~s1A=A9y4Z(g z4DeD|#3s4pbYtst(PcmF4R)aa$dJu^#3H z$IWK)2asYDfF{>dwFE##X~fIz2|}e0$%M*DlRp%x86$GrT7uOYapLR$Zj6YDSS>zxGuAGiJ%0>n9 zpK9(GwUN4St<6k9U+7r$9U9z?{py0VupC)m9fNS5Cp;Ga;vaA-F-w`Id3JVg-O6eM zw-KSLMa+IMD7S;>)U&U3=&8K>`Q)_Z&MT+4Il=bmYgF5mL09h=Qs25ld^v+Rv4t^J z&iXA)MAY_3zNhE9>jqor3y-n3F<4l~_W~kj4Tz4?R{&~SJUu5kGDl4Y>Dn_ZKg_3U zIo8BO&Eh7-CQ>g+i(c}`8B}=XXOE(N0^xs@)+B%J9Unj`Y;6y|ykr+xZ|_i8Qp>Y& zd&j%`jD)XQBVVx6eed`@8`|VevNP+fJ{LFd&2M~JUeE&`5inX5SUgAL&8L^o{37(Z<(i;f1UhG9i}Vo(rlSdk|8t6za* zs=k~FqfKvy>6enw^FTqF2^zBsU*A@ngGQND%kfgnj!`SO59z*ZHChh`rPW*GBioKA zb*!VeDUJc1{?H`bH~a)U&Mr$Q&k!#-3D5s{X80gaw;P!Q&ut?s-#yR$w#MmB!-1}z zLEW$&#stKF@}ybx&KW5Wgfk)9Q#|pfqqCy-m&~+F1ivqguH{p9RZ?})_h+%N?Fbvf zYEOLm54{SbJgIxNY$JEFqxxpDq2wXJ^G^c@^Q@O{9bT>36NnF({+O)~<_e;SHoue?@)yvKjwMA!W1xgOue-a#ce7GyN4_aK*X$xJu zu_yAYd>a;=L#JL-9CFGy{U?FX(V;Ze%qo_k-jd1fYw^gZ@fk5+{^+&GN9(dKlaz>$ z)TZ|3(a{%AD<(P|TtfP2FNT{>b3<6#_E+N(rN>(m2O3tMj*LPg8Bk7zyjew_eO&a` zhF_Us3JvB622HVGi>SHjt3MRj81mZ(Vm|MlCd{smmjzt@5qDfk;yp#PVb74YKxOG3 zpu`^zMnk07Bb#`?i5pC>XWNhZ|Fz=3{Y(^(#Q&uq|2yXY$VXyf$BjT3vWoWyG+DLr z<3~gs4l*~UhoayZ%z82oIEeekrETQMCy69Xd&gX;uNkz9C`yp z1yIt^6z1hIz{cUxbO?G@)<`vVb+7#PA#C|Nx}1Yfn}dPF_=gtf;ePvzG#)CMbTLk!DaG0F`1qIkO?1b5K|w*V z=^jb(y`DCVusSCo;If14b>LQY`(e@r9E8|Qb8z3&@DOhgzPmo1{~!?oT9MU)NrsM& zDxHuQ-%Gc~)^vnoWjVlHm|y8#oY& zl#{7Ktv|=LqAf9bFrdr*xPHlRk1!J@SP<&9>CQdf7Ub&1M28X?t5b-qdb z+_Wz@6ggk(Q!SdU3XW;UZA$0a!OE@yPJFB66Lh8?Qy1&dZ9~-dtkQX#=1+GwSAs{n zQGwW91xLU5t!<=A3SuWj*i1}5B#Y?D4a{B-?2$966uzGN#Jn2dCLKR`)bT=N)j5l^ zJ~2+?Neg#%MGC0&hc0#yQu1xr^|N7d3~d#A(E**@kctg1O~~66Yut*zf{0uBpyCeQJ|uT-&pm)E!AnXOYh~UsoEH40=wR zdwr*z&{L(~E_patIfMM)$_@^%_5E+RA*Ggeq0Pa^*;sCr|kL4avKW%H}m3q}Ow%Ua3Vu zKv38Bi=PQ~TB(a+YI)0k4GeEG#Aquu=@Iqn9ck*=aC=(e(S^TRPd~xzAZgq+)1B!I zI4eTW9P|4QW|>3_mr;?f Ik~9qdA4EJ|j{pDw literal 7352 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 diff --git a/docs/index.md b/docs/index.md index 0f0c53a..58475c0 100644 --- a/docs/index.md +++ b/docs/index.md @@ -17,5 +17,6 @@ Unterbereiche umfassen: - [Ausleihhistorie](Ausleihhistorie.md) - Historie der Ausleihen - [Bericht erstellen](Bericht erstellen.md) - Bericht für einen festgelegten Zeitrahmen erstellen - [Einstellungen](Einstellungen.md) - Einstellungen der Anwendung ändern +- [Allgemeines](Allgemeines.md) - Allgemeine Informationen zur Anwendung diff --git a/src/__init__.py b/src/__init__.py index 520de58..01fe4aa 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -9,7 +9,7 @@ __version__ = "0.2.18" __author__ = "Alexander Kirchner" __email__ = "alexander.kirchner@ph-freiburg.de" __license__ = "MIT" -docport = 6543 +docport = 8000 config = Config("config/settings.yaml") @@ -56,7 +56,6 @@ log.add( rotation="1 day", compression="zip", ) -print(config.debug) if config.debug: import sys diff --git a/src/logic/documentation_thread.py b/src/logic/documentation_thread.py index 65b7d7e..f25e320 100644 --- a/src/logic/documentation_thread.py +++ b/src/logic/documentation_thread.py @@ -1,10 +1,10 @@ from PyQt6.QtCore import QThread, pyqtSignal -from src.utils import launch_documentation - +from src.utils.documentation import run_mkdocs class DocumentationThread(QThread): def __init__(self): super().__init__() def run(self): - launch_documentation() + # launch_documentation() + run_mkdocs() diff --git a/src/schemas/book.py b/src/schemas/book.py index 76893c8..6e9a904 100644 --- a/src/schemas/book.py +++ b/src/schemas/book.py @@ -3,14 +3,14 @@ from dataclasses import dataclass @dataclass class Book: - title: str = "" - ppn: int = "" - signature: str = "" - isbn: str = "" - link: str = "" - database_id: int = "" - link: str = "" - loan_from: str = "" - loan_to: str = "" - returned: int = "" - returned_date: str = "" + title: str | None = None + ppn: int | None = None + signature: str | None = None + isbn: str | None = None + link: str | None = None + database_id: int | None = None + link: str | None = None + loan_from: str | None = None + loan_to: str | None = None + returned: int | None = None + returned_date: str | None = None diff --git a/src/ui/main_ui.py b/src/ui/main_ui.py index 6a98abe..8d9bcd3 100644 --- a/src/ui/main_ui.py +++ b/src/ui/main_ui.py @@ -1,3 +1,4 @@ +import os import sys import atexit import datetime @@ -281,9 +282,11 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): def createUser(self): log.info("Creating User") user = CreateUser(fieldname="id", data="") + user.setWindowModality( + QtCore.Qt.WindowModality.ApplicationModal + ) # Block MainUI fom being accessed user.exec() userid = user.userid - print(userid) if userid: log.info(f"User created {userid}") data = self.db.getUserBy("user_id", userid) @@ -319,16 +322,13 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): multi.exec() self.activeUser = multi.userdata else: - # print("User found", user[0]) self.activeUser = user[0] if self.activeUser is not None: log.info(f"User found {self.activeUser}") - # print("User found", self.activeUser) self.setUserData() self.input_file_ident.setFocus() self.mode.setText("Ausleihe") - # print(self.activeUser.__dict__) loans = self.db.getActiveLoans(self.activeUser.id) log.debug("Active Loans", loans) self.btn_show_lentmedia.setText(loans) @@ -416,8 +416,8 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): elif book_id: if isinstance(book_id, list) and len(book_id) > 1: - # print("Multiple Books found") # TODO: implement book selection dialog + raise NotImplementedError("Multiple books found") return else: if isinstance(book_id, int): @@ -456,8 +456,16 @@ class MainUI(QtWidgets.QMainWindow, Ui_MainWindow): if newentries: for entry in newentries: book = self.db.getMedia(entry) - self.loanMedia(user_id, [entry], book) + log.debug( + "Inserting duplicated book {} with id {} to user {}".format( + book, entry, user_id + ) + ) + self.loanMedia(user_id, [entry]) log.info("inserted duplicated book into database") + else: + log.info("No new entry created") + self.input_file_ident.setEnabled(True) return else: # print("Book not loaned, loaning now") @@ -559,7 +567,13 @@ def exit_handler(): # set icon dialog.setWindowIcon(Icon("backup").icon) dialog.setWindowTitle("Backup") - dialog.setText("Backup konnte nicht erstellt werden") + errormsg = "Backup konnte nicht erstellt werden\nGrund: {}" + files = os.listdir(config.database.backupLocation) + if ".backup" in files: + errormsg = errormsg.format("Normaler speicherort nicht gefunden") + else: + errormsg = errormsg.format("Backuppfad nicht gefunden") + dialog.setText(errormsg) dialog.exec() log.info("Exiting, backup:", state) diff --git a/src/ui/newentry.py b/src/ui/newentry.py index 92997e1..31cea02 100644 --- a/src/ui/newentry.py +++ b/src/ui/newentry.py @@ -36,16 +36,27 @@ class NewEntry(QtWidgets.QDialog, Ui_Dialog): self.tableWidget.setItem( row, i, QtWidgets.QTableWidgetItem(self.tableWidget.item(row - 1, i)) ) - if i == 2 and "+" in self.tableWidget.item(row, i).text(): - entry = self.tableWidget.item(row, i).text().split("+")[1] - entry = str(int(entry) + 1) - self.tableWidget.setItem( - row, - i, - QtWidgets.QTableWidgetItem( - self.tableWidget.item(row, i).text().split("+")[0] + "+" + entry - ), - ) + if i == 2: + if "+" in self.tableWidget.item(row, i).text(): + entry = self.tableWidget.item(row, i).text().split("+")[1] + entry = str(int(entry) + 1) + self.tableWidget.setItem( + row, + i, + QtWidgets.QTableWidgetItem( + self.tableWidget.item(row, i).text().split("+")[0] + + "+" + + entry + ), + ) + else: + self.tableWidget.setItem( + row, + i, + QtWidgets.QTableWidgetItem( + self.tableWidget.item(row, i).text() + "+1" + ), + ) def populateTable(self): for title in self.titles: @@ -61,7 +72,11 @@ class NewEntry(QtWidgets.QDialog, Ui_Dialog): 0, 2, QtWidgets.QTableWidgetItem(entry.signature) ) self.tableWidget.setItem(0, 3, QtWidgets.QTableWidgetItem(entry.ppn)) - + # set row to be not editable + for i in range(4): + self.tableWidget.item(0, i).setFlags( + QtCore.Qt.ItemFlag.ItemIsEnabled + ) def insertEntry(self): # get all rows, convert them to Book and insert into database for row in range(self.tableWidget.rowCount()):