jules.lambert1
change app
cef72f8
raw
history blame
6.99 kB
import os
import time
from src.markers import display_interventions, display_solved, show_requests, show_verified_requests
from src.filters import show_requests_filters, show_interventions_filters
import folium
import pandas as pd
import streamlit as st
from huggingface_hub import HfApi
from streamlit_folium import st_folium
from src.components import show_dataframes_metrics, show_embed_code, id_review_submission, show_donations
from src.text_content import (
CREDITS_TEXT,
LOGO,
SLOGAN,
)
from src.utils import add_latlng_col, init_map, parse_gg_sheet, is_request_in_list, parse_json_file
from src.map_utils import get_legend_macro
from src.dataframes import display_dataframe
from src.filter.filter import add_category
from src.filter.filter import HelpCategory
from src.ranking.ranking import sort_request
TOKEN = os.environ.get("HF_TOKEN", None)
VERIFIED_REQUESTS_URL = (
"https://docs.google.com/spreadsheets/d/1PXcAtI5L95hHSXAiRl3Y4v5O4coG39S86OTfBEcvLTE/edit#gid=0"
)
REQUESTS_URL = "https://docs.google.com/spreadsheets/d/1gYoBBiBo1L18IVakHkf3t1fOGvHWb23loadyFZUeHJs/edit#gid=966953708"
INTERVENTIONS_URL = (
"https://docs.google.com/spreadsheets/d/1eXOTqunOWWP8FRdENPs4cU9ulISm4XZWYJJNR1-SrwY/edit#gid=2089222765"
)
DOUARS_URL = "data/regions.json"
api = HfApi(TOKEN)
# Initialize Streamlit Config
st.set_page_config(
layout="wide",
initial_sidebar_state="collapsed",
page_icon="🤝",
page_title="Nt3awnou نتعاونو",
)
# Initialize States
if "sleep_time" not in st.session_state:
st.session_state.sleep_time = 2
if "auto_refresh" not in st.session_state:
st.session_state.auto_refresh = False
auto_refresh = st.sidebar.checkbox("Auto Refresh?", st.session_state.auto_refresh)
if auto_refresh:
number = st.sidebar.number_input("Refresh rate in seconds", value=st.session_state.sleep_time)
st.session_state.sleep_time = number
# Streamlit functions
# Logo and Title
st.markdown(LOGO, unsafe_allow_html=True)
# st.title("Nt3awnou نتعاونو")
st.markdown(SLOGAN, unsafe_allow_html=True)
m, emergency_fgs, intervention_fgs = init_map()
fg = folium.FeatureGroup(name="Markers")
# Selection of requests
selected_options, options, show_unverified, show_interventions = show_requests_filters()
# Load data and initialize map with plugins
df = parse_gg_sheet(REQUESTS_URL)
if show_unverified:
df = add_latlng_col(df, process_column=15)
interventions_df = parse_gg_sheet(INTERVENTIONS_URL)
interventions_df = add_latlng_col(interventions_df, process_column="Automatic Extracted Coordinates")
verified_df = parse_gg_sheet(VERIFIED_REQUESTS_URL)
verified_df = add_latlng_col(verified_df, process_column="Automatic Extracted Coordinates")
douar_df = parse_json_file(DOUARS_URL)
# check if verified requests have been solved
solved_verified_requests = verified_df[~pd.isnull(verified_df["Status"])]
verified_df = verified_df[pd.isnull(verified_df["Status"])]
len_requests = len(df)
len_interventions = len(interventions_df)
len_verified_requests = len(verified_df)
len_solved_verified_requests = len(solved_verified_requests)
df["id"] = df.index # Needed to display request id
verified_df["id"] = verified_df.index # Needed to display request id
# keep rows with at least one request in selected_options
filtered_df = df[
df["ما هي احتياجاتك؟ (أضفها إذا لم يتم ذكرها)"].apply(lambda x: is_request_in_list(x, selected_options, options))
]
filtered_verified_df = verified_df[
verified_df["Help Details"].apply(lambda x: is_request_in_list(x, selected_options, options))
]
# Selection of interventions
(
selected_statuses,
critical_villages,
partially_satisfied_villages,
fully_satisfied_villages,
) = show_interventions_filters()
# Add interventions markers to map
if show_interventions:
display_solved(solved_verified_requests, selected_statuses, fg)
display_interventions(interventions_df, selected_statuses, m, intervention_fgs)
# Add requests markers to map
if show_unverified:
show_requests(filtered_df, fg)
# Add verified requests markers to map
show_verified_requests(verified_df, emergency_fgs)
# Add legend
legend_macro = get_legend_macro(show_unverified)
# delete old legend
for child in m.get_root()._children:
pass # TODO: fix this
# if child.startswith("macro_element"):
# m.get_root()._children.remove(child)
m.get_root().add_child(legend_macro)
# add_village_names(douar_df, m)
st_folium(m, use_container_width=True, returned_objects=[], feature_group_to_add=fg, key="map")
# Embed code
show_embed_code()
# Show metrics
show_dataframes_metrics(len_requests, len_interventions, len_solved_verified_requests)
# Verified Requests table
verified_df = add_category(df)
st.divider()
st.subheader("📝 **Table of verified requests / جدول الطلبات المؤكدة**")
drop_cols = [
"Phone Number",
"id",
"Status",
"Intervenant ",
"Intervention Date",
"Any remarks",
"VerificationStatus",
"Automatic Extracted Coordinates",
]
display_dataframe(
verified_df, drop_cols, VERIFIED_REQUESTS_URL, search_id=True, for_help_requests=True, show_link=False
)
# Requests table aggregate
st.subheader("📝 **Table of aggragate")
aggregate = aggregate_locations(verified_df)
display_dataframe(
aggregate, [], VERIFIED_REQUESTS_URL, search_id=True, for_help_requests=True, show_link=False
)
# Requests table shelter
st.subheader("📝 **Table of shelter request")
house_request = verified_df[verified_df['Help Details'] == HelpCategory.HOUSE]
display_dataframe(
house_request, drop_cols, VERIFIED_REQUESTS_URL, search_id=True, for_help_requests=True, show_link=False
)
# Requests table
st.divider()
st.subheader("📝 **Table of requests / جدول الطلبات**")
drop_cols = [
"(عند الامكان) رقم هاتف شخص موجود في عين المكان",
"الرجاء الضغط على الرابط التالي لمعرفة موقعك إذا كان متاحا",
"GeoStamp",
"GeoCode",
"GeoAddress",
"Status",
"id",
]
display_dataframe(filtered_df, drop_cols, REQUESTS_URL, search_id=True, for_help_requests=True)
st.subheader("📝 **Table of sorted requests / جدول الطلبات**")
sorted_request = sort_request(filtered_df)
display_dataframe(sorted_request, drop_cols, REQUESTS_URL, search_id=True, for_help_requests=True)
# Interventions table
st.divider()
st.subheader("📝 **Table of interventions / جدول التدخلات**")
display_dataframe(
interventions_df,
[], # We show NGOs contact information
INTERVENTIONS_URL,
search_id=False,
status=True,
for_help_requests=False,
)
# Submit an id for review
st.divider()
id_review_submission(api)
# Donations can be made to the gouvernmental fund under the name
st.divider()
show_donations()
# Credits
st.markdown(
CREDITS_TEXT,
unsafe_allow_html=True,
)
if auto_refresh:
time.sleep(number)
st.experimental_rerun()