digiwild_bern / app /display.py
katospiegel's picture
Upload 104 files
20bdfba verified
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