4.0 Beta (Build 20253)
This commit is contained in:
@@ -151,4 +151,8 @@
|
|||||||
|
|
||||||
4.0 Beta (Build 20252)
|
4.0 Beta (Build 20252)
|
||||||
- Kontynuacja praca na sekcją strony 'Dokumentacja'
|
- 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
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<p id = "about-program-main-text">
|
<p id = "about-program-main-text">
|
||||||
Wersja 4.0 Beta (Build 20252)
|
Wersja 4.0 Beta (Build 20253)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p id = "about-program-text-centered">
|
<p id = "about-program-text-centered">
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
<body>
|
<body>
|
||||||
<button class="accordion"><b>generator.pyw - WPROWADZENIE</b></button>
|
<button class="accordion"><b>generator.pyw - WPROWADZENIE</b></button>
|
||||||
<div class="panel">
|
<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>
|
</div>
|
||||||
|
|
||||||
<button class="accordion"><b>generator.pyw - Import bibliotek</b></button>
|
<button class="accordion"><b>generator.pyw - Import bibliotek</b></button>
|
||||||
@@ -242,7 +242,7 @@
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</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">
|
<div class="panel">
|
||||||
<p>
|
<p>
|
||||||
Klasa <code>FMT</code> odpowiedzialna jest za zarządzanie plikami formatu (.fmt)<br>
|
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>
|
<button class="accordion"><b>generator.pyw - Przetwarzanie plików</b></button>
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
<p>
|
<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>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button class="accordion"><b>Edycja ustawień ogólnych</b></button>
|
<button class="accordion"><b>generator.pyw - GUI</b></button>
|
||||||
<div class="panel">
|
<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>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|||||||
189
generator.pyw
189
generator.pyw
@@ -41,7 +41,7 @@ class VAR:
|
|||||||
programName = 'Generator CSV'
|
programName = 'Generator CSV'
|
||||||
programVersion = '4.0'
|
programVersion = '4.0'
|
||||||
programVersionStage = 'Beta'
|
programVersionStage = 'Beta'
|
||||||
programVersionBuild = '20252'
|
programVersionBuild = '20253'
|
||||||
programCustomer = 'ZSP Sobolew'
|
programCustomer = 'ZSP Sobolew'
|
||||||
programAuthors = ['Mateusz Skoczek']
|
programAuthors = ['Mateusz Skoczek']
|
||||||
programToW = ['styczeń', '2019', 'wrzesień', '2020']
|
programToW = ['styczeń', '2019', 'wrzesień', '2020']
|
||||||
@@ -1008,6 +1008,97 @@ FMT = FMT()
|
|||||||
# ---------------------------------- # Przetwarzanie plików # ----------------------------------- #
|
# ---------------------------------- # Przetwarzanie plików # ----------------------------------- #
|
||||||
|
|
||||||
class dataProcess:
|
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
|
# Funkcje sprawdzające istnienie
|
||||||
def __checkIfAtLeastOneInputFileIsFilled(self, files):
|
def __checkIfAtLeastOneInputFileIsFilled(self, files):
|
||||||
filledFiles = []
|
filledFiles = []
|
||||||
@@ -1212,98 +1303,6 @@ class dataProcess:
|
|||||||
if CFG.R('ifHeadlineInOffice'):
|
if CFG.R('ifHeadlineInOffice'):
|
||||||
office.write(CFG.R('headlineInOffice') + '\n')
|
office.write(CFG.R('headlineInOffice') + '\n')
|
||||||
office.write('\n'.join(officeData))
|
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]:
|
if not output[6]:
|
||||||
MSG('E0013', False)
|
MSG('E0013', False)
|
||||||
else:
|
else:
|
||||||
if not output[7]:
|
if not (output[7])[0]:
|
||||||
MSG('E0014', False)
|
MSG('E0014', False)
|
||||||
else:
|
else:
|
||||||
MSG('I0001', False)
|
MSG('I0001', False, 'Przetworzono dane %i osób' % (output[7])[1])
|
||||||
self.GIF1SLocalizationEntryVar.set('')
|
self.GIF1SLocalizationEntryVar.set('')
|
||||||
self.GIF1SFormatComboboxVar.set('')
|
self.GIF1SFormatComboboxVar.set('')
|
||||||
self.GIF2SLocalizationEntryVar.set('')
|
self.GIF2SLocalizationEntryVar.set('')
|
||||||
|
|||||||
Reference in New Issue
Block a user