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 0000000..a1976a8 Binary files /dev/null and b/components/__pycache__/dataprocess.cpython-38.pyc differ diff --git a/components/__pycache__/format.cpython-38.pyc b/components/__pycache__/format.cpython-38.pyc new file mode 100644 index 0000000..c19d02b Binary files /dev/null and b/components/__pycache__/format.cpython-38.pyc differ diff --git a/components/__pycache__/processing.cpython-38.pyc b/components/__pycache__/processing.cpython-38.pyc new file mode 100644 index 0000000..2c3e1dc Binary files /dev/null and b/components/__pycache__/processing.cpython-38.pyc differ diff --git a/components/dataprocess.py b/components/dataprocess.py new file mode 100644 index 0000000..9bc6c9b --- /dev/null +++ b/components/dataprocess.py @@ -0,0 +1,38 @@ +import time as TM + +def plr(text): + text1 = text.replace('ę', 'e') + text2 = text1.replace('ó', 'o') + text3 = text2.replace('ą', 'a') + text4 = text3.replace('ś', 's') + text5 = text4.replace('ł', 'l') + text6 = text5.replace('ż', 'z') + text7 = text6.replace('ź', 'z') + text8 = text7.replace('ć', 'c') + text9 = text8.replace('ń', 'n') + text10 = text9.replace('Ę', 'E') + text11 = text10.replace('Ó', 'O') + text12 = text11.replace('Ą', 'A') + text13 = text12.replace('Ś', 'S') + text14 = text13.replace('Ł', 'L') + text15 = text14.replace('Ż', 'Z') + text16 = text15.replace('Ź', 'Z') + text17 = text16.replace('Ć', 'C') + text = text17.replace('Ń', 'N') + return text + +def ctc(Klasa): + czas = TM.localtime() + miesiac = czas[1] + if miesiac >= 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