4.0 Beta (Build 20253)
This commit is contained in:
@@ -152,3 +152,7 @@
|
||||
4.0 Beta (Build 20252)
|
||||
- Kontynuacja praca na sekcją strony 'Dokumentacja'
|
||||
- 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>
|
||||
|
||||
<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">
|
||||
|
||||
@@ -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>
|
||||
|
||||
189
generator.pyw
189
generator.pyw
@@ -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 = []
|
||||
@@ -1215,98 +1306,6 @@ 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])
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
||||
dataProcess = dataProcess()
|
||||
|
||||
|
||||
@@ -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('')
|
||||
|
||||
Reference in New Issue
Block a user