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)

diff --git a/documentation/instruction.html b/documentation/instruction.html index 6f7635f..7e1a31e 100644 --- a/documentation/instruction.html +++ b/documentation/instruction.html @@ -84,7 +84,7 @@

Nagłówek dla pliku wyjściowego office

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)