From 73d47118199cafcc50e6385a709d1f23d49c31c3 Mon Sep 17 00:00:00 2001 From: Mateusz Skoczek Date: Thu, 6 Aug 2020 18:19:38 +0200 Subject: [PATCH] 4.0 Alpha (Build 19349.1) --- .idea/workspace.xml | 3 +- changelog-UC.txt | 5 + .../__pycache__/dataprocess.cpython-38.pyc | Bin 0 -> 1231 bytes components/__pycache__/format.cpython-38.pyc | Bin 0 -> 2031 bytes .../__pycache__/processing.cpython-38.pyc | Bin 0 -> 1656 bytes components/dataprocess.py | 38 +++++ components/format.py | 141 ++++++++++++++++++ components/main.py | 87 ++++++++++- components/processing.py | 56 +++++++ generator.py | 25 +++- 10 files changed, 345 insertions(+), 10 deletions(-) create mode 100644 components/__pycache__/dataprocess.cpython-38.pyc create mode 100644 components/__pycache__/format.cpython-38.pyc create mode 100644 components/__pycache__/processing.cpython-38.pyc create mode 100644 components/dataprocess.py create mode 100644 components/format.py create mode 100644 components/processing.py diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 2946b7e..f5214e2 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -79,6 +79,7 @@ + @@ -101,6 +102,6 @@ - + \ No newline at end of file diff --git a/changelog-UC.txt b/changelog-UC.txt index 5246ea5..74da955 100644 --- a/changelog-UC.txt +++ b/changelog-UC.txt @@ -19,3 +19,8 @@ 4.0 Alpha (Build 19349) - Ukończenie okna ustawień + +4.0 Alpha (Build 19349.1) +- Doprowadzenie programu do podstawowego stanu użyteczności (występuje błąd: nie można dodać drugiej ścieżki poprzez wybór) +- Utworzenie systemu crashlogów +- Zastosowanie systemu crashlogów dla głównego modułu diff --git a/components/__pycache__/dataprocess.cpython-38.pyc b/components/__pycache__/dataprocess.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a1976a87b367aae47b82cf8a57464b75ebf7874c GIT binary patch literal 1231 zcma)*Id2p(6vyp3c4p5U@XK>2@70gC9o}QaG6!W1yKN3b9RISuCWosUEzX9*%-Je zir{g!3tSQ<@C2I#mqi&o#iqd(Q32Q447e();90gCToX0$9NPmP5hLKeIgg4_@IE$= z_?Q?2?`H?V*cVRV;PR?EuB|tchTDoZKTDeE*b7PhoPNBMG}ZJ}(n!;HN&A|<=Cbut z(m)5EOB(CgYe_F}=V@O_x}swky`bm4m9(kpiKN#xeUsGF^d* z{8IByD@eM%Bo5;&Z81OdF)s+y^l)!Yn!SjdNSYpkA++)zA6FIsPc^#;s3dtcZvZm# zfqo>ak{O*Ls*0J>vH1b`CVVrlXkxSuFEa${eTF=vsB63e%&_qu)C1nrHUH4NTCHRM`+{O7}xf$b9O`U zYRyaFy%K*Q;VsYn1Nax`6{(VWMB)V@U}o)DO-VM|IcLXbX1%6%J<1q zlxx7t@Udx~rFWg)=ywvaNX0QAoWK!zZyIVLrWi-igV^9GM{+~#toCFoD3yjL+i>_#&?0)%tADVx;85A|H=N zJ_OZcwfq+>_qnbbzExb6K3_pU+x<&Ve~dp}77hz8R^MV_lBmd!w<~h%t_DxTu7;Wh z)ZlB_(@@v&wT6a<2O63hS{m9K0u7;tjs~S6(hzGn)X>$Clx%IZ{6Je#r`3qH(FkH~ zDKDt|+T3ddsEsIAbO`QfbGPN8%EC_v2W?+YhRI>r3Io4lM@chmbt`U&m^8dr z_f)8B1oqF{ByQcP-VOW>)%eD*ZU%v0{Zxey{AS!;?x?V?y!Nj@A69Ssfv>zcRLkqz z_p7zA-66k0998#1)%N1GPFLr*JIXu6tx-dnnD_M74 z=0UB|iF4HBB)Fm(_1>dRDu^6wL^L8d%8Y1BL=`xOSPlth5WxyeL?WcIU)VR1F7nhW zXSb*LY82m8R-jW;y~O*MS(I3;k|>!P%4(878Gw3~1y^VwUZb79GR&{+C5Mfu8M0l( zG!WpzB&Dg|r2V;M3{r6TEE!JqToS-+rX;ARs7pAB+%O5bpW_tN>tv#?lPDP)HZO-Z zK7_W}ZupEf;tGlZC>{(ort{gupg744)D7CCpysI^peVA|o+psp+5}9kapUt?;g)7y z;If8y46tODv&w2X$iS6gP)$O+rQP+Ud#{%G!G+a4W6M@pZv<}_o6 z{#-G+?fA`be@E>|Y^nM}oyN*o|IJ{Q5fDPq~oshc494~?Gr zr3maV1e!Eb%!i=NRFW@?u7O7vjRx8YbU14o6&7pJo}+PrZc)s!?*HeV!QkuJqu=Q4 z&=>o0F3>xqcVi>9jsQe#rgpYksgtdC>ZazA1d5y5sl#7&t4H^B?4;s^EcOc{pCjBC z#vi*RelClDdEB$8<`Yr*AIEq(k-1#fW1oDM$ZN}rS*Dm?iuu?7n}_8;BucKj%3AIi zoxAU~4*Xk6g(~a*tZNjrG`n(bd!3FSU}=p0UwJgU@*S1<@nNVEo@7=Sg}dIM6W(Q; zS6IBkf=Q&_Vev%cj*UEgM88H%c|lXilsS;Zw@Ka`HY~ynz4I_{xYW=tX(u6X%#1WS znpZTjJ|OFoqwQLVel4oV8eWt}cI+`A8Ki8CxbL?^JZSkJjx!i0y(`_K>$tX?{|`@$ Bv}FJQ literal 0 HcmV?d00001 diff --git a/components/__pycache__/processing.cpython-38.pyc b/components/__pycache__/processing.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2c3e1dcaf56523856fe32febbe44aace32ba5c0b GIT binary patch literal 1656 zcmb_dPj4GV6rb5Y_ImAgoWvrHfYt{NNoA!LYK2rGD2fA$0!e9As74Mj>`cto>z&Q+ zrmk1Bw{RvWE?n#*XAXP-lrOO-Bu@DNaL5JTtZj%$RdHZO``+*UnK$n@J6=C=92>#- z`Sm{z->)F_n=-Br4U7ly#CJh3#ITPDF0@AULL0;^bcvLi#`L~MEM_qC6p;$UkI`o7 z0#>5^lUpDULLO1~8EvI>AkI(SR0OmYisAVD2S4!mhpyUgF`59NCA1As{5?eaDAVB4 zCF-IxeE4f-NQ2>Zz)=&BwvI9rv<|u?ONCu#Mh5L<74Vzuuvpv;mL zR+e^wD-w`e1^)7JS6YhJx2md@pb3`d6lYbaV}Yjz9!-{}c%n~Hfh#k-hGcaOvC10C z9O*EqENftcugEG-F<9Wq>hmb{QDj+jt!#LtvK`PS=sM&tNo``t`V?a%bwEoB9oJ^O zUdk6b2fnxe8{ad0eD^Bj`8mFV=l{fU=@r~CYe2LiF4mz$Il55z61Q@^b)f@Hod>>%#n-~;qpi@t#O+Ib zKQ-F-I-L^>;_VYR<>#mE^j3Q@9;Mt($DxQr;d=>fJrsUCpy};)Kp}bTdfZ>6w%bMW zwOsoSA5zcXa^vS|^^Q0?@?5Tr9FKBrZ`O13lP*g_qPvMp^w5uT(-$Ki)oMXCq92q{TO2PH#1{mX_odEl= 9: + rokpodst = czas[0] + else: + rokpodst = czas[0] - 1 + nrklasy = int(Klasa[0]) + literaklasy = Klasa[1] + szkola = Klasa.split(' ')[1] + if szkola == 'BS': + znacznik = str((4 - nrklasy) + rokpodst) + szkola + else: + znacznik = str((5 - nrklasy) + rokpodst) + literaklasy + return znacznik \ No newline at end of file diff --git a/components/format.py b/components/format.py new file mode 100644 index 0000000..69472dc --- /dev/null +++ b/components/format.py @@ -0,0 +1,141 @@ +# Oznaczenia zmiennych: +# K - Klasa +# N - Nazwisko +# I - Imie +# L - Login do librusa + + + + + +import codecs as cd + +def SprawdzKlasa(K): + if len(K.split(' ')) != 2: # Wywołuje błąd jeżeli napis nie dzieli się w pożądanym formacie + blad = int('x') # + + for x in range(0,10): # + if K[1:].find(str(x)) != -1: # Wywołuje bląd jeżeli w nazwie klasy (poza numerem klasy) znajduje się liczba + blad = int('x') # + + numery_niedozwolone = [0,9,8,7,6,5,4] # Określa numery klas które nie istnieją + + for x in numery_niedozwolone: # + if K[0] == str(x): # Wywołuje błąd jeżeli numer klasy jest równy numerowi niedozwolonemu + blad = int('x') # + + szkoly = ['BS', 'LO'] # Określa istniejące szkoly + + if K.split(' ')[1] not in szkoly: # Wywołuje błąd jeżeli szkola nie należy do szkół istniejących + blad = int('x') # + + oddzialy = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'w', 'y', 'z'] # Określa istniejące oddzialy + + if K[1] not in oddzialy: # Wywołuje błąd jeżeli oddział nie należy do oddziałów istniejących + blad = int('x') # + + +def SprawdzNazwisko(N): + for a in N: + for x in range(0,10): # + if a.find(str(x)) != -1: # Wywoluje blad jeżeli nazwisko zawiera liczbę + blad = int('x') # + + +def SprawdzImie(I): + for x in range(0,10): # + if I.find(str(x)) != -1: # Wywoluje blad jeżeli imie zawiera liczbę + blad = int('x') # + + +def SprawdzLogin(L, CzyUczen): + if CzyUczen and L[-1] != 'u': # Wywoluje blad jeżeli login ucznia nie zawiera na końcu 'u' + blad = int('x') # + + if CzyUczen: # + blad = int(L[:-1]) # Wywoluje blad jeżeli login (-'u' dla ucznia) nie jest liczbą + else: # + blad = int(L) # + + + + +def przetworz(dane): + dane = dane.split('\n\n') # dzielenie danych na pojedyńcze osoby + + przetworzone = [] # tworzenie kontenera na przetworzone dane + + for osoba in dane: # + try: # + x = int(osoba[0]) # + except ValueError: # Sprawdza czy osoba jest nauczycielem czy uczniem + CzyUczen = False # + else: # + CzyUczen = True # + + # Dla uczniów + if CzyUczen: + K = osoba.split(', ')[0].split(' ')[:2] + K = K[0] + ' ' + K[1] + N = osoba.split(', ')[0].split(' ')[2:] + I = osoba.split(', ')[1].split(' ')[0] + L = osoba.split(', ')[1].split(' ')[2] + + # Sprawdzenie poprawności + SprawdzKlasa(K) + SprawdzNazwisko(N) + SprawdzImie(I) + SprawdzLogin(L, CzyUczen) + + dane = [K, N, I, L, CzyUczen] + przetworzone.append(dane) + # Dla nauczycieli + else: + N = osoba.split(', ')[0].split(' ') + I = osoba.split(', ')[1].split(' ')[-4] + L = osoba.split(', ')[1].split(' ')[-2] + + # Sprawdzenie poprawnosci + SprawdzNazwisko(N) + SprawdzImie(I) + SprawdzLogin(L, CzyUczen) + + dane = [N, I, L, CzyUczen] + przetworzone.append(dane) + return przetworzone + + + + + + +# Legenda do części dokumentacji poniżej: +# X - Dane nieznaczące +# Q - Pusta linia + + +# Format danych dla uczniów: +# , +# + +# Przykład: +# 1a BS Nowak, Adam 1234567u +# + + +# Format danych dla nauczycieli: +# , +# + +# Przykład: +# Nowak, Adam 1234567 +# + + + + +# Inne: +# - skrypt akceptuje prefix 'ks.', nieuwzględnia go w przetwarzaniu +# - skrypt akceptuje nazwiska holenderskie (typu 'van X', 'van der X' itp.) i uwzględnia je w przetwarzaniu +# - skrypt nie akceptuje nazwisk złożonych (np. Nowak-Kowalska) +# - skrypt wymaga kodowania ANSI diff --git a/components/main.py b/components/main.py index 19ae784..e98f86d 100644 --- a/components/main.py +++ b/components/main.py @@ -30,7 +30,17 @@ Wersja = '4.0 Experimental' E000x01 = "Brak modułu wywołującego okna dialogowe ('dialog.py').\nPrzywróć plik. (E000x01)" E000x02 = ["Brak modułu zarządzającego plikiem konfiguracyjnym ('load_config.py').\nPrzywróć plik. (E000x02)", True] +E001x01 = ["Brak pliku formatu 'format.py'.\nPrzywróć plik. (E001x01)", True] E001x02 = ["Brak pliku instrukcji ('instruction.txt').\nPrzywróć plik. (E001x02)", False] +E003x01 = ["Nie podano lokalizacji plików do importu. (E003x01)", False] +E003x02 = ["Nie podano lokalizacji zapisu wygenerowanych plików. (E003x02)", False] + +E003x111 = ["Plik podany w sciezce 1 nie istnieje (E003x111)", False] +E003x112 = ["Plik podany w sciezce 2 nie istnieje (E003x112)", False] +E003x113 = ["Plik podany w sciezce 3 nie istnieje (E003x113)", False] +E003x114 = ["Plik podany w sciezce 4 nie istnieje (E003x114)", False] + +A001 = "Czy na pewno chcesz rozpocząć generowanie?\nProgram utworzy w podanej lokalizacji pliki 'email.csv' i 'office.csv'.\nJeżeli w podanej lokalizacji istnieją pliki o takich nazwach zostaną one nadpisane." @@ -60,6 +70,15 @@ try: except ModuleNotFoundError: MDdlg.Err(E000x02) +try: + import format as MDfmt +except ModuleNotFoundError: + MDdlg.Err(E000x02) + +try: + import processing as MDprc +except ModuleNotFoundError: + MDdlg.Err(E000x02) # Biblioteki zewnętrzne interfejsu graficznego @@ -360,7 +379,73 @@ def main(): # Przycisk START def PathPreprocess(): - pass + if MDdlg.Ask(A001): + while True: + sciezka1 = Pole1.get() + sciezka1_puste = True + sciezka2 = Pole2.get() + sciezka2_puste = True + sciezka3 = Pole3.get() + sciezka3_puste = True + sciezka4 = Pole3.get() + sciezka4_puste = True + sciezkaExport = PoleExport.get() + sciezkaExport_puste = True + + if sciezka1 != '': + sciezka1_puste = False + if sciezka2 != '': + sciezka2_puste = False + if sciezka3 != '': + sciezka3_puste = False + if sciezka4 != '': + sciezka4_puste = False + if sciezkaExport != '': + sciezkaExport_puste = False + + if sciezka1_puste and sciezka2_puste and sciezka3_puste and sciezka4_puste: + MDdlg.Err(E003x01) + break + if sciezkaExport_puste: + MDdlg.Err(E003x02) + break + KontenerDanych = [] + if not sciezka1_puste: + try: + x = open(sciezka1) + except FileNotFoundError: + MDdlg.Err(E003x111) + else: + with open(sciezka1, 'r') as plik1: + KontenerDanych += MDfmt.przetworz(plik1.read()) + if not sciezka2_puste: + try: + x = open(sciezka2) + except FileNotFoundError: + MDdlg.Err(E003x112) + else: + with open(sciezka2, 'r') as plik2: + KontenerDanych += MDfmt.przetworz(plik2.read()) + if not sciezka3_puste: + try: + x = open(sciezka3) + except FileNotFoundError: + MDdlg.Err(E003x113) + else: + with open(sciezka3, 'r') as plik3: + KontenerDanych += MDfmt.przetworz(plik3.read()) + if not sciezka4_puste: + try: + x = open(sciezka4) + except FileNotFoundError: + MDdlg.Err(E003x114) + else: + with open(sciezka4, 'r') as plik4: + KontenerDanych += MDfmt.przetworz(plik4.read()) + break + MDprc.do(KontenerDanych, sciezkaExport) + else: + pass PrzyciskSTART = TK.Button(MainWindow) PrzyciskSTART.config(text = 'START') diff --git a/components/processing.py b/components/processing.py new file mode 100644 index 0000000..7c9b316 --- /dev/null +++ b/components/processing.py @@ -0,0 +1,56 @@ +import dataprocess as MDdtp +import load_config as MDlcg +import dialog as MDdlg +import codecs as CD + +I002 = ['Operacja zakończona pomyślnie', False] + +def do(KontenerDanych, sciezkaExport): + KontenerEmail = [] + KontenerOffice = [] + for osoba in KontenerDanych: + if osoba[-1]: + Klasa = osoba[0] + Imie = osoba[2] + Inicjaly = Imie[0] + Nazwisko = '' + NazwiskoDoEmaila = '' + for x in osoba[1]: + Nazwisko += x + ' ' + NazwiskoDoEmaila += ('.' + x) + Inicjaly += x[0] + Nazwisko = Nazwisko[:-1] + ZnacznikKlasy = MDdtp.ctc(Klasa) + Login = osoba[3] + Adres = MDdtp.plr(Imie).lower() + MDdtp.plr(NazwiskoDoEmaila).lower() + ZnacznikKlasy + '@losobolew.pl' + Email = Adres + ',' + Login + ':' + MDdtp.plr(Inicjaly) + ',500' + Office = Adres + ',' + Imie + ',' + Nazwisko + ',' + Imie + ' ' + Nazwisko + ',uczeń,' + Klasa + ',,,,,,,,,Rzeczypospolita Polska' + KontenerEmail.append(Email) + KontenerOffice.append(Office) + else: + Imie = osoba[1] + Inicjaly = Imie[0] + Nazwisko = '' + NazwiskoDoEmaila = '' + for x in osoba[0]: + Nazwisko += x + ' ' + NazwiskoDoEmaila += ('.' + x) + Inicjaly += x[0] + Nazwisko = Nazwisko[:-1] + Login = osoba[2] + Adres = MDdtp.plr(Imie).lower() + MDdtp.plr(NazwiskoDoEmaila).lower() + '@losobolew.pl' + Email = Adres + ',' + Login + ':' + MDdtp.plr(Inicjaly) + ',500' + Office = Adres + ',' + Imie + ',' + Nazwisko + ',' + Imie + ' ' + Nazwisko + ',nauczyciel,,,,,,,,,,Rzeczpospolita Polska' + KontenerEmail.append(Email) + KontenerOffice.append(Office) + sciezkaEmail = sciezkaExport + '/email.csv' + sciezkaOffice = sciezkaExport + '/office.csv' + with CD.open(sciezkaEmail, 'w', MDlcg.read()[1]) as plikEmail: + for x in KontenerEmail: + plikEmail.writelines(x + '\n') + plikEmail.close() + with CD.open(sciezkaOffice, 'w', MDlcg.read()[1]) as plikOffice: + for x in KontenerOffice: + plikOffice.writelines(x + '\n') + plikOffice.close() + MDdlg.Inf(I002) \ No newline at end of file diff --git a/generator.py b/generator.py index 911865e..af82ea4 100644 --- a/generator.py +++ b/generator.py @@ -17,9 +17,20 @@ -# ----------------------------------------- # Definicja kodów dialogowych # ------------------------------------------ # +# ------------ # Import bibliotek zewnętrznych i modułów oraz inicjacja funkcji zapisywania crashlogów # ------------- # -E000x00 = "Brak głównego pliku składowego programu ('main.py').\nPrzywróć plik. (E000x00)" +# Funkcja zapisująca crashlogi +def crash(ErrorCode): + import sys as SS + import time as TM + d = TM.localtime() + name = 'crashlogs/crash_' + str(d[2]) + str(d[1]) + str(d[0]) + str(d[3]) + str(d[4]) + str(d[5]) + '.txt' + with open(name, 'w') as crash: + crash.write('Critical error!\n' + ErrorCode) + SS.exit(0) + +# Błędy +E000x00 = "Brak głównego pliku składowego programu ('main.py'). Przywróć plik. (E000x00)" @@ -31,7 +42,7 @@ E000x00 = "Brak głównego pliku składowego programu ('main.py').\nPrzywróć p # ----------------------------------- # Import bibliotek zewnętrznych i modułów # ------------------------------------ # import os as OS -import sys as SS + @@ -43,10 +54,8 @@ import sys as SS # ----------------------------------------- # Uruchomienie głównego modułu # ----------------------------------------- # try: - fck = open("components\main.py") + fck = open("components/main.py") except: - print('Nieoczekiwany wyjatek - nie mozna wygenerowac okna dialogowego bledu\n\nBŁĄD KRYTYCZNY!\n%s') % E000x00 - wait = input('Naciśnij ENTER aby zakończyć') - SS.exit(0) + crash(E000x00) else: - OS.system("components\main.py") + OS.system("components\main.py") \ No newline at end of file