1616 CalculateRequest ,
1717 CalculateRequestVariable ,
1818)
19+ from policyengine_household_api .models .analytics import ModalResolvedChannel
1920
2021
2122DEFAULT_REQUEST_LIMIT = 1_000
2829class CalculateAnalyticsQuery :
2930 start_time : datetime | None
3031 end_time : datetime | None
32+ requested_version : str | None
33+ resolved_channel : str | None
3134 unique : bool
3235 limit : int
3336
@@ -50,6 +53,8 @@ def get_calculate_analytics_requests() -> Response:
5053 "message" : None ,
5154 "start_time" : _datetime_to_json (query .start_time ),
5255 "end_time" : _datetime_to_json (query .end_time ),
56+ "requested_version" : query .requested_version ,
57+ "resolved_channel" : query .resolved_channel ,
5358 "unique" : query .unique ,
5459 }
5560 if query .unique :
@@ -97,6 +102,12 @@ def _parse_query_args() -> CalculateAnalyticsQuery:
97102 return CalculateAnalyticsQuery (
98103 start_time = start_time ,
99104 end_time = end_time ,
105+ requested_version = _parse_optional_string (
106+ request .args .get ("requested_version" )
107+ ),
108+ resolved_channel = _parse_resolved_channel (
109+ request .args .get ("resolved_channel" )
110+ ),
100111 unique = _parse_bool (request .args .get ("unique" ), default = False ),
101112 limit = _parse_limit (request .args .get ("limit" )),
102113 )
@@ -139,6 +150,23 @@ def _parse_bool(value: str | None, *, default: bool) -> bool:
139150 raise ValueError ("`unique` must be true or false" )
140151
141152
153+ def _parse_optional_string (value : str | None ) -> str | None :
154+ if value is None :
155+ return None
156+ value = value .strip ()
157+ return value or None
158+
159+
160+ def _parse_resolved_channel (value : str | None ) -> str | None :
161+ value = _parse_optional_string (value )
162+ if value is None :
163+ return None
164+ if value not in {channel .value for channel in ModalResolvedChannel }:
165+ allowed = ", " .join (channel .value for channel in ModalResolvedChannel )
166+ raise ValueError (f"`resolved_channel` must be one of: { allowed } " )
167+ return value
168+
169+
142170def _parse_limit (value : str | None ) -> int :
143171 if value is None :
144172 return DEFAULT_REQUEST_LIMIT
@@ -156,7 +184,7 @@ def _parse_limit(value: str | None) -> int:
156184def _calculate_requests (
157185 query : CalculateAnalyticsQuery ,
158186) -> list [dict [str , Any ]]:
159- request_query = _apply_time_filters (CalculateRequest .query , query )
187+ request_query = _apply_filters (CalculateRequest .query , query )
160188 calculate_requests = (
161189 request_query .order_by (CalculateRequest .created_at .desc ())
162190 .limit (query .limit )
@@ -204,7 +232,7 @@ def _variables_by_request_id(
204232def _unique_variable_keys (
205233 query : CalculateAnalyticsQuery ,
206234) -> list [dict [str , Any ]]:
207- variable_query = _apply_time_filters (CalculateRequestVariable .query , query )
235+ variable_query = _apply_filters (CalculateRequestVariable .query , query )
208236 rows = (
209237 variable_query .with_entities (
210238 CalculateRequestVariable .variable_name ,
@@ -251,13 +279,21 @@ def _unique_variable_keys(
251279 ]
252280
253281
254- def _apply_time_filters (query , filters : CalculateAnalyticsQuery ):
282+ def _apply_filters (query , filters : CalculateAnalyticsQuery ):
255283 model = query .column_descriptions [0 ]["entity" ]
256284 created_at = model .created_at
257285 if filters .start_time :
258286 query = query .filter (created_at >= filters .start_time )
259287 if filters .end_time :
260288 query = query .filter (created_at <= filters .end_time )
289+ if filters .requested_version :
290+ query = query .filter (
291+ model .requested_version == filters .requested_version
292+ )
293+ if filters .resolved_channel :
294+ query = query .filter (
295+ model .resolved_channel == filters .resolved_channel
296+ )
261297 return query
262298
263299
@@ -271,6 +307,8 @@ def _request_to_dict(
271307 "api_version" : calculate_request .api_version ,
272308 "country_id" : calculate_request .country_id ,
273309 "model_version" : calculate_request .model_version ,
310+ "requested_version" : calculate_request .requested_version ,
311+ "resolved_channel" : calculate_request .resolved_channel ,
274312 "endpoint" : calculate_request .endpoint ,
275313 "method" : calculate_request .method ,
276314 "response_status_code" : calculate_request .response_status_code ,
0 commit comments