import demistomock as demisto # noqa: F401 from CommonServerPython import * # noqa: F401 def create_impacted_assets_html(impacted_assets_data: dict, alert_url: str) -> str: """ Create HTML content for the impacted assets. :type impacted_assets_data: ``dict`` :param impacted_assets_data: Impacted Assets data. :type alert_url: ``str`` :param alert_url: Alert URL. :rtype: ``str`` :return: HTML content for the impacted assets. """ html_content = [] def append_section(icon: str, header: str, sub_header: str) -> None: html_content.append('
') html_content.append(f'
{icon}
') html_content.append(f'
{header}{sub_header}
') # noqa: E231,E702 html_content.append("
") html_content.append("
") # locationAssets for section in impacted_assets_data.get("locationAssets", []): distance_from_event = section.get("distanceFromEventLocation", "") name = section.get("name", "") address = section.get("address", "") if distance_from_event: header = ( '

' # noqa: E231,E702 f"{distance_from_event} km from {name}

" ) else: header = f'

{name}

' # noqa: E231,E702 sub_header = f'

{address}

' # noqa: E231,E702 append_section( '', header, sub_header, ) # thirdPartyAssets for section in impacted_assets_data.get("thirdPartyAssets", []): name = section.get("name", "") url = section.get("href", "") header = f'

{name}

' # noqa: E231,E702 sub_header = f'

{url}

' # noqa: E231,E702 append_section( '', header, sub_header, ) # travelSegments for section in impacted_assets_data.get("travelSegments", []): distance_from_event = section.get("distanceFromEventLocation", "") name = section.get("name", "") travel_type = section.get("travelType", "") travelers_count = section.get("countImpactedTravelers", 1) if distance_from_event: header = ( '

' # noqa: E231,E702 f"{distance_from_event} km from {travelers_count} " f'{"traveler" if int(travelers_count) == 1 else "travelers"}

' ) else: header = ( '

' # noqa: E231,E702 f'{travelers_count} {"traveler" if int(travelers_count) == 1 else "travelers"} ' "at risk

" ) sub_header = f'

{name}

' # noqa: E231,E702 if travel_type.lower() == "hotel": append_section( '', header, sub_header, ) elif travel_type.lower() == "flight": append_section( '', header, sub_header, ) else: append_section("📍", header, sub_header) if html_content: incident_footer = ( '

View employee and traveler locations ' # noqa: E231,E702 "in the vicinity with Dataminr Pulse: " f'{alert_url}' ) html_content.append(incident_footer) impacted_assets_html = "".join(html_content) return impacted_assets_html def main(): try: impacted_assets_data = demisto.incident().get("CustomFields", {}).get("dataminrpulseimpactedassetstext", "") alert_url = demisto.incident().get("CustomFields", {}).get("dataminrpulseexpandalerturl", "") if not impacted_assets_data: return_results( { "ContentsFormat": EntryFormat.HTML, "Type": EntryType.NOTE, "Contents": "

N/A

", # noqa: E231,E702 } ) return else: try: impacted_assets_data = json.loads(impacted_assets_data) except json.JSONDecodeError: raise ValueError('Failed to parse "Dataminr Pulse Impacted Assets" JSON string.') if not isinstance(impacted_assets_data, dict): raise ValueError("Invalid format for impacted assets data.") impacted_assets_html = create_impacted_assets_html(impacted_assets_data, alert_url) if not impacted_assets_html: return_results( { "ContentsFormat": EntryFormat.HTML, "Type": EntryType.NOTE, "Contents": "

N/A

", # noqa: E231,E702 } ) return html_content_start = '
' data = [] data.append(html_content_start) data.append(impacted_assets_html) data.append("
") html_content = "".join(data) return_results( { "ContentsFormat": EntryFormat.HTML, "Type": EntryType.NOTE, "Contents": html_content, } ) except Exception as e: return_error(f"Failed to render data: {str(e)}") if __name__ in ("__builtin__", "builtins", "__main__"): main()