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