Spaces:
Sleeping
Sleeping
import gradio as gr | |
import pandas as pd | |
from gradio_modal import Modal | |
from PIL import Image | |
from io import BytesIO | |
import base64 | |
from validation_submission.submission import validate_save_individual | |
from validation_submission.get_json import get_json_all_individuals | |
HEADERS = ["Identifier", "Location", "Wounded", "Dead"] | |
def save_display_individual(gallery, df, error_box): | |
individual, error_box = validate_save_individual(error_box) | |
if individual: | |
all_animals = get_json_all_individuals() | |
gallery_animals = process_animals_for_gallery(all_animals) | |
gallery = make_gallery(gallery_animals) | |
df_animals = process_animals_for_df(all_animals) | |
df = make_df(df_animals) | |
return gallery, df, error_box | |
# ---------------------------------- | |
# GALLERY | |
def convert_image(image_base64_str): | |
im = Image.open(BytesIO(base64.b64decode(image_base64_str))) | |
return im | |
def set_gallery_size(len_animals): | |
if len_animals < 10: | |
num_cols=5 | |
num_rows=2 | |
else: | |
num_cols = len_animals/2 | |
num_rows = len_animals/(num_cols) | |
return num_cols, num_rows | |
def process_animals_for_gallery(all_animals): | |
gallery_animals = [] | |
for _, animal in all_animals.items(): | |
image = convert_image(animal["image"]["image"]) | |
caption = animal["identifier"] | |
animal = (image, caption) | |
gallery_animals.append(animal) | |
return gallery_animals | |
def make_gallery(gallery_animals): | |
num_cols, num_rows = set_gallery_size(len(gallery_animals)) | |
gallery = gr.Gallery( | |
label="Gallery of Records", elem_id="gallery", | |
columns=[num_cols], rows=[num_rows], | |
value=gallery_animals, | |
object_fit="contain", height="auto", interactive=False) | |
return gallery | |
def keep_only_values(dict_to_filter): | |
info_text = "" | |
values_to_ignore = ["Yes", "No", "NA"] | |
if dict_to_filter: | |
for key, val in dict_to_filter.items(): | |
if type(val) is dict: | |
subset_text = keep_only_values(val) | |
info_text += f"{subset_text}" | |
elif type(val) is list: | |
for item in val: | |
if type(item) is dict: | |
subset_text = keep_only_values(item) | |
info_text += f"{subset_text}" | |
elif (val is not None) and (type(val) is not bool) and (val not in values_to_ignore): | |
info_text += f" {key} : {val} |" | |
else: | |
print("Ignoring value: ", val) | |
print("Associated key: ", key) | |
else: | |
info_text = "NaN" | |
return info_text | |
# ---------------------------------- | |
# DATAFRAME | |
def process_animals_for_df(all_animals): | |
df_animals = {} | |
identifiers =[] | |
geo =[] | |
wounded =[] | |
dead =[] | |
for _, animal in all_animals.items(): | |
identifier_value = animal["identifier"] | |
identifiers.append(identifier_value) | |
geo_dict = animal["geolocalisation"] | |
geo_values = keep_only_values(geo_dict) | |
geo.append(geo_values) | |
wounded_dict = animal["wounded"] | |
wounded_values = keep_only_values(wounded_dict) | |
wounded.append(wounded_values) | |
dead_dict = animal["dead"] | |
dead_values = keep_only_values(dead_dict) | |
dead.append(dead_values) | |
df_animals["Identifier"] = identifiers | |
df_animals["Location"] = geo | |
df_animals["Wounded"] = wounded | |
df_animals["Dead"] = dead | |
return df_animals | |
def make_df(df_animals): | |
df = pd.DataFrame.from_dict(df_animals) | |
styled_df = df.style.set_properties(**{ | |
'min-width': '25px', | |
'max-width': '50px', # Adjust width as needed | |
'white-space': 'normal', # Allows text to wrap to the next line | |
'word-wrap': 'break-word' # Breaks long words to fit within the width | |
}) | |
df_gradio = gr.DataFrame(visible=True, | |
value=styled_df, | |
headers=HEADERS, interactive=False) | |
return df_gradio | |