Spaces:
Running
Running
rmm
commited on
Commit
·
fc21199
1
Parent(s):
2e11215
fix: implemented state for persistent date/time data entry
Browse files- src/input/input_handling.py +58 -21
src/input/input_handling.py
CHANGED
@@ -17,6 +17,13 @@ from input.input_validator import get_image_datetime, is_valid_email, is_valid_n
|
|
17 |
m_logger = logging.getLogger(__name__)
|
18 |
m_logger.setLevel(logging.INFO)
|
19 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
20 |
'''
|
21 |
A module to setup the input handling for the whale observation guidance tool
|
22 |
|
@@ -207,6 +214,7 @@ def metadata_inputs_one_file(file:UploadedFile, image_hash:str, dbg_ix:int=0) ->
|
|
207 |
# 2) if file metadata, take that value
|
208 |
# 3) if spoof metadata flag is up, take that value
|
209 |
# 4) else, empty (None)
|
|
|
210 |
|
211 |
author_email = st.session_state["input_author_email"]
|
212 |
filename = file.name
|
@@ -273,35 +281,64 @@ def metadata_inputs_one_file(file:UploadedFile, image_hash:str, dbg_ix:int=0) ->
|
|
273 |
|
274 |
|
275 |
# 5. Date/time
|
276 |
-
## first from
|
277 |
-
|
278 |
-
|
279 |
-
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
|
284 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
285 |
date_value = dt.date()
|
286 |
time_value = dt.time()
|
287 |
-
|
288 |
-
#time_value = datetime.datetime.strptime(image_datetime_raw, '%Y:%m:%d %H:%M:%S').time()
|
289 |
-
#date_value = datetime.datetime.strptime(image_datetime_raw, '%Y:%m:%d %H:%M:%S').date()
|
290 |
else:
|
291 |
-
|
292 |
-
|
293 |
-
|
294 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
298 |
|
299 |
|
300 |
## either way, give user the option to enter manually (or correct, e.g. if camera has no rtc clock)
|
301 |
-
date = viewcontainer.date_input(
|
|
|
|
|
302 |
disabled=st.session_state.get("input_disabled", False), )
|
303 |
-
time = viewcontainer.time_input(
|
|
|
|
|
304 |
disabled=st.session_state.get("input_disabled", False),)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
305 |
|
306 |
tz_str = dt.strftime('%z') # this is numeric, otherwise the info isn't consistent.
|
307 |
|
|
|
17 |
m_logger = logging.getLogger(__name__)
|
18 |
m_logger.setLevel(logging.INFO)
|
19 |
|
20 |
+
OKGREEN = '\033[92m'
|
21 |
+
ENDC = '\033[0m'
|
22 |
+
def _cprint(msg:str, color:str=OKGREEN):
|
23 |
+
"""Print colored message"""
|
24 |
+
print(f"{color}{msg}{ENDC}")
|
25 |
+
|
26 |
+
|
27 |
'''
|
28 |
A module to setup the input handling for the whale observation guidance tool
|
29 |
|
|
|
214 |
# 2) if file metadata, take that value
|
215 |
# 3) if spoof metadata flag is up, take that value
|
216 |
# 4) else, empty (None)
|
217 |
+
# - and similarly for date/time
|
218 |
|
219 |
author_email = st.session_state["input_author_email"]
|
220 |
filename = file.name
|
|
|
281 |
|
282 |
|
283 |
# 5. Date/time
|
284 |
+
## first from state, if previously set/modified
|
285 |
+
key_date = f"input_date_{image_hash}"
|
286 |
+
key_time = f"input_time_{image_hash}"
|
287 |
+
present_date = key_date in st.session_state
|
288 |
+
present_time = key_time in st.session_state
|
289 |
+
date_prior:datetime.date = st.session_state.get(key_date, None)
|
290 |
+
time_prior:datetime.time = st.session_state.get(key_time, None)
|
291 |
+
|
292 |
+
m_logger.debug(f"[D] {key_date}: key present? {int(present_date)} | prior value: {date_prior} | metadata value: {image_datetime_raw}")
|
293 |
+
m_logger.debug(f"[D] {key_time}: key present? {int(present_time)} | prior value: {time_prior} | metadata value: {image_datetime_raw}")
|
294 |
+
|
295 |
+
|
296 |
+
if date_prior is not None and time_prior is not None:
|
297 |
+
# we should use these values
|
298 |
+
dt = datetime.datetime.combine(date_prior, time_prior)
|
299 |
date_value = dt.date()
|
300 |
time_value = dt.time()
|
|
|
|
|
|
|
301 |
else:
|
302 |
+
## second from image metadata
|
303 |
+
if image_datetime_raw is not None:
|
304 |
+
# if we have a timezone let's use it (but only if we also have datetime)
|
305 |
+
time_fmt = '%Y:%m:%d %H:%M:%S'
|
306 |
+
if image_timezone_raw is not None:
|
307 |
+
image_datetime_raw += f" {image_timezone_raw}"
|
308 |
+
time_fmt += ' %z'
|
309 |
+
#
|
310 |
+
dt = datetime.datetime.strptime(image_datetime_raw, time_fmt)
|
311 |
+
date_value = dt.date()
|
312 |
+
time_value = dt.time()
|
313 |
+
|
314 |
+
#time_value = datetime.datetime.strptime(image_datetime_raw, '%Y:%m:%d %H:%M:%S').time()
|
315 |
+
#date_value = datetime.datetime.strptime(image_datetime_raw, '%Y:%m:%d %H:%M:%S').date()
|
316 |
+
else:
|
317 |
+
# get current time, with user timezone (or is it server timezone?! TODO: test with different zones)
|
318 |
+
dt = datetime.datetime.now().astimezone().replace(microsecond=0)
|
319 |
+
time_value = dt.time()
|
320 |
+
date_value = dt.date()
|
321 |
+
|
322 |
|
323 |
|
324 |
## either way, give user the option to enter manually (or correct, e.g. if camera has no rtc clock)
|
325 |
+
date = viewcontainer.date_input(
|
326 |
+
"Date for "+filename, value=date_value,
|
327 |
+
key=f"input_date_anchor_{image_hash}",
|
328 |
disabled=st.session_state.get("input_disabled", False), )
|
329 |
+
time = viewcontainer.time_input(
|
330 |
+
"Time for "+filename, time_value,
|
331 |
+
key=f"input_time_anchor_{image_hash}",
|
332 |
disabled=st.session_state.get("input_disabled", False),)
|
333 |
+
|
334 |
+
#v1 = st.session_state.get(key_date, None)
|
335 |
+
#v2 = st.session_state.get(key_time, None)
|
336 |
+
#_cprint(f"[DD] date, time: {type(date)}, {type(time)}. {type(v1)}, {type(v2)}. {v1}, {v2}")
|
337 |
+
|
338 |
+
# now store the date and time into the session state (persists across page switches)
|
339 |
+
st.session_state[key_date] = date
|
340 |
+
st.session_state[key_time] = time
|
341 |
+
|
342 |
|
343 |
tz_str = dt.strftime('%z') # this is numeric, otherwise the info isn't consistent.
|
344 |
|