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"
),
)
)