mirror of https://github.com/gmbrax/Pilgrim.git
				
				
				
			Merge pull request #2 from gmbrax/refactor/refactoring_basics
Refactor/refactoring basics
This commit is contained in:
		
						commit
						cad6a93dd4
					
				|  | @ -0,0 +1,11 @@ | ||||||
|  | # To get started with Dependabot version updates, you'll need to specify which | ||||||
|  | # package ecosystems to update and where the package manifests are located. | ||||||
|  | # Please see the documentation for all configuration options: | ||||||
|  | # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file | ||||||
|  | 
 | ||||||
|  | version: 2 | ||||||
|  | updates: | ||||||
|  |   - package-ecosystem: "pip" # See documentation for possible values | ||||||
|  |     directory: "/" # Location of package manifests | ||||||
|  |     schedule: | ||||||
|  |       interval: "weekly" | ||||||
|  | @ -0,0 +1,24 @@ | ||||||
|  | name: Pylint | ||||||
|  | 
 | ||||||
|  | on: [push] | ||||||
|  | 
 | ||||||
|  | jobs: | ||||||
|  |   build: | ||||||
|  |     runs-on: ubuntu-latest | ||||||
|  |     strategy: | ||||||
|  |       matrix: | ||||||
|  |         python-version: ["3.10"] | ||||||
|  |     steps: | ||||||
|  |     - uses: actions/checkout@v4 | ||||||
|  |     - name: Set up Python ${{ matrix.python-version }} | ||||||
|  |       uses: actions/setup-python@v3 | ||||||
|  |       with: | ||||||
|  |         python-version: ${{ matrix.python-version }} | ||||||
|  |     - name: Install dependencies | ||||||
|  |       run: | | ||||||
|  |         python -m pip install --upgrade pip | ||||||
|  |         if [ -f requirements.txt ]; then pip install -r requirements.txt; fi | ||||||
|  |         pip install pylint | ||||||
|  |     - name: Analysing the code with pylint | ||||||
|  |       run: | | ||||||
|  |         pylint --disable=C0114,C0115,C0116 --exit-zero $(git ls-files '*.py') | ||||||
|  | @ -1,2 +1,144 @@ | ||||||
|  | # Database files | ||||||
| database.db | database.db | ||||||
| __pycache__ | 
 | ||||||
|  | # 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/ | ||||||
|  | build/ | ||||||
|  | temp/ | ||||||
|  | 
 | ||||||
|  | # PyBuilder | ||||||
|  | target/ | ||||||
|  | 
 | ||||||
|  | # Jupyter Notebook | ||||||
|  | .ipynb_checkpoints | ||||||
|  | 
 | ||||||
|  | # IPython | ||||||
|  | profile_default/ | ||||||
|  | ipython_config.py | ||||||
|  | 
 | ||||||
|  | # pyenv | ||||||
|  | .python-version | ||||||
|  | 
 | ||||||
|  | # pipenv | ||||||
|  | Pipfile.lock | ||||||
|  | 
 | ||||||
|  | # poetry | ||||||
|  | poetry.lock | ||||||
|  | 
 | ||||||
|  | # PEP 582; used by e.g. github.com/David-OConnor/pyflow | ||||||
|  | __pypackages__/ | ||||||
|  | 
 | ||||||
|  | # Celery stuff | ||||||
|  | celerybeat-schedule | ||||||
|  | celerybeat.pid | ||||||
|  | 
 | ||||||
|  | # SageMath parsed files | ||||||
|  | *.sage.py | ||||||
|  | 
 | ||||||
|  | # Environments | ||||||
|  | .env | ||||||
|  | .env.* | ||||||
|  | .venv | ||||||
|  | venv/ | ||||||
|  | ENV/ | ||||||
|  | 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/ | ||||||
|  | 
 | ||||||
|  | # IDE settings | ||||||
|  | .vscode/ | ||||||
|  | .idea/ | ||||||
|  | @ -1,10 +0,0 @@ | ||||||
| <?xml version="1.0" encoding="UTF-8"?> |  | ||||||
| <module type="PYTHON_MODULE" version="4"> |  | ||||||
|   <component name="NewModuleRootManager"> |  | ||||||
|     <content url="file://$MODULE_DIR$"> |  | ||||||
|       <excludeFolder url="file://$MODULE_DIR$/.venv" /> |  | ||||||
|     </content> |  | ||||||
|     <orderEntry type="jdk" jdkName="Python 3.10 (Pilgrim)" jdkType="Python SDK" /> |  | ||||||
|     <orderEntry type="sourceFolder" forTests="false" /> |  | ||||||
|   </component> |  | ||||||
| </module> |  | ||||||
|  | @ -1,6 +0,0 @@ | ||||||
| <component name="InspectionProjectProfileManager"> |  | ||||||
|   <settings> |  | ||||||
|     <option name="USE_PROJECT_PROFILE" value="false" /> |  | ||||||
|     <version value="1.0" /> |  | ||||||
|   </settings> |  | ||||||
| </component> |  | ||||||
|  | @ -1,8 +0,0 @@ | ||||||
| <?xml version="1.0" encoding="UTF-8"?> |  | ||||||
| <project version="4"> |  | ||||||
|   <component name="ProjectModuleManager"> |  | ||||||
|     <modules> |  | ||||||
|       <module fileurl="file://$PROJECT_DIR$/.idea/Pilgrim.iml" filepath="$PROJECT_DIR$/.idea/Pilgrim.iml" /> |  | ||||||
|     </modules> |  | ||||||
|   </component> |  | ||||||
| </project> |  | ||||||
|  | @ -1,6 +0,0 @@ | ||||||
| <?xml version="1.0" encoding="UTF-8"?> |  | ||||||
| <project version="4"> |  | ||||||
|   <component name="VcsDirectoryMappings"> |  | ||||||
|     <mapping directory="$PROJECT_DIR$" vcs="Git" /> |  | ||||||
|   </component> |  | ||||||
| </project> |  | ||||||
|  | @ -1,117 +0,0 @@ | ||||||
| <?xml version="1.0" encoding="UTF-8"?> |  | ||||||
| <project version="4"> |  | ||||||
|   <component name="AutoImportSettings"> |  | ||||||
|     <option name="autoReloadType" value="SELECTIVE" /> |  | ||||||
|   </component> |  | ||||||
|   <component name="ChangeListManager"> |  | ||||||
|     <list default="true" id="0a7f92e2-b44a-4dfe-8e01-136d1c0c18be" name="Changes" comment=""> |  | ||||||
|       <change afterPath="$PROJECT_DIR$/.idea/Pilgrim.iml" afterDir="false" /> |  | ||||||
|       <change afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/profiles_settings.xml" afterDir="false" /> |  | ||||||
|       <change afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" /> |  | ||||||
|       <change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" /> |  | ||||||
|       <change afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> |  | ||||||
|       <change afterPath="$PROJECT_DIR$/src/Application/Application.py" afterDir="false" /> |  | ||||||
|       <change afterPath="$PROJECT_DIR$/src/Application/__init__.py" afterDir="false" /> |  | ||||||
|       <change afterPath="$PROJECT_DIR$/src/Database/Database.py" afterDir="false" /> |  | ||||||
|       <change afterPath="$PROJECT_DIR$/src/Database/__init__.py" afterDir="false" /> |  | ||||||
|       <change afterPath="$PROJECT_DIR$/src/Models/TravelDiary/TravelDiary.py" afterDir="false" /> |  | ||||||
|       <change afterPath="$PROJECT_DIR$/src/Models/TravelDiary/__init__.py" afterDir="false" /> |  | ||||||
|       <change afterPath="$PROJECT_DIR$/src/Models/__init__.py" afterDir="false" /> |  | ||||||
|       <change afterPath="$PROJECT_DIR$/src/main.py" afterDir="false" /> |  | ||||||
|     </list> |  | ||||||
|     <option name="SHOW_DIALOG" value="false" /> |  | ||||||
|     <option name="HIGHLIGHT_CONFLICTS" value="true" /> |  | ||||||
|     <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" /> |  | ||||||
|     <option name="LAST_RESOLUTION" value="IGNORE" /> |  | ||||||
|   </component> |  | ||||||
|   <component name="FileTemplateManagerImpl"> |  | ||||||
|     <option name="RECENT_TEMPLATES"> |  | ||||||
|       <list> |  | ||||||
|         <option value="Python Script" /> |  | ||||||
|       </list> |  | ||||||
|     </option> |  | ||||||
|   </component> |  | ||||||
|   <component name="Git.Settings"> |  | ||||||
|     <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> |  | ||||||
|   </component> |  | ||||||
|   <component name="ProjectColorInfo"><![CDATA[{ |  | ||||||
|   "associatedIndex": 0 |  | ||||||
| }]]></component> |  | ||||||
|   <component name="ProjectId" id="2y0y1J9RlHT6m1qL5RuCBf0Ramp" /> |  | ||||||
|   <component name="ProjectViewState"> |  | ||||||
|     <option name="hideEmptyMiddlePackages" value="true" /> |  | ||||||
|     <option name="showLibraryContents" value="true" /> |  | ||||||
|   </component> |  | ||||||
|   <component name="PropertiesComponent"><![CDATA[{ |  | ||||||
|   "keyToString": { |  | ||||||
|     "ModuleVcsDetector.initialDetectionPerformed": "true", |  | ||||||
|     "Python.Database.executor": "Run", |  | ||||||
|     "Python.main.executor": "Run", |  | ||||||
|     "RunOnceActivity.ShowReadmeOnStart": "true", |  | ||||||
|     "RunOnceActivity.git.unshallow": "true", |  | ||||||
|     "git-widget-placeholder": "master", |  | ||||||
|     "node.js.detected.package.eslint": "true", |  | ||||||
|     "node.js.detected.package.tslint": "true", |  | ||||||
|     "node.js.selected.package.eslint": "(autodetect)", |  | ||||||
|     "node.js.selected.package.tslint": "(autodetect)", |  | ||||||
|     "nodejs_package_manager_path": "npm", |  | ||||||
|     "vue.rearranger.settings.migration": "true" |  | ||||||
|   } |  | ||||||
| }]]></component> |  | ||||||
|   <component name="RunManager"> |  | ||||||
|     <configuration name="main" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true"> |  | ||||||
|       <module name="Pilgrim" /> |  | ||||||
|       <option name="ENV_FILES" value="" /> |  | ||||||
|       <option name="INTERPRETER_OPTIONS" value="" /> |  | ||||||
|       <option name="PARENT_ENVS" value="true" /> |  | ||||||
|       <envs> |  | ||||||
|         <env name="PYTHONUNBUFFERED" value="1" /> |  | ||||||
|       </envs> |  | ||||||
|       <option name="SDK_HOME" value="" /> |  | ||||||
|       <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src" /> |  | ||||||
|       <option name="IS_MODULE_SDK" value="true" /> |  | ||||||
|       <option name="ADD_CONTENT_ROOTS" value="true" /> |  | ||||||
|       <option name="ADD_SOURCE_ROOTS" value="true" /> |  | ||||||
|       <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" /> |  | ||||||
|       <option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/main.py" /> |  | ||||||
|       <option name="PARAMETERS" value="" /> |  | ||||||
|       <option name="SHOW_COMMAND_LINE" value="false" /> |  | ||||||
|       <option name="EMULATE_TERMINAL" value="false" /> |  | ||||||
|       <option name="MODULE_MODE" value="false" /> |  | ||||||
|       <option name="REDIRECT_INPUT" value="false" /> |  | ||||||
|       <option name="INPUT_FILE" value="" /> |  | ||||||
|       <method v="2" /> |  | ||||||
|     </configuration> |  | ||||||
|     <recent_temporary> |  | ||||||
|       <list> |  | ||||||
|         <item itemvalue="Python.main" /> |  | ||||||
|       </list> |  | ||||||
|     </recent_temporary> |  | ||||||
|   </component> |  | ||||||
|   <component name="SharedIndexes"> |  | ||||||
|     <attachedChunks> |  | ||||||
|       <set> |  | ||||||
|         <option value="bundled-js-predefined-d6986cc7102b-6a121458b545-JavaScript-PY-251.25410.159" /> |  | ||||||
|         <option value="bundled-python-sdk-e0ed3721d81e-36ea0e71a18c-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-251.25410.159" /> |  | ||||||
|       </set> |  | ||||||
|     </attachedChunks> |  | ||||||
|   </component> |  | ||||||
|   <component name="TaskManager"> |  | ||||||
|     <task active="true" id="Default" summary="Default task"> |  | ||||||
|       <changelist id="0a7f92e2-b44a-4dfe-8e01-136d1c0c18be" name="Changes" comment="" /> |  | ||||||
|       <created>1748985568579</created> |  | ||||||
|       <option name="number" value="Default" /> |  | ||||||
|       <option name="presentableId" value="Default" /> |  | ||||||
|       <updated>1748985568579</updated> |  | ||||||
|       <workItem from="1748985569621" duration="2124000" /> |  | ||||||
|     </task> |  | ||||||
|     <servers /> |  | ||||||
|   </component> |  | ||||||
|   <component name="TypeScriptGeneratedFilesManager"> |  | ||||||
|     <option name="version" value="3" /> |  | ||||||
|   </component> |  | ||||||
|   <component name="com.intellij.coverage.CoverageDataManagerImpl"> |  | ||||||
|     <SUITE FILE_PATH="coverage/Pilgrim$Database.coverage" NAME="Database Coverage Results" MODIFIED="1748987101492" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/src/Database" /> |  | ||||||
|     <SUITE FILE_PATH="coverage/Pilgrim$main.coverage" NAME="main Coverage Results" MODIFIED="1748987594893" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="false" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/src" /> |  | ||||||
|   </component> |  | ||||||
| </project> |  | ||||||
							
								
								
									
										49
									
								
								README.md
								
								
								
								
							
							
						
						
									
										49
									
								
								README.md
								
								
								
								
							|  | @ -1,3 +1,50 @@ | ||||||
| # Python_Pilgrim | # Python_Pilgrim | ||||||
| 
 | 
 | ||||||
| Python Based Travel Diary | ## Overview | ||||||
|  | 
 | ||||||
|  | **Python_Pilgrim** is a Python-based travel diary application designed to help users document and manage their travel experiences. The project provides tools for recording trips, organizing travel notes, and storing memories in a structured and accessible format. | ||||||
|  | 
 | ||||||
|  | ## Features | ||||||
|  | 
 | ||||||
|  | - Create and manage travel diaries | ||||||
|  | - Add, edit, and delete travel entries | ||||||
|  | - Organize trips by date, location, or theme | ||||||
|  | - Store photos, notes, and other media | ||||||
|  | - Export and share travel logs | ||||||
|  | 
 | ||||||
|  | ## Requirements | ||||||
|  | - Python 3.8 or higher | ||||||
|  | - Linux operating system (tested on Ubuntu 20.04+) | ||||||
|  | - Visual Studio Code (VSCode) for development (optional but strongly recommended) | ||||||
|  | - pip (Python package installer) | ||||||
|  | - Optional: virtualenv for isolated environments | ||||||
|  | 
 | ||||||
|  | ## Installation | ||||||
|  | 
 | ||||||
|  | 1. Clone the repository: | ||||||
|  |     ```bash | ||||||
|  |     git clone https://github.com/gmbrax/Pilgrim.git | ||||||
|  |     ``` | ||||||
|  | 2. Navigate to the project directory: | ||||||
|  |     ```bash | ||||||
|  |     cd Pilgrim | ||||||
|  |     ``` | ||||||
|  | 3. Create a virtual environment and, then, activate it: | ||||||
|  |     ```bash | ||||||
|  |     python -m venv .venv | ||||||
|  |     source .venv/bin/activate | ||||||
|  |     ``` | ||||||
|  | 4. Install the required dependencies: | ||||||
|  |     ```bash | ||||||
|  |     pip install -r requirements.txt | ||||||
|  |     ``` | ||||||
|  | 
 | ||||||
|  | ## Usage | ||||||
|  | 
 | ||||||
|  | To run the main application, execute: | ||||||
|  | 
 | ||||||
|  | ```bash | ||||||
|  | python <???>.py | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | This will start the Python_Pilgrim application. Follow the on-screen instructions to create and manage your travel diaries. | ||||||
|  | @ -26,6 +26,6 @@ src-layout = true | ||||||
| Homepage = "https://git.gustavomiranda.xyz/GHMiranda/Pilgrim" | Homepage = "https://git.gustavomiranda.xyz/GHMiranda/Pilgrim" | ||||||
| Issues = "https://git.gustavomiranda.xyz/GHMiranda/Pilgrim" | Issues = "https://git.gustavomiranda.xyz/GHMiranda/Pilgrim" | ||||||
| [tool.hatch.build.targets.wheel] | [tool.hatch.build.targets.wheel] | ||||||
| packages = ["src/Pilgrim"] | packages = ["src/pilgrim"] | ||||||
| [project.scripts] | [project.scripts] | ||||||
| pilgrim = "Pilgrim:main" | pilgrim = "pilgrim:main" | ||||||
|  |  | ||||||
|  | @ -0,0 +1,3 @@ | ||||||
|  | greenlet==3.2.3 | ||||||
|  | SQLAlchemy==2.0.41 | ||||||
|  | typing_extensions==4.14.0 | ||||||
|  | @ -1,9 +0,0 @@ | ||||||
| from Pilgrim.Database import Database |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class Application: |  | ||||||
|     def __init__(self): |  | ||||||
|         self.database = Database() |  | ||||||
| 
 |  | ||||||
|     def run(self): |  | ||||||
|         self.database.create() |  | ||||||
|  | @ -1,9 +0,0 @@ | ||||||
| from sqlalchemy import Column, String, Integer |  | ||||||
| 
 |  | ||||||
| from Pilgrim import Application, Base |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class TravelDiary(Base): |  | ||||||
|     __tablename__ = "TravelDiary" |  | ||||||
|     id = Column(Integer, primary_key=True) |  | ||||||
|     name = Column(String) |  | ||||||
|  | @ -1,6 +0,0 @@ | ||||||
| from Pilgrim.Application import Application |  | ||||||
| from Pilgrim.command import main |  | ||||||
| from Pilgrim.Database import Database, Base |  | ||||||
| from Pilgrim.TravelDiary import TravelDiary |  | ||||||
| 
 |  | ||||||
| __all__ = ["Application", "Database", "TravelDiary", "main", "Base"] |  | ||||||
|  | @ -0,0 +1,16 @@ | ||||||
|  | from src.database import Database | ||||||
|  | from src.service.servicemanager import ServiceManager | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Application: | ||||||
|  |     def __init__(self): | ||||||
|  |         self.database = Database() | ||||||
|  | 
 | ||||||
|  |     def run(self): | ||||||
|  |         self.database.create() | ||||||
|  | 
 | ||||||
|  |     def get_service_manager(self): | ||||||
|  |         session = self.database.session() | ||||||
|  |         session_manager = ServiceManager() | ||||||
|  |         session_manager.set_session(session) | ||||||
|  |         return session_manager | ||||||
|  | @ -1,4 +1,4 @@ | ||||||
| from Pilgrim import Application | from src.application import Application | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def main(): | def main(): | ||||||
|  | @ -4,7 +4,6 @@ from sqlalchemy.orm import sessionmaker | ||||||
| 
 | 
 | ||||||
| Base = declarative_base() | Base = declarative_base() | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| class Database: | class Database: | ||||||
|     def __init__(self): |     def __init__(self): | ||||||
|         self.engine = create_engine( |         self.engine = create_engine( | ||||||
|  | @ -12,10 +11,10 @@ class Database: | ||||||
|             echo=False, |             echo=False, | ||||||
|             connect_args={"check_same_thread": False}, |             connect_args={"check_same_thread": False}, | ||||||
|         ) |         ) | ||||||
|         self.Session = sessionmaker(bind=self.engine, autoflush=False, autocommit=False) |         self.session = sessionmaker(bind=self.engine, autoflush=False, autocommit=False) | ||||||
| 
 | 
 | ||||||
|     def create(self): |     def create(self): | ||||||
|         Base.metadata.create_all(self.engine) |         Base.metadata.create_all(self.engine) | ||||||
| 
 | 
 | ||||||
|     def get_db(self): |     def get_db(self): | ||||||
|         return self.Session() |         return self.session() | ||||||
|  | @ -0,0 +1,26 @@ | ||||||
|  | from typing import Any | ||||||
|  | 
 | ||||||
|  | from sqlalchemy import Column, Integer, String, ForeignKey | ||||||
|  | from sqlalchemy.orm import relationship | ||||||
|  | 
 | ||||||
|  | from src.models.photo_in_entry import photo_entry_association | ||||||
|  | from src.database import Base | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Entry(Base): | ||||||
|  |     __tablename__ = "entries" | ||||||
|  |     id = Column(Integer, primary_key=True) | ||||||
|  |     title = Column(String) | ||||||
|  |     text = Column(String) | ||||||
|  |     date = Column(String) | ||||||
|  |     photos = relationship( | ||||||
|  |         "Photo", | ||||||
|  |         secondary=photo_entry_association, | ||||||
|  |         back_populates="entries") | ||||||
|  |     fk_travel_diary_id = Column(Integer, ForeignKey("travel_diaries.id"),nullable=False) | ||||||
|  |     def __init__(self, title: str, text: str, date: str, travel_diary_id: int, **kw: Any): | ||||||
|  |         super().__init__(**kw) | ||||||
|  |         self.title = title | ||||||
|  |         self.text = text | ||||||
|  |         self.date = date | ||||||
|  |         self.fk_travel_diary_id = travel_diary_id | ||||||
|  | @ -0,0 +1,31 @@ | ||||||
|  | from typing import Any | ||||||
|  | 
 | ||||||
|  | from sqlalchemy.orm import relationship | ||||||
|  | from sqlalchemy import Column, Integer, String, ForeignKey | ||||||
|  | 
 | ||||||
|  | from src.models.photo_in_entry import photo_entry_association | ||||||
|  | from src.database import Base | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class Photo(Base): | ||||||
|  |     __tablename__ = "photos" | ||||||
|  |     id = Column(Integer, primary_key=True) | ||||||
|  |     filepath = Column(String) | ||||||
|  |     name = Column(String) | ||||||
|  |     addition_date = Column(String) | ||||||
|  |     caption = Column(String) | ||||||
|  |     entries = relationship( | ||||||
|  |         "Entry", | ||||||
|  |         secondary=photo_entry_association, | ||||||
|  |         back_populates="photos" | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  |     fk_travel_diary_id = Column(Integer, ForeignKey("travel_diaries.id"),nullable=False) | ||||||
|  | 
 | ||||||
|  |     def __init__(self, filepath, name, addition_date=None, caption=None, entries=None, **kw: Any): | ||||||
|  |         super().__init__(**kw) | ||||||
|  |         self.filepath = filepath | ||||||
|  |         self.name = name | ||||||
|  |         self.addition_date = addition_date | ||||||
|  |         self.caption = caption | ||||||
|  |         self.entries = entries | ||||||
|  | @ -0,0 +1,8 @@ | ||||||
|  | from sqlalchemy import Table, Column, Integer, ForeignKey | ||||||
|  | 
 | ||||||
|  | from src.database import Base | ||||||
|  | 
 | ||||||
|  | photo_entry_association = Table('photo_entry_association', Base.metadata, | ||||||
|  | Column('id', Integer, primary_key=True, autoincrement=True), | ||||||
|  |     Column('fk_photo_id', Integer, ForeignKey('photos.id'),nullable=False), | ||||||
|  |     Column('fk_entry_id', Integer, ForeignKey('entries.id'),nullable=False)) | ||||||
|  | @ -0,0 +1,15 @@ | ||||||
|  | from typing import Any | ||||||
|  | 
 | ||||||
|  | from src.database import Base | ||||||
|  | 
 | ||||||
|  | from sqlalchemy import Column, String, Integer | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class TravelDiary(Base): | ||||||
|  |     __tablename__ = "travel_diaries" | ||||||
|  |     id = Column(Integer, primary_key=True) | ||||||
|  |     name = Column(String) | ||||||
|  | 
 | ||||||
|  |     def __init__(self, name: str, **kw: Any): | ||||||
|  |         super().__init__(**kw) | ||||||
|  |         self.name = name | ||||||
|  | @ -0,0 +1,48 @@ | ||||||
|  | from typing import List | ||||||
|  | 
 | ||||||
|  | from src.models.entry import Entry | ||||||
|  | from src.models.travel_diary import TravelDiary | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class EntryService: | ||||||
|  |     def __init__(self,session): | ||||||
|  |         self.session = session | ||||||
|  | 
 | ||||||
|  |     def create(self, travel_diary_id:int, title: str, text: str, date: str, ): | ||||||
|  |         travel_diary = self.session.query(TravelDiary).filter(TravelDiary.id == travel_diary_id).first() | ||||||
|  |         if not travel_diary: | ||||||
|  |             return None | ||||||
|  |         new_entry = Entry(title,text,date,travel_diary_id) | ||||||
|  |         self.session.add(new_entry) | ||||||
|  |         self.session.commit() | ||||||
|  |         self.session.refresh(new_entry) | ||||||
|  |         return new_entry | ||||||
|  | 
 | ||||||
|  |     def read_by_id(self,entry_id:int)->Entry: | ||||||
|  |         entry = self.session.query(Entry).filter(Entry.id == entry_id).first() | ||||||
|  |         return entry | ||||||
|  | 
 | ||||||
|  |     def read_all(self)-> List[Entry]: | ||||||
|  |         entries = self.session.query(Entry).all() | ||||||
|  |         return entries | ||||||
|  | 
 | ||||||
|  |     def update(self,entry_src:Entry,entry_dst:Entry) -> Entry | None: | ||||||
|  |         original:Entry = self.read_by_id(entry_src.id) | ||||||
|  |         if original: | ||||||
|  |             original.title = entry_dst.title | ||||||
|  |             original.text = entry_dst.text | ||||||
|  |             original.date = entry_dst.date | ||||||
|  |             original.fk_travel_diary_id = entry_dst.fk_travel_diary_id | ||||||
|  |             original.photos = entry_dst.photos | ||||||
|  |             self.session.commit() | ||||||
|  |             self.session.refresh(original) | ||||||
|  |             return original | ||||||
|  |         return None | ||||||
|  | 
 | ||||||
|  |     def delete(self,entry_src:Entry)-> Entry | None: | ||||||
|  |         excluded = self.read_by_id(entry_src.id) | ||||||
|  |         if excluded is not None: | ||||||
|  |             self.session.delete(excluded) | ||||||
|  |             self.session.commit() | ||||||
|  |             return excluded | ||||||
|  |         return None | ||||||
|  | @ -0,0 +1,48 @@ | ||||||
|  | from pathlib import Path | ||||||
|  | from typing import List | ||||||
|  | 
 | ||||||
|  | from src.models.photo import Photo | ||||||
|  | from src.models.travel_diary import TravelDiary | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class PhotoService: | ||||||
|  |     def __init__(self, session): | ||||||
|  |         self.session = session | ||||||
|  | 
 | ||||||
|  |     def create(self, filepath:Path, name:str, travel_diary_id, addition_date=None, caption=None, ) -> Photo | None: | ||||||
|  |         travel_diary = self.session.query(TravelDiary).filter(TravelDiary.id == travel_diary_id).first() | ||||||
|  |         if not travel_diary: | ||||||
|  |             return None | ||||||
|  |         new_photo = Photo(filepath, name, addition_date=addition_date, caption=caption) | ||||||
|  |         self.session.add(new_photo) | ||||||
|  |         self.session.commit() | ||||||
|  |         self.session.refresh(new_photo) | ||||||
|  | 
 | ||||||
|  |         return new_photo | ||||||
|  |     def read_by_id(self, photo_id:int) -> Photo: | ||||||
|  |         return self.session.query(Photo).get(photo_id) | ||||||
|  | 
 | ||||||
|  |     def read_all(self) -> List[Photo]: | ||||||
|  |         return self.session.query(Photo).all() | ||||||
|  | 
 | ||||||
|  |     def update(self,photo_src:Photo,photo_dst:Photo) -> Photo | None: | ||||||
|  |         original:Photo = self.read_by_id(photo_src.id) | ||||||
|  |         if original: | ||||||
|  |             original.filepath = photo_dst.filepath | ||||||
|  |             original.name = photo_dst.name | ||||||
|  |             original.addition_date = photo_dst.addition_date | ||||||
|  |             original.caption = photo_dst.caption | ||||||
|  |             original.entries.extend(photo_dst.entries) | ||||||
|  |             self.session.commit() | ||||||
|  |             self.session.refresh(original) | ||||||
|  |             return original | ||||||
|  |         return None | ||||||
|  | 
 | ||||||
|  |     def delete(self, photo_src:Photo) -> Photo | None: | ||||||
|  |         excluded = self.read_by_id(photo_src.id) | ||||||
|  |         if excluded: | ||||||
|  |             self.session.delete(excluded) | ||||||
|  |             self.session.commit() | ||||||
|  |             self.session.refresh(excluded) | ||||||
|  |             return excluded | ||||||
|  |         return None | ||||||
|  | @ -0,0 +1,19 @@ | ||||||
|  | from src.service.entry_service import EntryService | ||||||
|  | from src.service.travel_diary_service import TravelDiaryService | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class ServiceManager: | ||||||
|  |     def __init__(self): | ||||||
|  |         self.session = None | ||||||
|  |     def set_session(self, session): | ||||||
|  |         self.session = session | ||||||
|  |     def get_session(self): | ||||||
|  |         return self.session | ||||||
|  |     def get_entry_service(self): | ||||||
|  |         if self.session is not None: | ||||||
|  |             return EntryService(self.session) | ||||||
|  |         return None | ||||||
|  |     def get_travel_diary_service(self): | ||||||
|  |         if self.session is not None: | ||||||
|  |             return TravelDiaryService(self.session) | ||||||
|  |         return None | ||||||
|  | @ -0,0 +1,35 @@ | ||||||
|  | from src.models.travel_diary import TravelDiary | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class TravelDiaryService: | ||||||
|  |     def __init__(self,session): | ||||||
|  |         self.session = session | ||||||
|  |     def create(self, name:str): | ||||||
|  |         new_travel_diary = TravelDiary(name) | ||||||
|  |         self.session.add(new_travel_diary) | ||||||
|  |         self.session.commit() | ||||||
|  |         self.session.refresh(new_travel_diary) | ||||||
|  | 
 | ||||||
|  |         return new_travel_diary | ||||||
|  | 
 | ||||||
|  |     def read_by_id(self, travel_id:int): | ||||||
|  |         return self.session.query(TravelDiary).get(travel_id) | ||||||
|  | 
 | ||||||
|  |     def read_all(self): | ||||||
|  |         return self.session.query(TravelDiary).all() | ||||||
|  | 
 | ||||||
|  |     def update(self, travel_diary_src:TravelDiary,travel_diary_dst:TravelDiary): | ||||||
|  |         original = self.read_by_id(travel_diary_src.id) | ||||||
|  |         if original is not None: | ||||||
|  |             original.name = travel_diary_dst.name | ||||||
|  |             self.session.commit() | ||||||
|  |             self.session.refresh(original) | ||||||
|  |         return original | ||||||
|  | 
 | ||||||
|  |     def delete(self, travel_diary_src:TravelDiary): | ||||||
|  |         excluded = self.read_by_id(travel_diary_src.id) | ||||||
|  |         if excluded is not None: | ||||||
|  |             self.session.delete(travel_diary_src) | ||||||
|  |             self.session.commit() | ||||||
|  |             return excluded | ||||||
|  |         return None | ||||||
		Loading…
	
		Reference in New Issue