4.0 Beta (Build 20253)

This commit is contained in:
2020-09-09 00:01:02 +02:00
Unverified
parent a27a5f05be
commit fd82416b85
4 changed files with 170 additions and 102 deletions

View File

@@ -151,4 +151,8 @@
4.0 Beta (Build 20252)
- Kontynuacja praca na sekcją strony 'Dokumentacja'
- Przeprojektowanie sprawdzania katalogu programu w appdata
- Przeprojektowanie sprawdzania katalogu programu w appdata
4.0 Beta (Build 20253)
- Ukończenie sekcji strony 'Dokumentacja'
- Dodano informację o ilości osób, których dane zostały przetworzone

View File

@@ -24,7 +24,7 @@
</h1>
<p id = "about-program-main-text">
Wersja 4.0 Beta (Build 20252)
Wersja 4.0 Beta (Build 20253)
</p>
<p id = "about-program-text-centered">

View File

@@ -9,7 +9,7 @@
<body>
<button class="accordion"><b>generator.pyw - WPROWADZENIE</b></button>
<div class="panel">
<p>Aby móc uruchomić aplikację w wersji developerskiej należy pobrać Pythona oraz wymagane biblioteki (wymienione w sekcji 'generator.pyw - Import bibliotek')</p>
<p>Aby móc uruchomić aplikację w wersji developerskiej należy pobrać Pythona (wersja zalecana: 3.8.5) oraz wymagane biblioteki (wymienione w sekcji 'generator.pyw - Import bibliotek')</p>
</div>
<button class="accordion"><b>generator.pyw - Import bibliotek</b></button>
@@ -242,7 +242,7 @@
</p>
</div>
<button class="accordion"><b>Zarządzanie plikami formatu</b></button>
<button class="accordion"><b>generator.pyw - Zarządzanie plikami formatu</b></button>
<div class="panel">
<p>
Klasa <code>FMT</code> odpowiedzialna jest za zarządzanie plikami formatu (.fmt)<br>
@@ -294,13 +294,78 @@
<button class="accordion"><b>generator.pyw - Przetwarzanie plików</b></button>
<div class="panel">
<p>
Klasa <code>dataProcess</code> odpowiedzialna za przetwarzanie plików wejściowych i generowanie plików wyjściowych<br>
<br>
<br>
<b>Główna funkcja klasy</b> (<code>start</code>)<br>
<br>
Funkcja ta odpowiedzialna za zainicjowanie kolejnych funkcji w odpowiedniej kolejności oraz zwrócenie informacji o błędach lub pomyślnym wykonaniu polecenia<br>
1. Inicjacja funkcji <code>__checkIfAtLeastOneInputFileIsFilled</code> w celu sprawdzenia czy przynajmniej jedno pole plików wejściowych zostało wypełnione<br>
2. Inicjacja funkcji <code>__checkIfInputFilesIsReadable</code> w celu sprawdzenia czy pliki wejściowe, do których ścieżki zostały podane, są możliwe do odczytania<br>
3. Inicjacja funkcji <code>__checkIfInputFilesFormatPresetsExist</code> w celu sprawdzenia czy format presety, które zostały wybrane, istnieją<br>
4. Inicjacja funkcji <code>__getData</code> w celu zebrania danych z plików wejściowych<br>
5. Dla każdego zbioru danych - <code>for x in data</code> (dla każdej osoby), inicjacja funkcji <code>__checkLogin</code>, <code>__checkFname</code>, <code>__checkLname</code>, oraz dla uczniów <code>__checkSchool</code>, <code>__checkClass</code>, w celu sprawdzenia poprawności danych<br>
6. Inicjacja funkcji <code>__processData</code> w celu przetworzenia danych w linie gotowe do zapisania w plikach wyjściowych<br>
7. Inicjacja funkcji <code>__checkIfCreatingOutputFilesIsPossible</code> w celu sprawdzenia czy możliwe jest utworzenie plików wyjściowych<br>
8. Inicjacja funkcji <code>__saveData</code> w celu zapisania danych w plikach wyjściowych<br>
Funkcja zwraca listę zawierającą zmienne boolean potwierdzające w którym momencie zakończyło się wykonywanie funkcji (z powodu błędu lub pomyślnego ukończenia operacji)<br>
<br>
<br>
<b>Funkcje sprawdzające istnienie</b>
<br>
<code>__checkIfAtLeastOneInputFileIsFilled</code> - sprawdza czy przynajmniej jedno pole plików wejściowych zostało wypełnione oraz zwraca dane z wypełnionych pól<br>
<code>__checkIfInputFilesIsReadable</code> - sprawdza czy pliki wejściowe są możliwe do odczytania<br>
<code>__checkIfInputFilesFormatPresetsExist</code> - sprawdza czy wybrane format presety istnieją<br>
<code>__checkIfCreatingOutputFilesIsPossible</code> - sprawdza czy utworzenie plików wyjściowych jest możliwe<br>
<br>
<br>
<b>Funkcje sprawdzające poprawność</b>
<br>
Funkcje te sprawdzają poprawność określonych typów danych.
<br>
<br>
<b>Wyodrębnienie danych z plików</b> (<code>__getData</code>)<br>
<br>
Funkcja odpowiedzialna jest za wyodrębnienie danych z pliku (<code>path</code>) na podstawie określonego format presetu (<code>format</code>)
Dla każdego zbioru ścieżek plików wejściowych i format presetów (<code>for x in input</code>):<br>
1. Pobranie danych z pliku formatu (za pomocą funkcji <code>FMT.R</code>)<br>
2. Pobranie zawartości z pliku wyjściowego i podzielenie ich na zbiory danych pojedyńczych osób (<code>.split(personseparator)</code>)<br>
Dla każdego zbioru danych pojedyńczych osób (<code>for x in file</code>):<br>
3. Dzielenie zbioru danych na linie (<code>x.split(linesSeparator)</code>)<br>
4. Dla każdej linii: dzielenie danych na pojedyńcze segmenty separatorami z listy <code>dataSeparators</code><br>
5. Wyodrębnienie wymaganych danych ze zbioru<br>
6. Dodanie danych pojedyńczej osoby do listy <code>data</code><br>
<br>
<br>
<b>Przetworzenie danych</b> (<code>__processData</code>)<br>
<br>
Funkcja odpowiedzialna jest za przetworzenie danych w linie gotowe do zapisania w plikach wyjściowych<br>
Funkcja zwraca listę <code>[mailData, officeData]</code><br>
<br>
<br>
<b>Zapisanie danych</b> (<code>__saveData</code>)<br>
<br>
Funkcja odpowiedzialna jest za zapisanie danych w plikach wyjściowych dla poczty i dla office
</p>
</div>
<button class="accordion"><b>Edycja ustawień ogólnych</b></button>
<button class="accordion"><b>generator.pyw - GUI</b></button>
<div class="panel">
<p>
Klasa <code>GUI</code> odpowiada za interfejs programu<br>
<br>
<br>
<b>1. Główna funkcja programu</b><br>
<br>
- Stworzenie okna<br>
- Inicjacja styli kontrolek<br>
- Kontrolki<br>
<br>
<br>
<b>Akcje przycisków</b><br>
<br>
Funkcje inicjowane przez naciśnięcie przycisków
</p>
</div>
<script>

View File

@@ -41,7 +41,7 @@ class VAR:
programName = 'Generator CSV'
programVersion = '4.0'
programVersionStage = 'Beta'
programVersionBuild = '20252'
programVersionBuild = '20253'
programCustomer = 'ZSP Sobolew'
programAuthors = ['Mateusz Skoczek']
programToW = ['styczeń', '2019', 'wrzesień', '2020']
@@ -1008,6 +1008,97 @@ FMT = FMT()
# ---------------------------------- # Przetwarzanie plików # ----------------------------------- #
class dataProcess:
def start(self, files):
checkingOutput = []
testOutput = self.__checkIfAtLeastOneInputFileIsFilled(files[:-1])
checkingOutput.append(testOutput[0])
if not testOutput[0]:
return checkingOutput
filledFiles = testOutput[1]
testOutput = self.__checkIfInputFilesIsReadable(files[:-1], filledFiles)
checkingOutput.append(testOutput)
if not testOutput:
return checkingOutput
testOutput = self.__checkIfInputFilesFormatPresetsExist(files[:-1], filledFiles)
checkingOutput.append(testOutput)
if not testOutput:
return checkingOutput
input = []
for x in filledFiles:
input.append(files[x])
output = files[-1]
try:
data = self.__getData(input)
except:
checkingOutput.append(False)
return checkingOutput
else:
checkingOutput.append(True)
for x in data:
student = x[0]
login = x[1]
loginCheckingOutput = self.__checkLogin(login, student)
if not loginCheckingOutput[0]:
loginCheckingOutput[1] = loginCheckingOutput[1] + str(x[1:])
checkingOutput.append(loginCheckingOutput)
return checkingOutput
fname = x[2]
fnameCheckingOutput = self.__checkFname(fname)
if not fnameCheckingOutput[0]:
fnameCheckingOutput[1] = fnameCheckingOutput[1] + str(x[1:])
checkingOutput.append(fnameCheckingOutput)
return checkingOutput
lname = x[3]
lnameCheckingOutput = self.__checkLname(lname)
if not lnameCheckingOutput[0]:
lnameCheckingOutput[1] = lnameCheckingOutput[1] + str(x[1:])
checkingOutput.append(lnameCheckingOutput)
return checkingOutput
if student:
school = x[4]
schoolCheckingOutput = self.__checkSchool(school)
if not schoolCheckingOutput[0]:
schoolCheckingOutput[1] = schoolCheckingOutput[1] + str(x[1:])
checkingOutput.append(schoolCheckingOutput)
return checkingOutput
classX = x[5]
classCheckingOutput = self.__checkClass(classX, school)
if not classCheckingOutput[0]:
classCheckingOutput[1] = classCheckingOutput[1] + str(x[1:])
checkingOutput.append(classCheckingOutput)
return checkingOutput
checkingOutput.append([True])
amount = len(data)
try:
data = self.__processData(data)
except:
checkingOutput.append(False)
return checkingOutput
else:
checkingOutput.append(True)
testOutput = self.__checkIfCreatingOutputFilesIsPossible(files[-1])
checkingOutput.append(testOutput)
if not testOutput:
return checkingOutput
try:
self.__saveData(output, data)
except:
checkingOutput.append([False])
return checkingOutput
else:
checkingOutput.append([True, amount])
return checkingOutput
# Funkcje sprawdzające istnienie
def __checkIfAtLeastOneInputFileIsFilled(self, files):
filledFiles = []
@@ -1212,98 +1303,6 @@ class dataProcess:
if CFG.R('ifHeadlineInOffice'):
office.write(CFG.R('headlineInOffice') + '\n')
office.write('\n'.join(officeData))
def start(self, files):
checkingOutput = []
testOutput = self.__checkIfAtLeastOneInputFileIsFilled(files[:-1])
checkingOutput.append(testOutput[0])
if not testOutput[0]:
return checkingOutput
filledFiles = testOutput[1]
testOutput = self.__checkIfInputFilesIsReadable(files[:-1], filledFiles)
checkingOutput.append(testOutput)
if not testOutput:
return checkingOutput
testOutput = self.__checkIfInputFilesFormatPresetsExist(files[:-1], filledFiles)
checkingOutput.append(testOutput)
if not testOutput:
return checkingOutput
input = []
for x in filledFiles:
input.append(files[x])
output = files[-1]
try:
data = self.__getData(input)
except:
checkingOutput.append(False)
return checkingOutput
else:
checkingOutput.append(True)
for x in data:
student = x[0]
login = x[1]
loginCheckingOutput = self.__checkLogin(login, student)
if not loginCheckingOutput[0]:
loginCheckingOutput[1] = loginCheckingOutput[1] + str(x[1:])
checkingOutput.append(loginCheckingOutput)
return checkingOutput
fname = x[2]
fnameCheckingOutput = self.__checkFname(fname)
if not fnameCheckingOutput[0]:
fnameCheckingOutput[1] = fnameCheckingOutput[1] + str(x[1:])
checkingOutput.append(fnameCheckingOutput)
return checkingOutput
lname = x[3]
lnameCheckingOutput = self.__checkLname(lname)
if not lnameCheckingOutput[0]:
lnameCheckingOutput[1] = lnameCheckingOutput[1] + str(x[1:])
checkingOutput.append(lnameCheckingOutput)
return checkingOutput
if student:
school = x[4]
schoolCheckingOutput = self.__checkSchool(school)
if not schoolCheckingOutput[0]:
schoolCheckingOutput[1] = schoolCheckingOutput[1] + str(x[1:])
checkingOutput.append(schoolCheckingOutput)
return checkingOutput
classX = x[5]
classCheckingOutput = self.__checkClass(classX, school)
if not classCheckingOutput[0]:
classCheckingOutput[1] = classCheckingOutput[1] + str(x[1:])
checkingOutput.append(classCheckingOutput)
return checkingOutput
checkingOutput.append([True])
try:
data = self.__processData(data)
except:
checkingOutput.append(False)
return checkingOutput
else:
checkingOutput.append(True)
testOutput = self.__checkIfCreatingOutputFilesIsPossible(files[-1])
checkingOutput.append(testOutput)
if not testOutput:
return checkingOutput
try:
self.__saveData(output, data)
except:
checkingOutput.append(False)
return checkingOutput
else:
checkingOutput.append(True)
return checkingOutput
@@ -2962,10 +2961,10 @@ class mainWindow:
if not output[6]:
MSG('E0013', False)
else:
if not output[7]:
if not (output[7])[0]:
MSG('E0014', False)
else:
MSG('I0001', False)
MSG('I0001', False, 'Przetworzono dane %i osób' % (output[7])[1])
self.GIF1SLocalizationEntryVar.set('')
self.GIF1SFormatComboboxVar.set('')
self.GIF2SLocalizationEntryVar.set('')