From bbe392fd1e7e2b09bc03b15bd8ba59e60eb6187f Mon Sep 17 00:00:00 2001 From: collerek Date: Fri, 21 Oct 2022 15:06:07 +0200 Subject: [PATCH 1/3] Fix property_fields not being inherited. Fix for #774. --- ormar/models/metaclass.py | 4 +- .../test_inheritance_of_property_fields.py | 44 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 tests/test_inheritance_and_pydantic_generation/test_inheritance_of_property_fields.py diff --git a/ormar/models/metaclass.py b/ormar/models/metaclass.py index 208e0eb9..093b7d74 100644 --- a/ormar/models/metaclass.py +++ b/ormar/models/metaclass.py @@ -238,7 +238,7 @@ def update_attrs_from_base_meta( # noqa: CCR001 :type model_fields: Dict[str, BaseField] """ - params_to_update = ["metadata", "database", "constraints"] + params_to_update = ["metadata", "database", "constraints", "property_fields"] for param in params_to_update: current_value = attrs.get("Meta", {}).__dict__.get(param, ormar.Undefined) parent_value = ( @@ -254,6 +254,8 @@ def update_attrs_from_base_meta( # noqa: CCR001 parent_value = [get_constraint_copy(value) for value in parent_value] if isinstance(current_value, list): current_value.extend(parent_value) + elif isinstance(current_value, set): + setattr(attrs["Meta"], param, current_value.union(parent_value)) else: setattr(attrs["Meta"], param, parent_value) diff --git a/tests/test_inheritance_and_pydantic_generation/test_inheritance_of_property_fields.py b/tests/test_inheritance_and_pydantic_generation/test_inheritance_of_property_fields.py new file mode 100644 index 00000000..3e73ec48 --- /dev/null +++ b/tests/test_inheritance_and_pydantic_generation/test_inheritance_of_property_fields.py @@ -0,0 +1,44 @@ +import databases +import pytest +import sqlalchemy +import sqlalchemy as sa + +import ormar +from tests.settings import DATABASE_URL + +metadata = sa.MetaData() +database = databases.Database(DATABASE_URL) + + +class BaseFoo(ormar.Model): + class Meta: + abstract = True + + name: str = ormar.String(max_length=100) + + @ormar.property_field + def prefixed_name(self) -> str: + return "prefix_" + self.name + + +class Foo(BaseFoo): + class Meta: + metadata = metadata + database = database + + id: int = ormar.Integer(primary_key=True) + + +@pytest.fixture(autouse=True, scope="module") +def create_test_database(): + engine = sqlalchemy.create_engine(DATABASE_URL) + metadata.drop_all(engine) + metadata.create_all(engine) + yield + metadata.drop_all(engine) + + +def test_property_fields_are_inherited(): + foo = Foo(name="foo") + assert foo.prefixed_name == "prefix_foo" + assert foo.json() == '{"name": "foo", "id": null, "prefixed_name": "prefix_foo"}' From 0298b71e05d7c6ab40613b3294c46c7530da2533 Mon Sep 17 00:00:00 2001 From: collerek Date: Fri, 21 Oct 2022 15:16:24 +0200 Subject: [PATCH 2/3] Fix coverage --- .../test_inheritance_of_property_fields.py | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/tests/test_inheritance_and_pydantic_generation/test_inheritance_of_property_fields.py b/tests/test_inheritance_and_pydantic_generation/test_inheritance_of_property_fields.py index 3e73ec48..9e9169f7 100644 --- a/tests/test_inheritance_and_pydantic_generation/test_inheritance_of_property_fields.py +++ b/tests/test_inheritance_and_pydantic_generation/test_inheritance_of_property_fields.py @@ -26,6 +26,22 @@ class Meta: metadata = metadata database = database + @ormar.property_field + def double_prefixed_name(self) -> str: + return "prefix2_" + self.name + + id: int = ormar.Integer(primary_key=True) + + +class Bar(BaseFoo): + class Meta: + metadata = metadata + database = database + + @ormar.property_field + def prefixed_name(self) -> str: + return "baz_" + self.name + id: int = ormar.Integer(primary_key=True) @@ -41,4 +57,13 @@ def create_test_database(): def test_property_fields_are_inherited(): foo = Foo(name="foo") assert foo.prefixed_name == "prefix_foo" - assert foo.json() == '{"name": "foo", "id": null, "prefixed_name": "prefix_foo"}' + assert foo.dict() == { + "name": "foo", + "id": None, + "double_prefixed_name": "prefix2_foo", + "prefixed_name": "prefix_foo", + } + + bar = Bar(name="bar") + assert bar.prefixed_name == "baz_bar" + assert bar.dict() == {"name": "bar", "id": None, "prefixed_name": "baz_bar"} From 079021fab3c6ad2f326150dd313bc94b180c8d14 Mon Sep 17 00:00:00 2001 From: collerek Date: Fri, 21 Oct 2022 16:13:31 +0200 Subject: [PATCH 3/3] Fix coverage by removing set attribute update - during inheriting the current property fields are not set yet. --- ormar/models/metaclass.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/ormar/models/metaclass.py b/ormar/models/metaclass.py index 093b7d74..36a3e748 100644 --- a/ormar/models/metaclass.py +++ b/ormar/models/metaclass.py @@ -254,8 +254,6 @@ def update_attrs_from_base_meta( # noqa: CCR001 parent_value = [get_constraint_copy(value) for value in parent_value] if isinstance(current_value, list): current_value.extend(parent_value) - elif isinstance(current_value, set): - setattr(attrs["Meta"], param, current_value.union(parent_value)) else: setattr(attrs["Meta"], param, parent_value)