rmm commited on
Commit
fc21199
·
1 Parent(s): 2e11215

fix: implemented state for persistent date/time data entry

Browse files
Files changed (1) hide show
  1. 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 image metadata
277
- if image_datetime_raw is not None:
278
- # if we have a timezone let's use it (but only if we also have datetime)
279
- time_fmt = '%Y:%m:%d %H:%M:%S'
280
- if image_timezone_raw is not None:
281
- image_datetime_raw += f" {image_timezone_raw}"
282
- time_fmt += ' %z'
283
- #
284
- dt = datetime.datetime.strptime(image_datetime_raw, time_fmt)
 
 
 
 
 
 
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
- # get current time, with user timezone (or is it server timezone?! TODO: test with different zones)
292
- dt = datetime.datetime.now().astimezone().replace(microsecond=0)
293
- time_value = dt.time()
294
- date_value = dt.date()
295
-
296
- #time_value = datetime.datetime.now().time() # Default to current time
297
- #date_value = datetime.datetime.now().date()
 
 
 
 
 
 
 
 
 
 
 
 
 
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("Date for "+filename, value=date_value, key=f"input_date_{image_hash}",
 
 
302
  disabled=st.session_state.get("input_disabled", False), )
303
- time = viewcontainer.time_input("Time for "+filename, time_value, key=f"input_time_{image_hash}",
 
 
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