from datetime import datetime import folium import pandas as pd COLOR_MAPPING = { "إغاثة": "red", "مساعدة طبية": "orange", "مأوى": "beige", "طعام وماء": "blue", "مخاطر (تسرب الغاز، تلف في الخدمات العامة...)": "gray", } ICON_MAPPING = { "إغاثة": "bell", # life ring icon for rescue "مساعدة طبية": "heart", # medical kit for medical assistance "مأوى": "home", # home icon for shelter "طعام وماء": "cutlery", # cutlery (fork and knife) for food & water "مخاطر (تسرب الغاز، تلف في الخدمات العامة...)": "Warning" # warning triangle for dangers } numcol = lambda x: ord(x) - ord("A") def marker_request(request): # in case of multiple requests we use the first one for the marker's icon # requests are already sorted by priority from the form try: displayed_request = request.split(',')[0] except: displayed_request = request return displayed_request ## Interventions def display_interventions(interventions_df, selected_statuses, map_obj, intervention_fgs): """Display NGO interventions on the map""" for index, row in interventions_df.iterrows(): village_status = row[interventions_df.columns[numcol("K")]] is_future_intervention = ( row[interventions_df.columns[numcol("H")]] == "Intervention prévue dans le futur / Planned future intervention" ) if pd.isna(village_status) and not is_future_intervention: village_status = "Partiellement satisfait / Partially Served" if village_status not in selected_statuses: continue if is_future_intervention: color_mk = "pink" status = "Planned ⌛" elif village_status != "Critique, Besoin d'aide en urgence / Critical, in urgent need of help": # past intervention and village not in a critical condition color_mk = "green" status = "Done ✅" else: color_mk = "darkgreen" status = "Partial 📝" # ['Horodateur', 'Organization Name', 'Association ID', 'Speciality', # 'Phone 1', 'Phone 2', 'Email', 'Intervention status', # 'Intervention date', 'Types of Help Provided', # 'Current situation of the area', 'Future help type', 'Douar name', # 'Commune', 'Caidat', ' Google Maps Link', # 'Accessibility to the targeted douar', 'Type of accessibility', # 'Population of the douar if available', 'Intervention Additional Info', # 'Any Additional info is welcome', 'Automatic Extracted Coordinates', # 'Unnamed: 22'], org = row[interventions_df.columns[numcol("B")]] association_id = row[interventions_df.columns[numcol("C")]] speciality = row[interventions_df.columns[numcol("D")]] phone_1 = row[interventions_df.columns[numcol("E")]] phone_2 = row[interventions_df.columns[numcol("F")]] email = row[interventions_df.columns[numcol("G")]] intervention_status = row[interventions_df.columns[numcol("H")]] intervention_date = row[interventions_df.columns[numcol("I")]] help_type = row[interventions_df.columns[numcol("J")]] current_situation = row[interventions_df.columns[numcol("K")]] future_help_type = row[interventions_df.columns[numcol("L")]] douar_name = row[interventions_df.columns[numcol("M")]] commune = row[interventions_df.columns[numcol("N")]] caidat = row[interventions_df.columns[numcol("O")]] google_maps_link = row[interventions_df.columns[numcol("P")]] accessibility_to_douar = row[interventions_df.columns[numcol("Q")]] type_of_accessibility = row[interventions_df.columns[numcol("R")]] population = row[interventions_df.columns[numcol("S")]] intervention_additional_info = row[interventions_df.columns[numcol("T")]] any_additional_info = row[interventions_df.columns[numcol("U")]] full_douar_name = ", ".join([x for x in [douar_name, commune, caidat] if not pd.isna(x)]) intervention_info = f""" Org: {org}
Association ID: {association_id}
Speciality: {speciality}
Phone 1: {phone_1}
Phone 2: {phone_2}
Email: {email}
Intervention Date: {intervention_date}
Intervention Status: {intervention_status}
Help Type: {help_type}
Current Situation: {current_situation}
Future Help Type: {future_help_type}
Douar Name: {full_douar_name}
Accessibility to Douar: {accessibility_to_douar}
Type of Accessibility: {type_of_accessibility}
Population: {population}
Intervention Additional Info: {intervention_additional_info}
Any Additional Info: {any_additional_info}
""" #TODO: filter nans if row["latlng"] is None: continue fg = intervention_fgs[status] fg.add_child( folium.Marker( location=row["latlng"], tooltip=full_douar_name, popup=folium.Popup(intervention_info, max_width=300), icon=folium.Icon(color=color_mk), ) ) def display_solved(solved_verified_requests, selected_statuses, feature_group): for index, row in solved_verified_requests.iterrows(): if row["latlng"] is None: continue intervention_status = row[solved_verified_requests.columns[8]] is_future_intervention = ( intervention_status == "Planned" ) if is_future_intervention: status = "Planned ⌛" icon = folium.Icon(icon="heart", prefix="glyphicon", color="pink", icon_color="red") else: status = "Done ✅" icon = folium.Icon(icon="heart", prefix="glyphicon", color="green", icon_color="red") # if village_status not in selected_statuses: # continue # TODO: enable filters intervention_type = row[solved_verified_requests.columns[2]] details = row[solved_verified_requests.columns[3]] contact = row[solved_verified_requests.columns[4]] location = row[solved_verified_requests.columns[5]] org = row[solved_verified_requests.columns[9]] intervention_date = row[solved_verified_requests.columns[10]] remarks = row[solved_verified_requests.columns[11]] intervention_info = f""" Intervention Date: {intervention_date}
Org: {org}
Intervention: {intervention_type}
Invervention Status: {status}
Details: {details}
Location: {location}
Remarks: {remarks}
Contact: {contact}
""" # golden color feature_group.add_child( folium.Marker( location=row["latlng"], tooltip=location, popup=folium.Popup(intervention_info, max_width=300), icon=icon ) ) ## Requests def show_requests(filtered_df, feature_group): """Display victim requests on the map""" for index, row in filtered_df.iterrows(): request_type = row["ما هي احتياجاتك؟ (أضفها إذا لم يتم ذكرها)"] displayed_request = marker_request(request_type) # TODO: the marker should depend on selected_options long_lat = row["latlng"] maps_url = f"https://maps.google.com/?q={long_lat}" douar = row[filtered_df.columns[3]] person_in_place = row[filtered_df.columns[6]] douar_info = row[filtered_df.columns[9]] source = row[filtered_df.columns[10]] # we display all requests in popup text and use the first one for the icon/color display_text = f""" Request Type: {request_type}
Id: {row["id"]}
Source: {source}
Person in place: {person_in_place}
Douar: {douar}
Douar Info: {douar_info}
Google Maps """ icon_name = ICON_MAPPING.get(request_type, "list") if long_lat is None: continue feature_group.add_child( folium.Marker( location=long_lat, tooltip=row[" لأي جماعة / قيادة / دوار تنتمون ؟"] if not pd.isna(row[" لأي جماعة / قيادة / دوار تنتمون ؟"]) else None, popup=folium.Popup(display_text, max_width=300), icon=folium.Icon( color=COLOR_MAPPING.get(displayed_request, "beige"), icon=icon_name, prefix="glyphicon" ), ) ) def show_verified_requests(filtered_verified_df, emergency_fgs): """Display verified victim requests on the map""" global fg verified_color_mapping = { "Low": "beige", "Medium": "orange", "High": "red", } for index, row in filtered_verified_df.iterrows(): long_lat = row["latlng"] # we display all requests in popup text and use the first one for the icon/color display_text = "" for col, val in zip(filtered_verified_df.columns, row): if col == "Help Details": request_type = row["Help Details"] marker_request(request_type) # TODO: the marker should depend on selected_options display_text += f"Request Type: {request_type}
" elif col == "Location Details": display_text += f"Location: {val}
" elif col == "Emergency Degree": display_text += f"Emergency Degree: {val}
" elif col == "Verification Date": display_text += f"Verification Date: {val}
" elif col == "id": display_text = f"Id: {val}
" + display_text elif col == "latlng": maps_url = f"https://maps.google.com/?q={val}" display_text += ( f'Google Maps
' ) # mark as solved button id_in_sheet = row["id"] + 2 display_text += f"Mark as solved
" icon_name = ICON_MAPPING.get(request_type, "list") emergency = row.get("Emergency Degree", "Low") if long_lat is None: continue location = row["Location Details"] # Select the correct feature group fg_emergency_group = emergency_fgs[emergency] fg_emergency_group.add_child( folium.Marker( location=long_lat, tooltip=location if not pd.isna(location) else None, popup=folium.Popup(display_text, max_width=300), icon=folium.Icon( color=verified_color_mapping.get(emergency, "beige"), icon=icon_name, prefix="glyphicon" ), ) )