Skip to content

Commit cab8b52

Browse files
refactor: make result labels a pydantic model
and translate labels before initializing the model
1 parent 1cecda4 commit cab8b52

File tree

9 files changed

+39
-18
lines changed

9 files changed

+39
-18
lines changed

ohsome_quality_api/indicators/attribute_completeness/indicator.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,17 +98,17 @@ def calculate(self) -> None:
9898
if self.result.value >= self.threshold_yellow:
9999
self.result.class_ = 5
100100
self.result.description = (
101-
self.description + self.templates.label_description["green"]
101+
self.description + self.templates.label_description.green
102102
)
103103
elif self.threshold_yellow > self.result.value >= self.threshold_red:
104104
self.result.class_ = 3
105105
self.result.description = (
106-
self.description + self.templates.label_description["yellow"]
106+
self.description + self.templates.label_description.yellow
107107
)
108108
else:
109109
self.result.class_ = 1
110110
self.result.description = (
111-
self.description + self.templates.label_description["red"]
111+
self.description + self.templates.label_description.red
112112
)
113113

114114
def create_description(self):

ohsome_quality_api/indicators/base.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def __init__(
3737
self.topic: Topic = topic
3838
self.feature: Feature = feature
3939
self.result: Result = Result(
40-
description=self.templates.label_description["undefined"],
40+
description=self.templates.label_description.undefined
4141
)
4242
self._get_default_figure()
4343

ohsome_quality_api/indicators/building_comparison/indicator.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,13 +130,19 @@ def calculate(self) -> None:
130130
self.result.class_ = 3
131131
elif self.th_low > self.result.value >= 0:
132132
self.result.class_ = 1
133-
label_description = self.templates.label_description[self.result.label]
133+
label_description = getattr(
134+
self.templates.label_description, self.result.label
135+
)
134136
self.result.description = " ".join((label_description, result_description))
135137
elif major_edge_case:
136-
label_description = self.templates.label_description[self.result.label]
138+
label_description = getattr(
139+
self.templates.label_description, self.result.label
140+
)
137141
self.result.description = " ".join((label_description, result_description))
138142
else:
139-
label_description = self.templates.label_description[self.result.label]
143+
label_description = getattr(
144+
self.templates.label_description, self.result.label
145+
)
140146
edge_case = (
141147
"OSM has substantivly more buildings than the reference datasets. The "
142148
"reference dataset is likely to miss many buildings."

ohsome_quality_api/indicators/currentness/indicator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ def calculate(self):
158158
else:
159159
self.result.class_ = 1
160160

161-
label_description = self.templates.label_description[self.result.label]
161+
label_description = getattr(self.templates.label_description, self.result.label)
162162
self.result.description += Template(
163163
self.templates.result_description
164164
).substitute(

ohsome_quality_api/indicators/density/indicator.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,18 @@ def calculate(self) -> None:
4646
if self.result.value >= self.threshold_yellow:
4747
self.result.class_ = 5
4848
self.result.description = (
49-
description + self.templates.label_description["green"]
49+
description + self.templates.label_description.green
5050
)
5151
else:
5252
if self.result.value > self.threshold_red:
5353
self.result.class_ = 3
5454
self.result.description = (
55-
description + self.templates.label_description["yellow"]
55+
description + self.templates.label_description.yellow
5656
)
5757
else:
5858
self.result.class_ = 1
5959
self.result.description = (
60-
description + self.templates.label_description["red"]
60+
description + self.templates.label_description.red
6161
)
6262

6363
def create_figure(self) -> None:

ohsome_quality_api/indicators/mapping_saturation/indicator.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ def calculate(self) -> None: # noqa: C901
151151
description = Template(self.templates.result_description).substitute(
152152
saturation=round(self.result.value * 100, 2)
153153
)
154-
self.result.description = (
155-
description + self.templates.label_description[self.result.label]
154+
self.result.description = description + getattr(
155+
self.templates.label_description, self.result.label
156156
)
157157

158158
def create_figure(self) -> None:

ohsome_quality_api/indicators/minimal/indicator.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@ async def preprocess(self) -> None:
2525
def calculate(self) -> None:
2626
description = Template(self.templates.result_description).substitute()
2727
self.result.value = 1.0
28-
self.result.description = (
29-
description + self.templates.label_description["green"]
30-
)
28+
self.result.description = description + self.templates.label_description.green
3129

3230
def create_figure(self) -> None:
3331
# Do nothing ...

ohsome_quality_api/indicators/models.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,29 @@ class IndicatorMetadata(BaseModel):
2424
)
2525

2626

27+
class LabelDescription(BaseModel):
28+
green: str
29+
yellow: str
30+
red: str
31+
undefined: str
32+
33+
@field_validator("green", "yellow", "red", "undefined", mode="before")
34+
@classmethod
35+
def translate(cls, value: str) -> str:
36+
return _(value)
37+
38+
2739
class IndicatorTemplates(BaseModel):
2840
"""Result text templates of an indicator as defined in the templates.yaml file."""
2941

30-
label_description: dict[str, str]
42+
label_description: LabelDescription
3143
result_description: str
3244

45+
@field_validator("result_description", mode="before")
46+
@classmethod
47+
def translate(cls, value: str) -> str:
48+
return _(value)
49+
3350

3451
class Result(BaseModel):
3552
"""The result of the Indicator.

ohsome_quality_api/indicators/road_comparison/indicator.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ def calculate(self) -> None:
138138
elif self.th_low > self.result.value >= 0:
139139
self.result.class_ = 1
140140

141-
label_description = self.templates.label_description[self.result.label]
141+
label_description = getattr(self.templates.label_description, self.result.label)
142142
self.result.description += label_description
143143
# remove double white spaces
144144
self.result.description = " ".join(self.result.description.split())

0 commit comments

Comments
 (0)