Structure refactor
This commit is contained in:
parent
a33bf0b366
commit
126b25a119
|
@ -58,7 +58,7 @@ section in persistence/README.md file.
|
||||||
as shown below:
|
as shown below:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from hub.exports.db_factory import DBFactory
|
from hub.persistence.db_control import DBFactory
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
dotenv_path = (Path(__file__).parent / '.env').resolve()
|
dotenv_path = (Path(__file__).parent / '.env').resolve()
|
||||||
|
|
0
hub/__init__.py
Normal file
0
hub/__init__.py
Normal file
|
@ -1,81 +0,0 @@
|
||||||
"""
|
|
||||||
DBFactory performs database create, delete and update operations
|
|
||||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
|
||||||
Copyright © 2022 Concordia CERC group
|
|
||||||
Project CoderPeter Yefi peteryefi@gmail.com
|
|
||||||
"""
|
|
||||||
from hub.city_model_structure.city import City
|
|
||||||
from hub.persistence import City as CityRepository
|
|
||||||
from hub.persistence import SimulationResults
|
|
||||||
from hub.persistence import Application
|
|
||||||
|
|
||||||
|
|
||||||
class DBFactory:
|
|
||||||
"""
|
|
||||||
DBFactory class
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, db_name, dotenv_path, app_env):
|
|
||||||
self._city_repository = CityRepository(db_name=db_name, dotenv_path=dotenv_path, app_env=app_env)
|
|
||||||
self._simulation_results = SimulationResults(db_name=db_name, dotenv_path=dotenv_path, app_env=app_env)
|
|
||||||
self._application = Application(db_name=db_name, dotenv_path=dotenv_path, app_env=app_env)
|
|
||||||
|
|
||||||
def persist_city(self, city: City, pickle_path, application_id: int, user_id: int):
|
|
||||||
"""
|
|
||||||
Persist city into postgres database
|
|
||||||
:param city: City to be stored
|
|
||||||
:param pickle_path: Path to save the pickle file
|
|
||||||
:param application_id: Application id owning this city
|
|
||||||
:param user_id: User who create the city
|
|
||||||
"""
|
|
||||||
return self._city_repository.insert(city, pickle_path, application_id, user_id)
|
|
||||||
|
|
||||||
def update_city(self, city_id, city):
|
|
||||||
"""
|
|
||||||
Update an existing city in postgres database
|
|
||||||
:param city_id: the id of the city to update
|
|
||||||
:param city: the updated city object
|
|
||||||
"""
|
|
||||||
return self._city_repository.update(city_id, city)
|
|
||||||
|
|
||||||
def persist_application(self, name: str, description: str, application_uuid: str):
|
|
||||||
"""
|
|
||||||
Creates an application
|
|
||||||
:param name: name of application
|
|
||||||
:param description: the description of the application
|
|
||||||
:param application_uuid: the uuid of the application to be created
|
|
||||||
"""
|
|
||||||
return self._application.insert(name, description, application_uuid)
|
|
||||||
|
|
||||||
def update_application(self, name: str, description: str, application_uuid: str):
|
|
||||||
"""
|
|
||||||
Update an application
|
|
||||||
:param name: name of application
|
|
||||||
:param description: the description of the application
|
|
||||||
:param application_uuid: the uuid of the application to be created
|
|
||||||
"""
|
|
||||||
return self._application.update(application_uuid, name, description)
|
|
||||||
|
|
||||||
def delete_city(self, city_id):
|
|
||||||
"""
|
|
||||||
Deletes a single city from postgres
|
|
||||||
:param city_id: the id of the city to get
|
|
||||||
"""
|
|
||||||
self._city_repository.delete(city_id)
|
|
||||||
|
|
||||||
def delete_application(self, application_uuid):
|
|
||||||
"""
|
|
||||||
Deletes a single application from postgres
|
|
||||||
:param application_uuid: the id of the application to get
|
|
||||||
"""
|
|
||||||
self._application.delete(application_uuid)
|
|
||||||
|
|
||||||
def add_simulation_results(self, name, values, city_id=None, city_object_id=None):
|
|
||||||
"""
|
|
||||||
Add simulation results to the city or to the city_object
|
|
||||||
:param name: simulation and simulation engine name
|
|
||||||
:param values: simulation values in json format
|
|
||||||
:param city_id: city id or None
|
|
||||||
:param city_object_id: city object id or None
|
|
||||||
"""
|
|
||||||
self._simulation_results.insert(name, values, city_id, city_object_id)
|
|
|
@ -1,46 +0,0 @@
|
||||||
"""
|
|
||||||
User performs user-related crud operations
|
|
||||||
SPDX - License - Identifier: LGPL - 3.0 - or -later
|
|
||||||
Copyright © 2022 Concordia CERC group
|
|
||||||
Project CoderPeter Yefi peteryefi@gmail.com
|
|
||||||
"""
|
|
||||||
|
|
||||||
from hub.persistence import User
|
|
||||||
from hub.persistence import UserRoles
|
|
||||||
|
|
||||||
|
|
||||||
class UserFactory:
|
|
||||||
"""
|
|
||||||
UserFactory class
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, db_name, app_env, dotenv_path):
|
|
||||||
self._user_repo = User(db_name=db_name, app_env=app_env, dotenv_path=dotenv_path)
|
|
||||||
|
|
||||||
def create_user(self, name: str, application_id: int, password: str, role: UserRoles):
|
|
||||||
"""
|
|
||||||
Creates a new user
|
|
||||||
:param name: the name of the user
|
|
||||||
:param application_id: the application id of the user
|
|
||||||
:param password: the password of the user
|
|
||||||
:param role: the role of the user
|
|
||||||
"""
|
|
||||||
return self._user_repo.insert(name, password, role, application_id)
|
|
||||||
|
|
||||||
def update_user(self, user_id: int, name: str, password: str, role: UserRoles):
|
|
||||||
"""
|
|
||||||
Creates a new user
|
|
||||||
:param user_id: the id of the user
|
|
||||||
:param name: the name of the user
|
|
||||||
:param email: the email of the user
|
|
||||||
:param password: the password of the user
|
|
||||||
:param role: the role of the user
|
|
||||||
"""
|
|
||||||
return self._user_repo.update(user_id, name, password, role)
|
|
||||||
|
|
||||||
def delete_user(self, user_id):
|
|
||||||
"""
|
|
||||||
Retrieve a single user
|
|
||||||
:param user_id: the id of the user to delete
|
|
||||||
"""
|
|
||||||
return self._user_repo.delete(user_id)
|
|
|
@ -7,20 +7,22 @@ Project CoderPeter Yefi peteryefi@gmail.com
|
||||||
import json
|
import json
|
||||||
from typing import Union, Dict
|
from typing import Union, Dict
|
||||||
|
|
||||||
from hub.persistence import City
|
from hub.city_model_structure.city import City
|
||||||
from hub.persistence import Application
|
from hub.persistence import Application
|
||||||
from hub.persistence import User
|
from hub.persistence import City as CityRepository
|
||||||
from hub.persistence import CityObject
|
from hub.persistence import CityObject
|
||||||
from hub.persistence import SimulationResults
|
from hub.persistence import SimulationResults
|
||||||
|
from hub.persistence import User
|
||||||
|
from hub.persistence import UserRoles
|
||||||
|
|
||||||
|
|
||||||
class DBFactory:
|
class DBControl:
|
||||||
"""
|
"""
|
||||||
DBFactory class
|
DBFactory class
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, db_name, app_env, dotenv_path):
|
def __init__(self, db_name, app_env, dotenv_path):
|
||||||
self._city = City(db_name=db_name, app_env=app_env, dotenv_path=dotenv_path)
|
self._city_repository = CityRepository(db_name=db_name, dotenv_path=dotenv_path, app_env=app_env)
|
||||||
self._application = Application(db_name=db_name, app_env=app_env, dotenv_path=dotenv_path)
|
self._application = Application(db_name=db_name, app_env=app_env, dotenv_path=dotenv_path)
|
||||||
self._user = User(db_name=db_name, app_env=app_env, dotenv_path=dotenv_path)
|
self._user = User(db_name=db_name, app_env=app_env, dotenv_path=dotenv_path)
|
||||||
self._city_object = CityObject(db_name=db_name, app_env=app_env, dotenv_path=dotenv_path)
|
self._city_object = CityObject(db_name=db_name, app_env=app_env, dotenv_path=dotenv_path)
|
||||||
|
@ -61,7 +63,7 @@ class DBFactory:
|
||||||
:param application_id: Application id
|
:param application_id: Application id
|
||||||
:return: [City]
|
:return: [City]
|
||||||
"""
|
"""
|
||||||
return self._city.get_by_user_id_and_application_id(user_id, application_id)
|
return self._city_repository.get_by_user_id_and_application_id(user_id, application_id)
|
||||||
|
|
||||||
def building_info(self, name, city_id) -> Union[CityObject, None]:
|
def building_info(self, name, city_id) -> Union[CityObject, None]:
|
||||||
"""
|
"""
|
||||||
|
@ -85,7 +87,7 @@ class DBFactory:
|
||||||
results = {}
|
results = {}
|
||||||
for city in cities['cities']:
|
for city in cities['cities']:
|
||||||
city_name = next(iter(city))
|
city_name = next(iter(city))
|
||||||
result_set = self._city.get_by_user_id_application_id_and_name(user_id, application_id, city_name)
|
result_set = self._city_repository.get_by_user_id_application_id_and_name(user_id, application_id, city_name)
|
||||||
if result_set is None:
|
if result_set is None:
|
||||||
continue
|
continue
|
||||||
city_id = result_set.id
|
city_id = result_set.id
|
||||||
|
@ -104,3 +106,92 @@ class DBFactory:
|
||||||
values["building"] = building_name
|
values["building"] = building_name
|
||||||
results[city_name].append(values)
|
results[city_name].append(values)
|
||||||
return results
|
return results
|
||||||
|
|
||||||
|
def persist_city(self, city: City, pickle_path, application_id: int, user_id: int):
|
||||||
|
"""
|
||||||
|
Persist city into postgres database
|
||||||
|
:param city: City to be stored
|
||||||
|
:param pickle_path: Path to save the pickle file
|
||||||
|
:param application_id: Application id owning this city
|
||||||
|
:param user_id: User who create the city
|
||||||
|
"""
|
||||||
|
return self._city_repository.insert(city, pickle_path, application_id, user_id)
|
||||||
|
|
||||||
|
def update_city(self, city_id, city):
|
||||||
|
"""
|
||||||
|
Update an existing city in postgres database
|
||||||
|
:param city_id: the id of the city to update
|
||||||
|
:param city: the updated city object
|
||||||
|
"""
|
||||||
|
return self._city_repository.update(city_id, city)
|
||||||
|
|
||||||
|
def persist_application(self, name: str, description: str, application_uuid: str):
|
||||||
|
"""
|
||||||
|
Creates an application
|
||||||
|
:param name: name of application
|
||||||
|
:param description: the description of the application
|
||||||
|
:param application_uuid: the uuid of the application to be created
|
||||||
|
"""
|
||||||
|
return self._application.insert(name, description, application_uuid)
|
||||||
|
|
||||||
|
def update_application(self, name: str, description: str, application_uuid: str):
|
||||||
|
"""
|
||||||
|
Update an application
|
||||||
|
:param name: name of application
|
||||||
|
:param description: the description of the application
|
||||||
|
:param application_uuid: the uuid of the application to be created
|
||||||
|
"""
|
||||||
|
return self._application.update(application_uuid, name, description)
|
||||||
|
|
||||||
|
def delete_city(self, city_id):
|
||||||
|
"""
|
||||||
|
Deletes a single city from postgres
|
||||||
|
:param city_id: the id of the city to get
|
||||||
|
"""
|
||||||
|
self._city_repository.delete(city_id)
|
||||||
|
|
||||||
|
def delete_application(self, application_uuid):
|
||||||
|
"""
|
||||||
|
Deletes a single application from postgres
|
||||||
|
:param application_uuid: the id of the application to get
|
||||||
|
"""
|
||||||
|
self._application.delete(application_uuid)
|
||||||
|
|
||||||
|
def add_simulation_results(self, name, values, city_id=None, city_object_id=None):
|
||||||
|
"""
|
||||||
|
Add simulation results to the city or to the city_object
|
||||||
|
:param name: simulation and simulation engine name
|
||||||
|
:param values: simulation values in json format
|
||||||
|
:param city_id: city id or None
|
||||||
|
:param city_object_id: city object id or None
|
||||||
|
"""
|
||||||
|
self._simulation_results.insert(name, values, city_id, city_object_id)
|
||||||
|
|
||||||
|
def create_user(self, name: str, application_id: int, password: str, role: UserRoles):
|
||||||
|
"""
|
||||||
|
Creates a new user
|
||||||
|
:param name: the name of the user
|
||||||
|
:param application_id: the application id of the user
|
||||||
|
:param password: the password of the user
|
||||||
|
:param role: the role of the user
|
||||||
|
"""
|
||||||
|
return self._user.insert(name, password, role, application_id)
|
||||||
|
|
||||||
|
def update_user(self, user_id: int, name: str, password: str, role: UserRoles):
|
||||||
|
"""
|
||||||
|
Creates a new user
|
||||||
|
:param user_id: the id of the user
|
||||||
|
:param name: the name of the user
|
||||||
|
:param email: the email of the user
|
||||||
|
:param password: the password of the user
|
||||||
|
:param role: the role of the user
|
||||||
|
"""
|
||||||
|
return self._user.update(user_id, name, password, role)
|
||||||
|
|
||||||
|
def delete_user(self, user_id):
|
||||||
|
"""
|
||||||
|
Retrieve a single user
|
||||||
|
:param user_id: the id of the user to delete
|
||||||
|
"""
|
||||||
|
return self._user.delete(user_id)
|
||||||
|
|
|
@ -13,9 +13,7 @@ import sqlalchemy.exc
|
||||||
from hub.imports.geometry_factory import GeometryFactory
|
from hub.imports.geometry_factory import GeometryFactory
|
||||||
from hub.imports.construction_factory import ConstructionFactory
|
from hub.imports.construction_factory import ConstructionFactory
|
||||||
from hub.imports.usage_factory import UsageFactory
|
from hub.imports.usage_factory import UsageFactory
|
||||||
from hub.imports.db_factory import DBFactory as ImportDBFactory
|
from hub.persistence.db_control import DBControl
|
||||||
from hub.imports.user_factory import UserFactory
|
|
||||||
from hub.exports.db_factory import DBFactory as ExportDBFactory
|
|
||||||
from hub.persistence.repository import Repository
|
from hub.persistence.repository import Repository
|
||||||
from sqlalchemy import create_engine
|
from sqlalchemy import create_engine
|
||||||
from hub.persistence.models import City, Application, CityObject
|
from hub.persistence.models import City, Application, CityObject
|
||||||
|
@ -25,7 +23,7 @@ from sqlalchemy.exc import ProgrammingError
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
|
|
||||||
class Configure:
|
class Control:
|
||||||
_skip_test = False
|
_skip_test = False
|
||||||
_skip_reason = 'PostgreSQL not properly installed in host machine'
|
_skip_reason = 'PostgreSQL not properly installed in host machine'
|
||||||
|
|
||||||
|
@ -68,30 +66,19 @@ setup
|
||||||
ConstructionFactory('nrcan', self._city).enrich()
|
ConstructionFactory('nrcan', self._city).enrich()
|
||||||
UsageFactory('nrcan', self._city).enrich()
|
UsageFactory('nrcan', self._city).enrich()
|
||||||
|
|
||||||
self._import_db_factory = ImportDBFactory(
|
self._database = DBControl(
|
||||||
db_name=repository.configuration.db_name,
|
|
||||||
app_env='TEST',
|
|
||||||
dotenv_path=dotenv_path)
|
|
||||||
self._export_db_factory = ExportDBFactory(
|
|
||||||
db_name=repository.configuration.db_name,
|
|
||||||
app_env='TEST',
|
|
||||||
dotenv_path=dotenv_path)
|
|
||||||
user_factory = UserFactory(
|
|
||||||
db_name=repository.configuration.db_name,
|
db_name=repository.configuration.db_name,
|
||||||
app_env='TEST',
|
app_env='TEST',
|
||||||
dotenv_path=dotenv_path)
|
dotenv_path=dotenv_path)
|
||||||
|
|
||||||
self._unique_id = str(uuid.uuid4())
|
self._unique_id = str(uuid.uuid4())
|
||||||
self._application = self.import_db_factory.persist_application("test", "test application", self.unique_id)
|
self._application = self._database.persist_application("test", "test application", self.unique_id)
|
||||||
self._user = user_factory.create_user("Admin", self.application.id, "Admin@123", UserRoles.Admin)
|
self._user = self._database.create_user("Admin", self.application.id, "Admin@123", UserRoles.Admin)
|
||||||
self._pickle_path = 'tests_data/pickle_path.bz2'
|
self._pickle_path = 'tests_data/pickle_path.bz2'
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def import_db_factory(self):
|
def database(self):
|
||||||
return self._import_db_factory
|
return self._database
|
||||||
|
|
||||||
@property
|
|
||||||
def export_db_factory(self):
|
|
||||||
return self._export_db_factory
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def unique_id(self):
|
def unique_id(self):
|
||||||
|
@ -126,7 +113,7 @@ setup
|
||||||
return self._pickle_path
|
return self._pickle_path
|
||||||
|
|
||||||
|
|
||||||
configure = Configure()
|
control = Control()
|
||||||
|
|
||||||
|
|
||||||
class TestDBFactory(TestCase):
|
class TestDBFactory(TestCase):
|
||||||
|
@ -134,38 +121,38 @@ class TestDBFactory(TestCase):
|
||||||
TestDBFactory
|
TestDBFactory
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@unittest.skipIf(configure.skip_test, configure.skip_reason)
|
@unittest.skipIf(control.skip_test, control.skip_reason)
|
||||||
def test_save_application(self):
|
def test_save_application(self):
|
||||||
self.assertEqual(configure.application.name, "test")
|
self.assertEqual(control.application.name, "test")
|
||||||
self.assertEqual(configure.application.description, "test application")
|
self.assertEqual(control.application.description, "test application")
|
||||||
self.assertEqual(str(configure.application.application_uuid), configure.unique_id)
|
self.assertEqual(str(control.application.application_uuid), control.unique_id)
|
||||||
|
|
||||||
@unittest.skipIf(configure.skip_test, configure.skip_reason)
|
@unittest.skipIf(control.skip_test, control.skip_reason)
|
||||||
def test_save_city(self):
|
def test_save_city(self):
|
||||||
configure.city.name = "Montreal"
|
control.city.name = "Montreal"
|
||||||
city = configure.import_db_factory.persist_city(
|
city = control.database.persist_city(
|
||||||
configure.city,
|
control.city,
|
||||||
configure.pickle_path,
|
control.pickle_path,
|
||||||
configure.application.id,
|
control.application.id,
|
||||||
configure.user.id)
|
control.user.id)
|
||||||
self.assertEqual(city.name, 'Montreal')
|
self.assertEqual(city.name, 'Montreal')
|
||||||
self.assertEqual(city.pickle_path, configure.pickle_path)
|
self.assertEqual(city.pickle_path, control.pickle_path)
|
||||||
self.assertEqual(city.level_of_detail, configure.city.level_of_detail.geometry)
|
self.assertEqual(city.level_of_detail, control.city.level_of_detail.geometry)
|
||||||
configure.import_db_factory.delete_city(city.id)
|
control.database.delete_city(city.id)
|
||||||
|
|
||||||
@unittest.skipIf(configure.skip_test, configure.skip_reason)
|
@unittest.skipIf(control.skip_test, control.skip_reason)
|
||||||
def test_get_update_city(self):
|
def test_get_update_city(self):
|
||||||
city = configure.import_db_factory.persist_city(configure.city,
|
city = control.database.persist_city(control.city,
|
||||||
configure.pickle_path,
|
control.pickle_path,
|
||||||
configure.application.id,
|
control.application.id,
|
||||||
configure._user.id)
|
control._user.id)
|
||||||
city.name = "Ottawa"
|
city.name = "Ottawa"
|
||||||
configure.import_db_factory.update_city(city.id, configure.city)
|
control.database.update_city(city.id, control.city)
|
||||||
cities = configure.export_db_factory.cities_by_user_and_application(
|
cities = control.database.cities_by_user_and_application(
|
||||||
configure.user.id,
|
control.user.id,
|
||||||
configure.application.id)
|
control.application.id)
|
||||||
for updated_city in cities:
|
for updated_city in cities:
|
||||||
if updated_city.id == city.id:
|
if updated_city.id == city.id:
|
||||||
self.assertEqual(updated_city.name, city.name)
|
self.assertEqual(updated_city.name, city.name)
|
||||||
break
|
break
|
||||||
configure.import_db_factory.delete_city(city.id)
|
control.database.delete_city(city.id)
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user