Skip to content

Commit 1d8fadb

Browse files
authored
Merge pull request #2711 from IFRCGo/chore/revert-datetime
chore(filter): change the datetime filter.
2 parents 89a7570 + 8651a49 commit 1d8fadb

3 files changed

Lines changed: 41 additions & 28 deletions

File tree

alert_system/etl/base/extraction.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from django.utils import timezone
99

1010
from alert_system.helpers import build_stac_search
11-
from alert_system.models import Connector, ExtractionItem, LoadItem
11+
from alert_system.models import Connector, ExtractionItem, ImpactDetailsEnum, LoadItem
1212

1313
from .config import ExtractionConfig
1414
from .loader import BaseLoaderClass
@@ -267,7 +267,11 @@ def _impact_filter(self, impact_metadata: list[dict]) -> str:
267267
filters = []
268268

269269
for data in impact_metadata or []:
270-
if data.get("category") and data.get("type") and data.get("value") is not None:
270+
if (
271+
data.get("category") == ImpactDetailsEnum.Category.PEOPLE
272+
and data.get("type") == ImpactDetailsEnum.Type.AFFECTED_TOTAL # TODO: Add other possible types here.
273+
and data.get("value") is not None
274+
):
271275
filters.append(
272276
f"monty:impact_detail.category = '{data['category']}' AND "
273277
f"monty:impact_detail.type = '{data['type']}' AND "

alert_system/etl/gdacs_flood/transform.py

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@ class GdacsTransformer(BaseTransformerClass):
1313
Extracts and normalizes impact fields, computes derived values, and stores metadata.
1414
"""
1515

16-
# NOTE: This logic might change in future
16+
# NOTE: This logic might change in future. Currently only creating a function for future use.
1717
def compute_people_exposed(self, metadata_list) -> Optional[int]:
1818
for data in metadata_list:
1919
if data["category"] == ImpactDetailsEnum.Category.PEOPLE and data["type"] == ImpactDetailsEnum.Type.AFFECTED_TOTAL:
2020
return data["value"]
2121
return None
2222

23-
# NOTE: This logic might change in future
23+
# NOTE: This logic might change in future. Currently only creating a function for future use.
2424
def compute_buildings_exposed(self, metadata_list) -> Optional[int]:
2525
"""
2626
Compute the 'buildings_exposed' field.
@@ -30,28 +30,36 @@ def compute_buildings_exposed(self, metadata_list) -> Optional[int]:
3030
return data["value"]
3131
return None
3232

33-
# NOTE: This logic will change with changes in montandon.
3433
def process_impact(self, impact_items) -> BaseTransformerClass.ImpactType:
35-
metadata = []
34+
meta_hash_map = {}
35+
3636
for item in impact_items:
3737
properties = item.resp_data.get("properties", {})
38-
impact_detail = properties.get("monty:impact_detail", {})
39-
category = impact_detail.get("category")
40-
type_ = impact_detail.get("type")
41-
value = impact_detail.get("value")
42-
if category == ImpactDetailsEnum.Category.PEOPLE and type_ == ImpactDetailsEnum.Type.AFFECTED_TOTAL:
43-
metadata = [
44-
{
45-
"category": category,
46-
"type": type_,
47-
"value": value,
48-
"unit": impact_detail.get("unit", ""),
49-
"estimate_type": impact_detail.get("estimate_type", ""),
50-
}
51-
]
38+
detail = properties.get("monty:impact_detail", {})
39+
40+
category = detail.get("category")
41+
type_ = detail.get("type")
42+
value = detail.get("value")
43+
if value in (None, -1):
44+
value = 0
45+
key = (category, type_)
46+
meta_hash_map[key] = meta_hash_map.get(key, 0) + value
47+
48+
metadata = [
49+
{
50+
"category": category,
51+
"type": type_,
52+
"value": value,
53+
}
54+
for (category, type_), value in meta_hash_map.items()
55+
if category == ImpactDetailsEnum.Category.PEOPLE
56+
]
57+
5258
return {
53-
"people_exposed": self.compute_people_exposed(metadata),
54-
"buildings_exposed": self.compute_buildings_exposed(metadata),
59+
"people_exposed": meta_hash_map.get(
60+
(ImpactDetailsEnum.Category.PEOPLE, ImpactDetailsEnum.Type.AFFECTED_TOTAL) # Taking only people exposed.
61+
),
62+
"buildings_exposed": meta_hash_map.get((ImpactDetailsEnum.Category.BUILDINGS, ImpactDetailsEnum.Type.DAMAGED)),
5563
"impact_metadata": metadata,
5664
}
5765

alert_system/helpers.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ def build_search_params(
55
collections: str,
66
cql_filters: list[str] | None = None,
77
extra_params: dict | None = None,
8+
start_datetime: str | None = None,
9+
end_datetime: str | None = None,
810
) -> dict:
911
params = {
1012
"collections": collections,
@@ -15,6 +17,9 @@ def build_search_params(
1517
params["filter-lang"] = "cql2-text"
1618
params["filter"] = combined_filter
1719

20+
if start_datetime and end_datetime:
21+
params["datetime"] = f"{start_datetime}/{end_datetime}"
22+
1823
if extra_params:
1924
params.update(extra_params)
2025

@@ -25,10 +30,6 @@ def build_guid_filter(guid: str) -> str:
2530
return f"monty:guid = '{guid}'"
2631

2732

28-
def build_datetime_filter(start_date: str, end_date: str) -> str:
29-
return f"datetime >= '{start_date}' AND datetime < '{end_date}'"
30-
31-
3233
def build_stac_search(
3334
collections: str,
3435
guid: str | None = None,
@@ -41,11 +42,11 @@ def build_stac_search(
4142

4243
if guid:
4344
filters.append(build_guid_filter(guid))
44-
if start_datetime and end_datetime:
45-
filters.append(build_datetime_filter(start_datetime, end_datetime))
4645

4746
return build_search_params(
4847
collections=collections,
4948
cql_filters=filters,
5049
extra_params=extra_params,
50+
start_datetime=start_datetime,
51+
end_datetime=end_datetime,
5152
)

0 commit comments

Comments
 (0)