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 } 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[7]] is_future_intervention = ( row[interventions_df.columns[5]] == "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 📝" intervention_type = row[interventions_df.columns[6]] org = row[interventions_df.columns[1]] contact = row[interventions_df.columns[2]] city = row[interventions_df.columns[9]] date = row[interventions_df.columns[4]] population = row[interventions_df.columns[11]] details = row[interventions_df.columns[8]] road_state = row[interventions_df.columns[12]] intervention_info = f""" Date: {date}
City: {city}
Intervention Status: {status}
Village Status: {village_status}
Org: {org}
Intervention: {intervention_type}
Population: {population}
Road State: {road_state}
Details: {details}
Contact: {contact}
""" if row["latlng"] is None: continue fg = intervention_fgs[status] fg.add_child( folium.Marker( location=row["latlng"], tooltip=city, 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" ), ) )