From c6c445f9a80fc2eaeb5d75749e2a8d646ba4518c Mon Sep 17 00:00:00 2001 From: msorvoja Date: Tue, 6 Feb 2024 07:52:36 +0200 Subject: [PATCH 1/3] Add plan regulation group table --- ...68ce708_add_plan_regulation_group_table.py | 66 +++++++++++++++++++ database/models.py | 15 ++++- database/test/test_db.py | 10 ++- 3 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 database/migrations/versions/2024_02_05_1807-c882368ce708_add_plan_regulation_group_table.py diff --git a/database/migrations/versions/2024_02_05_1807-c882368ce708_add_plan_regulation_group_table.py b/database/migrations/versions/2024_02_05_1807-c882368ce708_add_plan_regulation_group_table.py new file mode 100644 index 0000000..80fe71a --- /dev/null +++ b/database/migrations/versions/2024_02_05_1807-c882368ce708_add_plan_regulation_group_table.py @@ -0,0 +1,66 @@ +"""add_plan_regulation_group_table + +Revision ID: c882368ce708 +Revises: 84c37bffeca0 +Create Date: 2024-02-05 18:07:16.739686 + +""" +from typing import Sequence, Union + +# import geoalchemy2 +import sqlalchemy as sa +from alembic import op +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = "c882368ce708" +down_revision: Union[str, None] = "84c37bffeca0" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + "plan_regulation_group", + sa.Column("short_name", sa.String(), nullable=False), + sa.Column( + "name", + postgresql.JSONB(astext_type=sa.Text()), + server_default='{"fin": "", "swe": "", "eng": ""}', + nullable=False, + ), + sa.Column( + "id", sa.UUID(), server_default=sa.text("gen_random_uuid()"), nullable=False + ), + sa.Column( + "created_at", sa.DateTime(), server_default=sa.text("now()"), nullable=False + ), + sa.Column( + "modified_at", + sa.DateTime(), + server_default=sa.text("now()"), + nullable=False, + ), + sa.PrimaryKeyConstraint("id"), + schema="hame", + ) + op.create_index( + op.f("ix_hame_plan_regulation_group_short_name"), + "plan_regulation_group", + ["short_name"], + unique=True, + schema="hame", + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_index( + op.f("ix_hame_plan_regulation_group_short_name"), + table_name="plan_regulation_group", + schema="hame", + ) + op.drop_table("plan_regulation_group", schema="hame") + # ### end Alembic commands ### diff --git a/database/models.py b/database/models.py index 36e0776..48371d1 100644 --- a/database/models.py +++ b/database/models.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import Optional -from base import PlanBase, language_str +from base import PlanBase, VersionedBase, language_str, unique_str from shapely.geometry import Polygon from sqlalchemy.orm import Mapped @@ -16,3 +16,16 @@ class Plan(PlanBase): name: Mapped[language_str] approved_at: Mapped[Optional[datetime]] geom: Mapped[Polygon] + + +class PlanRegulationGroup(VersionedBase): + """ + Kaavamääräysryhmä + """ + + __tablename__ = "plan_regulation_group" + + short_name: Mapped[unique_str] + name: Mapped[language_str] + + __table_args__ = {"schema": "hame"} diff --git a/database/test/test_db.py b/database/test/test_db.py index 78690ba..c3f6056 100644 --- a/database/test/test_db.py +++ b/database/test/test_db.py @@ -2,7 +2,7 @@ import psycopg2 -hame_count: int = 1 # adjust me when adding tables +hame_count: int = 2 # adjust me when adding tables codes_count: int = 8 # adjust me when adding tables matview_count: int = 0 # adjust me when adding views @@ -80,6 +80,14 @@ def assert_database_is_alright( None, f"CREATE INDEX idx_{table_name}_geom ON hame.{table_name} USING gist (geom)", ) in indexes + if ("short_name",) in columns: + assert ( + "hame", + table_name, + f"ix_hame_{table_name}_short_name", + None, + f"CREATE UNIQUE INDEX ix_hame_{table_name}_short_name ON hame.{table_name} USING btree (short_name)", + ) in indexes # Check code tables cur.execute("SELECT tablename, tableowner FROM pg_tables WHERE schemaname='codes';") From e846984a6651f78bb024acc76cb1f9c89998ef06 Mon Sep 17 00:00:00 2001 From: msorvoja Date: Thu, 8 Feb 2024 14:24:11 +0200 Subject: [PATCH 2/3] Change inherited base class --- ...178cef_edit_plan_regulation_group_table.py | 73 +++++++++++++++++++ database/models.py | 6 +- 2 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 database/migrations/versions/2024_02_08_1423-811b23178cef_edit_plan_regulation_group_table.py diff --git a/database/migrations/versions/2024_02_08_1423-811b23178cef_edit_plan_regulation_group_table.py b/database/migrations/versions/2024_02_08_1423-811b23178cef_edit_plan_regulation_group_table.py new file mode 100644 index 0000000..5983b3e --- /dev/null +++ b/database/migrations/versions/2024_02_08_1423-811b23178cef_edit_plan_regulation_group_table.py @@ -0,0 +1,73 @@ +"""Edit plan regulation group table + +Revision ID: 811b23178cef +Revises: c882368ce708 +Create Date: 2024-02-08 14:23:00.747678 + +""" +from typing import Sequence, Union + +# import geoalchemy2 +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision: str = "811b23178cef" +down_revision: Union[str, None] = "c882368ce708" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column( + "plan_regulation_group", + sa.Column("exported_at", sa.DateTime(), nullable=True), + schema="hame", + ) + op.add_column( + "plan_regulation_group", + sa.Column("valid_from", sa.DateTime(), nullable=True), + schema="hame", + ) + op.add_column( + "plan_regulation_group", + sa.Column("valid_to", sa.DateTime(), nullable=True), + schema="hame", + ) + op.add_column( + "plan_regulation_group", + sa.Column("repealed_at", sa.DateTime(), nullable=True), + schema="hame", + ) + op.add_column( + "plan_regulation_group", + sa.Column("lifecycle_status_id", sa.UUID(), nullable=False), + schema="hame", + ) + op.create_foreign_key( + "plan_lifecycle_status_id_fkey", + "plan_regulation_group", + "lifecycle_status", + ["lifecycle_status_id"], + ["id"], + source_schema="hame", + referent_schema="codes", + ) + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint( + "plan_lifecycle_status_id_fkey", + "plan_regulation_group", + schema="hame", + type_="foreignkey", + ) + op.drop_column("plan_regulation_group", "lifecycle_status_id", schema="hame") + op.drop_column("plan_regulation_group", "repealed_at", schema="hame") + op.drop_column("plan_regulation_group", "valid_to", schema="hame") + op.drop_column("plan_regulation_group", "valid_from", schema="hame") + op.drop_column("plan_regulation_group", "exported_at", schema="hame") + # ### end Alembic commands ### diff --git a/database/models.py b/database/models.py index 48371d1..2f3af15 100644 --- a/database/models.py +++ b/database/models.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import Optional -from base import PlanBase, VersionedBase, language_str, unique_str +from base import PlanBase, language_str, unique_str from shapely.geometry import Polygon from sqlalchemy.orm import Mapped @@ -18,7 +18,7 @@ class Plan(PlanBase): geom: Mapped[Polygon] -class PlanRegulationGroup(VersionedBase): +class PlanRegulationGroup(PlanBase): """ Kaavamääräysryhmä """ @@ -27,5 +27,3 @@ class PlanRegulationGroup(VersionedBase): short_name: Mapped[unique_str] name: Mapped[language_str] - - __table_args__ = {"schema": "hame"} From c5f660eae1899762db6a97bd85fb4c0b00692df3 Mon Sep 17 00:00:00 2001 From: msorvoja Date: Thu, 8 Feb 2024 16:14:58 +0200 Subject: [PATCH 3/3] Change plan regulation group base class to VersionedBase --- database/base.py | 2 +- ...a_edit_plan_regulation_group_base_class.py | 84 +++++++++++++++++++ database/models.py | 4 +- 3 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 database/migrations/versions/2024_02_08_1613-6ee06a6e634a_edit_plan_regulation_group_base_class.py diff --git a/database/base.py b/database/base.py index fda5932..be2b1be 100644 --- a/database/base.py +++ b/database/base.py @@ -52,6 +52,7 @@ class VersionedBase(Base): """ __abstract__ = True + __table_args__ = {"schema": "hame"} id: Mapped[uuid_pk] created_at: Mapped[timestamp] @@ -105,7 +106,6 @@ class PlanBase(VersionedBase): """ __abstract__ = True - __table_args__ = {"schema": "hame"} exported_at: Mapped[Optional[datetime]] valid_from: Mapped[Optional[datetime]] diff --git a/database/migrations/versions/2024_02_08_1613-6ee06a6e634a_edit_plan_regulation_group_base_class.py b/database/migrations/versions/2024_02_08_1613-6ee06a6e634a_edit_plan_regulation_group_base_class.py new file mode 100644 index 0000000..33eae14 --- /dev/null +++ b/database/migrations/versions/2024_02_08_1613-6ee06a6e634a_edit_plan_regulation_group_base_class.py @@ -0,0 +1,84 @@ +"""edit_plan_regulation_group_base_class + +Revision ID: 6ee06a6e634a +Revises: 811b23178cef +Create Date: 2024-02-08 16:13:11.875724 + +""" +from typing import Sequence, Union + +# import geoalchemy2 +import sqlalchemy as sa +from alembic import op +from sqlalchemy.dialects import postgresql + +# revision identifiers, used by Alembic. +revision: str = "6ee06a6e634a" +down_revision: Union[str, None] = "811b23178cef" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint( + "plan_lifecycle_status_id_fkey", + "plan_regulation_group", + schema="hame", + type_="foreignkey", + ) + op.drop_column("plan_regulation_group", "valid_to", schema="hame") + op.drop_column("plan_regulation_group", "valid_from", schema="hame") + op.drop_column("plan_regulation_group", "exported_at", schema="hame") + op.drop_column("plan_regulation_group", "lifecycle_status_id", schema="hame") + op.drop_column("plan_regulation_group", "repealed_at", schema="hame") + # ### end Alembic commands ### + + +def downgrade() -> None: + # ### commands auto generated by Alembic - please adjust! ### + op.add_column( + "plan_regulation_group", + sa.Column( + "repealed_at", postgresql.TIMESTAMP(), autoincrement=False, nullable=True + ), + schema="hame", + ) + op.add_column( + "plan_regulation_group", + sa.Column( + "lifecycle_status_id", sa.UUID(), autoincrement=False, nullable=False + ), + schema="hame", + ) + op.add_column( + "plan_regulation_group", + sa.Column( + "exported_at", postgresql.TIMESTAMP(), autoincrement=False, nullable=True + ), + schema="hame", + ) + op.add_column( + "plan_regulation_group", + sa.Column( + "valid_from", postgresql.TIMESTAMP(), autoincrement=False, nullable=True + ), + schema="hame", + ) + op.add_column( + "plan_regulation_group", + sa.Column( + "valid_to", postgresql.TIMESTAMP(), autoincrement=False, nullable=True + ), + schema="hame", + ) + op.create_foreign_key( + "plan_lifecycle_status_id_fkey", + "plan_regulation_group", + "lifecycle_status", + ["lifecycle_status_id"], + ["id"], + source_schema="hame", + referent_schema="codes", + ) + # ### end Alembic commands ### diff --git a/database/models.py b/database/models.py index 2f3af15..237e71c 100644 --- a/database/models.py +++ b/database/models.py @@ -1,7 +1,7 @@ from datetime import datetime from typing import Optional -from base import PlanBase, language_str, unique_str +from base import PlanBase, VersionedBase, language_str, unique_str from shapely.geometry import Polygon from sqlalchemy.orm import Mapped @@ -18,7 +18,7 @@ class Plan(PlanBase): geom: Mapped[Polygon] -class PlanRegulationGroup(PlanBase): +class PlanRegulationGroup(VersionedBase): """ Kaavamääräysryhmä """