4.0 Alpha (Build 19349.1)
This commit is contained in:
3
.idea/workspace.xml
generated
3
.idea/workspace.xml
generated
@@ -79,6 +79,7 @@
|
||||
<workItem from="1575210569237" duration="2431000" />
|
||||
<workItem from="1575490006287" duration="48000" />
|
||||
<workItem from="1576401956701" duration="4897000" />
|
||||
<workItem from="1576407152914" duration="5325000" />
|
||||
</task>
|
||||
<servers />
|
||||
</component>
|
||||
@@ -101,6 +102,6 @@
|
||||
<component name="com.intellij.coverage.CoverageDataManagerImpl">
|
||||
<SUITE FILE_PATH="coverage/GeneratorCSV_3_1$generator.coverage" NAME="generator Coverage Results" MODIFIED="1575142941417" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
|
||||
<SUITE FILE_PATH="coverage/Wersja_Under_Construction$generator.coverage" NAME="generator Coverage Results" MODIFIED="1575214162661" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
|
||||
<SUITE FILE_PATH="coverage/Generator_CSV$generator.coverage" NAME="generator Coverage Results" MODIFIED="1576406807406" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
|
||||
<SUITE FILE_PATH="coverage/Generator_CSV$generator.coverage" NAME="generator Coverage Results" MODIFIED="1576412477883" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
|
||||
</component>
|
||||
</project>
|
||||
@@ -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
|
||||
|
||||
BIN
components/__pycache__/dataprocess.cpython-38.pyc
Normal file
BIN
components/__pycache__/dataprocess.cpython-38.pyc
Normal file
Binary file not shown.
BIN
components/__pycache__/format.cpython-38.pyc
Normal file
BIN
components/__pycache__/format.cpython-38.pyc
Normal file
Binary file not shown.
BIN
components/__pycache__/processing.cpython-38.pyc
Normal file
BIN
components/__pycache__/processing.cpython-38.pyc
Normal file
Binary file not shown.
38
components/dataprocess.py
Normal file
38
components/dataprocess.py
Normal file
@@ -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
|
||||
141
components/format.py
Normal file
141
components/format.py
Normal file
@@ -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:
|
||||
# <Klasa> <Nazwisko>, <Imie> <X> <Login do librusa> <X>
|
||||
# <Q>
|
||||
|
||||
# Przykład:
|
||||
# 1a BS Nowak, Adam <NieznaczaceDane> 1234567u <NieznaczaceDane>
|
||||
#
|
||||
|
||||
|
||||
# Format danych dla nauczycieli:
|
||||
# <Nazwisko>, <Imie> <X> <Login do Librusa> <X>
|
||||
# <Q>
|
||||
|
||||
# Przykład:
|
||||
# Nowak, Adam <NieznaczaceDane> 1234567 <NieznaczaceDane>
|
||||
#
|
||||
|
||||
|
||||
|
||||
|
||||
# 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
|
||||
@@ -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,6 +379,72 @@ def main():
|
||||
|
||||
# Przycisk START
|
||||
def PathPreprocess():
|
||||
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)
|
||||
|
||||
56
components/processing.py
Normal file
56
components/processing.py
Normal file
@@ -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)
|
||||
23
generator.py
23
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")
|
||||
Reference in New Issue
Block a user