Spaces:
Sleeping
Sleeping
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 |
|