Skip to content

Commit 167ebde

Browse files
feat: add validation for filter definition and geometry and type (#983)
* add validation for filter definition and geometry and type * change ValidationError to ValueError * add test topic filter validation * cleane test_topic_definitions.py / add test topic filter validation for geometry and type / add filter validation OhsomeFilter
1 parent dfc9b12 commit 167ebde

File tree

4 files changed

+45
-10
lines changed

4 files changed

+45
-10
lines changed

ohsome_quality_api/topics/models.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from typing import Literal
99

1010
from fastapi_i18n import _
11+
from ohsome_filter_to_sql.main import OhsomeFilter
1112
from pydantic import BaseModel, ConfigDict, field_validator
1213

1314
from ohsome_quality_api.projects.definitions import ProjectEnum
@@ -37,12 +38,20 @@ class Topic(BaseTopic):
3738

3839
endpoint: Literal["elements"]
3940
aggregation_type: Literal["area", "count", "length", "perimeter", "area/density"]
40-
filter: str
41+
filter: OhsomeFilter
4142
indicators: list[str]
4243
projects: list[ProjectEnum]
4344
source: str | None = None
4445
ratio_filter: str | None = None
4546

47+
@field_validator("filter", mode="before")
48+
@classmethod
49+
def ensure_filter_geometry_or_type(cls, value: str) -> str:
50+
if "geometry" not in value and "type" not in value:
51+
raise ValueError("Filter does not contain geometry or type specification.")
52+
else:
53+
return value
54+
4655

4756
class TopicData(BaseTopic):
4857
"""Includes the data associated with the topic."""

tests/unittests/test_topic.py

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,32 @@ def test_base_topic_extra():
2020
BaseTopic(name="name", key="key", description="description", foo="bar")
2121

2222

23+
def test_topic_filter_validation():
24+
with pytest.raises(ValidationError):
25+
Topic(
26+
endpoint="elements",
27+
aggregation_type=["area", "count", "length", "perimeter", "area/density"],
28+
filter="filter",
29+
indicators=["indicators"],
30+
projects=["projects"],
31+
source="source",
32+
ratio_filter="ratio_filter",
33+
)
34+
35+
36+
def test_topic_filter_validation_geom_type():
37+
with pytest.raises(ValidationError):
38+
Topic(
39+
endpoint="elements",
40+
aggregation_type=["area", "count", "length", "perimeter", "area/density"],
41+
filter="building=yes",
42+
indicators=["indicators"],
43+
projects=["projects"],
44+
source="source",
45+
ratio_filter="ratio_filter",
46+
)
47+
48+
2349
def test_topic_definition():
2450
Topic(
2551
key="key",
@@ -29,7 +55,7 @@ def test_topic_definition():
2955
projects=["core"],
3056
endpoint="elements",
3157
aggregation_type="count",
32-
filter="filter",
58+
filter="building=yes and geometry:polygon",
3359
)
3460
Topic(
3561
key="key",
@@ -39,7 +65,7 @@ def test_topic_definition():
3965
projects=["core"],
4066
endpoint="elements",
4167
aggregation_type="count",
42-
filter="filter",
68+
filter="building=yes and geometry:polygon",
4369
source="source",
4470
)
4571
Topic(
@@ -50,7 +76,7 @@ def test_topic_definition():
5076
projects=["core"],
5177
endpoint="elements",
5278
aggregation_type="count",
53-
filter="filter",
79+
filter="type:way and highway=residential",
5480
source="source",
5581
)
5682
Topic(
@@ -61,7 +87,7 @@ def test_topic_definition():
6187
projects=["core", "experimental"],
6288
endpoint="elements",
6389
aggregation_type="count",
64-
filter="filter",
90+
filter="geometry:polygon and building=*",
6591
source="source",
6692
)
6793
Topic(
@@ -72,7 +98,7 @@ def test_topic_definition():
7298
projects=["core"],
7399
endpoint="elements",
74100
aggregation_type="count",
75-
filter="filter",
101+
filter="geometry:polygon and building=*",
76102
source="source",
77103
)
78104
Topic(
@@ -83,7 +109,7 @@ def test_topic_definition():
83109
projects=["core"],
84110
endpoint="elements",
85111
aggregation_type="count",
86-
filter="filter",
112+
filter="type:way and highway=residential",
87113
source="source",
88114
ratio_filter="ration_filter",
89115
)

tests/unittests/test_topics_definitions.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ def test_get_valid_topics():
1717

1818
def test_load_topic_definition():
1919
topics = definitions.load_topic_presets()
20-
for topic in topics:
21-
assert isinstance(topics[topic], models.Topic)
20+
for topic in topics.values():
21+
assert isinstance(topic, models.Topic)
2222

2323

2424
def test_get_topic_definition():

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)