async def delete_area(area_id: str, reboot_processor: Optional[bool] = True): """ Deletes the configuration related to the area <area_id> """ if area_id.upper() == ALL_AREAS: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=bad_request_serializer( "Area with ID: 'ALL' cannot be deleted.", error_type="Invalid ID")) config_dict = extract_config() areas_name = [x for x in config_dict.keys() if x.startswith("Area_")] areas = [map_section_from_config(x, config_dict) for x in areas_name] areas_ids = [area["id"] for area in areas] try: index = areas_ids.index(area_id) except ValueError: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"The area: {area_id} does not exist") config_dict.pop(f"Area_{index}") config_dict = reestructure_areas((config_dict)) success = update_config(config_dict, reboot_processor) area_directory = os.path.join(os.getenv("AreaLogDirectory"), area_id) shutil.rmtree(area_directory) return handle_response(None, success, status.HTTP_204_NO_CONTENT)
async def delete_area(area_id: str, reboot_processor: Optional[bool] = True): """ Deletes the configuration related to the area <area_id> """ if area_id.upper() == ALL_AREAS: delete_area_occupancy_rules(ALL_AREAS) raise HTTPException( status_code=status.HTTP_202_ACCEPTED, detail="Area with ID: 'ALL' cannot be deleted. However, its occupancy rules were deleted." ) config_dict = extract_config() areas_name = [x for x in config_dict.keys() if x.startswith("Area_")] areas = [map_section_from_config(x, config_dict) for x in areas_name] areas_ids = [area["id"] for area in areas] try: index = areas_ids.index(area_id) except ValueError: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"The area: {area_id} does not exist") config_dict.pop(f"Area_{index}") config_dict = reestructure_areas(config_dict) success = update_config(config_dict, reboot_processor) delete_area_occupancy_rules(area_id) area_directory = os.path.join(os.getenv("AreaLogDirectory"), area_id) shutil.rmtree(area_directory) area_config_directory = os.path.join(os.getenv("AreaConfigDirectory"), area_id) shutil.rmtree(area_config_directory) return handle_response(None, success, status.HTTP_204_NO_CONTENT)
async def create_area(new_area: AreaConfigDTO, reboot_processor: Optional[bool] = True): """ Adds a new area to the processor. """ config_dict = extract_config() areas_name = [x for x in config_dict.keys() if x.startswith("Area_")] areas = [map_section_from_config(x, config_dict) for x in areas_name] if new_area.id in [area["id"] for area in areas]: raise HTTPException(status_code=400, detail="Area already exists") cameras = [x for x in config_dict.keys() if x.startswith("Source_")] cameras = [map_camera(x, config_dict, []) for x in cameras] camera_ids = [camera["id"] for camera in cameras] if not all(x in camera_ids for x in new_area.cameras.split(",")): non_existent_cameras = set( new_area.cameras.split(",")) - set(camera_ids) raise HTTPException( status_code=404, detail=f"The cameras: {non_existent_cameras} do not exist") area_dict = map_to_config_file_format(new_area) config_dict[f"Area_{len(areas)}"] = area_dict success = update_config(config_dict, reboot_processor) return handle_response(area_dict, success, status.HTTP_201_CREATED)
async def create_area(new_area: AreaConfigDTO, reboot_processor: Optional[bool] = True): """ Adds a new area to the processor. """ config_dict = extract_config() areas_name = [x for x in config_dict.keys() if x.startswith("Area_")] areas = [map_section_from_config(x, config_dict) for x in areas_name] if new_area.id in [area["id"] for area in areas]: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=bad_request_serializer( "Area already exists", error_type="config duplicated area")) cameras = [x for x in config_dict.keys() if x.startswith("Source_")] cameras = [map_camera(x, config_dict, []) for x in cameras] camera_ids = [camera["id"] for camera in cameras] if not all(x in camera_ids for x in new_area.cameras.split(",")): non_existent_cameras = set( new_area.cameras.split(",")) - set(camera_ids) raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"The cameras: {non_existent_cameras} do not exist") area_dict = map_to_config_file_format(new_area) config_dict[f"Area_{len(areas)}"] = area_dict success = update_config(config_dict, reboot_processor) if not success: return handle_response(area_dict, success, status.HTTP_201_CREATED) return next( (area for area in get_areas() if area["id"] == area_dict["Id"]), None)
async def edit_area(area_id: str, edited_area: AreaConfigDTO, reboot_processor: Optional[bool] = True): """ Edits the configuration related to the area <area_id> """ edited_area.id = area_id config_dict = extract_config() area_names = [x for x in config_dict.keys() if x.startswith("Area_")] areas = [map_section_from_config(x, config_dict) for x in area_names] areas_ids = [area["id"] for area in areas] try: index = areas_ids.index(area_id) except ValueError: raise HTTPException(status_code=404, detail=f"The area: {area_id} does not exist") cameras = [x for x in config_dict.keys() if x.startswith("Source_")] cameras = [map_camera(x, config_dict, []) for x in cameras] camera_ids = [camera["id"] for camera in cameras] if not all(x in camera_ids for x in edited_area.cameras.split(",")): non_existent_cameras = set( edited_area.cameras.split(",")) - set(camera_ids) raise HTTPException( status_code=404, detail=f"The cameras: {non_existent_cameras} do not exist") area_dict = map_to_config_file_format(edited_area) config_dict[f"Area_{index}"] = area_dict success = update_config(config_dict, reboot_processor) return handle_response(area_dict, success)
def map_camera(camera_name, config, options=[]): camera_dict = map_section_from_config(camera_name, config) camera = config.get(camera_name) camera_id = camera.get("Id") image_string = None if "withImage" in options: image_string = get_camera_default_image_string(camera_id) camera_dict["image"] = image_string return camera_dict
def update_app_config(app: AppDTO, reboot_processor: Optional[bool] = True): """ Updates the app configuration of the processor """ config_dict = extract_config() app_dict = map_to_config_file_format(app) config_dict["App"] = app_dict success = update_config(config_dict, reboot_processor) if not success: return handle_response(app_dict, success) return map_section_from_config("App", extract_config())
def update_core_config(core: CoreDTO, reboot_processor: Optional[bool] = True): """ Updates the core configuration of the processor """ config_dict = extract_config() core_dict = map_to_config_file_format(core) config_dict["CORE"] = core_dict success = update_config(config_dict, reboot_processor) if not success: return handle_response(core_dict, success) return map_section_from_config("CORE", extract_config())
def update_detector_config(detector: DetectorDTO, reboot_processor: Optional[bool] = True): """ Updates the detector configuration of the processor """ config_dict = extract_config() detector_dict = map_to_config_file_format(detector) config_dict["Detector"] = detector_dict success = update_config(config_dict, reboot_processor) if not success: return handle_response(detector_dict, success) return map_section_from_config("Detector", extract_config())
def update_classifier_config(classifier: ClassifierDTO, reboot_processor: Optional[bool] = True): """ Updates the classifier configuration of the processor """ config_dict = extract_config() classifier_dict = map_to_config_file_format(classifier) config_dict["Classifier"] = classifier_dict success = update_config(config_dict, reboot_processor) if not success: return handle_response(classifier_dict, success) return map_section_from_config("Classifier", extract_config())
def map_camera(camera_name, config, options=[]): camera_dict = map_section_from_config(camera_name, config) camera = config.get(camera_name) camera_id = camera.get("Id") image_string = None if "withImage" in options: image_string = get_camera_default_image_string(camera_id) camera_dict["image"] = image_string calibration_file_path = get_camera_calibration_path(settings.config, camera_id) camera_dict["has_been_calibrated"] = validate_file_exists_and_is_not_empty(calibration_file_path) roi_file_path = ObjectsFilteringPostProcessor.get_roi_file_path(camera_id, settings.config) camera_dict["has_defined_roi"] = validate_file_exists_and_is_not_empty(roi_file_path) in_out_file_path = InOutMetric.get_in_out_file_path(camera_id, settings.config) camera_dict["has_in_out_border"] = validate_file_exists_and_is_not_empty(in_out_file_path) return camera_dict
async def edit_area(area_id: str, edited_area: AreaConfigDTO, reboot_processor: Optional[bool] = True): """ Edits the configuration related to the area <area_id> """ if area_id.upper() == ALL_AREAS: area = modify_area_all(edited_area) if edited_area.occupancy_rules: set_occupancy_rules(ALL_AREAS, edited_area.occupancy_rules) else: delete_area_occupancy_rules(ALL_AREAS) area["occupancy_rules"] = get_area_occupancy_rules(ALL_AREAS) return area edited_area.id = area_id config_dict = extract_config() area_names = [x for x in config_dict.keys() if x.startswith("Area_")] areas = [map_section_from_config(x, config_dict) for x in area_names] areas_ids = [area["id"] for area in areas] try: index = areas_ids.index(area_id) except ValueError: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"The area: {area_id} does not exist") cameras = [x for x in config_dict.keys() if x.startswith("Source_")] cameras = [map_camera(x, config_dict, []) for x in cameras] camera_ids = [camera["id"] for camera in cameras] if not all(x in camera_ids for x in edited_area.cameras.split(",")): non_existent_cameras = set(edited_area.cameras.split(",")) - set(camera_ids) raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"The cameras: {non_existent_cameras}" f"do not exist") occupancy_rules = edited_area.occupancy_rules del edited_area.occupancy_rules area_dict = map_to_config_file_format(edited_area) config_dict[f"Area_{index}"] = area_dict success = update_config(config_dict, reboot_processor) if occupancy_rules: set_occupancy_rules(edited_area.id, occupancy_rules) else: delete_area_occupancy_rules(area_id) if not success: return handle_response(area_dict, success) area = next((area for area in get_areas() if area["id"] == area_id), None) area["occupancy_rules"] = get_area_occupancy_rules(area["id"]) return area
async def delete_area(area_id: str, reboot_processor: Optional[bool] = True): """ Deletes the configuration related to the area <area_id> """ config_dict = extract_config() areas_name = [x for x in config_dict.keys() if x.startswith("Area_")] areas = [map_section_from_config(x, config_dict) for x in areas_name] areas_ids = [area["id"] for area in areas] try: index = areas_ids.index(area_id) except ValueError: raise HTTPException(status_code=404, detail=f"The area: {area_id} does not exist") config_dict.pop(f"Area_{index}") config_dict = reestructure_areas((config_dict)) success = update_config(config_dict, reboot_processor) return handle_response(None, success, status.HTTP_204_NO_CONTENT)
async def edit_area(area_id: str, edited_area: AreaConfigDTO, reboot_processor: Optional[bool] = True): """ Edits the configuration related to the area <area_id> """ if area_id.upper() == ALL_AREAS: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=bad_request_serializer( "Area with ID: 'ALL' cannot be edited.", error_type="Invalid ID")) edited_area.id = area_id config_dict = extract_config() area_names = [x for x in config_dict.keys() if x.startswith("Area_")] areas = [map_section_from_config(x, config_dict) for x in area_names] areas_ids = [area["id"] for area in areas] try: index = areas_ids.index(area_id) except ValueError: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"The area: {area_id} does not exist") cameras = [x for x in config_dict.keys() if x.startswith("Source_")] cameras = [map_camera(x, config_dict, []) for x in cameras] camera_ids = [camera["id"] for camera in cameras] if not all(x in camera_ids for x in edited_area.cameras.split(",")): non_existent_cameras = set( edited_area.cameras.split(",")) - set(camera_ids) raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail=f"The cameras: {non_existent_cameras} do not exist") area_dict = map_to_config_file_format(edited_area) config_dict[f"Area_{index}"] = area_dict success = update_config(config_dict, reboot_processor) if not success: return handle_response(area_dict, success) return next((area for area in get_areas() if area["id"] == area_id), None)
def map_config(config, options): cameras_name = [x for x in config.keys() if x.startswith("Source_")] areas_name = [x for x in config.keys() if x.startswith("Area_")] source_post_processor = [ x for x in config.keys() if x.startswith("SourcePostProcessor_") ] source_loggers = [ x for x in config.keys() if x.startswith("SourceLogger_") ] area_loggers = [x for x in config.keys() if x.startswith("AreaLogger_")] periodic_tasks = [ x for x in config.keys() if x.startswith("PeriodicTask_") ] return { "app": map_section_from_config("App", config), "api": map_section_from_config("API", config), "core": map_section_from_config("CORE", config), "cameras": [map_camera(x, config, options) for x in cameras_name], "areas": [map_section_from_config(x, config) for x in areas_name], "detector": map_section_from_config("Detector", config), "classifier": map_section_from_config("Classifier", config), "tracker": map_section_from_config("Tracker", config), "sourcePostProcessors": [map_section_from_config(x, config) for x in source_post_processor], "sourceLoggers": [map_section_from_config(x, config) for x in source_loggers], "areaLoggers": [map_section_from_config(x, config) for x in area_loggers], "periodicTasks": [map_section_from_config(x, config) for x in periodic_tasks], }
def get_classifier_config(): """ Returns the classifier configuration of the processor """ return map_section_from_config("Classifier", extract_config())
def get_core_config(): """ Returns the core configuration of the processor """ return map_section_from_config("CORE", extract_config())
def get_source_post_processors(): config = extract_config(config_type="source_post_processors") return [map_section_from_config(x, config) for x in config.keys()]
def get_detector_config(): """ Returns the detector configuration of the processor """ return map_section_from_config("Detector", extract_config())
def get_areas(): config = extract_config(config_type="areas") return [map_section_from_config(x, config) for x in config.keys()]
def get_tracker_config(): """ Returns the tracker configuration of the processor """ return map_section_from_config("Tracker", extract_config())
def get_periodic_tasks(): config = extract_config(config_type="periodic_tasks") return [map_section_from_config(x, config) for x in config.keys()]
def get_app_config(): """ Returns the app configuration of the processor """ return map_section_from_config("App", extract_config())