feat: json schema set-up
Browse files- app/assets/config/config_dropdown_circumstances.json +43 -15
- app/assets/json_tmp/tmp_wounded_dead.json +1 -0
- app/behavior/behavior_checkbox.py +1 -1
- app/behavior/class_behavior.py +1 -1
- app/circumstances/circumstances.py +7 -2
- app/circumstances/circumstances_dropdowns.py +27 -12
- app/circumstances/class_circumstance.py +22 -9
- app/classes.py +1 -13
- app/dead.py +3 -3
- app/follow_up/followup_events.py +1 -1
- app/gallery.py +6 -2
- app/geolocalisation/maps.py +28 -11
- app/gradio_test/test_selectdata_event.py +16 -0
- app/{tests.py → gradio_test/tests_delete_gallery.py} +0 -0
- app/main_multianimal.py +12 -3
- app/physical/class_physical.py +1 -1
- app/physical/physical_checkbox.py +1 -1
- app/utils/utils_json.py +0 -42
- app/validation_submission/__init__.py +0 -0
- app/validation_submission/add_json.py +15 -0
- app/validation_submission/create_json.py +16 -0
- app/validation_submission/get_json.py +16 -0
- app/validation_submission/submission.py +10 -0
- app/validation_submission/validation.py +44 -0
- app/wounded.py +3 -3
app/assets/config/config_dropdown_circumstances.json
CHANGED
@@ -4,7 +4,9 @@
|
|
4 |
"road vehicle":
|
5 |
{
|
6 |
|
7 |
-
"Options":
|
|
|
|
|
8 |
"Open": "Infrastructure number"
|
9 |
|
10 |
},
|
@@ -21,20 +23,26 @@
|
|
21 |
{
|
22 |
"hunting":
|
23 |
{
|
24 |
-
"Options":
|
|
|
|
|
25 |
},
|
26 |
"trap":
|
27 |
{
|
28 |
-
"Options":
|
|
|
|
|
29 |
},
|
30 |
"poisoning": {},
|
31 |
"removal or direct capture":
|
32 |
{
|
33 |
-
"Options": ["gassing", "raptor captured at nest", "brood destruction", "traffic/trade", "capture accident", "scientific sample", "other", "unknown"]
|
|
|
34 |
},
|
35 |
"fishing":
|
36 |
{
|
37 |
-
"Options": ["drowned/tangled", "beached with capture indications", "other", "unknown"]
|
|
|
38 |
},
|
39 |
"other": {},
|
40 |
"unknown": {}
|
@@ -44,7 +52,9 @@
|
|
44 |
"pylone and electric grid":
|
45 |
{
|
46 |
|
47 |
-
"Options":
|
|
|
|
|
48 |
"Extra":
|
49 |
{
|
50 |
"Cause": ["collision", "electrocution", "unknown"]
|
@@ -53,24 +63,34 @@
|
|
53 |
"windfarm": {},
|
54 |
"other collision":
|
55 |
{
|
56 |
-
"Options":
|
|
|
|
|
57 |
},
|
58 |
"fall":
|
59 |
{
|
60 |
-
"Options":
|
|
|
|
|
61 |
},
|
62 |
"development work":
|
63 |
{
|
64 |
-
"Options":
|
|
|
|
|
65 |
},
|
66 |
"pollution / contamination":
|
67 |
{
|
68 |
-
"Options":
|
|
|
69 |
},
|
70 |
"agricultural net protection": {},
|
71 |
"vegetal / forest work":
|
72 |
{
|
73 |
-
"Options":
|
|
|
|
|
|
|
74 |
},
|
75 |
"other": {},
|
76 |
"unknown": {}
|
@@ -79,22 +99,30 @@
|
|
79 |
{
|
80 |
"predation":
|
81 |
{
|
82 |
-
"Options":
|
|
|
|
|
83 |
},
|
84 |
"weather":
|
85 |
{
|
86 |
-
"Options":
|
|
|
|
|
87 |
},
|
88 |
"natural disaster":
|
89 |
{
|
90 |
-
"Options":
|
|
|
|
|
91 |
},
|
92 |
"nest fall": {},
|
93 |
"stranding due to exhaustion": {},
|
94 |
"disease/parasite": {},
|
95 |
"accidental drowing":
|
96 |
{
|
97 |
-
"Options":
|
|
|
|
|
98 |
},
|
99 |
"other": {},
|
100 |
"unknown": {}
|
|
|
4 |
"road vehicle":
|
5 |
{
|
6 |
|
7 |
+
"Options": {
|
8 |
+
"road_type" : ["highway", "main road", "secondary road", "local road/path/trail", "parking lot", "other", "unknown"]
|
9 |
+
},
|
10 |
"Open": "Infrastructure number"
|
11 |
|
12 |
},
|
|
|
23 |
{
|
24 |
"hunting":
|
25 |
{
|
26 |
+
"Options": {
|
27 |
+
"method" : ["shooting", "bow", "falconry", "hounds hunting", "digging up", "other", "unknown"]
|
28 |
+
}
|
29 |
},
|
30 |
"trap":
|
31 |
{
|
32 |
+
"Options": {
|
33 |
+
"method": ["killing trap", "pole trap", "trap cage", "corvids nasse", "net", "cage trap", "fall-trap", "glue trap", "insect trap", "other", "unknown"]
|
34 |
+
}
|
35 |
},
|
36 |
"poisoning": {},
|
37 |
"removal or direct capture":
|
38 |
{
|
39 |
+
"Options": {"method": ["gassing", "raptor captured at nest", "brood destruction", "traffic/trade", "capture accident", "scientific sample", "other", "unknown"]
|
40 |
+
}
|
41 |
},
|
42 |
"fishing":
|
43 |
{
|
44 |
+
"Options": {"method" : ["drowned/tangled", "beached with capture indications", "other", "unknown"]
|
45 |
+
}
|
46 |
},
|
47 |
"other": {},
|
48 |
"unknown": {}
|
|
|
52 |
"pylone and electric grid":
|
53 |
{
|
54 |
|
55 |
+
"Options": {
|
56 |
+
"infrastructure" : ["electric line", "pole/pylon", "other", "unknown"]
|
57 |
+
},
|
58 |
"Extra":
|
59 |
{
|
60 |
"Cause": ["collision", "electrocution", "unknown"]
|
|
|
63 |
"windfarm": {},
|
64 |
"other collision":
|
65 |
{
|
66 |
+
"Options": {
|
67 |
+
"object": ["window", "building", "lighthouse", "cable", "wire fence/barbed wire", "other crash", "unknown"]
|
68 |
+
}
|
69 |
},
|
70 |
"fall":
|
71 |
{
|
72 |
+
"Options": {
|
73 |
+
"location": ["chimney", "empty pole", "hole/well", "other", "unknown"]
|
74 |
+
}
|
75 |
},
|
76 |
"development work":
|
77 |
{
|
78 |
+
"Options": {
|
79 |
+
"work_type" : ["transport infrastructure", "building", "other", "unknown"]
|
80 |
+
}
|
81 |
},
|
82 |
"pollution / contamination":
|
83 |
{
|
84 |
+
"Options": {
|
85 |
+
"pollution_type" : ["oil pollution", "chemical pollution", "heavy metals", "light", "noise", "plastic ingestion", "other", "unknown"]
|
86 |
},
|
87 |
"agricultural net protection": {},
|
88 |
"vegetal / forest work":
|
89 |
{
|
90 |
+
"Options": {
|
91 |
+
"work_type" : ["clearing/mowing/plowing", "tree felling/pruning", "other", "unknown"]
|
92 |
+
}
|
93 |
+
}
|
94 |
},
|
95 |
"other": {},
|
96 |
"unknown": {}
|
|
|
99 |
{
|
100 |
"predation":
|
101 |
{
|
102 |
+
"Options": {
|
103 |
+
"predator" : ["cat", "dog", "rooster/hen", "other domestic animal", "wild birds", "wild mammal", "other", "unknown"]
|
104 |
+
}
|
105 |
},
|
106 |
"weather":
|
107 |
{
|
108 |
+
"Options": {
|
109 |
+
"condition" : ["cold wave", "drought", "hail", "lightening", "storm", "other", "unknown"]
|
110 |
+
}
|
111 |
},
|
112 |
"natural disaster":
|
113 |
{
|
114 |
+
"Options": {
|
115 |
+
"disaster" : ["fire", "avalanche", "rock fall", "mudslide", "volcanic eruption/ashes", "other", "unknown"]
|
116 |
+
}
|
117 |
},
|
118 |
"nest fall": {},
|
119 |
"stranding due to exhaustion": {},
|
120 |
"disease/parasite": {},
|
121 |
"accidental drowing":
|
122 |
{
|
123 |
+
"Options": {
|
124 |
+
"drowning_location" : ["drinking trough", "pool", "storm pool", "irrigation pool", "natural pool", "flood", "other container", "unknown"]
|
125 |
+
}
|
126 |
},
|
127 |
"other": {},
|
128 |
"unknown": {}
|
app/assets/json_tmp/tmp_wounded_dead.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{}
|
app/behavior/behavior_checkbox.py
CHANGED
@@ -2,7 +2,7 @@ import gradio as gr
|
|
2 |
from utils.utils_config import get_custom_config_dropdowns
|
3 |
from utils.utils_checkbox import create_checkbox
|
4 |
from utils.utils_visible import set_visible
|
5 |
-
from
|
6 |
|
7 |
def on_select_behavior(behavior_checkbox):
|
8 |
add_data_to_individual("behavior", behavior_checkbox)
|
|
|
2 |
from utils.utils_config import get_custom_config_dropdowns
|
3 |
from utils.utils_checkbox import create_checkbox
|
4 |
from utils.utils_visible import set_visible
|
5 |
+
from validation_submission.add_json import add_data_to_individual
|
6 |
|
7 |
def on_select_behavior(behavior_checkbox):
|
8 |
add_data_to_individual("behavior", behavior_checkbox)
|
app/behavior/class_behavior.py
CHANGED
@@ -63,4 +63,4 @@ BehaviorType = Union[
|
|
63 |
|
64 |
# Main class that logs multiple behaviors
|
65 |
class Behaviors(BaseModel):
|
66 |
-
observed_behaviors: List[BehaviorType]
|
|
|
63 |
|
64 |
# Main class that logs multiple behaviors
|
65 |
class Behaviors(BaseModel):
|
66 |
+
observed_behaviors: List[BehaviorType] = Field(..., discriminator='type')
|
app/circumstances/circumstances.py
CHANGED
@@ -1,8 +1,10 @@
|
|
1 |
import gradio as gr
|
2 |
import os
|
3 |
-
from utils.utils_visible import set_visible
|
4 |
from dotenv import load_dotenv
|
5 |
-
|
|
|
|
|
|
|
6 |
load_dotenv()
|
7 |
PATH = os.getcwd() + "/"
|
8 |
PATH_ASSETS = os.getenv('PATH_ASSETS')
|
@@ -13,6 +15,9 @@ CAUSE_COL_WIDTH = "50px"
|
|
13 |
|
14 |
def show_circumstances(choice):
|
15 |
visible = set_visible(choice)
|
|
|
|
|
|
|
16 |
button_collision, button_deliberate_destruction, button_indirect_destruction, button_natural_cause, dropdown, dropdown_level2, openfield_level2, dropdown_extra_level2 = create_circumstances(visible)
|
17 |
return button_collision, button_deliberate_destruction, button_indirect_destruction, button_natural_cause, dropdown, dropdown_level2, openfield_level2, dropdown_extra_level2
|
18 |
|
|
|
1 |
import gradio as gr
|
2 |
import os
|
|
|
3 |
from dotenv import load_dotenv
|
4 |
+
|
5 |
+
from utils.utils_visible import set_visible
|
6 |
+
from validation_submission.add_json import add_data_tmp
|
7 |
+
|
8 |
load_dotenv()
|
9 |
PATH = os.getcwd() + "/"
|
10 |
PATH_ASSETS = os.getenv('PATH_ASSETS')
|
|
|
15 |
|
16 |
def show_circumstances(choice):
|
17 |
visible = set_visible(choice)
|
18 |
+
add_data_tmp("wounded_dead",
|
19 |
+
"circumstance_radio",
|
20 |
+
True)
|
21 |
button_collision, button_deliberate_destruction, button_indirect_destruction, button_natural_cause, dropdown, dropdown_level2, openfield_level2, dropdown_extra_level2 = create_circumstances(visible)
|
22 |
return button_collision, button_deliberate_destruction, button_indirect_destruction, button_natural_cause, dropdown, dropdown_level2, openfield_level2, dropdown_extra_level2
|
23 |
|
app/circumstances/circumstances_dropdowns.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
import gradio as gr
|
2 |
from utils.utils_config import get_custom_config_dropdowns
|
3 |
-
from
|
4 |
|
5 |
#--------------------------------------------------------- LEVEL 1 DROPDOWNS
|
6 |
def retrieve_config_options(label, dropdown_config):
|
@@ -23,28 +23,29 @@ def create_dropdown_level1(label):
|
|
23 |
|
24 |
def dropdown_collision():
|
25 |
label = "Collision with a means of transport"
|
26 |
-
|
27 |
return create_dropdown_level1(label)
|
28 |
|
29 |
def dropdown_deliberate_destruction():
|
30 |
label = "Destruction / Deliberatly removed"
|
31 |
-
|
32 |
return create_dropdown_level1(label)
|
33 |
|
34 |
def dropdown_indirect_destruction():
|
35 |
label = "Indirect destruction"
|
36 |
-
|
37 |
return create_dropdown_level1(label)
|
38 |
|
39 |
def dropdown_natural_cause():
|
40 |
label = "Natural cause"
|
41 |
-
|
42 |
return create_dropdown_level1(label)
|
43 |
|
44 |
|
45 |
#--------------------------------------------------------- LEVEL 2 DROPDOWNS
|
46 |
def get_options(value):
|
47 |
value = value.lower()
|
|
|
48 |
options_dropdown= None
|
49 |
open_field = None
|
50 |
extras = None
|
@@ -54,7 +55,9 @@ def get_options(value):
|
|
54 |
nested_dict = sub_dict.get(value)
|
55 |
if nested_dict is not None:
|
56 |
if "Options" in nested_dict.keys():
|
57 |
-
|
|
|
|
|
58 |
options_dropdown = [option.title() for option in options_dropdown]
|
59 |
if "Open" in nested_dict.keys():
|
60 |
open_field = nested_dict["Open"]
|
@@ -64,12 +67,18 @@ def get_options(value):
|
|
64 |
extras_label = key
|
65 |
extras = val
|
66 |
extras = [extra.title() for extra in extras]
|
67 |
-
return options_dropdown, open_field, extras, extras_label
|
68 |
|
69 |
|
70 |
def on_select(evt: gr.SelectData): # SelectData is a subclass of EventData
|
71 |
-
|
72 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
73 |
if options_dropdown is not None:
|
74 |
dropdown_level2 = gr.Dropdown(choices=options_dropdown, label=evt.value, interactive=True, visible=True)
|
75 |
else:
|
@@ -87,10 +96,16 @@ def on_select(evt: gr.SelectData): # SelectData is a subclass of EventData
|
|
87 |
return dropdown_level2, openfield_level2, dropdown_extra_level2
|
88 |
|
89 |
def on_select_dropdown_level2(evt: gr.SelectData):
|
90 |
-
|
|
|
|
|
91 |
|
92 |
def on_select_openfield_level2(evt: gr.SelectData):
|
93 |
-
|
|
|
|
|
94 |
|
95 |
def on_select_dropdown_extra_level2(evt: gr.SelectData):
|
96 |
-
|
|
|
|
|
|
1 |
import gradio as gr
|
2 |
from utils.utils_config import get_custom_config_dropdowns
|
3 |
+
from validation_submission.add_json import add_data_tmp
|
4 |
|
5 |
#--------------------------------------------------------- LEVEL 1 DROPDOWNS
|
6 |
def retrieve_config_options(label, dropdown_config):
|
|
|
23 |
|
24 |
def dropdown_collision():
|
25 |
label = "Collision with a means of transport"
|
26 |
+
add_data_tmp("wounded_dead", "circumstance", label.lower())
|
27 |
return create_dropdown_level1(label)
|
28 |
|
29 |
def dropdown_deliberate_destruction():
|
30 |
label = "Destruction / Deliberatly removed"
|
31 |
+
add_data_tmp("wounded_dead", "circumstance", label.lower())
|
32 |
return create_dropdown_level1(label)
|
33 |
|
34 |
def dropdown_indirect_destruction():
|
35 |
label = "Indirect destruction"
|
36 |
+
add_data_tmp("wounded_dead", "circumstance", label.lower())
|
37 |
return create_dropdown_level1(label)
|
38 |
|
39 |
def dropdown_natural_cause():
|
40 |
label = "Natural cause"
|
41 |
+
add_data_tmp("wounded_dead", "circumstance", label.lower())
|
42 |
return create_dropdown_level1(label)
|
43 |
|
44 |
|
45 |
#--------------------------------------------------------- LEVEL 2 DROPDOWNS
|
46 |
def get_options(value):
|
47 |
value = value.lower()
|
48 |
+
options_label = None
|
49 |
options_dropdown= None
|
50 |
open_field = None
|
51 |
extras = None
|
|
|
55 |
nested_dict = sub_dict.get(value)
|
56 |
if nested_dict is not None:
|
57 |
if "Options" in nested_dict.keys():
|
58 |
+
options_dict = nested_dict["Options"]
|
59 |
+
options_label = list(options_dict.keys())[0]
|
60 |
+
options_dropdown = list(options_dict.values())[0]
|
61 |
options_dropdown = [option.title() for option in options_dropdown]
|
62 |
if "Open" in nested_dict.keys():
|
63 |
open_field = nested_dict["Open"]
|
|
|
67 |
extras_label = key
|
68 |
extras = val
|
69 |
extras = [extra.title() for extra in extras]
|
70 |
+
return options_label, options_dropdown, open_field, extras, extras_label
|
71 |
|
72 |
|
73 |
def on_select(evt: gr.SelectData): # SelectData is a subclass of EventData
|
74 |
+
options_label, options_dropdown, open_field, extras, extras_label = get_options(evt.value)
|
75 |
+
add_data_tmp("wounded_dead",
|
76 |
+
"cirumstance_type",
|
77 |
+
{"type": (evt.value).lower(),
|
78 |
+
"option_dropdown_label" : options_label.lower() if options_label is not None else 'NA',
|
79 |
+
"open_field_label" : open_field.lower() if open_field is not None else 'NA',
|
80 |
+
"extra_label": extras_label.lower() if extras_label is not None else 'NA'
|
81 |
+
})
|
82 |
if options_dropdown is not None:
|
83 |
dropdown_level2 = gr.Dropdown(choices=options_dropdown, label=evt.value, interactive=True, visible=True)
|
84 |
else:
|
|
|
96 |
return dropdown_level2, openfield_level2, dropdown_extra_level2
|
97 |
|
98 |
def on_select_dropdown_level2(evt: gr.SelectData):
|
99 |
+
add_data_tmp("wounded_dead",
|
100 |
+
"circumstance_option_dropdown",
|
101 |
+
evt.value)
|
102 |
|
103 |
def on_select_openfield_level2(evt: gr.SelectData):
|
104 |
+
add_data_tmp("wounded_dead",
|
105 |
+
"circumstance_open_field",
|
106 |
+
evt.value)
|
107 |
|
108 |
def on_select_dropdown_extra_level2(evt: gr.SelectData):
|
109 |
+
add_data_tmp("wounded_dead",
|
110 |
+
"circumstance_extra",
|
111 |
+
evt.value)
|
app/circumstances/class_circumstance.py
CHANGED
@@ -22,10 +22,10 @@ class BoatCollision(CircumstanceTypeBase):
|
|
22 |
type: Literal['boat']
|
23 |
|
24 |
class OtherTransportCollision(CircumstanceTypeBase):
|
25 |
-
type: Literal['other']
|
26 |
|
27 |
class UnknownTransportCollision(CircumstanceTypeBase):
|
28 |
-
type: Literal['unknown']
|
29 |
|
30 |
# Destruction / Deliberately removed
|
31 |
class HuntingDestruction(CircumstanceTypeBase):
|
@@ -48,10 +48,10 @@ class FishingDestruction(CircumstanceTypeBase):
|
|
48 |
method: Literal['drowned/tangled', 'beached with capture indications', 'other', 'unknown']
|
49 |
|
50 |
class OtherDestruction(CircumstanceTypeBase):
|
51 |
-
type: Literal['other']
|
52 |
|
53 |
class UnknownDestruction(CircumstanceTypeBase):
|
54 |
-
type: Literal['unknown']
|
55 |
|
56 |
# Indirect destruction
|
57 |
class PylonElectricGridDestruction(CircumstanceTypeBase):
|
@@ -86,10 +86,10 @@ class VegetalForestWorkDestruction(CircumstanceTypeBase):
|
|
86 |
work_type: Literal['clearing/mowing/plowing', 'tree felling/pruning', 'other', 'unknown']
|
87 |
|
88 |
class OtherIndirectDestruction(CircumstanceTypeBase):
|
89 |
-
type: Literal['other']
|
90 |
|
91 |
class UnknownIndirectDestruction(CircumstanceTypeBase):
|
92 |
-
type: Literal['unknown']
|
93 |
|
94 |
# Natural cause
|
95 |
class Predation(CircumstanceTypeBase):
|
@@ -118,10 +118,10 @@ class AccidentalDrowning(CircumstanceTypeBase):
|
|
118 |
drowning_location: Literal['drinking trough', 'pool', 'storm pool', 'irrigation pool', 'natural pool', 'flood', 'other container', 'unknown']
|
119 |
|
120 |
class OtherNaturalCause(CircumstanceTypeBase):
|
121 |
-
type: Literal['other']
|
122 |
|
123 |
class UnknownNaturalCause(CircumstanceTypeBase):
|
124 |
-
type: Literal['unknown']
|
125 |
|
126 |
# Unknown cause
|
127 |
class UnknownCircumstance(CircumstanceTypeBase):
|
@@ -168,4 +168,17 @@ CircumstanceType = Union[
|
|
168 |
class Circumstances(BaseModel):
|
169 |
circumstance: str # e.g., "COLLISION"
|
170 |
circumstance_radio: str # e.g., "Yes"
|
171 |
-
circumstance_type: CircumstanceType = Field(..., discriminator='type')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
type: Literal['boat']
|
23 |
|
24 |
class OtherTransportCollision(CircumstanceTypeBase):
|
25 |
+
type: Literal['other transport collision']
|
26 |
|
27 |
class UnknownTransportCollision(CircumstanceTypeBase):
|
28 |
+
type: Literal['unknown transport collision']
|
29 |
|
30 |
# Destruction / Deliberately removed
|
31 |
class HuntingDestruction(CircumstanceTypeBase):
|
|
|
48 |
method: Literal['drowned/tangled', 'beached with capture indications', 'other', 'unknown']
|
49 |
|
50 |
class OtherDestruction(CircumstanceTypeBase):
|
51 |
+
type: Literal['other destruction']
|
52 |
|
53 |
class UnknownDestruction(CircumstanceTypeBase):
|
54 |
+
type: Literal['unknown destruction']
|
55 |
|
56 |
# Indirect destruction
|
57 |
class PylonElectricGridDestruction(CircumstanceTypeBase):
|
|
|
86 |
work_type: Literal['clearing/mowing/plowing', 'tree felling/pruning', 'other', 'unknown']
|
87 |
|
88 |
class OtherIndirectDestruction(CircumstanceTypeBase):
|
89 |
+
type: Literal['other indirect desctruction']
|
90 |
|
91 |
class UnknownIndirectDestruction(CircumstanceTypeBase):
|
92 |
+
type: Literal['unknown indirect desctruction']
|
93 |
|
94 |
# Natural cause
|
95 |
class Predation(CircumstanceTypeBase):
|
|
|
118 |
drowning_location: Literal['drinking trough', 'pool', 'storm pool', 'irrigation pool', 'natural pool', 'flood', 'other container', 'unknown']
|
119 |
|
120 |
class OtherNaturalCause(CircumstanceTypeBase):
|
121 |
+
type: Literal['other natural cause']
|
122 |
|
123 |
class UnknownNaturalCause(CircumstanceTypeBase):
|
124 |
+
type: Literal['unknown natural cause']
|
125 |
|
126 |
# Unknown cause
|
127 |
class UnknownCircumstance(CircumstanceTypeBase):
|
|
|
168 |
class Circumstances(BaseModel):
|
169 |
circumstance: str # e.g., "COLLISION"
|
170 |
circumstance_radio: str # e.g., "Yes"
|
171 |
+
circumstance_type: CircumstanceType = Field(..., discriminator='type')
|
172 |
+
|
173 |
+
|
174 |
+
# Example usage
|
175 |
+
# json_data = {
|
176 |
+
# "circumstance": "COLLISION",
|
177 |
+
# "circumstance_radio": "Yes",
|
178 |
+
# "circumstance_type": {
|
179 |
+
# "type": "Train",
|
180 |
+
# "infrastructure_number": "56"
|
181 |
+
# }
|
182 |
+
# }
|
183 |
+
# circumstance_instance = Circumstance(**json_data)
|
184 |
+
# circumstance_schema = Circumstance.schema_json(indent=2)
|
app/classes.py
CHANGED
@@ -8,7 +8,7 @@ from follow_up.class_follow_up import FollowUpEvents
|
|
8 |
from geolocalisation.class_geolocalisation import Geolocalisation
|
9 |
|
10 |
class Wounded(BaseModel):
|
11 |
-
circumstances:
|
12 |
behaviors: List[Behaviors]
|
13 |
physical_anomalies: List[PhysicalAnomaly]
|
14 |
follow_up_events: List[FollowUpEvents]
|
@@ -28,15 +28,3 @@ class Report(BaseModel):
|
|
28 |
wounded: Optional[Wounded] = None
|
29 |
dead_state: bool
|
30 |
dead: Optional[Dead] = None
|
31 |
-
|
32 |
-
# Example usage
|
33 |
-
# json_data = {
|
34 |
-
# "circumstance": "COLLISION",
|
35 |
-
# "circumstance_radio": "Yes",
|
36 |
-
# "circumstance_type": {
|
37 |
-
# "type": "Train",
|
38 |
-
# "infrastructure_number": "56"
|
39 |
-
# }
|
40 |
-
# }
|
41 |
-
# circumstance_instance = Circumstance(**json_data)
|
42 |
-
# circumstance_schema = Circumstance.schema_json(indent=2)
|
|
|
8 |
from geolocalisation.class_geolocalisation import Geolocalisation
|
9 |
|
10 |
class Wounded(BaseModel):
|
11 |
+
circumstances: Circumstances
|
12 |
behaviors: List[Behaviors]
|
13 |
physical_anomalies: List[PhysicalAnomaly]
|
14 |
follow_up_events: List[FollowUpEvents]
|
|
|
28 |
wounded: Optional[Wounded] = None
|
29 |
dead_state: bool
|
30 |
dead: Optional[Dead] = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/dead.py
CHANGED
@@ -1,12 +1,12 @@
|
|
1 |
import gradio as gr
|
2 |
from circumstances.circumstances import create_circumstances
|
3 |
from follow_up.followup_events import create_followup_dropdowns, create_followup_open
|
4 |
-
from
|
5 |
|
6 |
def show_section_dead(visible):
|
7 |
if visible==True:
|
8 |
-
add_data_to_individual("
|
9 |
-
add_data_to_individual("
|
10 |
|
11 |
with gr.Column(visible=visible, elem_id="dead") as section_dead:
|
12 |
gr.Markdown("# Dead Animal")
|
|
|
1 |
import gradio as gr
|
2 |
from circumstances.circumstances import create_circumstances
|
3 |
from follow_up.followup_events import create_followup_dropdowns, create_followup_open
|
4 |
+
from validation_submission.add_json import add_data_to_individual
|
5 |
|
6 |
def show_section_dead(visible):
|
7 |
if visible==True:
|
8 |
+
add_data_to_individual("dead_bool", "True")
|
9 |
+
add_data_to_individual("wounded_bool", "False")
|
10 |
|
11 |
with gr.Column(visible=visible, elem_id="dead") as section_dead:
|
12 |
gr.Markdown("# Dead Animal")
|
app/follow_up/followup_events.py
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
import gradio as gr
|
2 |
from utils.utils_config import get_custom_config_dropdowns
|
3 |
-
from
|
4 |
|
5 |
def create_followup_dropdowns(visible, elem_id):
|
6 |
followup_config = get_custom_config_dropdowns("config_followup.json")
|
|
|
1 |
import gradio as gr
|
2 |
from utils.utils_config import get_custom_config_dropdowns
|
3 |
+
from validation_submission.add_json import add_data_to_individual
|
4 |
|
5 |
def create_followup_dropdowns(visible, elem_id):
|
6 |
followup_config = get_custom_config_dropdowns("config_followup.json")
|
app/gallery.py
CHANGED
@@ -2,10 +2,13 @@ import gradio as gr
|
|
2 |
import pandas as pd
|
3 |
import numpy as np
|
4 |
from dotenv import load_dotenv
|
|
|
5 |
|
6 |
from utils.utils_config import load_config
|
7 |
-
from
|
8 |
-
import
|
|
|
|
|
9 |
|
10 |
load_dotenv()
|
11 |
PATH = os.getcwd() + "/"
|
@@ -87,6 +90,7 @@ def set_gallery_size(len_animals):
|
|
87 |
return num_cols, num_rows
|
88 |
|
89 |
def save_individual_to_gallery(gallery):
|
|
|
90 |
one_individual = get_json_one_individual()
|
91 |
fields = get_fields()
|
92 |
one_individual_matched = match_data_to_fields(fields, one_individual)
|
|
|
2 |
import pandas as pd
|
3 |
import numpy as np
|
4 |
from dotenv import load_dotenv
|
5 |
+
import os
|
6 |
|
7 |
from utils.utils_config import load_config
|
8 |
+
from validation_submission.get_json import get_json_one_individual
|
9 |
+
from validation_submission.submission import save_to_all_individuals
|
10 |
+
from validation_submission.validation import validate_individual
|
11 |
+
|
12 |
|
13 |
load_dotenv()
|
14 |
PATH = os.getcwd() + "/"
|
|
|
90 |
return num_cols, num_rows
|
91 |
|
92 |
def save_individual_to_gallery(gallery):
|
93 |
+
validate_individual()
|
94 |
one_individual = get_json_one_individual()
|
95 |
fields = get_fields()
|
96 |
one_individual_matched = match_data_to_fields(fields, one_individual)
|
app/geolocalisation/maps.py
CHANGED
@@ -1,9 +1,26 @@
|
|
1 |
from geopy.geocoders import Nominatim
|
2 |
import gradio as gr
|
3 |
-
from
|
4 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
def get_location(address):
|
6 |
-
|
7 |
# calling the Nominatim tool
|
8 |
loc = Nominatim(user_agent="GetLoc")
|
9 |
|
@@ -15,8 +32,8 @@ def get_location(address):
|
|
15 |
lon = getLoc.longitude
|
16 |
|
17 |
# Save values
|
18 |
-
|
19 |
-
|
20 |
|
21 |
#display location processing
|
22 |
value = "Latitude = " + str(lat) + "\n" + "Longitude = " + str(lon)
|
@@ -25,9 +42,9 @@ def get_location(address):
|
|
25 |
value=value)
|
26 |
return identified_location
|
27 |
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
|
|
1 |
from geopy.geocoders import Nominatim
|
2 |
import gradio as gr
|
3 |
+
from app.validation_submission.utils_json import add_data_to_individual
|
4 |
+
from geolocalisation.class_geolocalisation import Geolocalisation
|
5 |
+
|
6 |
+
|
7 |
+
def create_geolocalisation_object(lat, long, name):
|
8 |
+
try:
|
9 |
+
geolocalisation = Geolocalisation(
|
10 |
+
longitude={"type": "longitude", "value": long},
|
11 |
+
latitude={"type": "latitude", "value": lat},
|
12 |
+
name=name
|
13 |
+
)
|
14 |
+
except:
|
15 |
+
print("Pydantic Error for Geolocalisation")
|
16 |
+
return geolocalisation
|
17 |
+
|
18 |
+
def save_geolocalisation_to_json(geolocalisation):
|
19 |
+
geo_dict = geolocalisation.dict()
|
20 |
+
add_data_to_individual("geolocalisation", geo_dict)
|
21 |
+
|
22 |
def get_location(address):
|
23 |
+
try:
|
24 |
# calling the Nominatim tool
|
25 |
loc = Nominatim(user_agent="GetLoc")
|
26 |
|
|
|
32 |
lon = getLoc.longitude
|
33 |
|
34 |
# Save values
|
35 |
+
geolocalisation = create_geolocalisation_object(lat, lon, address)
|
36 |
+
save_geolocalisation_to_json(geolocalisation)
|
37 |
|
38 |
#display location processing
|
39 |
value = "Latitude = " + str(lat) + "\n" + "Longitude = " + str(lon)
|
|
|
42 |
value=value)
|
43 |
return identified_location
|
44 |
|
45 |
+
except:
|
46 |
+
error = "Please try another less precise location."
|
47 |
+
identified_location= gr.Textbox(visible=True, interactive=False,
|
48 |
+
label="Identified GPS Location",
|
49 |
+
value=error)
|
50 |
+
return identified_location
|
app/gradio_test/test_selectdata_event.py
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
|
3 |
+
with gr.Blocks() as demo:
|
4 |
+
table = gr.Dataframe([[1, 2, 3], [4, 5, 6]])
|
5 |
+
#gallery = gr.Gallery([("cat.jpg", "Cat"), ("dog.jpg", "Dog")])
|
6 |
+
textbox = gr.Textbox("Hello World!")
|
7 |
+
statement = gr.Textbox()
|
8 |
+
|
9 |
+
def on_select(evt: gr.SelectData):
|
10 |
+
return gr.Textbox(f"You selected {evt.value} at {evt.index} from {evt.target}")
|
11 |
+
|
12 |
+
table.select(on_select, inputs=[table], outputs=[statement])
|
13 |
+
#gallery.select(on_select, gallery, statement)
|
14 |
+
textbox.select(on_select, inputs=[textbox], outputs=[statement])
|
15 |
+
|
16 |
+
demo.launch(server_name="0.0.0.0", server_port=3131)
|
app/{tests.py → gradio_test/tests_delete_gallery.py}
RENAMED
File without changes
|
app/main_multianimal.py
CHANGED
@@ -1,7 +1,8 @@
|
|
1 |
import gradio as gr
|
2 |
from gradio_modal import Modal
|
3 |
|
4 |
-
from
|
|
|
5 |
from gallery import save_individual_to_gallery
|
6 |
from geolocalisation.maps import get_location
|
7 |
from functools import partial
|
@@ -15,9 +16,16 @@ from behavior.behavior_checkbox import show_behavior, on_select_behavior
|
|
15 |
from follow_up.followup_events import save_fe
|
16 |
from styling.style import *
|
17 |
from styling.theme import theme, css
|
|
|
18 |
|
19 |
with gr.Blocks(theme=theme, css=css) as demo:
|
20 |
create_json_all_individuals()
|
|
|
|
|
|
|
|
|
|
|
|
|
21 |
with gr.Row():
|
22 |
show_modal = gr.Button("Add an Animal", scale=3)
|
23 |
submit_button = gr.Button("Submit All Animals", scale=1)
|
@@ -33,8 +41,8 @@ with gr.Blocks(theme=theme, css=css) as demo:
|
|
33 |
# Intro Text
|
34 |
with gr.Row():
|
35 |
with gr.Column(scale=1):
|
36 |
-
title = gr.Markdown("#
|
37 |
-
description = gr.Markdown("Please record your
|
38 |
|
39 |
# ---------------------------------------------------------
|
40 |
# Camera
|
@@ -256,6 +264,7 @@ with gr.Blocks(theme=theme, css=css) as demo:
|
|
256 |
# Event Functions of the landing page buttons
|
257 |
show_modal.click(lambda: Modal(visible=True), None, modal)
|
258 |
show_modal.click(create_json_one_individual)
|
|
|
259 |
#submit_button.click(save_and_rest_df, inputs=[df], outputs=[df])
|
260 |
submit_button.click(save_individual_to_gallery)
|
261 |
|
|
|
1 |
import gradio as gr
|
2 |
from gradio_modal import Modal
|
3 |
|
4 |
+
from validation_submission.create_json import create_json_all_individuals, create_json_one_individual, create_tmp
|
5 |
+
from validation_submission.add_json import add_data_to_individual
|
6 |
from gallery import save_individual_to_gallery
|
7 |
from geolocalisation.maps import get_location
|
8 |
from functools import partial
|
|
|
16 |
from follow_up.followup_events import save_fe
|
17 |
from styling.style import *
|
18 |
from styling.theme import theme, css
|
19 |
+
from classes import Report
|
20 |
|
21 |
with gr.Blocks(theme=theme, css=css) as demo:
|
22 |
create_json_all_individuals()
|
23 |
+
# ---------------------------------------------------------
|
24 |
+
# Intro Text
|
25 |
+
with gr.Row():
|
26 |
+
with gr.Column(scale=1):
|
27 |
+
title = gr.Markdown("# Welcome to Digiwild", label="Title")
|
28 |
+
description = gr.Markdown("Please record your wildlife observations here !", label="description")
|
29 |
with gr.Row():
|
30 |
show_modal = gr.Button("Add an Animal", scale=3)
|
31 |
submit_button = gr.Button("Submit All Animals", scale=1)
|
|
|
41 |
# Intro Text
|
42 |
with gr.Row():
|
43 |
with gr.Column(scale=1):
|
44 |
+
title = gr.Markdown("# Animal Report", label="Title")
|
45 |
+
description = gr.Markdown("Please record your observation here.", label="description")
|
46 |
|
47 |
# ---------------------------------------------------------
|
48 |
# Camera
|
|
|
264 |
# Event Functions of the landing page buttons
|
265 |
show_modal.click(lambda: Modal(visible=True), None, modal)
|
266 |
show_modal.click(create_json_one_individual)
|
267 |
+
show_modal.click(create_tmp)
|
268 |
#submit_button.click(save_and_rest_df, inputs=[df], outputs=[df])
|
269 |
submit_button.click(save_individual_to_gallery)
|
270 |
|
app/physical/class_physical.py
CHANGED
@@ -75,4 +75,4 @@ AnomalyType = Union[
|
|
75 |
|
76 |
# Main PhysicalAnomaly class that logs anomalies across different body parts
|
77 |
class PhysicalAnomaly(BaseModel):
|
78 |
-
body_part_anomalies: List[AnomalyType]
|
|
|
75 |
|
76 |
# Main PhysicalAnomaly class that logs anomalies across different body parts
|
77 |
class PhysicalAnomaly(BaseModel):
|
78 |
+
body_part_anomalies: List[AnomalyType] = Field(..., discriminator='type')
|
app/physical/physical_checkbox.py
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
import gradio as gr
|
2 |
from utils.utils_config import get_custom_config_dropdowns
|
3 |
from utils.utils_checkbox import create_checkbox
|
4 |
-
from
|
5 |
#---------------------------------------------------------
|
6 |
def get_body_parts():
|
7 |
dropdown_config = get_custom_config_dropdowns("config_checkbox_physical.json")
|
|
|
1 |
import gradio as gr
|
2 |
from utils.utils_config import get_custom_config_dropdowns
|
3 |
from utils.utils_checkbox import create_checkbox
|
4 |
+
from validation_submission.add_json import add_data_to_individual
|
5 |
#---------------------------------------------------------
|
6 |
def get_body_parts():
|
7 |
dropdown_config = get_custom_config_dropdowns("config_checkbox_physical.json")
|
app/utils/utils_json.py
DELETED
@@ -1,42 +0,0 @@
|
|
1 |
-
import json
|
2 |
-
import gradio as gr
|
3 |
-
|
4 |
-
def create_json_one_individual(one_individual={}):
|
5 |
-
# Serializing json
|
6 |
-
one_individual = json.dumps(one_individual)
|
7 |
-
with open("data/one_individual.json", "w") as outfile:
|
8 |
-
outfile.write(one_individual)
|
9 |
-
def create_json_all_individuals(all_individuals={}):
|
10 |
-
all_individuals = json.dumps(all_individuals)
|
11 |
-
with open("data/all_individuals.json", "w") as outfile:
|
12 |
-
outfile.write(all_individuals)
|
13 |
-
|
14 |
-
def add_data_to_individual(key, value):
|
15 |
-
with open("data/one_individual.json", 'r') as openfile:
|
16 |
-
one_individual = json.load(openfile)
|
17 |
-
one_individual[key] = value
|
18 |
-
create_json_one_individual(one_individual)
|
19 |
-
|
20 |
-
def get_json_one_individual():
|
21 |
-
with open("data/one_individual.json", 'r') as openfile:
|
22 |
-
one_individual = json.load(openfile)
|
23 |
-
return one_individual
|
24 |
-
|
25 |
-
def get_json_all_individuals():
|
26 |
-
with open("data/all_individuals.json", "r") as openfile:
|
27 |
-
all_individuals = json.load(openfile)
|
28 |
-
return all_individuals
|
29 |
-
|
30 |
-
def save_to_all_individuals(one_individual):
|
31 |
-
all_individuals = get_json_all_individuals()
|
32 |
-
all_individuals[str(len(all_individuals))] = one_individual
|
33 |
-
all_individuals_for_json = json.dumps(all_individuals)
|
34 |
-
with open("data/all_individuals.json", "w") as outfile:
|
35 |
-
outfile.write(all_individuals_for_json)
|
36 |
-
return all_individuals
|
37 |
-
|
38 |
-
# def save_all_individuals(df):
|
39 |
-
# all_individuals = df.to_json(orient="records")
|
40 |
-
# with open("data/all_individuals.json", "w") as outfile:
|
41 |
-
# outfile.write(all_individuals)
|
42 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/validation_submission/__init__.py
ADDED
File without changes
|
app/validation_submission/add_json.py
ADDED
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from validation_submission.create_json import create_json_one_individual, create_tmp
|
2 |
+
import json
|
3 |
+
|
4 |
+
def add_data_to_individual(key, value):
|
5 |
+
with open("data/one_individual.json", 'r') as openfile:
|
6 |
+
one_individual = json.load(openfile)
|
7 |
+
one_individual[key] = value
|
8 |
+
create_json_one_individual(one_individual)
|
9 |
+
|
10 |
+
def add_data_tmp(tmp_name, key, value):
|
11 |
+
with open(f"app/assets/json_tmp/tmp_{tmp_name}.json", 'r') as openfile:
|
12 |
+
tmp = json.load(openfile)
|
13 |
+
tmp[key] = value
|
14 |
+
create_tmp(tmp_name, tmp)
|
15 |
+
|
app/validation_submission/create_json.py
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import json
|
2 |
+
|
3 |
+
def create_json_one_individual(one_individual={}):
|
4 |
+
one_individual = json.dumps(one_individual)
|
5 |
+
with open("data/one_individual.json", "w") as outfile:
|
6 |
+
outfile.write(one_individual)
|
7 |
+
|
8 |
+
def create_json_all_individuals(all_individuals={}):
|
9 |
+
all_individuals = json.dumps(all_individuals)
|
10 |
+
with open("data/all_individuals.json", "w") as outfile:
|
11 |
+
outfile.write(all_individuals)
|
12 |
+
|
13 |
+
def create_tmp(tmp_name, tmp={}):
|
14 |
+
tmp = json.dumps(tmp)
|
15 |
+
with open(f"app/assets/json_tmp/tmp_{tmp_name}.json", "w") as outfile:
|
16 |
+
outfile.write(tmp)
|
app/validation_submission/get_json.py
ADDED
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import json
|
2 |
+
|
3 |
+
def get_json_one_individual():
|
4 |
+
with open("data/one_individual.json", 'r') as openfile:
|
5 |
+
one_individual = json.load(openfile)
|
6 |
+
return one_individual
|
7 |
+
|
8 |
+
def get_json_all_individuals():
|
9 |
+
with open("data/all_individuals.json", "r") as openfile:
|
10 |
+
all_individuals = json.load(openfile)
|
11 |
+
return all_individuals
|
12 |
+
|
13 |
+
def get_json_tmp(tmp_name):
|
14 |
+
with open(f"app/assets/json_tmp/tmp_{tmp_name}.json", "r") as openfile:
|
15 |
+
tmp_json = json.load(openfile)
|
16 |
+
return tmp_json
|
app/validation_submission/submission.py
ADDED
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import json
|
2 |
+
from validation_submission.get_json import get_json_all_individuals
|
3 |
+
|
4 |
+
def save_to_all_individuals(one_individual):
|
5 |
+
all_individuals = get_json_all_individuals()
|
6 |
+
all_individuals[str(len(all_individuals))] = one_individual
|
7 |
+
all_individuals_for_json = json.dumps(all_individuals)
|
8 |
+
with open("data/all_individuals.json", "w") as outfile:
|
9 |
+
outfile.write(all_individuals_for_json)
|
10 |
+
return all_individuals
|
app/validation_submission/validation.py
ADDED
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from validation_submission.get_json import get_json_tmp, get_json_one_individual
|
2 |
+
from classes import Report
|
3 |
+
from circumstances.class_circumstance import Circumstance
|
4 |
+
|
5 |
+
def get_fields(data_dict, keyword):
|
6 |
+
extract = {}
|
7 |
+
for key, val in data_dict.items():
|
8 |
+
if keyword in key:
|
9 |
+
extract[key] = val
|
10 |
+
return extract
|
11 |
+
|
12 |
+
def validate_individual():
|
13 |
+
data = get_json_tmp("wounded_dead")
|
14 |
+
validate_circumstance(data)
|
15 |
+
validate_behavior(data)
|
16 |
+
validate_physical(data)
|
17 |
+
validate_follow_up(data)
|
18 |
+
validate_individual()
|
19 |
+
pass
|
20 |
+
|
21 |
+
|
22 |
+
def validate_circumstance(data):
|
23 |
+
circumstance_raw = get_fields(data, "circumstance")
|
24 |
+
circumstance_formatted = process_circumstance(circumstance_raw)
|
25 |
+
if not Circumstance(circumstance_formatted).validate():
|
26 |
+
print("Validation failed for the circumstance.")
|
27 |
+
pass
|
28 |
+
def process_circumstance(data):
|
29 |
+
pass
|
30 |
+
|
31 |
+
def validate_behavior(data):
|
32 |
+
pass
|
33 |
+
|
34 |
+
def validate_physical(data):
|
35 |
+
pass
|
36 |
+
|
37 |
+
def validate_follow_up(data):
|
38 |
+
pass
|
39 |
+
|
40 |
+
def validate_individual():
|
41 |
+
individual = get_json_one_individual()
|
42 |
+
if not Report(individual).validate():
|
43 |
+
print("Validation failed for creating the individual report.")
|
44 |
+
pass
|
app/wounded.py
CHANGED
@@ -4,12 +4,12 @@ from physical.physical_select_animal import create_bird_anatomy
|
|
4 |
from physical.physical_checkbox import process_body_parts
|
5 |
from behavior.behavior_checkbox import create_behavior_checkbox
|
6 |
from follow_up.followup_events import create_followup_dropdowns, create_followup_open
|
7 |
-
from
|
8 |
|
9 |
def show_section_wounded(visible):
|
10 |
if visible==True:
|
11 |
-
add_data_to_individual("
|
12 |
-
add_data_to_individual("
|
13 |
|
14 |
with gr.Column(visible=visible, elem_id="wounded") as wounded_section:
|
15 |
gr.Markdown("# Wounded Animal")
|
|
|
4 |
from physical.physical_checkbox import process_body_parts
|
5 |
from behavior.behavior_checkbox import create_behavior_checkbox
|
6 |
from follow_up.followup_events import create_followup_dropdowns, create_followup_open
|
7 |
+
from validation_submission.add_json import add_data_to_individual
|
8 |
|
9 |
def show_section_wounded(visible):
|
10 |
if visible==True:
|
11 |
+
add_data_to_individual("wounded_bool", "True")
|
12 |
+
add_data_to_individual("dead_bool", "False")
|
13 |
|
14 |
with gr.Column(visible=visible, elem_id="wounded") as wounded_section:
|
15 |
gr.Markdown("# Wounded Animal")
|