import gradio as gr import pandas as pd import numpy as np from dotenv import load_dotenv from utils_config import load_config from utils_json import get_json_one_individual, save_to_all_individuals import os load_dotenv() PATH = os.getcwd() + "/" PATH_ASSETS = os.getenv('PATH_ASSETS') PATH_CONFIG = PATH + PATH_ASSETS + "config/" def get_headers(): headers_config = load_config(PATH_CONFIG + "config_headers.json") headers = headers_config["headers"] return headers def get_fields(): fields_config = load_config(PATH_CONFIG + "config_fields.json") fields = fields_config["fields"] return fields def match_data_to_fields(fields, one_individual): new_row = {} for key in fields: if key in one_individual: if key=="image": new_row[key] = one_individual[key] elif type(one_individual[key])==list: new_row[key] = ' , '.join(one_individual[key]) else: new_row[key] = one_individual[key] else: new_row[key] = "NA" return new_row def process_animals(all_animals): processed_animals = [] print(len(all_animals)) for _, animal in all_animals.items(): image = np.array(animal["image"]) caption = [] for key, val in animal.items(): if key!="image": if key=="latitude": caption.extend([ " | Latitude: " + str(animal["latitude"])]) elif key=="longitude": caption.extend([ " | Longitude: " + str(animal["longitude"])]) elif key=="wounded" and val=="True": caption.extend([" | Wounded: " + animal["wounded"]]) elif key=="dead" and val=="True": caption.extend([" | Dead: " + animal["dead"]]) elif key=="circumstance": caption.extend([" | Circumstances: " , animal["circumstance"], animal["circumstance_dropdown_level1"], animal["circumstance_dropdown_level2"], animal["circumstance_openfield_level2"], animal["circumstance_dropdown_extra_level2"]]) elif key=="behavior": caption.extend([" | Behavior: ", animal[key]]) elif "physical_changes" in key: if not(" | Physical Changes: " in caption) : caption.extend([" | Physical Changes: ", "Beak: " + animal["physical_changes_beak"], "Body: " + animal["physical_changes_body"], "Head: " + animal["physical_changes_head"], "Feathers: " + animal["physical_changes_feathers"], "Legs: " + animal["physical_changes_legs"]]) caption_str = " ".join(caption) animal = (image, caption_str) processed_animals.append(animal) return processed_animals 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 save_individual_to_gallery(gallery): one_individual = get_json_one_individual() fields = get_fields() one_individual_matched = match_data_to_fields(fields, one_individual) all_animals = save_to_all_individuals(one_individual_matched) num_cols, num_rows = set_gallery_size(len(all_animals)) processed_animals = process_animals(all_animals) gallery = gr.Gallery( label="Gallery of Records", elem_id="gallery", columns=[num_cols], rows=[num_rows], value=processed_animals, object_fit="contain", height="auto", interactive=False) return gallery # def save_individual_to_df(df): # fields = get_fields() # one_individual = get_json_one_individual() # headers = get_headers() # new_row = match_data_to_fields(fields, one_individual) # new_row = format_row(new_row, headers) # new_row_df = pd.DataFrame([new_row], columns=headers) # df_new = pd.concat([df, new_row_df], ignore_index=True) # df_gr = gr.DataFrame(visible=True, # value=df_new, # headers=headers) # return df_gr # def save_and_rest_df(df): # save_all_animals(df) # df = gr.Dataframe(fields=get_fields(), # visible=False) # return df # def format_row(new_row, headers): # formatted_row = {} # #formatted_row["image"] = new_row["image"] # for header in headers: # if header=="location": # formatted_row[header] = " | ".join(["Latitude: " + str(new_row["latitude"]), # "Longitude: " + str(new_row["longitude"])]) # elif header=="state": # formatted_row[header] = " | ".join(["Wounded: " + new_row["wounded"], # "Dead: " + new_row["dead"]]) # elif header=="circumstance": # formatted_row[header] = " | ".join([new_row["circumstance"], # new_row["circumstance_dropdown_level1"], # new_row["circumstance_dropdown_level2"], # new_row["circumstance_openfield_level2"], # new_row["circumstance_dropdown_extra_level2"]]) # elif header=="behavior": # formatted_row[header] = new_row[header] # elif header=="physical_changes": # formatted_row[header] = " | ".join([new_row["physical_changes_beak"], # new_row["physical_changes_body"], # new_row["physical_changes_head"], # new_row["physical_changes_feathers"], # new_row["physical_changes_legs"]]) # return list(formatted_row.values())