From 06e59b8061869b1fae5485701cdfdec99f67edd3 Mon Sep 17 00:00:00 2001 From: Philipp Horstenkamp Date: Thu, 24 Aug 2023 17:23:19 +0200 Subject: [PATCH] Changes to the database (#67) In this PR are pruposed changed that come up when i started the data migration. Plese review them an approve and disaprove. --- .../utils/enumy_types.py | 28 +++++----- .../utils/postgres/connector.py | 6 ++- .../utils/postgres/entities.py | 51 ++++++++++--------- tests/config/__init__.py | 1 - tests/utils/mongo/__init__.py | 1 - tests/utils/postgres/__init__.py | 1 - tests/utils/postgres/connector_test.py | 3 +- tests/utils/postgres/entities_test.py | 2 +- 8 files changed, 44 insertions(+), 49 deletions(-) delete mode 100644 tests/config/__init__.py delete mode 100644 tests/utils/mongo/__init__.py delete mode 100644 tests/utils/postgres/__init__.py diff --git a/src/aki_prj23_transparenzregister/utils/enumy_types.py b/src/aki_prj23_transparenzregister/utils/enumy_types.py index e8edbf0..30901de 100644 --- a/src/aki_prj23_transparenzregister/utils/enumy_types.py +++ b/src/aki_prj23_transparenzregister/utils/enumy_types.py @@ -2,15 +2,20 @@ import enum -class RelationTypeEnum(enum.Enum): +class RelationTypeEnum(enum.IntEnum): """RelationTypeEnum.""" - executive = "Executive" - auditor = "Auditor" - supervisory_board = "Supervisory_Board" - managing_director = "Managing_Directory" - authorized_representative = "Authorized_Representative" - final_auditor = "Final_Auditor" + EXECUTIVE = enum.auto() + AUDITOR = enum.auto() + SUPERVISORY_BOARD = enum.auto() + MANAGING_DIRECTOR = enum.auto() + AUTHORIZED_REPRESENTATIVE = enum.auto() + FINAL_AUDITOR = enum.auto() + + PARTICIPATES_WITH = enum.auto() + HAS_SHARES_OF = enum.auto() + IS_SUPPLIED_BY = enum.auto() + WORKS_WITH = enum.auto() class SentimentTypeEnum(enum.Enum): @@ -20,12 +25,3 @@ class SentimentTypeEnum(enum.Enum): sustainability = "sustainability" environmental_aspects = "environmental_aspects" perception = "perception" - - -class RelationTypeCompanyEnum(enum.Enum): - """RelationTypeCompanyEnum.""" - - participates_with = "participates_with" - has_shares_of = "has_shares_of" - is_supplied_by = "is_supplied_by" - works_with = "works_with" diff --git a/src/aki_prj23_transparenzregister/utils/postgres/connector.py b/src/aki_prj23_transparenzregister/utils/postgres/connector.py index 5fab529..5b41fac 100644 --- a/src/aki_prj23_transparenzregister/utils/postgres/connector.py +++ b/src/aki_prj23_transparenzregister/utils/postgres/connector.py @@ -1,11 +1,10 @@ """Module containing connection utils for PostgreSQL DB.""" from sqlalchemy import create_engine from sqlalchemy.engine import URL, Engine -from sqlalchemy.orm import Session, sessionmaker +from sqlalchemy.orm import Session, declarative_base, sessionmaker from aki_prj23_transparenzregister.config.config_providers import JsonFileConfigProvider from aki_prj23_transparenzregister.config.config_template import PostgreConnectionString -from aki_prj23_transparenzregister.utils.postgres.entities import Base def get_engine(conn_args: PostgreConnectionString) -> Engine: @@ -34,6 +33,9 @@ def get_session() -> Session: # pragma: no cover return session() +Base = declarative_base() + + def init_db() -> None: """Initialize DB with all defined entities.""" config_provider = JsonFileConfigProvider("./secrets.json") diff --git a/src/aki_prj23_transparenzregister/utils/postgres/entities.py b/src/aki_prj23_transparenzregister/utils/postgres/entities.py index 53b2a36..c398325 100644 --- a/src/aki_prj23_transparenzregister/utils/postgres/entities.py +++ b/src/aki_prj23_transparenzregister/utils/postgres/entities.py @@ -1,20 +1,15 @@ """ORM entities for Prod. DB.""" -import uuid from datetime import datetime import sqlalchemy as sa -from sqlalchemy.orm import ( - declarative_base, -) from aki_prj23_transparenzregister.utils.enumy_types import ( - RelationTypeCompanyEnum, RelationTypeEnum, SentimentTypeEnum, ) +from aki_prj23_transparenzregister.utils.postgres.connector import Base # # create an object *district_court* which inherits attributes from Base-class -Base = declarative_base() class DistrictCourt(Base): @@ -22,9 +17,9 @@ class DistrictCourt(Base): __tablename__ = "district_court" - id = sa.Column(sa.Integer, primary_key=True) + id = sa.Column(sa.Integer, primary_key=True, autoincrement=True) city = sa.Column(sa.String(100), nullable=False) - name = sa.Column(sa.String(100), nullable=False) + name = sa.Column(sa.String(100), nullable=False, unique=True) class Company(Base): @@ -37,7 +32,7 @@ class Company(Base): sa.UniqueConstraint("hr", "court_id"), ) - id = sa.Column(sa.String, primary_key=True, default=uuid.uuid4, unique=True) + id = sa.Column(sa.Integer, primary_key=True, autoincrement=True) hr = sa.Column(sa.Integer, nullable=False) court_id = sa.Column( sa.Integer, @@ -51,14 +46,14 @@ class Company(Base): sector = sa.Column(sa.String(100), nullable=False) -class Finance(Base): +class AnnualFinanceStatement(Base): """Finance.""" - __tablename__ = "finance" + __tablename__ = "annual_finance_statement" id = sa.Column(sa.Integer, primary_key=True) company_id = sa.Column(sa.String, sa.ForeignKey("company.id")) - date = sa.Column(sa.DateTime(timezone=True), default=datetime.now) + date = sa.Column(sa.DateTime(timezone=True), nullable=False) total_volume = sa.Column(sa.Float) ebit = sa.Column(sa.Float) ebitda = sa.Column(sa.Float) @@ -103,36 +98,42 @@ class Person(Base): works_for = sa.Column(sa.String(100)) +class Relation(Base): + """A super table containing all relations.""" + + __tablename__ = "relation" + id = sa.Column(sa.Integer, primary_key=True) + company_id = sa.Column(sa.String, sa.ForeignKey("company.id")) + + date_from = sa.Column(sa.DateTime(timezone=True), nullable=True) + date_to = sa.Column(sa.DateTime(timezone=True), nullable=True) + + relation = sa.Column(sa.Enum(RelationTypeEnum), nullable=False) + + # create own relation type and person_relation object -class PersonRelation(Base): +class PersonRelation(Relation): """PersonRelation.""" __tablename__ = "person_relation" - id = sa.Column(sa.Integer, primary_key=True) - company_id = sa.Column(sa.String, sa.ForeignKey("company.id")) - person_id = sa.Column(sa.Integer, sa.ForeignKey(Person.id)) - date_from = sa.Column(sa.DateTime(timezone=True), default=datetime.now) - date_to = sa.Column(sa.DateTime(timezone=True), default=datetime.now) - relation = sa.Column(sa.Enum(RelationTypeEnum), nullable=False) + id = sa.Column(sa.Integer, sa.ForeignKey("relation.id"), primary_key=True) + person_id = sa.Column(sa.Integer, sa.ForeignKey("person.id")) # company = relationship("Company") # person = relationship("Person", foreign_keys=[person_id]) # company = relationship('Company', foreign_keys=[company_hr,company_court]) + __table_args__ = {"extend_existing": True} # create own relation type and company_relation object -class CompanyRelation(Base): +class CompanyRelation(Relation): """CompanyRelation.""" __tablename__ = "company_relation" - id = sa.Column(sa.Integer, primary_key=True) - company1_id = sa.Column(sa.String, sa.ForeignKey("company.id"), nullable=False) + id = sa.Column(sa.Integer, sa.ForeignKey("relation.id"), primary_key=True) company2_id = sa.Column(sa.String, sa.ForeignKey("company.id"), nullable=False) - date_from = sa.Column(sa.DateTime(timezone=True), default=datetime.now) - date_to = sa.Column(sa.DateTime(timezone=True), default=datetime.now) - relation = sa.Column(sa.Enum(RelationTypeCompanyEnum), nullable=False) # company = relationship("Company") diff --git a/tests/config/__init__.py b/tests/config/__init__.py deleted file mode 100644 index 6275ce4..0000000 --- a/tests/config/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Tests for config module.""" diff --git a/tests/utils/mongo/__init__.py b/tests/utils/mongo/__init__.py deleted file mode 100644 index cf97370..0000000 --- a/tests/utils/mongo/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Mongo utils module.""" diff --git a/tests/utils/postgres/__init__.py b/tests/utils/postgres/__init__.py deleted file mode 100644 index a4ce3a4..0000000 --- a/tests/utils/postgres/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Tests for utils.postgres module.""" diff --git a/tests/utils/postgres/connector_test.py b/tests/utils/postgres/connector_test.py index ec9aaf2..35e0c94 100644 --- a/tests/utils/postgres/connector_test.py +++ b/tests/utils/postgres/connector_test.py @@ -18,7 +18,7 @@ def test_init_db() -> None: with patch( "aki_prj23_transparenzregister.utils.postgres.connector.get_engine" ) as mock_get_engine, patch( - "aki_prj23_transparenzregister.utils.postgres.entities.declarative_base" + "aki_prj23_transparenzregister.utils.postgres.connector.declarative_base" ) as mock_declarative_base, patch( "aki_prj23_transparenzregister.utils.postgres.connector.JsonFileConfigProvider" ) as mock_provider: @@ -33,4 +33,3 @@ def test_init_db() -> None: mock_value.get_postgre_connection_string.return_value = "" init_db() - assert True diff --git a/tests/utils/postgres/entities_test.py b/tests/utils/postgres/entities_test.py index bb67ffe..69d376c 100644 --- a/tests/utils/postgres/entities_test.py +++ b/tests/utils/postgres/entities_test.py @@ -1,4 +1,4 @@ def test_import() -> None: from aki_prj23_transparenzregister.utils.postgres import entities - assert entities is not None + assert entities