From a27a5f05bebd700f50c7d68aa51fb2ab473f1f30 Mon Sep 17 00:00:00 2001
From: Mateusz Skoczek
Date: Tue, 8 Sep 2020 11:01:14 +0200
Subject: [PATCH] 4.0 Beta (Build 20252)
---
dev-changelog.txt | 6 +-
documentation/about_program.html | 2 +-
documentation/instruction.html | 6 +-
documentation/main.css | 3 +-
documentation/program_documentation.html | 255 +++++-
generator.pyw | 955 ++++++++++++-----------
6 files changed, 724 insertions(+), 503 deletions(-)
diff --git a/dev-changelog.txt b/dev-changelog.txt
index c4b921d..81bd87c 100644
--- a/dev-changelog.txt
+++ b/dev-changelog.txt
@@ -147,4 +147,8 @@
- Przeniesienie pliku 'changelog.txt' do sekcji strony 'O programie'
- Dodanie screenshotów programu do sekcji strony 'Opis'
- Rozpoczęcie prac nad sekcją strony 'Dokumentacja'
-- Lekkie poprawki w kodzie programu
\ No newline at end of file
+- Lekkie poprawki w kodzie programu
+
+4.0 Beta (Build 20252)
+- Kontynuacja praca na sekcją strony 'Dokumentacja'
+- Przeprojektowanie sprawdzania katalogu programu w appdata
\ No newline at end of file
diff --git a/documentation/about_program.html b/documentation/about_program.html
index 780ad5a..39ef8e2 100644
--- a/documentation/about_program.html
+++ b/documentation/about_program.html
@@ -24,7 +24,7 @@
- Wersja 4.0 Beta (Build 20246)
+ Wersja 4.0 Beta (Build 20252)
Jeżeli chcesz aby w pierwszej linii pliku wyjściowego dla office znajdował się nagłowek, zaznacz opcję "Umieść w pliku". Zawartość nagłówka można edytować w polu tekstowym po lewej.
Rozpoczęcie roku szkolnego (DD | MM)
-
W tych polach należy wpisać datę rozpoczęcia roku szkolnego (z reguły). W pierwszym polu (po lewo) należy wpisać dzień, a w drugim (po prawo) miesiąc. Te dane są używane do obliczania roku w znaczniku klasy (przykłądowy znacznik klasy: 2023a).
+
W tych polach należy wpisać datę rozpoczęcia roku szkolnego (z reguły). W pierwszym polu (po lewo) należy wpisać dzień, a w drugim (po prawo) miesiąc. Te dane są używane do obliczania roku w znaczniku klasy (przykłądowy znacznik klasy: 2023a). W przypadku generowania plików na nowy rok szkolny przed jego rozpoczęciem, należy wprowadzić datę dzisiejszą lub wcześniejszą.
Dane o szkołach
W tym polu należy wprowadzić dane każdej szkoły w zespole szkół (po jednej szkole w linijce). Wymagane są trzy "kolumny danych". Są one odzielone znakami " | ". W pierwszej kolumnie należy wpisać oznaczenie szkoły (dowolne bez spacji, najlepiej jak najkrótsze). Te dane będą używane w znaczniku klasy, jeżeli w trzeciej kolumnie została wybrana opcja "1". W drugiej kolmnie należy wpisać liczbę klas w danej szkole. Te dane używane są do obliczenia roku w znaczniku klasy. W trzeciej kolumnie można wybrać opcję "1" lub "0" (Prawda/Fałsz). Wybierz "1" jeżeli chcesz, aby w znaczniku klasy znajdowało się oznaczenie szkoły (przykład: 2023bs). Wybierz "0" jeżeli chcesz, aby w znaczniku klasy znajdowała się litera klasy (przykład: 2023a).
@@ -149,11 +149,7 @@
for (i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
- /* Toggle between adding and removing the "active" class,
- to highlight the button that controls the panel */
this.classList.toggle("active");
-
- /* Toggle between hiding and showing the active panel */
var panel = this.nextElementSibling;
if (panel.style.display === "block") {
panel.style.display = "none";
diff --git a/documentation/main.css b/documentation/main.css
index a4d8e5e..74bac21 100644
--- a/documentation/main.css
+++ b/documentation/main.css
@@ -72,9 +72,8 @@ section {
iframe {
float: left;
- width: 99%;
+ width: 100%;
border: none;
- padding: 0.5%;
height: calc(100% - 220px);
overflow: scroll;
position: absolute;
diff --git a/documentation/program_documentation.html b/documentation/program_documentation.html
index 0efebb7..c0b9031 100644
--- a/documentation/program_documentation.html
+++ b/documentation/program_documentation.html
@@ -7,29 +7,9 @@
Generator CSV
-
+
-
- Informacje o programie
-
- programName - Zmienna definująca nazwę programu
- programVersion - Zmienna definiująca główną wersję programu
- programVersionStage - Zmienna definiująca etap rozwoju programu. Wersja stabilna definiowana jest przez pusty string
- programVersionBuild - Zmienna definiująca numer buildu programu. Zapisany jest on w formacie '[ostatnie dwie cyfry roku][numer dnia w roku]'
- programCustomer - Zmienna definiująca nazwę organizacji zlecającej stworzenie programu
- programAuthors - Lista zawierająca nazwy osób rozwijających program.
- programToW - Lista zawierająca informacje na temat czasu rozwoju programu. Format: ['miesiąc rozpoczęcia prac', 'rok rozpoczęcia prac', 'aktualny dla rozwoju danej wersji miesiąc', 'aktualny dla rozwoju danej wersji rok']
-
-
- Dozwolone kodowanie plików
-
- allowedCoding - Lista zawierająca wspierane kodowania plików. Są one wyświetlane w rozwijanych listach wyboru kodowania pliku.
-
-
- Dozwolone znaki
-
- allowedCharactersInSeparator - Lista zawierająca znaki które można wpisać w pola dotyczące separatorów osób, linii i danych
-
+
Aby móc uruchomić aplikację w wersji developerskiej należy pobrać Pythona oraz wymagane biblioteki (wymienione w sekcji 'generator.pyw - Import bibliotek')
@@ -65,6 +45,36 @@
+
+
+
+ Informacje o programie
+
+ programName - Zmienna definująca nazwę programu
+ programVersion - Zmienna definiująca główną wersję programu
+ programVersionStage - Zmienna definiująca etap rozwoju programu. Wersja stabilna definiowana jest przez pusty string
+ programVersionBuild - Zmienna definiująca numer buildu programu. Zapisany jest on w formacie '[ostatnie dwie cyfry roku][numer dnia w roku]'
+ programCustomer - Zmienna definiująca nazwę organizacji zlecającej stworzenie programu
+ programAuthors - Lista zawierająca nazwy osób rozwijających program.
+ programToW - Lista zawierająca informacje na temat czasu rozwoju programu. Format: ['miesiąc rozpoczęcia prac', 'rok rozpoczęcia prac', 'aktualny dla rozwoju danej wersji miesiąc', 'aktualny dla rozwoju danej wersji rok']
+
+
+ Dozwolone kodowanie plików
+
+ allowedCoding - Lista zawierająca wspierane kodowania plików. Są one wyświetlane w rozwijanych listach wyboru kodowania pliku.
+
+
+ Dozwolone znaki
+
+ allowedCharactersInSeparator - Lista zawierająca znaki które można wpisać w pola dotyczące separatorów osób, linii i danych
+
+
+ Katalog APPDATA
+
+ appdataPath - zmienna definiująca ścieżkę do folderu %appdata%
+
+
+
@@ -87,7 +97,204 @@
Wywoływanie funkcji: MSG([kod dialogowy],[True - Zakończ działanie programu po zamknięciu okna dialogowego/False - Kontynuuj działanie programu po zamknięciu okna dialogowego],[dodatkowe informacje wyświetlane w komunikacie - opcjonalnie])
+
+ try:
+ optionalInfo[0]
+ except:
+ optionalInfo = ['']
+
+ Sprawdza czy zostały wpisane 'dodatkowe informacje wyświetlane w komunikacie' i jeżeli nie, definiuje listę, w której znajduje się pusty string (ma to na celu uniknięcia błędu podczas próby wywołania dodatkowych informacji przez dalszą część funkcji)
+
+
+ if code[0] == 'E/I/W':
+ TKmsb.showerror/showinfo/showwarning('[tytuł komunikatu]', '%s\n%s' % (MSGlist[code], optionalInfo[0]))
+
+ Wywoływanie danego rodzaju komunikatu na podstawie jednoznakowego znacznika rodzaju okna dialogowego.
+
+
+ if terminate:
+ SS.exit(0)
+
+ Zakończenie działania programu po zamknięciu okna dialogowego, jeżeli została ustawiona opdowiednia opcja.
+
+
+ elif code[0] == 'A':
+ if TKmsb.askokcancel('Pytanie', '%s\n%s' % (MSGlist[code], optionalInfo[0])):
+ return True
+ else:
+ return False
+
+ Funkcja zwraca wartość boolean w przypadku wywołania komunikatu zapytania
+
+
+
+
+
+ Klasa checkAppdata odpowiedzialna jest za sprawdzenie poprawności i, w razie potrzeby, doprowadzenie go do stanu poprawności.
+
+
+ Główna funkcja programu
+
+ 1. Czy w folderze %appdata% istnieje folder programu (Generator CSV)?
+ Jeżeli nie istnieje, uruchamiana jest funckja __buildAppdata (odpowiedzialna za zbudowanie całości katalogu programu).
+ 2. Czy w folderze programu istnieje plik 'version' (przechowuje on numer buildu programu, w którym został zbudowany katalog programu)?
+ Jeżeli nie istnieje, uruchamiane jest okno dialogowe zapytania z pytaniem czy pozwolić na zresetowanie katalogu programu i kontynuować ładowanie programu
+ 3. Czy numer buildu programu w pliku 'version' jest zgodny z numerem buildu zawartym w zmiennej VAR.programVersionBuild
+ Jeżeli nie, uruchamiane jest okno dialogowe zapytania z pytaniem czy pozwolić na zresetowanie katalogu programu i kontynuować ładowanie programu
+ Jeżeli tak, sprawdzane są poszczególne pliki i foldery które powinny być zawarte w folderze, i jeżeli któryś plik/folder nie znajduje się w folderze, wywołuje się funkcje mające na celu przywrócenie/utworzenie tych plików/folderów (odpowiednio: __restoreCFG dla plików konfiguracyjnych, __createFormatPresetsDir dla folderu przechowującego format presety)
+
+
+ Budowanie katalogu programu (__buildAppdata)
+
+ Funkcja ta, jest odpowiedzialna za zbudowanie całości katalogu programu w folderze %appdata%.
+ 1. Tworzenie katalogu 'Generator CSV'
+ 2. Tworzenie pliku 'version' i zapisanie w nim numeru buildu.
+ 3. Inicjacja funkcji __restoreCFG (w celu skopiowania pliku 'config.cfg' z głównego katalogu programu do katalogu 'Generator CSV' w folderze %appdata%).
+ 4. Inicjacja funkcji __restoreCFG (w celu skopiowania pliku 'style.cfg' z głównego katalogu programu do katalogu 'Generator CSV' w folderze %appdata%).
+ 5. Inicjacja funkcji __createFormatPresetsDir (w celu stworzenia folderu 'format-presets' przechowującego format presety)
+
+
+ Resetowanie katalogu programu (__resetAppdata)
+
+ Funkcja ta, jest odpowiedzialna za przywrócenie katalogu programu w folderze %appdata% do stanu podstawowego oraz stworzenie kopii zapasowej starego katalogu.
+ 1. W przypadku gdy w katalogu istnieje jeszcze starsza kopia zapasowa folderu, kopia ta jest usuwana.
+ 2. Nazwa katalogu programu jest zmieniana na taką z dopiskiem '_old'.
+ 3. Inicjacja funkcji __buildAppdata w celu zbudowania nowego katalogu programu
+ 4. Skopiowanie katalogu 'Generator CSV_old' do nowego katalogu 'Generator CSV'
+
+
+ Przywracanie plików konfiguracyjnych (__restoreCFG)
+
+ Funkcja ta, jest odpowiedzialna za skopiowanie pliku konfiguracyjnego (.cfg) o danej nazwie z głównego katalogu programu do katalogu programu w folderze %appdata%
+
+
+ Tworzenie katalogu przechowującego format presety (__createFormatPresetsDir)
+
+ Funkcja ta, jest odpowiedzialna za utworzenie folderu 'format-presets', przechowującego format presety, w katalogu programu w folderze %appdata%
+
+
+
+
+
+
+ Klasa CFG odpowiedzialna jest za zarządzanie plikiem konfiguracyjnym 'config.cfg'
+
+
+ Odczytywanie pojedyńczej zmiennej z pliku (R)
+
+ Funkcja ta, jest odpowiedzialna za odczytanie zawartości danego recordu i sprawdzenie jego poprawności
+ 1. Inicjacja funkcji __checkIfFileExist w celu sprawdzenia czy plik 'config.cfg' istnieje
+ 2. Zczytanie i zapisanie wszystkich danych z pliku 'config.cfg' do słownika content w formacie: 'nazwa zmiennej' : ['zmienna', 'typ zmiennej']
+ 3. Inicjacja funckji __checkIfRecordExist w celu sprawdzenia czy w słowniku content znajduje się żądany record
+ 4. Inicjacja, odpowiedniej dla typu zmiennej, funkcji mającej na celu sprawdzenie jej poprawności i jej przetworzenie
+ 5. Funkcja zwraca wartość zmiennej.
+
+
+ Zapisywanie zmian w pliku (W)
+
+ Funkcja ta jest odpowiedzialna za sprawdzenie, przetworzenie i zapisanie zmian w pliku konfiguracyjnych.
+ 1. Inicjacja funkcji __checkIfFileExist w celu sprawdzenia czy plik 'config.cfg' istnieje
+ 2. Zczytanie i zapisanie wszystkich danych z pliku 'config.cfg' do słownika content w formacie: 'nazwa zmiennej' : ['zmienna', 'typ zmiennej']
+ 3. Inicjacja, odpowiedniej dla typu zmiennej, funkcji mającej na celu sprawdzenie jej poprawności i jej przetworzenie, dla każdego recordu ze słownika changes
+ 4. Nadpisanie zmiennej ze słownika content, wartością var.
+ 5. Zapisanie zawartości słownika content w pliku 'config.cfg'
+ 6. Funkcja zwraca True jeżeli operacja została wykonana pomyślnie lub False jeżeli wystąpił błąd
+
+
+ Funkcje sprawdzające istnienie
+
+ __checkIfFileExist - funkcja sprawdza czy plik istnieje i możliwe jest jego nadpisanie (w przypadku zapisu)
+ __checkIfRecordExist - funkcja sprawdza czy record istnieje w słowniku content
+
+
+ Funkcje sprawdzające poprawność recordu
+
+ Funkcje te odpowiadają za sprawdzenie poprawności zmiennej i w razie potrzeby przetwarzają ją na pożądaną formę.
+
+
+
+
+
+
+ Klasa GUI odpowiedzialna jest za zarządzanie plikiem konfiguracyjnym 'style.cfg'
+
+
+ Odczytywanie pojedyńczej zmiennej z pliku (R)
+
+ Funkcja ta, jest odpowiedzialna za odczytanie zawartości danego recordu i sprawdzenie jego poprawności
+ 1. Inicjacja funkcji __checkIfFileExist w celu sprawdzenia czy plik 'style.cfg' istnieje
+ 2. Zczytanie i zapisanie wszystkich danych z pliku 'style.cfg' do słownika content w formacie: 'nazwa zmiennej' : ['zmienna', 'typ zmiennej']
+ 3. Inicjacja funkcji __checkIfRecordExist w celu sprawdzenia czy w słowniku content znajduje się żądany record
+ 4. Inicjacja, odpowiedniej dla typu zmiennej, funkcji mającej na celu sprawdzenie jej poprawności i jej przetworzenie
+ Funkcja zwraca wartość zmiennej.
+
+
+ Funkcje sprawdzające istnienie
+
+ __checkIfFileExist - funkcja sprawdza czy plik istnieje
+ __checkIfRecordExist - funkcja sprawdza czy record istnieje w słowniku content
+
+
+ Funkcje sprawdzające poprawność recordu
+
+ Funkcje te odpowiadają za sprawdzenie poprawności zmiennej i w razie potrzeby przetwarzają ją na pożądaną formę.
+
+
+
+
+
+
+ Klasa FMT odpowiedzialna jest za zarządzanie plikami formatu (.fmt)
+
+
+ Odczytywanie pojedyńczej zmiennej z pliku (R)
+
+ Funkcja ta, jest odpowiedzialna za odczytanie zawartości danego recordu i sprawdzenie jego poprawności
+ 1. Inicjacja funkcji __checkIfFolderExist w celu sprawdzenia czy folder 'format-presets' istnieje
+ 2. Sprawdzenie czy podany plik formatu (preset) znajduje się w folderze 'format-presets' (funkcja getList zwraca listę plików formatu w folderze 'format-presets')
+ Jeżeli nie, wartość zmiennej jest wybierana ze słownika content (zawierającego podstawowe wartości zmiennych)
+ Jeżeli tak:
+ 3. Zczytanie i zapisanie wszystkich danych z wybranego pliku formatu do słownika content w formacie: 'nazwa zmiennej' : ['zmienna', 'typ zmiennej']
+ 4. Inicjacja funkcji __checkIfRecordExist w celu sprawdzenia czy w słowniku content znajduje się żądany record
+ 5. Inicjacja, odpowiedniej dla typu zmiennej, funkcji mającej na celu sprawdzenie jej poprawności i jej przetworzenie
+ Funkcja zwraca wartość zmiennej.
+
+
+ Zapisywanie zmian w pliku (W)
+
+ Funkcja ta jest odpowiedzialna za sprawdzenie, przetworzenie i zapisanie zmian w pliku konfiguracyjnych.
+ 1. Inicjacja funkcji __checkIfFolderExist w celu sprawdzenia czy folder 'format-presets' istnieje
+ 2. Sprawdzenie czy podany plik formatu (preset) znajduje się w folderze 'format-presets' (funkcja getList zwraca listę plików formatu w folderze 'format-presets')
+ Jeżeli nie, tworzony jest słownik content z zawartością podstawową
+ Jeżeli tak: Zczytanie i zapisanie wszystkich danych z wybranego pliku formatu do słownika content w formacie: 'nazwa zmiennej' : ['zmienna', 'typ zmiennej']
+ 3. Inicjacja, odpowiedniej dla typu zmiennej, funkcji mającej na celu sprawdzenie jej poprawności i jej przetworzenie, dla każdego recordu ze słownika changes
+ 4. Nadpisanie zmiennej ze słownika content, wartością var.
+ 5. Zapisanie zawartości słownika content w pliku 'config.cfg'
+ 6. Funkcja zwraca True jeżeli operacja została wykonana pomyślnie lub False jeżeli wystąpił błąd
+
+
+ Funkcja zwracająca listę presetów (getList)
+
+ Funkcja ta odpowiedzialna jest za stworzenie listy plików .fmt w folderze 'format-presets' oraz za jej zwrócenie.
+
+
+ Funkcje sprawdzające istnienie
+
+ __checkIfFolderExist - funkcja sprawdza czy folder 'format-presets' istnieje (inicjuje checkAppdata)
+ __checkIfRecordExist - funkcja sprawdza czy record istnieje w słowniku content
+
+
+ Funkcje sprawdzające poprawność recordu
+
+ Funkcje te odpowiadają za sprawdzenie poprawności zmiennej i w razie potrzeby przetwarzają ją na pożądaną formę.
+
+
+
+
+
+
+
@@ -102,11 +309,7 @@
for (i = 0; i < acc.length; i++) {
acc[i].addEventListener("click", function() {
- /* Toggle between adding and removing the "active" class,
- to highlight the button that controls the panel */
this.classList.toggle("active");
-
- /* Toggle between hiding and showing the active panel */
var panel = this.nextElementSibling;
if (panel.style.display === "block") {
panel.style.display = "none";
diff --git a/generator.pyw b/generator.pyw
index 347da8b..9cd7004 100644
--- a/generator.pyw
+++ b/generator.pyw
@@ -10,28 +10,6 @@
-# --------------------------------- # Główne zmienne globalne # --------------------------------- #
-
-class VAR:
- # Informacje o programie
- programName = 'Generator CSV'
- programVersion = '4.0'
- programVersionStage = 'Beta'
- programVersionBuild = '20246'
- programCustomer = 'ZSP Sobolew'
- programAuthors = ['Mateusz Skoczek']
- programToW = ['styczeń', '2019', 'wrzesień', '2020']
-
- # Dozwolone kodowanie plików
- allowedCoding = ['utf-8', 'ANSI', 'iso-8859-2']
-
- # Dozwolone znaki
- allowedCharactersInSeparator = ['`', '~', '!', '@', '#', '$', '%', '^', '&', '(', ')', '-', '_', '=', '+', '[', ']', ' ', '?', '/', '>', '.', '<', ',', '"', "'", ':', ';', '|']
-
-
-
-
-
# ------------------------------------- # Import bibliotek # ------------------------------------ #
# Biblioteki główne
@@ -56,6 +34,37 @@ from PIL import Image as PLimg
+# --------------------------------- # Główne zmienne globalne # --------------------------------- #
+
+class VAR:
+ # Informacje o programie
+ programName = 'Generator CSV'
+ programVersion = '4.0'
+ programVersionStage = 'Beta'
+ programVersionBuild = '20252'
+ programCustomer = 'ZSP Sobolew'
+ programAuthors = ['Mateusz Skoczek']
+ programToW = ['styczeń', '2019', 'wrzesień', '2020']
+
+ # Dozwolone kodowanie plików
+ allowedCoding = ['utf-8', 'ANSI', 'iso-8859-2']
+
+ # Dozwolone znaki
+ allowedCharactersInSeparator = ['`', '~', '!', '@', '#', '$', '%', '^', '&', '(', ')', '-', '_', '=', '+', '[', ']', ' ', '?', '/', '>', '.', '<', ',', '"', "'", ':', ';', '|']
+
+ # Katalog APPDATA
+ appdataPath = PT.Path.home() / 'Appdata/Roaming'
+
+
+
+
+
+
+
+
+
+
+
# -------------------------------------- # Okna dialogowe # ------------------------------------- #
# Lista komunikatów
@@ -85,6 +94,8 @@ MSGlist = {
'A0005' : 'Czy na pewno chcesz przywrócić domyślne ustawienia ogólne?',
'A0006' : 'Czy na pewno chcesz przywrócić domyślne ustawienia wyglądu?',
'A0007' : 'Czy na pewno chcesz usunąc zaznaczone format presety?',
+ 'A0008' : 'Nie znaleziono informacji o wersji programu w katalogu programu w APPDATA. Nastąpi zresetowanie katalogu programu w APPDATA oraz utworzenie kopii zapasowej dotychczasowej zawartości. Czy chcesz kontynuować?',
+ 'A0009' : 'Została zainstalowana nowa wersja programu. Nastąpi zresetowanie katalogu programu w APPDATA oraz utworzenie kopii zapasowej dotychczasowej zawartości. Czy chcesz kontynuować?',
'I0001' : 'Operacja ukończona pomyślnie',
'I0002' : 'Aplikacja zostanie zamknięta w celu przeładowania ustawień',
}
@@ -126,94 +137,233 @@ def MSG(code, terminate, *optionalInfo):
-# ----------------------------------- # Opcje deweloperskie # ----------------------------------- #
-
-dev_config = []
-if 'dev.cfg' in [x for x in OS.listdir('.\configs')]:
- try:
- dev_config = CD.open(r'.\configs\dev.cfg', 'r', 'utf-8').read().split('\n')
- except Exception as exceptInfo:
- print('DEVELOPER CONSOLE LOG: Nie można załadować listy aktywnych opcji developerskich')
- else:
- print('DEVELOPER CONSOLE LOG: Pomyślnie załadowano listę aktywnych opcji developerskich')
- print('DEVELOPER CONSOLE LOG: Lista aktywnych opcji developerskich: %s' % str(dev_config))
-
-
-
-
-
# ------------------------- # Sprawdzanie katalogu programu w APPDATA # ------------------------- #
-appdata = PT.Path.home() / 'Appdata/Roaming'
+class checkAppdata:
+ def __init__(self):
+ if 'Generator CSV' in [x for x in OS.listdir(VAR.appdataPath)]:
+ if 'version' in [x for x in OS.listdir(str(VAR.appdataPath) + '\Generator CSV')]:
+ versionFile = CD.open((str(VAR.appdataPath) + r'\Generator CSV\version'), 'r', 'utf-8')
+ if versionFile.read() == VAR.programVersionBuild:
+ versionFile.close()
+ if 'config.cfg' not in [x for x in OS.listdir(str(VAR.appdataPath) + '\Generator CSV')]:
+ self.__restoreCFG('config')
+ if 'style.cfg' not in [x for x in OS.listdir(str(VAR.appdataPath) + '\Generator CSV')]:
+ self.__restoreCFG('style')
+ if 'format-presets' not in [x for x in OS.listdir(str(VAR.appdataPath) + '\Generator CSV')]:
+ self.__createFormatPresetsDir()
+ else:
+ versionFile.close()
+ if MSG('A0009', False):
+ self.__resetAppdata()
+ MSG('I0002', True)
+ else:
+ SS.exit(0)
+ else:
+ if MSG('A0008', False):
+ self.__resetAppdata()
+ MSG('I0002', True)
+ else:
+ SS.exit(0)
+ else:
+ self.__buildAppdata()
-if 'reset_appdata' in dev_config:
- try:
- SU.rmtree(str(appdata) + '\Generator CSV')
- OS.mkdir(str(appdata) + '\Generator CSV')
- versionFile = CD.open((str(appdata) + r'\Generator CSV\version'), 'w', 'utf-8')
- versionFile.write(VAR.programVersionBuild)
- versionFile.close()
- SU.copy('configs\config.cfg', str(appdata) + '\Generator CSV\config.cfg')
- SU.copy('configs\style.cfg', str(appdata) + '\Generator CSV\style.cfg')
- OS.mkdir(str(appdata) + r'\Generator CSV\format-presets')
- except Exception as exceptInfo:
- print("DEVELOPER CONSOLE LOG: Folder 'Generator CSV' w folderze 'APPDATA' nie został zresetowany z powodu błędu: %s" % exceptInfo)
- else:
- print("DEVELOPER CONSOLE LOG: Folder 'Generator CSV' w folderze 'APPDATA' został zresetowany pomyślnie")
-def checkAppdata():
- if 'Generator CSV' not in [x for x in OS.listdir(appdata)]:
+ # Budowanie katalogu programu
+ def __buildAppdata(self):
try:
- OS.mkdir(str(appdata) + '\Generator CSV')
- versionFile = CD.open((str(appdata) + r'\Generator CSV\version'), 'w', 'utf-8')
+ OS.mkdir(str(VAR.appdataPath) + '\Generator CSV')
+
+ versionFile = CD.open((str(VAR.appdataPath) + r'\Generator CSV\version'), 'w', 'utf-8')
versionFile.write(VAR.programVersionBuild)
versionFile.close()
- SU.copy('configs\config.cfg', str(appdata) + '\Generator CSV\config.cfg')
- SU.copy('configs\style.cfg', str(appdata) + '\Generator CSV\style.cfg')
- OS.mkdir(str(appdata) + r'\Generator CSV\format-presets')
except Exception as exceptInfo:
MSG('E0001', True, exceptInfo)
- else:
- if 'version' not in [x for x in OS.listdir(str(appdata) + '\Generator CSV')]:
- SU.rmtree(str(appdata) + '\Generator CSV')
- checkAppdata()
- else:
- versionFile = CD.open((str(appdata) + r'\Generator CSV\version'), 'r', 'utf-8')
- if versionFile.read() != VAR.programVersionBuild:
- versionFile.close()
- SU.rmtree(str(appdata) + '\Generator CSV')
- checkAppdata()
- if 'config.cfg' not in [x for x in OS.listdir(str(appdata) + '\Generator CSV')]:
- try:
- SU.copy('configs\config.cfg', str(appdata) + '\Generator CSV\config.cfg')
- except Exception as exceptInfo:
- MSG('E0001', True, exceptInfo)
- if 'style.cfg' not in [x for x in OS.listdir(str(appdata) + '\Generator CSV')]:
- try:
- SU.copy('configs\style.cfg', str(appdata) + '\Generator CSV\style.cfg')
- except Exception as exceptInfo:
- MSG('E0001', True, exceptInfo)
- if 'format-presets' not in [x for x in OS.listdir(str(appdata) + '\Generator CSV')]:
- try:
- OS.mkdir(str(appdata) + r'\Generator CSV\format-presets')
- except Exception as exceptInfo:
- MSG('E0001', True, exceptInfo)
+
+ self.__restoreCFG('config')
+ self.__restoreCFG('style')
+ self.__createFormatPresetsDir()
+
+ # Resetowanie katalogu programu
+ def __resetAppdata(self):
+ try:
+ if 'Generator CSV_old' in [x for x in OS.listdir(str(VAR.appdataPath) + '\Generator CSV')]:
+ SU.rmtree(str(VAR.appdataPath) + '\Generator CSV\Generator CSV_old')
+ OS.rename((str(VAR.appdataPath) + '\Generator CSV'), (str(VAR.appdataPath) + '\Generator CSV_old'))
+ except Exception as exceptInfo:
+ MSG('E0001', True, exceptInfo)
+
+ self.__buildAppdata()
+
+ try:
+ SU.move((str(VAR.appdataPath) + '\Generator CSV_old'), (str(VAR.appdataPath) + '\Generator CSV\Generator CSV_old'))
+ except Exception as exceptInfo:
+ MSG('E0001', True, exceptInfo)
+
+
+ # Przywracanie plików konfiguracyjnych
+ def __restoreCFG(self, configFileName):
+ try:
+ SU.copy(('configs\%s.cfg' % configFileName), str(VAR.appdataPath) + ('\Generator CSV\%s.cfg' % configFileName))
+ except Exception as exceptInfo:
+ MSG('E0001', True, exceptInfo)
+
+
+ # Tworzenie katalogu przechowującego format presety
+ def __createFormatPresetsDir(self):
+ try:
+ OS.mkdir(str(VAR.appdataPath) + r'\Generator CSV\format-presets')
+ except Exception as exceptInfo:
+ MSG('E0001', True, exceptInfo)
+
+
+
checkAppdata()
-# ----------------------------- # Ładowanie pliku konfiguracyjnego # ---------------------------- #
+# ------------------ # Ładowanie głównego pliku konfiguracyjnego 'config.cfg' # ----------------- #
class CFG:
+ def R(self, record):
+ self.__checkIfFileExist(False)
+ content = {}
+ for x in CD.open((str(VAR.appdataPath) + '\Generator CSV\config.cfg'), 'r', 'utf-8').read().strip('\r').split('\n'):
+ x = x.split(' = ')
+ try:
+ name = x[0].split('(')[0]
+ var = x[1]
+ type = x[0].split('(')[1].strip(')')
+ content[name] = [var, type]
+ except:
+ continue
+ checkingOutput = self.__checkIfRecordExist(content, record)
+ if not checkingOutput[0]:
+ MSG('E0003', True, checkingOutput[1])
+ var = content[record]
+ if var[1] == 'S':
+ # String
+ var = var[0].strip('\r')
+ return var
+ elif var[1] == 'Sc':
+ # Integer
+ checkingOutput = self.__checkSc(record, var[0])
+ if checkingOutput[0]:
+ return checkingOutput[1]
+ else:
+ MSG('E0003', True, checkingOutput[1])
+ elif var[1] == 'I':
+ # Integer
+ checkingOutput = self.__checkI(False, record, var[0])
+ if checkingOutput[0]:
+ return checkingOutput[1]
+ else:
+ MSG('E0003', True, checkingOutput[1])
+ elif var[1] == 'D':
+ # Date (DD.MM.RRRR HH:MM:SS)
+ checkingOutput = self.__checkD(False, record, var[0])
+ if checkingOutput[0]:
+ return checkingOutput[1]
+ else:
+ MSG('E0003', True, checkingOutput[1])
+ elif var[1] == 'MSAs':
+ # Multiple Specified Arrays - schoolData
+ checkingOutput = self.__checkMSAs(False, record, var[0])
+ if checkingOutput[0]:
+ return checkingOutput[1]
+ else:
+ MSG('E0003', True, checkingOutput[1])
+ elif var[1] == 'B':
+ # Boolean
+ checkingOutput = self.__checkB(False, record, var[0])
+ if checkingOutput[0]:
+ return checkingOutput[1]
+ else:
+ MSG('E0003', True, checkingOutput[1])
+ else:
+ MSG('E0003', True, 'Nie można rozpoznać typu klucza %s' % record)
+
+ def W(self, changes):
+ self.__checkIfFileExist(True)
+ file = CD.open(str(VAR.appdataPath) + '\Generator CSV\config.cfg', 'r', 'utf-8').read().split('\n')
+ if file[-1] == '':
+ file = file[:-1]
+ content = {}
+ for x in file:
+ x = x.split(' = ')
+ try:
+ name = x[0].split('(')[0]
+ var = x[1]
+ type = x[0].split('(')[1].strip(')')
+ content[name] = [var, type]
+ except Exception as exceptInfo:
+ MSG('E0003', False, exceptInfo)
+ for x in changes:
+ name = x
+ var = changes[name]
+ type = (content[name])[1]
+ if type == 'S':
+ # String
+ pass
+ elif type == 'Sc':
+ # Integer
+ checkingOutput = self.__checkSc(name, var)
+ if checkingOutput[0]:
+ var = checkingOutput[1]
+ else:
+ MSG('E0006', False, checkingOutput[1])
+ return False
+ elif type == 'I':
+ # Integer
+ checkingOutput = self.__checkI(True, name, var)
+ if checkingOutput[0]:
+ var = checkingOutput[1]
+ else:
+ MSG('E0006', False, checkingOutput[1])
+ return False
+ elif type == 'D':
+ # Date (DD.MM.RRRR HH:MM:SS)
+ checkingOutput = self.__checkD(True, name, var)
+ if checkingOutput[0]:
+ var = checkingOutput[1]
+ else:
+ MSG('E0006', False, checkingOutput[1])
+ return False
+ elif type == 'MSAs':
+ # Multiple Specified Arrays - schoolData
+ checkingOutput = self.__checkMSAs(True, name, var)
+ if checkingOutput[0]:
+ var = checkingOutput[1]
+ else:
+ MSG('E0006', False, checkingOutput[1])
+ return False
+ elif type == 'B':
+ # Boolean
+ checkingOutput = self.__checkB(True, name, var)
+ if checkingOutput[0]:
+ var = checkingOutput[1]
+ else:
+ MSG('E0006', False, checkingOutput[1])
+ return False
+ else:
+ MSG('E0003', False, 'Nie można rozpoznać typu klucza %s' % name)
+ return False
+ content[name] = [var, type]
+ with CD.open(str(VAR.appdataPath) + '\Generator CSV\config.cfg', 'w', 'utf-8') as file:
+ for x in content:
+ file.write('%s(%s) = %s\n' % (x, (content[x])[1], (content[x][0])))
+ return True
+
+
# Funkcje sprawdzające istnienie
def __checkIfFileExist(self, write):
if write:
try:
checkAppdata()
- file = open((str(appdata) + '\Generator CSV\config.cfg'), 'a')
+ file = open((str(VAR.appdataPath) + '\Generator CSV\config.cfg'), 'a')
except Exception as exceptInfo:
MSG('E0002', True, exceptInfo)
return False
@@ -226,7 +376,7 @@ class CFG:
else:
try:
checkAppdata()
- open(str(appdata) + '\Generator CSV\config.cfg')
+ open(str(VAR.appdataPath) + '\Generator CSV\config.cfg')
except Exception as exceptInfo:
MSG('E0002', True, exceptInfo)
@@ -431,151 +581,82 @@ class CFG:
- def R(self, record):
- self.__checkIfFileExist(False)
- content = {}
- for x in CD.open((str(appdata) + '\Generator CSV\config.cfg'), 'r', 'utf-8').read().strip('\r').split('\n'):
- x = x.split(' = ')
- try:
- name = x[0].split('(')[0]
- var = x[1]
- type = x[0].split('(')[1].strip(')')
- content[name] = [var, type]
- except:
- continue
- checkingOutput = self.__checkIfRecordExist(content, record)
- if not checkingOutput[0]:
- MSG('E0003', True, checkingOutput[1])
- var = content[record]
- if var[1] == 'S':
- # String
- var = var[0].strip('\r')
- return var
- elif var[1] == 'Sc':
- # Integer
- checkingOutput = self.__checkSc(record, var[0])
- if checkingOutput[0]:
- return checkingOutput[1]
- else:
- MSG('E0003', True, checkingOutput[1])
- elif var[1] == 'I':
- # Integer
- checkingOutput = self.__checkI(False, record, var[0])
- if checkingOutput[0]:
- return checkingOutput[1]
- else:
- MSG('E0003', True, checkingOutput[1])
- elif var[1] == 'D':
- # Date (DD.MM.RRRR HH:MM:SS)
- checkingOutput = self.__checkD(False, record, var[0])
- if checkingOutput[0]:
- return checkingOutput[1]
- else:
- MSG('E0003', True, checkingOutput[1])
- elif var[1] == 'MSAs':
- # Multiple Specified Arrays - schoolData
- checkingOutput = self.__checkMSAs(False, record, var[0])
- if checkingOutput[0]:
- return checkingOutput[1]
- else:
- MSG('E0003', True, checkingOutput[1])
- elif var[1] == 'B':
- # Boolean
- checkingOutput = self.__checkB(False, record, var[0])
- if checkingOutput[0]:
- return checkingOutput[1]
- else:
- MSG('E0003', True, checkingOutput[1])
- else:
- MSG('E0003', True, 'Nie można rozpoznać typu klucza %s' % record)
-
- def W(self, changes):
- self.__checkIfFileExist(True)
- file = CD.open(str(appdata) + '\Generator CSV\config.cfg', 'r', 'utf-8').read().split('\n')
- if file[-1] == '':
- file = file[:-1]
- content = {}
- for x in file:
- x = x.split(' = ')
- try:
- name = x[0].split('(')[0]
- var = x[1]
- type = x[0].split('(')[1].strip(')')
- content[name] = [var, type]
- except Exception as exceptInfo:
- MSG('E0003', False, exceptInfo)
- for x in changes:
- name = x
- var = changes[name]
- type = (content[name])[1]
- if type == 'S':
- # String
- pass
- elif type == 'Sc':
- # Integer
- checkingOutput = self.__checkSc(name, var)
- if checkingOutput[0]:
- var = checkingOutput[1]
- else:
- MSG('E0006', False, checkingOutput[1])
- return False
- elif type == 'I':
- # Integer
- checkingOutput = self.__checkI(True, name, var)
- if checkingOutput[0]:
- var = checkingOutput[1]
- else:
- MSG('E0006', False, checkingOutput[1])
- return False
- elif type == 'D':
- # Date (DD.MM.RRRR HH:MM:SS)
- checkingOutput = self.__checkD(True, name, var)
- if checkingOutput[0]:
- var = checkingOutput[1]
- else:
- MSG('E0006', False, checkingOutput[1])
- return False
- elif type == 'MSAs':
- # Multiple Specified Arrays - schoolData
- checkingOutput = self.__checkMSAs(True, name, var)
- if checkingOutput[0]:
- var = checkingOutput[1]
- else:
- MSG('E0006', False, checkingOutput[1])
- return False
- elif type == 'B':
- # Boolean
- checkingOutput = self.__checkB(True, name, var)
- if checkingOutput[0]:
- var = checkingOutput[1]
- else:
- MSG('E0006', False, checkingOutput[1])
- return False
- else:
- MSG('E0003', False, 'Nie można rozpoznać typu klucza %s' % name)
- return False
- content[name] = [var, type]
- with CD.open(str(appdata) + '\Generator CSV\config.cfg', 'w', 'utf-8') as file:
- for x in content:
- file.write('%s(%s) = %s\n' % (x, (content[x])[1], (content[x][0])))
- return True
-
-
-
CFG = CFG()
-# ---------------------------------- # Ładowanie pliku stylu # ---------------------------------- #
+# -------------------- # Ładowanie pliku konfiguracyjnego stylu 'style.cfg' # ------------------- #
class GUI:
+ # Odczytywanie pojedyńczej zmiennej z pliku
+ def R(self, record):
+ self.__checkIfFileExist()
+ content = {}
+ for x in CD.open((str(VAR.appdataPath) + '\Generator CSV\style.cfg'), 'r', 'utf-8').read().strip('\r').split('\n'):
+ x = x.split(' = ')
+ try:
+ name = x[0].split('(')[0]
+ var = x[1]
+ type = x[0].split('(')[1].strip(')')
+ content[name] = [var.strip('\r'), type]
+ except:
+ continue
+ checkingOutput = self.__checkIfRecordExist(content, record)
+ if not checkingOutput[0]:
+ MSG('E0005', True, checkingOutput[1])
+ var = content[record]
+ if var[1] == 'I':
+ # Integer
+ checkingOutput = self.__checkI(record, var[0])
+ if checkingOutput[0]:
+ return checkingOutput[1]
+ else:
+ MSG('E0005', True, checkingOutput[1])
+ elif var[1] == 'B':
+ # Boolean
+ checkingOutput = self.__checkB(record, var[0])
+ if checkingOutput[0]:
+ return checkingOutput[1]
+ else:
+ MSG('E0005', True, checkingOutput[1])
+ elif var[1] == 'C':
+ # Color
+ checkingOutput = self.__checkC(record, var[0])
+ if checkingOutput[0]:
+ return checkingOutput[1]
+ else:
+ MSG('E0005', True, checkingOutput[1])
+ elif var[1] == 'P':
+ # Path
+ checkingOutput = self.__checkP(record, var[0])
+ if checkingOutput[0]:
+ return checkingOutput[1]
+ else:
+ MSG('E0005', True, checkingOutput[1])
+ elif (var[1])[:2] == 'FA':
+ # From Array
+ checkingOutput = self.__checkFA(record, var[0], (var[1])[2:])
+ if checkingOutput[0]:
+ return checkingOutput[1]
+ else:
+ MSG('E0005', True, checkingOutput[1])
+ elif var[1] == 'F':
+ # Font
+ checkingOutput = self.__checkF(record, var[0])
+ if checkingOutput[0]:
+ return checkingOutput[1]
+ else:
+ MSG('E0005', True, checkingOutput[1])
+ else:
+ MSG('E0005', True, 'Nie można rozpoznać typu klucza %s' % record)
+
# Funkcje sprawdzające istnienie
def __checkIfFileExist(self):
try:
checkAppdata()
- open(str(appdata) + '\Generator CSV\style.cfg')
+ open(str(VAR.appdataPath) + '\Generator CSV\style.cfg')
except Exception as exceptInfo:
checkAppdata()
@@ -643,69 +724,6 @@ class GUI:
else:
var = (var.split(';')[0], int(var.split(';')[1]))
return [True, var]
-
-
-
- def R(self, record):
- self.__checkIfFileExist()
- content = {}
- for x in CD.open((str(appdata) + '\Generator CSV\style.cfg'), 'r', 'utf-8').read().strip('\r').split('\n'):
- x = x.split(' = ')
- try:
- name = x[0].split('(')[0]
- var = x[1]
- type = x[0].split('(')[1].strip(')')
- content[name] = [var.strip('\r'), type]
- except:
- continue
- checkingOutput = self.__checkIfRecordExist(content, record)
- if not checkingOutput[0]:
- MSG('E0005', True, checkingOutput[1])
- var = content[record]
- if var[1] == 'I':
- # Integer
- checkingOutput = self.__checkI(record, var[0])
- if checkingOutput[0]:
- return checkingOutput[1]
- else:
- MSG('E0005', True, checkingOutput[1])
- elif var[1] == 'B':
- # Boolean
- checkingOutput = self.__checkB(record, var[0])
- if checkingOutput[0]:
- return checkingOutput[1]
- else:
- MSG('E0005', True, checkingOutput[1])
- elif var[1] == 'C':
- # Color
- checkingOutput = self.__checkC(record, var[0])
- if checkingOutput[0]:
- return checkingOutput[1]
- else:
- MSG('E0005', True, checkingOutput[1])
- elif var[1] == 'P':
- # Path
- checkingOutput = self.__checkP(record, var[0])
- if checkingOutput[0]:
- return checkingOutput[1]
- else:
- MSG('E0005', True, checkingOutput[1])
- elif (var[1])[:2] == 'FA':
- # From Array
- checkingOutput = self.__checkFA(record, var[0], (var[1])[2:])
- if checkingOutput[0]:
- return checkingOutput[1]
- else:
- MSG('E0005', True, checkingOutput[1])
- elif var[1] == 'F':
- # Font
- checkingOutput = self.__checkF(record, var[0])
- if checkingOutput[0]:
- return checkingOutput[1]
- else:
- MSG('E0005', True, checkingOutput[1])
- else:
- MSG('E0005', True, 'Nie można rozpoznać typu klucza %s' % record)
@@ -718,6 +736,186 @@ GUI = GUI()
# ------------------------------- # Zarządzanie plikami formatu # ------------------------------- #
class FMT:
+ # Odczytywanie pojedyńczej zmiennej z pliku
+ def R(self, preset, record):
+ self.__checkIfFolderExist()
+ if preset in self.getList():
+ path = str(VAR.appdataPath) + '/Generator CSV/format-presets/%s.fmt' % preset
+ file = CD.open(path, 'r', 'utf-8').read().strip('\r').split('\n')
+ content = {}
+ for x in file:
+ x = x.split(' = ')
+ try:
+ name = x[0].split('(')[0]
+ var = x[1]
+ type = x[0].split('(')[1].strip(')')
+ content[name] = [var, type]
+ except:
+ continue
+ checkingOutput = self.__checkIfRecordExist(content, record)
+ if not checkingOutput[0]:
+ MSG('E0006', False, checkingOutput[1])
+ var = content[record]
+ if var[1] == 'B':
+ # Boolean
+ checkingOutput = self.__checkB(False, record, var[0])
+ if checkingOutput[0]:
+ return checkingOutput[1]
+ else:
+ MSG('E0006', False, checkingOutput[1])
+ elif var[1] == 'Ss':
+ # String - separator
+ checkingOutput = self.__checkSs(record, var[0])
+ if checkingOutput[0]:
+ return checkingOutput[1]
+ else:
+ MSG('E0006', False, checkingOutput[1])
+ elif var[1] == 'As':
+ # Array - separator
+ checkingOutput = self.__checkAs(False, record, var[0])
+ if checkingOutput[0]:
+ return checkingOutput[1]
+ else:
+ MSG('E0006', False, checkingOutput[1])
+ elif var[1] == 'I':
+ # Integer
+ checkingOutput = self.__checkI(False, record, var[0])
+ if checkingOutput[0]:
+ return checkingOutput[1]
+ else:
+ MSG('E0006', False, checkingOutput[1])
+ elif var[1] == 'Sc':
+ # Integer
+ checkingOutput = self.__checkSc(record, var[0])
+ if checkingOutput[0]:
+ return checkingOutput[1]
+ else:
+ MSG('E0006', False, checkingOutput[1])
+ else:
+ MSG('E0006', True, 'Nie można rozpoznać typu klucza %s' % record)
+ else:
+ content = {
+ "student" : True,
+ "personSeparator" : '',
+ "rowSeparator" : '',
+ "dataSeparators" : [],
+ "loginRow" : 0,
+ "loginPositionInRow" : 0,
+ "fnameRow" : 0,
+ "fnamePositionInRow" : 0,
+ "lnameRow" : 0,
+ "lnamePositionInRow" : 0,
+ "schoolRow" : 0,
+ "schoolPositionInRow" : 0,
+ "classRow" : 0,
+ "classPositionInRow" : 0,
+ "inputCoding" : 'utf-8',
+ }
+ var = content[record]
+ return var
+
+ # Zapisywanie zmian w pliku
+ def W(self, preset, changes):
+ self.__checkIfFolderExist()
+ if preset in self.getList():
+ file = CD.open(str(VAR.appdataPath) + '/Generator CSV/format-presets/%s.fmt' % preset, 'r', 'utf-8').read().split('\n')
+ if file[-1] == '':
+ file = file[:-1]
+ content = {}
+ for x in file:
+ x = x.split(' = ')
+ try:
+ name = x[0].split('(')[0]
+ var = x[1]
+ type = x[0].split('(')[1].strip(')')
+ content[name] = [var, type]
+ except Exception as exceptInfo:
+ MSG('E0006', False, exceptInfo)
+ else:
+ content = {
+ "student" : ['1', 'B'],
+ "personSeparator" : ['', 'Ss'],
+ "rowSeparator" : ['', 'Ss'],
+ "dataSeparators" : ['', 'As'],
+ "loginRow" : ['0', 'I'],
+ "loginPositionInRow" : ['0', 'I'],
+ "fnameRow" : ['0', 'I'],
+ "fnamePositionInRow" : ['0', 'I'],
+ "lnameRow" : ['0', 'I'],
+ "lnamePositionInRow" : ['0', 'I'],
+ "schoolRow" : ['0', 'I'],
+ "schoolPositionInRow" : ['0', 'I'],
+ "classRow" : ['0', 'I'],
+ "classPositionInRow" : ['0', 'I'],
+ "inputCoding" : ['utf-8', 'Sc']
+ }
+ for x in changes:
+ name = x
+ var = changes[name]
+ type = (content[name])[1]
+ if type == 'B':
+ checkingOutput = self.__checkB(True, name, var)
+ if checkingOutput[0]:
+ var = checkingOutput[1]
+ else:
+ MSG('E0006', False, checkingOutput[1])
+ return False
+ elif type == 'Ss':
+ checkingOutput = self.__checkSs(name, var)
+ if checkingOutput[0]:
+ var = checkingOutput[1]
+ else:
+ MSG('E0006', False, checkingOutput[1])
+ return False
+ elif type == 'As':
+ checkingOutput = self.__checkAs(True, name, var)
+ if checkingOutput[0]:
+ var = checkingOutput[1]
+ else:
+ MSG('E0006', False, checkingOutput[1])
+ return False
+ elif type == 'I':
+ # Integer
+ checkingOutput = self.__checkI(True, name, var)
+ if checkingOutput[0]:
+ var = checkingOutput[1]
+ else:
+ MSG('E0006', False, checkingOutput[1])
+ return False
+ elif type == 'Sc':
+ checkingOutput = self.__checkSc(name, var)
+ if checkingOutput[0]:
+ var = checkingOutput[1]
+ else:
+ MSG('E0006', False, checkingOutput[1])
+ return False
+ else:
+ MSG('E0006', False, 'Nie można rozpoznać typu klucza %s' % name)
+ return False
+ content[name] = [var, type]
+ try:
+ with CD.open(str(VAR.appdataPath) + '/Generator CSV/format-presets/%s.fmt' % preset, 'w', 'utf-8') as file:
+ for x in content:
+ file.write('%s(%s) = %s\n' % (x, (content[x])[1], (content[x][0])))
+ except Exception as exceptInfo:
+ MSG('E0017', False, exceptInfo)
+ return False
+ return True
+
+
+ # Funkcja zwracająca listę presetów
+ def getList(self):
+ self.__checkIfFolderExist()
+ filesList = OS.listdir(str(VAR.appdataPath) + '/Generator CSV/format-presets')
+ formatPresetsList = []
+ for x in filesList:
+ if x[-4:] == '.fmt':
+ formatPresetsList.append(x[:-4])
+ else:
+ continue
+ return formatPresetsList
+
+
# Funkcje sprawdzające istnienie
def __checkIfFolderExist(self):
checkAppdata()
@@ -800,185 +998,6 @@ class FMT:
return [True, var]
- # Funkcja zwracająca listę presetów
- def getList(self):
- self.__checkIfFolderExist()
- filesList = OS.listdir(str(appdata) + '/Generator CSV/format-presets')
- formatPresetsList = []
- for x in filesList:
- if x[-4:] == '.fmt':
- formatPresetsList.append(x[:-4])
- else:
- continue
- return formatPresetsList
-
-
-
- def R(self, preset, record):
- self.__checkIfFolderExist()
- if preset in self.getList():
- path = str(appdata) + '/Generator CSV/format-presets/%s.fmt' % preset
- file = CD.open(path, 'r', 'utf-8').read().strip('\r').split('\n')
- content = {}
- for x in file:
- x = x.split(' = ')
- try:
- name = x[0].split('(')[0]
- var = x[1]
- type = x[0].split('(')[1].strip(')')
- content[name] = [var, type]
- except:
- continue
- checkingOutput = self.__checkIfRecordExist(content, record)
- if not checkingOutput[0]:
- MSG('E0006', False, checkingOutput[1])
- var = content[record]
- if var[1] == 'B':
- # Boolean
- checkingOutput = self.__checkB(False, record, var[0])
- if checkingOutput[0]:
- return checkingOutput[1]
- else:
- MSG('E0006', False, checkingOutput[1])
- elif var[1] == 'Ss':
- # String - separator
- checkingOutput = self.__checkSs(record, var[0])
- if checkingOutput[0]:
- return checkingOutput[1]
- else:
- MSG('E0006', False, checkingOutput[1])
- elif var[1] == 'As':
- # Array - separator
- checkingOutput = self.__checkAs(False, record, var[0])
- if checkingOutput[0]:
- return checkingOutput[1]
- else:
- MSG('E0006', False, checkingOutput[1])
- elif var[1] == 'I':
- # Integer
- checkingOutput = self.__checkI(False, record, var[0])
- if checkingOutput[0]:
- return checkingOutput[1]
- else:
- MSG('E0006', False, checkingOutput[1])
- elif var[1] == 'Sc':
- # Integer
- checkingOutput = self.__checkSc(record, var[0])
- if checkingOutput[0]:
- return checkingOutput[1]
- else:
- MSG('E0006', False, checkingOutput[1])
- else:
- MSG('E0006', True, 'Nie można rozpoznać typu klucza %s' % record)
- else:
- content = {
- "student" : True,
- "personSeparator" : '',
- "rowSeparator" : '',
- "dataSeparators" : [],
- "loginRow" : 0,
- "loginPositionInRow" : 0,
- "fnameRow" : 0,
- "fnamePositionInRow" : 0,
- "lnameRow" : 0,
- "lnamePositionInRow" : 0,
- "schoolRow" : 0,
- "schoolPositionInRow" : 0,
- "classRow" : 0,
- "classPositionInRow" : 0,
- "inputCoding" : 'utf-8',
- }
- var = content[record]
- return var
-
- def W(self, preset, changes):
- self.__checkIfFolderExist()
- if preset in self.getList():
- file = CD.open(str(appdata) + '/Generator CSV/format-presets/%s.fmt' % preset, 'r', 'utf-8').read().split('\n')
- if file[-1] == '':
- file = file[:-1]
- content = {}
- for x in file:
- x = x.split(' = ')
- try:
- name = x[0].split('(')[0]
- var = x[1]
- type = x[0].split('(')[1].strip(')')
- content[name] = [var, type]
- except Exception as exceptInfo:
- MSG('E0006', False, exceptInfo)
- else:
- content = {
- "student" : ['1', 'B'],
- "personSeparator" : ['', 'Ss'],
- "rowSeparator" : ['', 'Ss'],
- "dataSeparators" : ['', 'As'],
- "loginRow" : ['0', 'I'],
- "loginPositionInRow" : ['0', 'I'],
- "fnameRow" : ['0', 'I'],
- "fnamePositionInRow" : ['0', 'I'],
- "lnameRow" : ['0', 'I'],
- "lnamePositionInRow" : ['0', 'I'],
- "schoolRow" : ['0', 'I'],
- "schoolPositionInRow" : ['0', 'I'],
- "classRow" : ['0', 'I'],
- "classPositionInRow" : ['0', 'I'],
- "inputCoding" : ['utf-8', 'Sc']
- }
- for x in changes:
- name = x
- var = changes[name]
- type = (content[name])[1]
- if type == 'B':
- checkingOutput = self.__checkB(True, name, var)
- if checkingOutput[0]:
- var = checkingOutput[1]
- else:
- MSG('E0006', False, checkingOutput[1])
- return False
- elif type == 'Ss':
- checkingOutput = self.__checkSs(name, var)
- if checkingOutput[0]:
- var = checkingOutput[1]
- else:
- MSG('E0006', False, checkingOutput[1])
- return False
- elif type == 'As':
- checkingOutput = self.__checkAs(True, name, var)
- if checkingOutput[0]:
- var = checkingOutput[1]
- else:
- MSG('E0006', False, checkingOutput[1])
- return False
- elif type == 'I':
- # Integer
- checkingOutput = self.__checkI(True, name, var)
- if checkingOutput[0]:
- var = checkingOutput[1]
- else:
- MSG('E0006', False, checkingOutput[1])
- return False
- elif type == 'Sc':
- checkingOutput = self.__checkSc(name, var)
- if checkingOutput[0]:
- var = checkingOutput[1]
- else:
- MSG('E0006', False, checkingOutput[1])
- return False
- else:
- MSG('E0006', False, 'Nie można rozpoznać typu klucza %s' % name)
- return False
- content[name] = [var, type]
- try:
- with CD.open(str(appdata) + '/Generator CSV/format-presets/%s.fmt' % preset, 'w', 'utf-8') as file:
- for x in content:
- file.write('%s(%s) = %s\n' % (x, (content[x])[1], (content[x][0])))
- except Exception as exceptInfo:
- MSG('E0017', False, exceptInfo)
- return False
- return True
-
-
FMT = FMT()
@@ -3154,8 +3173,8 @@ class mainWindow:
def settingsButtonPDUOAction(self):
if MSG('A0005', False):
try:
- OS.remove(str(appdata) + '\Generator CSV\config.cfg')
- SU.copy('configs/config.cfg', str(appdata) + '\Generator CSV\config.cfg')
+ OS.remove(str(VAR.appdataPath) + '\Generator CSV\config.cfg')
+ SU.copy('configs/config.cfg', str(VAR.appdataPath) + '\Generator CSV\config.cfg')
except Exception as exceptInfo:
MSG('E0001', True, exceptInfo)
MSG('I0002', True)
@@ -3165,8 +3184,8 @@ class mainWindow:
def settingsButtonPDUWAction(self):
if MSG('A0006', False):
try:
- OS.remove(str(appdata) + '\Generator CSV\style.cfg')
- SU.copy('configs/style.cfg', str(appdata) + '\Generator CSV\style.cfg')
+ OS.remove(str(VAR.appdataPath) + '\Generator CSV\style.cfg')
+ SU.copy('configs/style.cfg', str(VAR.appdataPath) + '\Generator CSV\style.cfg')
except Exception as exceptInfo:
MSG('E0001', True, exceptInfo)
MSG('I0002', True)
@@ -3178,7 +3197,7 @@ class mainWindow:
selected = self.selectFPListbox.curselection()
for x in selected:
try:
- OS.remove(str(appdata) + ('/Generator CSV/format-presets') + ('\%s.fmt' % self.selectFPListbox.get(x)))
+ OS.remove(str(VAR.appdataPath) + ('/Generator CSV/format-presets') + ('\%s.fmt' % self.selectFPListbox.get(x)))
except Exception as exceptInfo:
MSG('E0015', True, exceptInfo)
MSG('I0001', False)