|
import uuid |
|
from pydantic import ValidationError |
|
import gradio as gr |
|
|
|
from validation_submission.get_json import get_json_tmp, get_json_one_individual |
|
from circumstances.class_circumstance import Circumstances |
|
from behavior.class_behavior import Behaviors |
|
from physical.class_physical import PhysicalAnomalies |
|
from follow_up.class_follow_up import FollowUpEvents |
|
from classes import Report, Wounded, Dead, ImageBase64 |
|
from validation_submission.processing import process_circumstance, process_behaviors, process_physical, process_followup |
|
|
|
def get_fields(data_dict, keyword): |
|
extract = {} |
|
for key, val in data_dict.items(): |
|
if keyword in key: |
|
extract[key] = val |
|
return extract |
|
|
|
def validate_individual(error_box): |
|
error_box = reset_error_box(error_box) |
|
data = get_json_one_individual() |
|
data["identifier"] = str(uuid.uuid4()) |
|
if "image" in data.keys(): |
|
img = ImageBase64.to_base64(data["image"]) |
|
else: |
|
img = None |
|
if "geolocalisation" in data.keys(): |
|
geolocalisation = data["geolocalisation"] |
|
else: |
|
geolocalisation = None |
|
|
|
error_behavior = None |
|
error_circumstance = None |
|
error_followup = None |
|
error_physical = None |
|
error_individual = None |
|
if "wounded_state" not in data or "dead_state" not in data: |
|
data["wounded_state"] = "No" |
|
data["dead_state"] = "No" |
|
if (data["wounded_state"] == "Yes") or (data["dead_state"] == "Yes"): |
|
data_wounded_dead = get_json_tmp("wounded_dead") |
|
circumstance, error_circumstance = validate_circumstance(data_wounded_dead) |
|
physical, error_physical = validate_physical(data_wounded_dead) |
|
followup, error_followup = validate_follow_up(data_wounded_dead) |
|
|
|
if data["wounded_state"]=="Yes": |
|
print(physical) |
|
behavior, error_behavior = validate_behavior(data_wounded_dead) |
|
try : |
|
individual = Report(identifier = data["identifier"], |
|
image = img, |
|
geolocalisation = geolocalisation, |
|
wounded_state = data["wounded_state"], |
|
wounded = Wounded(circumstances = circumstance, |
|
behaviors = behavior, |
|
physical_anomalies = physical, |
|
follow_up_events = followup), |
|
dead_state = data["dead_state"]) |
|
except ValidationError as e: |
|
print(e) |
|
error_individual = e |
|
|
|
elif data["dead_state"]=="Yes": |
|
try: |
|
individual = Report(identifier = data["identifier"], |
|
image = img, |
|
geolocalisation = geolocalisation, |
|
wounded_state = data["wounded_state"], |
|
dead_state = data["dead_state"], |
|
dead = Dead(circumstances = circumstance, |
|
physical_anomalies = physical, |
|
follow_up_events = followup) |
|
) |
|
except ValidationError as e: |
|
print(e) |
|
error_individual = e |
|
else: |
|
try: |
|
individual = Report(identifier = data["identifier"], |
|
image = img, |
|
geolocalisation = geolocalisation, |
|
wounded_state = data["wounded_state"], |
|
dead_state = data["dead_state"]) |
|
except ValidationError as e: |
|
print(e) |
|
error_individual = e |
|
if error_behavior or error_circumstance or error_followup or error_physical or error_individual: |
|
error_box = show_error(error_box, error_behavior, error_circumstance, error_followup, error_physical, error_individual) |
|
individual = None |
|
else: |
|
error_box= gr.Text(label="ALL VALID.", value="Record Registered. You can return to the Display.", visible=True, elem_id="valid") |
|
return individual, error_box |
|
|
|
def show_error(error_box, error_behavior, error_circumstance, error_followup, error_physical, error_individual): |
|
error_text = "" |
|
if error_circumstance: |
|
error_text += f"Error in circumstance: {error_circumstance}\n" |
|
if error_behavior: |
|
error_text += f"Error in behavior: {error_behavior}\n" |
|
if error_physical: |
|
error_text += f"Error in physical: {error_physical}\n" |
|
if error_followup: |
|
error_text += f"Error in follow-up: {error_followup}\n" |
|
if error_individual: |
|
error_text += f"Error in individual: {error_individual}\n" |
|
error_text += "PLEASE CORRECT THESE ERRORS BEFORE SUBMITTING." |
|
error_box= gr.Text(label="ERROR DETECTED !", value=error_text, visible=True, elem_id="error") |
|
return error_box |
|
|
|
def reset_error_box(error_box): |
|
error_box = gr.Text(value=None, visible=False) |
|
return error_box |
|
|
|
|
|
def validate_circumstance(data): |
|
circumstance_raw = get_fields(data, "circumstance") |
|
circumstance_formatted = process_circumstance(circumstance_raw) |
|
try: |
|
Circumstances.model_validate(circumstance_formatted) |
|
circumstances = Circumstances(**circumstance_formatted) |
|
error = None |
|
except ValidationError as e: |
|
error = e |
|
print(e) |
|
circumstances = None |
|
return circumstances, error |
|
|
|
|
|
def validate_behavior(data): |
|
behaviors_raw = get_fields(data, "behaviors") |
|
behaviors_formatted = process_behaviors(behaviors_raw) |
|
try: |
|
Behaviors.model_validate(behaviors_formatted) |
|
behavior = Behaviors(**behaviors_formatted) |
|
error = None |
|
except ValidationError as e: |
|
print(e) |
|
print("Validation failed for the behaviors.") |
|
behavior = None |
|
error = e |
|
return behavior, error |
|
|
|
|
|
def validate_physical(data): |
|
physical_raw = get_fields(data, "physical") |
|
physical_formatted = process_physical(physical_raw) |
|
try: |
|
PhysicalAnomalies.model_validate(physical_formatted) |
|
physical = PhysicalAnomalies(**physical_formatted) |
|
error = None |
|
except ValidationError as e: |
|
print(e) |
|
print("Validation failed for the physical anomalies.") |
|
physical = None |
|
error = e |
|
return physical, error |
|
|
|
def validate_follow_up(data): |
|
followup_raw = get_fields(data, "followup") |
|
followup_formatted = process_followup(followup_raw) |
|
try: |
|
FollowUpEvents.model_validate(followup_formatted) |
|
followup = FollowUpEvents(**followup_formatted) |
|
error = None |
|
except ValidationError as e: |
|
print(e) |
|
print("Validation failed for the follow-up events.") |
|
followup = None |
|
return followup, error |
|
|
|
|
|
|
|
|