diff --git a/anyway/flask_app.py b/anyway/flask_app.py index 6d7aae5e..2c6938d4 100755 --- a/anyway/flask_app.py +++ b/anyway/flask_app.py @@ -1285,10 +1285,10 @@ def infographics_data_by_location(): output = get_infographics_mock_data() elif mock_data == "false": request_params = get_request_params_from_request_values(request.values) - output = get_infographics_data_for_location(request_params) - if not output: + if request_params is None: log_bad_request(request) return abort(http_client.NOT_FOUND) + output = get_infographics_data_for_location(request_params) else: log_bad_request(request) return abort(http_client.BAD_REQUEST) diff --git a/anyway/infographics_utils.py b/anyway/infographics_utils.py index 3d0b5dd3..6eb57f53 100755 --- a/anyway/infographics_utils.py +++ b/anyway/infographics_utils.py @@ -28,9 +28,9 @@ # We need to import the modules, which in turn imports all the widgets, and registers them, even if they are not # explicitly used here # pylint: disable=unused-import -import anyway.widgets.urban_widgets -import anyway.widgets.road_segment_widgets import anyway.widgets.all_locations_widgets +import anyway.widgets.road_segment_widgets +import anyway.widgets.urban_widgets import anyway.widgets.no_location_widgets # pylint: enable=unused-import diff --git a/anyway/request_params.py b/anyway/request_params.py index 4a6e394c..f3f5acd1 100644 --- a/anyway/request_params.py +++ b/anyway/request_params.py @@ -78,67 +78,70 @@ def __eq__(self, other): # todo: merge with get_request_params() def get_request_params_from_request_values(vals: dict) -> Optional[RequestParams]: - news_flash_obj = extract_news_flash_obj(vals) - news_flash_description = ( - news_flash_obj.description - if news_flash_obj is not None and news_flash_obj.description is not None - else None - ) - news_flash_title = ( - news_flash_obj.title - if news_flash_obj is not None and news_flash_obj.title is not None - else None - ) - location = get_location_from_news_flash_or_request_values(news_flash_obj, vals) - if location is None: - return None - years_ago = vals.get("years_ago", BE_CONST.DEFAULT_NUMBER_OF_YEARS_AGO) - lang = vals.get("lang", "he") - location_text = location["text"] - gps = location.get("gps") - location_info = location["data"] - - if location_info is None: - return None - resolution = location_info.pop("resolution") - if resolution is None or resolution not in BE_CONST.SUPPORTED_RESOLUTIONS: - logging.error(f"Resolution empty or not supported: {resolution}.") - return None - - if all(value is None for value in location_info.values()): - return None - try: - years_ago = int(years_ago) - except (ValueError, TypeError): - return None - if years_ago < 0 or years_ago > 100: + news_flash_obj = extract_news_flash_obj(vals) + news_flash_description = ( + news_flash_obj.description + if news_flash_obj is not None and news_flash_obj.description is not None + else None + ) + news_flash_title = ( + news_flash_obj.title + if news_flash_obj is not None and news_flash_obj.title is not None + else None + ) + location = get_location_from_news_flash_or_request_values(news_flash_obj, vals) + if location is None: + return None + years_ago = vals.get("years_ago", BE_CONST.DEFAULT_NUMBER_OF_YEARS_AGO) + lang = vals.get("lang", "he") + location_text = location["text"] + gps = location.get("gps") + location_info = location["data"] + + if location_info is None: + return None + resolution = location_info.pop("resolution") + if resolution is None or resolution not in BE_CONST.SUPPORTED_RESOLUTIONS: + logging.error(f"Resolution empty or not supported: {resolution}.") + return None + + if all(value is None for value in location_info.values()): + return None + + try: + years_ago = int(years_ago) + except (ValueError, TypeError): + return None + if years_ago < 0 or years_ago > 100: + return None + last_accident_date = get_latest_accident_date(table_obj=AccidentMarkerView, filters=None) + # converting to datetime object to get the date + end_time = last_accident_date.to_pydatetime().date() + start_time = datetime.date(end_time.year + 1 - years_ago, 1, 1) + + widget_specific = {} + if resolution == BE_CONST.ResolutionCategories.SUBURBAN_ROAD: + widget_specific.update({"road_segment_name": location_info.get("road_segment_name")}) + + request_params = RequestParams( + years_ago=years_ago, + location_text=location_text, + location_info=location_info, + # TODO: getting a warning on resolution=resolution: "Expected type 'dict', got 'int' instead" + resolution=resolution, + gps=gps, + start_time=start_time, + end_time=end_time, + lang=lang, + news_flash_description=news_flash_description, + news_flash_title=news_flash_title, + widget_specific=widget_specific + ) + return request_params + except ValueError: + logging.exception(f"Exception while preparing request params. vals:{vals}.") return None - last_accident_date = get_latest_accident_date(table_obj=AccidentMarkerView, filters=None) - # converting to datetime object to get the date - end_time = last_accident_date.to_pydatetime().date() - start_time = datetime.date(end_time.year + 1 - years_ago, 1, 1) - - widget_specific = {} - if resolution == BE_CONST.ResolutionCategories.SUBURBAN_ROAD: - widget_specific.update({"road_segment_name": location_info.get("road_segment_name")}) - - request_params = RequestParams( - years_ago=years_ago, - location_text=location_text, - location_info=location_info, - # TODO: getting a warning on resolution=resolution: "Expected type 'dict', got 'int' instead" - resolution=resolution, - gps=gps, - start_time=start_time, - end_time=end_time, - lang=lang, - news_flash_description=news_flash_description, - news_flash_title=news_flash_title, - widget_specific=widget_specific - ) - return request_params - def get_location_from_news_flash_or_request_values( news_flash_obj: Optional[NewsFlash], vals: dict diff --git a/anyway/widgets/road_segment_widgets/head_on_collisions_comparison_widget.py b/anyway/widgets/road_segment_widgets/head_on_collisions_comparison_widget.py index d7c92796..0aca0a76 100644 --- a/anyway/widgets/road_segment_widgets/head_on_collisions_comparison_widget.py +++ b/anyway/widgets/road_segment_widgets/head_on_collisions_comparison_widget.py @@ -117,7 +117,7 @@ def is_included(self) -> bool: else: raise ValueError all_total = all_h2h + all_others # pylint: disable=E0606 - return segment_h2h > 1 and (segment_h2h / segment_total) > all_h2h / all_total + return segment_h2h > 1 and (segment_h2h / segment_total) > 2 * all_h2h / all_total # adding calls to _() for pybabel extraction diff --git a/docs/Architecture/CBS.md b/docs/Architecture/CBS.md index 1e3c89f7..6a3bf39b 100644 --- a/docs/Architecture/CBS.md +++ b/docs/Architecture/CBS.md @@ -6,7 +6,7 @@ - **Relevant output**: unzipped CBS files saved in S3 - **Relevant Storage directory**: S3 -> Bucket: dfc-anyway-cbs - **command**: `python3 main.py scripts importemail` -- **Scheduling**: Nowadays runs in Jenkins once a week +- **Scheduling**: Nowadays runs in Airflow once a week ### CBS: pulls data from s3, processes cbs data and pushes it to CBS tables Environment Variables: AWS_ACCESS_KEY, AWS_SECRET_KEY