diff --git a/.gitea/config/gitversion.yml b/.gitea/config/gitversion.yml new file mode 100644 index 0000000..57caa9e --- /dev/null +++ b/.gitea/config/gitversion.yml @@ -0,0 +1,9 @@ +next-version: 1.0.0 +mode: ContinuousDeployment +assembly-versioning-scheme: MajorMinorPatch +assembly-file-versioning-scheme: MajorMinorPatch + +branches: + main: + regex: ^main$ + increment: Patch \ No newline at end of file diff --git a/.gitea/readme/icon.png b/.gitea/readme/icon.png new file mode 100644 index 0000000..82b7840 Binary files /dev/null and b/.gitea/readme/icon.png differ diff --git a/.gitea/workflows/analyze.yml b/.gitea/workflows/analyze.yml new file mode 100644 index 0000000..43b0e26 --- /dev/null +++ b/.gitea/workflows/analyze.yml @@ -0,0 +1,34 @@ +name: Analyze code + +on: + push: + branches: + - "dev" + paths: + - "src**" + - "requirements.txt" + pull_request: + branches: + - "dev" + - "main" + paths: + - "src**" + - "requirements.txt" + +jobs: + analyze: + name: Analyze code + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.10" + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + pip install pylint + - name: Analysing the code with pylint + run: pylint --exit-zero $(git ls-files 'src/*.py') \ No newline at end of file diff --git a/.gitea/workflows/analyze_and_publish.yml b/.gitea/workflows/analyze_and_publish.yml new file mode 100644 index 0000000..1f9de86 --- /dev/null +++ b/.gitea/workflows/analyze_and_publish.yml @@ -0,0 +1,77 @@ +name: Analyze code and publish app + +on: + push: + branches: + - "main" + paths: + - "src**" + - "requirements.txt" + +jobs: + analyze: + name: Analyze code + steps: + - name: Checkout + uses: actions/checkout@v6 + - name: Set up Python + uses: actions/setup-python@v6 + with: + python-version: "3.7" + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + pip install pylint + - name: Analysing the code with pylint + run: pylint --exit-zero $(git ls-files 'src/*.py') + publish: + name: Publish script + needs: analyze + steps: + - name: Checkout + uses: actions/checkout@v6.0.2 + with: + fetch-depth: 0 + - name: Setup .NET + uses: actions/setup-dotnet@v3 + with: + dotnet-version: 10.0.x + - name: Setup GitVersion + uses: gittools/actions/gitversion/setup@v4.2.0 + with: + versionSpec: 6.4.x + - name: Determine version + uses: gittools/actions/gitversion/execute@v4.2.0 + id: gitversion + with: + configFilePath: ./.gitea/config/gitversion.yml + - name: Replace version + run: sed -i 's/WIP/${{steps.gitversion.outputs.SemVer}}/g' ./src/configs/config.cfg + - name: Create package root directory + run: | + mkdir package + mkdir package/generator_csv + cp -r src/* package/generator_csv/ + cp requirements.txt package/requirements.txt + - name: Create .TAR.GZ archive + uses: ksm2/archive-action@v1 + with: + format: "tar.gz" + name: generator_csv_${{steps.gitversion.outputs.SemVer}} + root-directory: "package" + - name: Create .ZIP archive + uses: ksm2/archive-action@v1 + with: + format: "zip" + name: generator_csv_${{steps.gitversion.outputs.SemVer}} + root-directory: "package" + - name: Create Release + uses: akkuman/gitea-release-action@v1 + with: + tag_name: ${{steps.gitversion.outputs.SemVer}} + name: ${{steps.gitversion.outputs.SemVer}} + files: |- + generator_csv_${{steps.gitversion.outputs.SemVer}}.tar.gz + generator_csv_${{steps.gitversion.outputs.SemVer}}.zip + \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..68bc17f --- /dev/null +++ b/.gitignore @@ -0,0 +1,160 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..933a527 --- /dev/null +++ b/LICENSE @@ -0,0 +1,18 @@ +MIT License + +Copyright (c) 2020 Mateusz Skoczek + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/assets/documentation-page/about-program/icon.png b/assets/documentation-page/about-program/icon.png deleted file mode 100644 index e0314ab..0000000 Binary files a/assets/documentation-page/about-program/icon.png and /dev/null differ diff --git a/assets/documentation-page/description/format-danych.png b/assets/documentation-page/description/format-danych.png deleted file mode 100644 index d6b65f5..0000000 Binary files a/assets/documentation-page/description/format-danych.png and /dev/null differ diff --git a/assets/documentation-page/description/generator-csv.png b/assets/documentation-page/description/generator-csv.png deleted file mode 100644 index 0475cda..0000000 Binary files a/assets/documentation-page/description/generator-csv.png and /dev/null differ diff --git a/assets/documentation-page/description/o-programie.png b/assets/documentation-page/description/o-programie.png deleted file mode 100644 index 9285df6..0000000 Binary files a/assets/documentation-page/description/o-programie.png and /dev/null differ diff --git a/assets/documentation-page/description/ustawienia.png b/assets/documentation-page/description/ustawienia.png deleted file mode 100644 index 1c335c5..0000000 Binary files a/assets/documentation-page/description/ustawienia.png and /dev/null differ diff --git a/assets/documentation-page/icon.ico b/assets/documentation-page/icon.ico deleted file mode 100644 index 49f2657..0000000 Binary files a/assets/documentation-page/icon.ico and /dev/null differ diff --git a/assets/documentation-page/icon.png b/assets/documentation-page/icon.png deleted file mode 100644 index e0314ab..0000000 Binary files a/assets/documentation-page/icon.png and /dev/null differ diff --git a/assets/documentation-page/instruction/example-input-data.png b/assets/documentation-page/instruction/example-input-data.png deleted file mode 100644 index ad321b9..0000000 Binary files a/assets/documentation-page/instruction/example-input-data.png and /dev/null differ diff --git a/assets/documentation-page/instruction/generate-input-file-settings.png b/assets/documentation-page/instruction/generate-input-file-settings.png deleted file mode 100644 index cbd2c1c..0000000 Binary files a/assets/documentation-page/instruction/generate-input-file-settings.png and /dev/null differ diff --git a/assets/documentation-page/instruction/generate-output-file-settings.png b/assets/documentation-page/instruction/generate-output-file-settings.png deleted file mode 100644 index 0487107..0000000 Binary files a/assets/documentation-page/instruction/generate-output-file-settings.png and /dev/null differ diff --git a/assets/documentation-page/instruction/input-name.png b/assets/documentation-page/instruction/input-name.png deleted file mode 100644 index 94522b6..0000000 Binary files a/assets/documentation-page/instruction/input-name.png and /dev/null differ diff --git a/assets/icon.png b/assets/icon.png deleted file mode 100644 index e0314ab..0000000 Binary files a/assets/icon.png and /dev/null differ diff --git a/assets/tab-icons/icon.png b/assets/tab-icons/icon.png deleted file mode 100644 index e0314ab..0000000 Binary files a/assets/tab-icons/icon.png and /dev/null differ diff --git a/documentation/about_program.html b/documentation/about_program.html deleted file mode 100644 index 18375ee..0000000 --- a/documentation/about_program.html +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - Generator CSV - - -

-
-
-
-
- -
-
-
-
-

- -

- Generator CSV -

- -

- Wersja 4.0 (Build 20254) -

- -

-
- © styczeń 2019 - wrzesień 2020
-
- Mateusz Skoczek
-
- dla ZSP Sobolew
-

- -
-
-
-
-
-
-
-
-
-
- -

Historia wersji

- -

Wersja 1.0

-
- -
-
-
- -

Wersja 2.0

-
- -
-
-
- -

Wersja 3.0

-
- -
-
-
- -

Wersja 3.0.1

-
- -
-
-
- -

Wersja 4.0 (work in progress)

-
- -
-
-
- - \ No newline at end of file diff --git a/documentation/content.css b/documentation/content.css deleted file mode 100644 index 19859c5..0000000 --- a/documentation/content.css +++ /dev/null @@ -1,104 +0,0 @@ -h1 { - color: #C0C0C0; - font-family: 'Segoe UI'; - font-size: 35px; - text-align: center; -} - -h2 { - color: #C0C0C0; - font-family: 'Segoe UI'; - font-size: 25px; - text-align: center; -} - -h5 { - color: #C0C0C0; - font-family: 'Segoe UI'; - font-size: 15px; -} - -p { - color: #C0C0C0; - font-family: 'Segoe UI'; -} - -#description-text { - color: #C0C0C0; - font-family: 'Segoe UI'; - font-size: 17px; - line-height: 25px; - text-align: center; -} - -#description-image { - text-align: center; -} - -#about-program-image { - text-align: center; -} -#about-program-main-text { - color: #C0C0C0; - font-family: 'Segoe UI'; - font-size: 17px; - line-height: 25px; - text-align: center; -} - -#about-program-text-centered { - text-align: center; -} - -#about-program-changelog-main-version { - color: #C0C0C0; - font-family: 'Segoe UI'; - font-size: 17px; - font-weight: 600; -} - -td { - color: #C0C0C0; - font-family: 'Segoe UI'; -} - -th { - color: #C0C0C0; - font-family: 'Segoe UI'; -} - -.accordion { - background-color: #333842; - color: #444; - cursor: pointer; - padding: 18px; - width: 100%; - text-align: left; - border: none; - outline: none; - transition: 0.4s; - color: #C0C0C0; - font-size: 18px; - font-family: 'Segoe UI'; -} - -.active, .accordion:hover { - background-color: #3a3f4b; -} - -.panel { - padding: 0 18px; - background-color: #2e313b; - display: none; - overflow: hidden; -} - -li { - color: #C0C0C0; - font-family: 'Segoe UI'; -} - -code { - color: #C0C0C0; - font-size: large; -} \ No newline at end of file diff --git a/documentation/description.html b/documentation/description.html deleted file mode 100644 index 290677b..0000000 --- a/documentation/description.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - Generator CSV - - -

Program "Generator CSV" służy do przetwarzania plików danymi uczniów/nauczycieli i generowania plików wyjściowych w formacie pozwalającym na import danych na stronie szkoły oraz portal.office.com

-
-
-


-


-


-


- - \ No newline at end of file diff --git a/documentation/index.html b/documentation/index.html deleted file mode 100644 index 915b1cb..0000000 --- a/documentation/index.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - Generator CSV - - -
-
- -
-

GENERATOR CSV

-
- -
-
- -
-
- - \ No newline at end of file diff --git a/documentation/instruction.html b/documentation/instruction.html deleted file mode 100644 index 7e1a31e..0000000 --- a/documentation/instruction.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - - - Generator CSV - - - -
-

Dane dla przykładu:

-
-

W praktyce układ danych wygląda tak (* - nieznaczące dla programu dane):

-

[imię] [nazwisko]
[klasa] [szkoła]
[login], [haslo*]

-

Uruchom program i otwórz zakładkę FORMAT DANYCH. W pierwszej kolejności należy nadać nazwę presetowi formatu w polu zaznaczonym poniżej lub wybrać preset już istniejący z listy rozwijanej

-
-

Aby przejśc do edycji presetu należy wcisnąć przycisk WCZYTAJ

-
-
Typ osoby
-

Wybierz odpowiednią opcję w zależności od tego jakich osób dane znajdują się w pliku wejściowym

-
Separator pomiędzy danymi
-

W tym polu należy wpisać znaki, które oddzielają zbiór danych pojeńczych osób. Jeżeli zbiór danych odziela znak końca wiersza (wciśnięcie ENTER) należy wpisać <enter> (ilość zależna od ilości znaków końca wiersza). Niedozwolone znaki to litery, cyfry oraz * i \. Dla przykładowych danych będzie to "<enter><enter>"

-
Separator pomiędzy wierszami
-

W tym polu należy wpisać znaki, które oddzielają wiersze. Zazwyczaj jest to jeden znak końca wiersza. Jeżeli wiersze odziela znak końca wiersza (wciśnięcie ENTER) należy wpisać <enter> (ilość zależna od ilości znaków końca wiersza). Niedozwolone znaki to litery, cyfry oraz * i \. Dla przykładowych danych będzie to "<enter>"

-
Separatory pomiędzy danymi
-

W tym polu należy wpisać znaki, które oddzielają pojedyńcze dane. Każdy kolejny separator musi być zapisany w następnej linijce. Jeżeli dane odziela znak końca wiersza (wciśnięcie ENTER) należy wpisać <enter> (ilość zależna od ilości znaków końca wiersza). Niedozwolone znaki to litery, cyfry oraz * i \. Dla przykładowych danych będzie to (znaki są podkreślone aby je wyróżnić):
"""
, 

"""

-
Prawa kolumna - pozycja danych w zbiorze
-

W tej sekcji należy dla każdego typu danych ustawić jego położenie w zbiorze. Typy SZKOŁA i KLASA nie są istotne jeżeli w sekcji TYP OSOBY zosła zaznaczona opcja Nauczyciele. Dla przykładowych danych uczniów bedzie to:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
WierszPozycja
w wierszu
Login31
Imię11
Nazwisko12
Szkoła22
Klasa21
-
Prawa kolumna - Kodowanie
-

W tym polu należy wybrać kodowanie pliku wejściowego.

-
-

Aby zapisać preset należy wcisnąć przycisk ZAPISZ. Aby anulować tworzenie należy wcisnąć przycisk Anuluj

-
- - -
-

Uruchom program i przejdź do zakładki USTAWIENIA.

-
-
Kodowanie wyjściowe dla pliku poczty
-

W tym polu należy wybrać kodowanie, w jakim ma być zapisany plik csv z danymi uczniów do importu w panelu administracyjnym serwisu szkoły

-
Kodowanie wyjściowe dla pliku office
-

W tym polu należy wybrać kodowanie, w jakim ma być zapisany plik csv z danymi uczniów do importu w panelu administracyjnym serwisu portal.office.com

-
Domena (używana w mailu)
-

W tym polu należy wpisać domenę serwisu szkoły. Będzie ona używana w mailu każdego uzytkownika. Przykład: jan.kowalski2023a@losobolew.pl

-
Quota (MB)
-

W tym polu należy wpisać ilość miejsca (w megabajtach) przeznaczoną dla każdego użytkownika na przechowywanie maili. Te dane są używane w pliku wyjściowym poczty. Przykład: jan.kowalski2023a@losobolew.pl,1234567u:JK,500

-
Kraj (zapisany w danych na office)
-

W tym polu należy wpisać nazwę kraju zamieszkania użytkowników. Będzie ona wykorzystywana w pliku wyjściowym office oraz widoczna w profilu użytkownika w serwisie office. Przykład: jan.kowalski2023a@losobolew.pl,Jan,Kowalski,Jan Kowalski,uczeń,1b LO,,,,,,,,,Rzeczpospolita Polska

-
Nagłówek dla pliku wyjściowego poczty
-

Jeżeli chcesz aby w pierwszej linii pliku wyjściowego dla poczty znajdował się nagłowek, zaznacz opcję "Umieść w pliku". Zawartość nagłówka można edytować w polu tekstowym po lewej.

-
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 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).

-
-

Aby zapisać ustawienia należy wcisnąć przycisk ZAPISZ. Aby anulować zmiany wciśnij przycisk Anuluj

-
- - -
-
Krok 1
-

W pierwszej kolejności należy przygotować pliki wejściowe oraz stworzyć presety formatu dla tych plików, według instrukcji w sekcji "Tworzenie/edytowanie format presetu dla danego pliku źródłowego" (jednego presetu formatu można używac do kilku plików jeżeli pliki mają ten sam format i to samo kodowanie)

-
Krok 2
-

Przejdź do zakładki GENERATOR CSV. Możesz przetworzyć naraz 4 pliki wejściowe. Dla każdego pliku należy wybrać jego lokalizację (wpisać ją w polu, oznaczonym kolorem czerwonym na poniższym zdjęciu, lub otworzyć okno wyboru lokalizacji za pomocą przycisku "Przeglądaj" i tam wybrać plik. Następnie należy wybrać preset formatu, odpowiedni dla pliku wejściowego, w polu oznaczonym kolorem zielonym na poniższym zdjęciu.

-
-
Krok 3
-

Wybierz lokalizację zapisu pliku wyjściowego dla serwisu szkoły, wpisując lokalizację wraz z nazwą pliku w polu, oznaczonym kolorem czerwonym na poniższym zdjęciu, lub otwierając okno wyboru lokalizacji za pomocą przycisku "Przeglądaj" obok tego pola i tam wybierając plik.
Wybierz lokalizację zapisu pliku wyjściowego dla serwisu portal.office.com, wpisując lokalizację wraz z nazwą pliku w polu, oznaczonym kolorem zielonym na poniższym zdjęciu, lub otwierając okno wyboru lokalizacji za pomocą przycisku "Przeglądaj" obok tego pola i tam wybierając plik.

-
-
Krok 4
-

Aby rozpocząć generowanie wciśnij przycisk START i potwierdź komunikat. Pliki wyjściowe zostaną zapisane w wybranych lokalizacjach. Przed importem upewnij się że w plikach nie występują błędy.

-
- - -
-
Krok 1
-

Uruchom program i przejdź do zakładki USTAWIENIA.

-
Krok 2
-

Naciśnij przycisk "Zarządzaj presetami formatu".

-
Krok 3
-

Zaznacz presety formatu które chcesz usunąć.

-
Krok 4
-

Naciśnij przycisk "Usuń zaznaczone"

-
- - -
-
Krok 1
-

Uruchom program i przejdź do zakładki USTAWIENIA.

-
Krok 2
-

Naciśnij przycisk "Przywróć domyślne ustawienia ogólne". Po potwierdzeniu i ponownym uruchomieniu programu, ustawienia zostaną przywrócone do ustawień fabrycznych.

-
- - -
-
Krok 1
-

Uruchom program i przejdź do zakładki USTAWIENIA.

-
Krok 2
-

Naciśnij przycisk "Przywróć domyślne ustawienia wyglądu". Po potwierdzeniu i ponownym uruchomieniu programu, wygląd zostanie przywrócony do ustawień fabrycznych.

-
- - -
-
Krok 1
-

Otwórz menu start i wpisz "%appdata%"

-
Krok 2
-

Przejdź do folderu "Generator CSV"

-
Krok 3
-

Za ustawienia programu odpowiedzialny jest plik "config.cfg", a za wygląd plik "style.cfg". Użyj dowolnego edytora plików tekstowych, do edycji tych plików. Więcej informacji o tych plikach znajduje się w Dokumentacji technicznej.
Aby przywrócić te pliki do stanu fabrycznego wykonaj kroki z sekcji odpowiednio "Przywracanie domyślnych ustawień ogólnych programu" lub "Przywracanie domyślnego wyglądu programu"

-
- - - - \ No newline at end of file diff --git a/documentation/main.css b/documentation/main.css deleted file mode 100644 index 74bac21..0000000 --- a/documentation/main.css +++ /dev/null @@ -1,80 +0,0 @@ -body, html{ - background-color: #21242D; - margin: 0px; - height: 100%; - width: 100%; -} - - -header { - width: 100%; - position: sticky; -} - -#header-image { - background-color: #333842; - width: 100px; - height: 100px; - float: left; - padding: 25px; -} - -#header-text { - background-color: #333842; - overflow: auto; - line-height: 40px; - font-family: 'Segoe UI'; - color: #C0C0C0; - font-size: 30px; - padding: 25px; -} - - - - -nav { - width: 100%; -} - -#menu-ul { - width: 100%; - height: 50px; - padding: 0; - margin: 0; - list-style: none; -} - -#menu-li a { - display: block; - float: left; - text-align: center; - font-family: 'Segoe UI'; - margin-right: 0.05%; - margin-left: 0.05%; - font-size: 20px; - width: 24.9%; - line-height: 50px; - text-decoration: none; - color: #C0C0C0; - background-color: #2e313b; -} - -#menu-li a:hover { - color: #C0C0C0; - background: #333842; -} - - - -section { - width: 100%; -} - -iframe { - float: left; - width: 100%; - border: none; - height: calc(100% - 220px); - overflow: scroll; - position: absolute; -} \ No newline at end of file diff --git a/documentation/program_documentation.html b/documentation/program_documentation.html deleted file mode 100644 index 790af67..0000000 --- a/documentation/program_documentation.html +++ /dev/null @@ -1,388 +0,0 @@ - - - - - - - Generator CSV - - - -
-

Aby móc uruchomić aplikację w wersji developerskiej należy pobrać Pythona (wersja zalecana: 3.8.5) oraz wymagane biblioteki (wymienione w sekcji 'generator.pyw - Import bibliotek')

-
- - -
-

- Biblioteki główne
-
- W tej sekcji importowane są wszystkie biblioteki niezwiązane z interfejsem graficznych
-

-

-

-
- Biblioteki interfejsu graficznego
-
- W tej sekcji importowane są wszystkie biblioteki związane z interfejsem graficznym -
-

-

-
- - -
-

- 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% -

-
- - -
-

- Lista komunikatów
-
- Słownik MSGlist zawiera listę komunikatów. Format: '[kod dialogowy]' : '[komunikat]'. Kod dialogowy składa się z [jednoznakowego znacznika rodzaju okna dialogowego][czterocyfrowego numeru komunikatu]
-
-
- Rodzaje okien dialogowych: -

-

-

-
- Funkcja odpowiedzialna za wywoływanie komunikatów dialogowych
-
- 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ę. -

-
- - -
-

- Klasa dataProcess odpowiedzialna za przetwarzanie plików wejściowych i generowanie plików wyjściowych
-
-
- Główna funkcja klasy (start)
-
- Funkcja ta odpowiedzialna za zainicjowanie kolejnych funkcji w odpowiedniej kolejności oraz zwrócenie informacji o błędach lub pomyślnym wykonaniu polecenia
- 1. Inicjacja funkcji __checkIfAtLeastOneInputFileIsFilled w celu sprawdzenia czy przynajmniej jedno pole plików wejściowych zostało wypełnione
- 2. Inicjacja funkcji __checkIfInputFilesIsReadable w celu sprawdzenia czy pliki wejściowe, do których ścieżki zostały podane, są możliwe do odczytania
- 3. Inicjacja funkcji __checkIfInputFilesFormatPresetsExist w celu sprawdzenia czy format presety, które zostały wybrane, istnieją
- 4. Inicjacja funkcji __getData w celu zebrania danych z plików wejściowych
- 5. Dla każdego zbioru danych - for x in data (dla każdej osoby), inicjacja funkcji __checkLogin, __checkFname, __checkLname, oraz dla uczniów __checkSchool, __checkClass, w celu sprawdzenia poprawności danych
- 6. Inicjacja funkcji __processData w celu przetworzenia danych w linie gotowe do zapisania w plikach wyjściowych
- 7. Inicjacja funkcji __checkIfCreatingOutputFilesIsPossible w celu sprawdzenia czy możliwe jest utworzenie plików wyjściowych
- 8. Inicjacja funkcji __saveData w celu zapisania danych w plikach wyjściowych
- Funkcja zwraca listę zawierającą zmienne boolean potwierdzające w którym momencie zakończyło się wykonywanie funkcji (z powodu błędu lub pomyślnego ukończenia operacji)
-
-
- Funkcje sprawdzające istnienie -
- __checkIfAtLeastOneInputFileIsFilled - sprawdza czy przynajmniej jedno pole plików wejściowych zostało wypełnione oraz zwraca dane z wypełnionych pól
- __checkIfInputFilesIsReadable - sprawdza czy pliki wejściowe są możliwe do odczytania
- __checkIfInputFilesFormatPresetsExist - sprawdza czy wybrane format presety istnieją
- __checkIfCreatingOutputFilesIsPossible - sprawdza czy utworzenie plików wyjściowych jest możliwe
-
-
- Funkcje sprawdzające poprawność -
- Funkcje te sprawdzają poprawność określonych typów danych. -
-
- Wyodrębnienie danych z plików (__getData)
-
- Funkcja odpowiedzialna jest za wyodrębnienie danych z pliku (path) na podstawie określonego format presetu (format) - Dla każdego zbioru ścieżek plików wejściowych i format presetów (for x in input):
- 1. Pobranie danych z pliku formatu (za pomocą funkcji FMT.R)
- 2. Pobranie zawartości z pliku wyjściowego i podzielenie ich na zbiory danych pojedyńczych osób (.split(personseparator))
- Dla każdego zbioru danych pojedyńczych osób (for x in file):
- 3. Dzielenie zbioru danych na linie (x.split(linesSeparator))
- 4. Dla każdej linii: dzielenie danych na pojedyńcze segmenty separatorami z listy dataSeparators
- 5. Wyodrębnienie wymaganych danych ze zbioru
- 6. Dodanie danych pojedyńczej osoby do listy data
-
-
- Przetworzenie danych (__processData)
-
- Funkcja odpowiedzialna jest za przetworzenie danych w linie gotowe do zapisania w plikach wyjściowych
- Funkcja zwraca listę [mailData, officeData]
-
-
- Zapisanie danych (__saveData)
-
- Funkcja odpowiedzialna jest za zapisanie danych w plikach wyjściowych dla poczty i dla office -

-
- - -
-

- Klasa GUI odpowiada za interfejs programu
-
-
- 1. Główna funkcja programu
-
- - Stworzenie okna
- - Inicjacja styli kontrolek
- - Kontrolki
-
-
- Akcje przycisków
-
- Funkcje inicjowane przez naciśnięcie przycisków -

-
- - - - \ No newline at end of file diff --git a/icon.ico b/icon.ico deleted file mode 100644 index 49f2657..0000000 Binary files a/icon.ico and /dev/null differ diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..49d5cad --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +pillow=9.0.1 +tk \ No newline at end of file diff --git a/generator.pyw b/src/__main__.pyw similarity index 99% rename from generator.pyw rename to src/__main__.pyw index 73e2aa4..a5913cc 100644 --- a/generator.pyw +++ b/src/__main__.pyw @@ -19,6 +19,7 @@ import time as TM import codecs as CD import pathlib as PT import shutil as SU +import webbrowser as WB # Biblioteki interfejsu graficznego @@ -39,9 +40,8 @@ from PIL import Image as PLimg class VAR: # Informacje o programie programName = 'Generator CSV' - programVersion = '4.0' programVersionStage = '' - programVersionBuild = '20254' + programVersionBuild = '26000' programCustomer = 'ZSP Sobolew' programAuthors = ['Mateusz Skoczek'] programToW = ['styczeń', '2019', 'wrzesień', '2020'] @@ -80,7 +80,6 @@ MSGlist = { 'E0013' : 'Nie można utworzyć plików wejściowych', 'E0014' : 'Nie można zapisać plików wejściowych', 'E0015' : 'Nie można usunąć wybranych format presetów', - 'E0016' : 'Nie można uruchomić pliku instrukcji (documentation/index.html)', 'E0017' : 'Nie można zapisać pliku formatu', 'A0001' : 'Czy chcesz zapisać? Zostanie utworzony nowy plik', 'A0002' : 'Czy chcesz zapisać? Plik zostanie nadpisany', @@ -197,7 +196,7 @@ class checkAppdata: # Przywracanie plików konfiguracyjnych def __restoreCFG(self, configFileName): try: - SU.copy(('configs\%s.cfg' % configFileName), str(VAR.appdataPath) + ('\Generator CSV\%s.cfg' % configFileName)) + SU.copy(OS.path.join(OS.path.dirname(OS.path.abspath(__file__)), ('configs\%s.cfg' % configFileName)), str(VAR.appdataPath) + ('\Generator CSV\%s.cfg' % configFileName)) except Exception as exceptInfo: MSG('E0001', True, exceptInfo) @@ -690,6 +689,7 @@ class GUI: return [True, var] def __checkP(self, record, var): + var = OS.path.join(OS.path.dirname(OS.path.abspath(__file__)), var.replace("/","\\")) try: check = open(var) except: @@ -1310,11 +1310,11 @@ class mainWindow: def __init__(self, master): # Okno self.master = master - master.title('%s %s %s' % (VAR.programName, VAR.programVersion, VAR.programVersionStage)) + master.title('%s %s %s' % (VAR.programName, CFG.R('version'), VAR.programVersionStage)) master.geometry('%ix%i' % (GUI.R('windowWidth'), GUI.R('windowHeight'))) master.resizable(width = GUI.R('windowWidthResizable'), height = GUI.R('windowHeightResizable')) master.configure(bg = GUI.R('windowMainBG')) - master.iconbitmap(GUI.R('mainIcon')) + master.iconbitmap(OS.path.join(OS.path.dirname(OS.path.abspath(__file__)), GUI.R('mainIcon'))) @@ -2826,7 +2826,7 @@ class mainWindow: # Wersja programu self.aboutInfoProgramNameLabel = TKttk.Label(self.aboutInfoFrame) self.aboutInfoProgramNameLabel.config(style = 'label1.TLabel') - self.aboutInfoProgramNameLabel.config(text = 'Wersja %s %s (Build %s)' % (VAR.programVersion, VAR.programVersionStage, VAR.programVersionBuild)) + self.aboutInfoProgramNameLabel.config(text = 'Wersja %s %s (Build %s)' % (CFG.R('version'), VAR.programVersionStage, VAR.programVersionBuild)) self.aboutInfoProgramNameLabel.pack() # (3) Pozostałe informacje ############## @@ -3207,7 +3207,7 @@ class mainWindow: self.ZPFWindow.geometry('%ix%i' % (GUI.R('ZPFWindowWidth'), GUI.R('ZPFWindowHeight'))) self.ZPFWindow.resizable(width = GUI.R('ZPFWindowWidthResizable'), height = GUI.R('ZPFWindowHeightResizable')) self.ZPFWindow.configure(bg = GUI.R('ZPFWindowMainBG')) - self.ZPFWindow.iconbitmap(GUI.R('mainIcon')) + self.ZPFWindow.iconbitmap(OS.path.join(OS.path.dirname(OS.path.abspath(__file__)), GUI.R('mainIcon'))) # Wybór format presetu - listbox self.selectFPListbox = TK.Listbox(self.ZPFWindow) @@ -3231,10 +3231,7 @@ class mainWindow: self.deleteSelectedFPButton.pack(fill = TK.X, padx = 6, pady = 6) def aboutInstructionButtonAction(self): - try: - OS.startfile('documentation\index.html') - except Exception as exceptInfo: - MSG('E0016', False, exceptInfo) + WB.open("https://repos.mateuszskoczek.com/MateuszSkoczek/GeneratorCSV/wiki", new = 2, autoraise = True) diff --git a/src/assets/icon.png b/src/assets/icon.png new file mode 100644 index 0000000..2698796 Binary files /dev/null and b/src/assets/icon.png differ diff --git a/assets/tab-icons/about.png b/src/assets/tab-icons/about.png similarity index 100% rename from assets/tab-icons/about.png rename to src/assets/tab-icons/about.png diff --git a/assets/tab-icons/format.png b/src/assets/tab-icons/format.png similarity index 100% rename from assets/tab-icons/format.png rename to src/assets/tab-icons/format.png diff --git a/assets/tab-icons/generate.png b/src/assets/tab-icons/generate.png similarity index 100% rename from assets/tab-icons/generate.png rename to src/assets/tab-icons/generate.png diff --git a/src/assets/tab-icons/icon.png b/src/assets/tab-icons/icon.png new file mode 100644 index 0000000..2698796 Binary files /dev/null and b/src/assets/tab-icons/icon.png differ diff --git a/assets/tab-icons/settings.png b/src/assets/tab-icons/settings.png similarity index 100% rename from assets/tab-icons/settings.png rename to src/assets/tab-icons/settings.png diff --git a/configs/config.cfg b/src/configs/config.cfg similarity index 95% rename from configs/config.cfg rename to src/configs/config.cfg index 5faa0a3..7bde742 100644 --- a/configs/config.cfg +++ b/src/configs/config.cfg @@ -1,12 +1,13 @@ -secret(S) = entersecretstringhere -mailOutputCoding(Sc) = utf-8 -officeOutputCoding(Sc) = utf-8 -domain(S) = losobolew.pl -quota(I) = 500 -country(S) = Rzeczypospolita Polska -schoolData(MSAs) = [LO, 4, 0]|[BS, 3, 1] -schoolyearStart(D) = 01.09.* *:*:* -ifHeadlineInMail(B) = 0 -headlineInMail(S) = mailHeadline -ifHeadlineInOffice(B) = 0 +version(S) = WIP +secret(S) = entersecretstringhere +mailOutputCoding(Sc) = utf-8 +officeOutputCoding(Sc) = utf-8 +domain(S) = losobolew.pl +quota(I) = 500 +country(S) = Rzeczypospolita Polska +schoolData(MSAs) = [LO, 4, 0]|[BS, 3, 1] +schoolyearStart(D) = 01.09.* *:*:* +ifHeadlineInMail(B) = 0 +headlineInMail(S) = mailHeadline +ifHeadlineInOffice(B) = 0 headlineInOffice(S) = officeHeadline \ No newline at end of file diff --git a/configs/style.cfg b/src/configs/style.cfg similarity index 96% rename from configs/style.cfg rename to src/configs/style.cfg index ba31d34..e209c48 100644 --- a/configs/style.cfg +++ b/src/configs/style.cfg @@ -1,152 +1,152 @@ -windowWidth(I) = 1200 -windowHeight(I) = 720 -windowWidthResizable(B) = 0 -windowHeightResizable(B) = 0 -windowMainBG(C) = #21242D -mainIcon(P) = icon.ico -mainMenuBG(C) = #21242D -mainMenuPosition(FAposition) = wn -tabFramesBorderWidth(I) = 0 -unselectedTabBG(C) = #21242D -menuTabsBorderWidth(I) = 0 -menuTabsPadding(I) = 10 -selectedTabBG(C) = #333842 -disabledTabBG(C) = #333842 -tabFrameBG(C) = #21242D -headerFont(F) = Segoe UI;15 -headerBG(C) = #333842 -headerTextColor(C) = #C0C0C0 -headerPadding(I) = 10 -headerTextAnchor(FAanchor) = center -contentTabFrameBG(C) = #21242D -layoutFrameBG(C) = #21242D -label1BG(C) = #21242D -label1TextColor(C) = #C0C0C0 -label1Font(F) = Segoe UI;10 -label2BG(C) = #21242D -label2TextColor(C) = #C0C0C0 -label2Font(F) = Segoe UI;9 -label3BG(C) = #21242D -label3TextColor(C) = #C0C0C0 -label3Font(F) = Segoe UI;7 -label4BG(C) = #21242D -label4TextColor(C) = #C0C0C0 -label4Font(F) = Segoe UI;25 -combobox1ArrowColor(C) = #C0C0C0 -combobox1ButtonColor(C) = #333842 -combobox1BorderColor(C) = #21242D -combobox1FieldBackground(C) = #333842 -combobox1TextColor(C) = #C0C0C0 -combobox1Relief(FArelief) = flat -combobox1BorderWidth(I) = 0 -combobox1Padding(I) = 5 -combobox1ListBoxBackground(C) = #333842 -combobox1ListBoxForeground(C) = #C0C0C0 -combobox1ListBoxSelectBackground(C) = #737373 -combobox1ListBoxSelectForeground(C) = #FFFFFF -combobox2ArrowColor(C) = #C0C0C0 -combobox2ButtonColor(C) = #333842 -combobox2BorderColor(C) = #21242D -combobox2FieldBackground(C) = #333842 -combobox2TextColor(C) = #C0C0C0 -combobox2Relief(FArelief) = flat -combobox2BorderWidth(I) = 0 -combobox2Padding(I) = 7 -combobox2ListBoxBackground(C) = #333842 -combobox2ListBoxForeground(C) = #C0C0C0 -combobox2ListBoxSelectBackground(C) = #737373 -combobox2ListBoxSelectForeground(C) = #FFFFFF -button1TextAnchor(FAanchor) = center -button1Background(C) = #333842 -button1Foreground(C) = #C0C0C0 -button1Padding(I) = 4 -separator1BG(C) = #21242D -spinbox1ArrowColor(C) = #C0C0C0 -spinbox1FieldBackground(C) = #333842 -spinbox1Relief(FArelief) = flat -spinbox1BorderWidth(I) = 0 -spinbox1TextColor(C) = #C0C0C0 -spinbox1ButtonColor(C) = #333842 -spinbox1Padding(I) = 7 -entry1FieldBackground(C) = #333842 -entry1Relief(FArelief) = flat -entry1BorderWidth(I) = 0 -entry1Padding(I) = 7 -entry1TextColor(C) = #C0C0C0 -iconTabIcon(P) = assets/tab-icons/icon.png -tabIconsSize(I) = 30 -generateTabIcon(P) = assets/tab-icons/generate.png -headerFill(FAfill) = x -tabFramePadding(I) = 10 -contentTabFrameFill(FAfill) = both -contentTabFrameExpand(I) = 1 -outsidelayoutFramesPadX(I) = 6 -GIFFrameSeparators(I) = 16 -generateFilesLabelWidth(I) = 15 -generateFilesLabelAnchor(FAanchor) = center -generateInputFilesPadding(I) = 6 -generateHorizontalSeparatorPadY(I) = 10 -generateOutputFilesPadding(I) = 6 -generateStartButtonPadding(I) = 10 -generateStartButtonPadY(I) = 6 -formatTabIcon(P) = assets/tab-icons/format.png -loadingListPadX(I) = 12 -loadingButtonWidth(I) = 15 -formatHorizontalSeparatorPadY(I) = 10 -formatVerticalSeparatorPadY(I) = 10 -EPOSTypeFramePadY(I) = 0 -EPOSPersonSeparatorFramePadY(I) = 0 -EPOSRowSeparatorFramePadY(I) = 0 -EPOSDataSeparatorFramePadY(I) = 7 -EPOSLabelWidth(I) = 30 -EPOSLabelAnchor(FAanchor) = center -radiobutton1Background(C) = #21242D -radiobutton1TextColor(C) = #C0C0C0 -radiobutton1IndicatorBackground(C) = #21242D -checkbutton1Background(C) = #21242D -checkbutton1TextColor(C) = #C0C0C0 -checkbutton1IndicatorBackground(C) = #21242D -text1Background(C) = #333842 -text1TextColor(C) = #C0C0C0 -text1Relief(FArelief) = flat -EPDataLocalizationPadX(I) = 6 -EPDataLocalizationPadY(I) = 6 -editingPresetButtonsPadY(I) = 6 -editingPresetSaveButtonWidth(I) = 25 -editingPresetCancelButtonWidth(I) = 25 -settingsTabIcon(P) = assets/tab-icons/settings.png -settingsHorizontalSeparatorPadY(I) = 10 -settingsVerticalSeparatorPadY(I) = 10 -settingsCodeLabelWidth(I) = 35 -settingsCodeLabelAnchor(FAanchor) = w -settingsOtherLabelWidth(I) = 35 -settingsOtherLabelAnchor(FAanchor) = w -settingsHeadlineLabelWidth(I) = 35 -settingsHeadlineLabelAnchor(FAanchor) = w -settingsSchoolDataLabelAnchor(FAanchor) = center -settingsButtonsPadY(I) = 6 -settingsButtonSaveWidth(I) = 20 -settingsButtonCancelWidth(I) = 15 -settingsButtonPDUOWidth(I) = 35 -settingsButtonPDUWWidth(I) = 35 -settingsButtonZPFWidth(I) = 35 -aboutTabIcon(P) = assets/tab-icons/about.png -button2TextAnchor(FAanchor) = center -button2Background(C) = #21242D -button2Padding(I) = 0 -aboutLogoButtonImg(P) = assets/icon.png -aboutLogoButtonImgSize(I) = 250 -aboutInstructionButtonWidth(I) = 25 -aboutOtherInfoFramePadX(I) = 10 -ZPFWindowWidth(I) = 500 -ZPFWindowHeight(I) = 400 -ZPFWindowWidthResizable(B) = 0 -ZPFWindowHeightResizable(B) = 0 -ZPFWindowMainBG(C) = #21242D -listbox1BG(C) = #333842 -listbox1TextColor(C) = #C0C0C0 -listbox1Relief(FArelief) = flat -listbox1BorderWidth(I) = 0 -listbox1ActiveStyle(FAactivestyle) = none -listbox1HighlightThickness(I) = 0 +windowWidth(I) = 1200 +windowHeight(I) = 720 +windowWidthResizable(B) = 0 +windowHeightResizable(B) = 0 +windowMainBG(C) = #21242D +mainIcon(P) = icon.ico +mainMenuBG(C) = #21242D +mainMenuPosition(FAposition) = wn +tabFramesBorderWidth(I) = 0 +unselectedTabBG(C) = #21242D +menuTabsBorderWidth(I) = 0 +menuTabsPadding(I) = 10 +selectedTabBG(C) = #333842 +disabledTabBG(C) = #333842 +tabFrameBG(C) = #21242D +headerFont(F) = Segoe UI;15 +headerBG(C) = #333842 +headerTextColor(C) = #C0C0C0 +headerPadding(I) = 10 +headerTextAnchor(FAanchor) = center +contentTabFrameBG(C) = #21242D +layoutFrameBG(C) = #21242D +label1BG(C) = #21242D +label1TextColor(C) = #C0C0C0 +label1Font(F) = Segoe UI;10 +label2BG(C) = #21242D +label2TextColor(C) = #C0C0C0 +label2Font(F) = Segoe UI;9 +label3BG(C) = #21242D +label3TextColor(C) = #C0C0C0 +label3Font(F) = Segoe UI;7 +label4BG(C) = #21242D +label4TextColor(C) = #C0C0C0 +label4Font(F) = Segoe UI;25 +combobox1ArrowColor(C) = #C0C0C0 +combobox1ButtonColor(C) = #333842 +combobox1BorderColor(C) = #21242D +combobox1FieldBackground(C) = #333842 +combobox1TextColor(C) = #C0C0C0 +combobox1Relief(FArelief) = flat +combobox1BorderWidth(I) = 0 +combobox1Padding(I) = 5 +combobox1ListBoxBackground(C) = #333842 +combobox1ListBoxForeground(C) = #C0C0C0 +combobox1ListBoxSelectBackground(C) = #737373 +combobox1ListBoxSelectForeground(C) = #FFFFFF +combobox2ArrowColor(C) = #C0C0C0 +combobox2ButtonColor(C) = #333842 +combobox2BorderColor(C) = #21242D +combobox2FieldBackground(C) = #333842 +combobox2TextColor(C) = #C0C0C0 +combobox2Relief(FArelief) = flat +combobox2BorderWidth(I) = 0 +combobox2Padding(I) = 7 +combobox2ListBoxBackground(C) = #333842 +combobox2ListBoxForeground(C) = #C0C0C0 +combobox2ListBoxSelectBackground(C) = #737373 +combobox2ListBoxSelectForeground(C) = #FFFFFF +button1TextAnchor(FAanchor) = center +button1Background(C) = #333842 +button1Foreground(C) = #C0C0C0 +button1Padding(I) = 4 +separator1BG(C) = #21242D +spinbox1ArrowColor(C) = #C0C0C0 +spinbox1FieldBackground(C) = #333842 +spinbox1Relief(FArelief) = flat +spinbox1BorderWidth(I) = 0 +spinbox1TextColor(C) = #C0C0C0 +spinbox1ButtonColor(C) = #333842 +spinbox1Padding(I) = 7 +entry1FieldBackground(C) = #333842 +entry1Relief(FArelief) = flat +entry1BorderWidth(I) = 0 +entry1Padding(I) = 7 +entry1TextColor(C) = #C0C0C0 +iconTabIcon(P) = assets/tab-icons/icon.png +tabIconsSize(I) = 30 +generateTabIcon(P) = assets/tab-icons/generate.png +headerFill(FAfill) = x +tabFramePadding(I) = 10 +contentTabFrameFill(FAfill) = both +contentTabFrameExpand(I) = 1 +outsidelayoutFramesPadX(I) = 6 +GIFFrameSeparators(I) = 16 +generateFilesLabelWidth(I) = 15 +generateFilesLabelAnchor(FAanchor) = center +generateInputFilesPadding(I) = 6 +generateHorizontalSeparatorPadY(I) = 10 +generateOutputFilesPadding(I) = 6 +generateStartButtonPadding(I) = 10 +generateStartButtonPadY(I) = 6 +formatTabIcon(P) = assets/tab-icons/format.png +loadingListPadX(I) = 12 +loadingButtonWidth(I) = 15 +formatHorizontalSeparatorPadY(I) = 10 +formatVerticalSeparatorPadY(I) = 10 +EPOSTypeFramePadY(I) = 0 +EPOSPersonSeparatorFramePadY(I) = 0 +EPOSRowSeparatorFramePadY(I) = 0 +EPOSDataSeparatorFramePadY(I) = 7 +EPOSLabelWidth(I) = 30 +EPOSLabelAnchor(FAanchor) = center +radiobutton1Background(C) = #21242D +radiobutton1TextColor(C) = #C0C0C0 +radiobutton1IndicatorBackground(C) = #21242D +checkbutton1Background(C) = #21242D +checkbutton1TextColor(C) = #C0C0C0 +checkbutton1IndicatorBackground(C) = #21242D +text1Background(C) = #333842 +text1TextColor(C) = #C0C0C0 +text1Relief(FArelief) = flat +EPDataLocalizationPadX(I) = 6 +EPDataLocalizationPadY(I) = 6 +editingPresetButtonsPadY(I) = 6 +editingPresetSaveButtonWidth(I) = 25 +editingPresetCancelButtonWidth(I) = 25 +settingsTabIcon(P) = assets/tab-icons/settings.png +settingsHorizontalSeparatorPadY(I) = 10 +settingsVerticalSeparatorPadY(I) = 10 +settingsCodeLabelWidth(I) = 35 +settingsCodeLabelAnchor(FAanchor) = w +settingsOtherLabelWidth(I) = 35 +settingsOtherLabelAnchor(FAanchor) = w +settingsHeadlineLabelWidth(I) = 35 +settingsHeadlineLabelAnchor(FAanchor) = w +settingsSchoolDataLabelAnchor(FAanchor) = center +settingsButtonsPadY(I) = 6 +settingsButtonSaveWidth(I) = 20 +settingsButtonCancelWidth(I) = 15 +settingsButtonPDUOWidth(I) = 35 +settingsButtonPDUWWidth(I) = 35 +settingsButtonZPFWidth(I) = 35 +aboutTabIcon(P) = assets/tab-icons/about.png +button2TextAnchor(FAanchor) = center +button2Background(C) = #21242D +button2Padding(I) = 0 +aboutLogoButtonImg(P) = assets/icon.png +aboutLogoButtonImgSize(I) = 250 +aboutInstructionButtonWidth(I) = 25 +aboutOtherInfoFramePadX(I) = 10 +ZPFWindowWidth(I) = 500 +ZPFWindowHeight(I) = 400 +ZPFWindowWidthResizable(B) = 0 +ZPFWindowHeightResizable(B) = 0 +ZPFWindowMainBG(C) = #21242D +listbox1BG(C) = #333842 +listbox1TextColor(C) = #C0C0C0 +listbox1Relief(FArelief) = flat +listbox1BorderWidth(I) = 0 +listbox1ActiveStyle(FAactivestyle) = none +listbox1HighlightThickness(I) = 0 listbox1SelectBG(C) = #4F4F4F \ No newline at end of file diff --git a/src/icon.ico b/src/icon.ico new file mode 100644 index 0000000..35b0445 Binary files /dev/null and b/src/icon.ico differ