
    $ie                    b   d Z ddlZddlZddlZddlmZ ddlmZ ddlZddl	Z	ddl
Z
ddlZ	 ddlmZ  ed          Zn# e$ r ddlZ ej        d          ZY nw xY wd Zej                            d e ee          j        dz  d	z  d
z                       dZdad Zdad Zd Zda ee          j        dz  dz  dz  Zd Z d Z!da"d Z# G d dej$        j%                  Z&e'dk    r e	j(         ee          j                    e)d            e             dej*        _+         ej*        defe&          5 Z, e)de             e)de d            e)d           	 e,-                                 n# e.$ r  e)d           Y nw xY wddd           dS # 1 swxY w Y   dS dS )a  
Dashboard Server - Serves dashboard.html and handles various APIs.

Now uses Supabase for data storage instead of JSON files.

APIs:
- GET /api/captures - Active captures
- GET /api/captures/archived - Archived captures
- POST /api/capture - Create capture
- POST /api/capture/{id}/archive - Archive capture
- POST /api/capture/{id}/unarchive - Unarchive capture
- DELETE /api/capture/{id} - Delete capture
- GET /api/research/latest - Latest research digest
- GET /api/research/history - Research history
- GET /api/research/{id} - Specific research digest
- PATCH /api/research/{id} - Update research topic
- DELETE /api/research/{id} - Delete research
- GET /api/bioage/latest - Latest bioage entry
- GET /api/bioage/trend - Bioage trend data (12 months)
- POST /api/bioage - Save bioage entry
- GET /api/longevity/dashboard - Full longevity dashboard (domains, scores, WHOOP avgs)
- GET /api/activities/config - Activity tracking configuration
- GET /api/activities/logs - Activity logs (last 90 days)
- GET /api/activities/stats - Activity streaks and weekly summary
- POST /api/activity - Log an activity (from Tasker or manual)
- GET /api/diet - All active diet items
- POST /api/diet - Create diet item
- PATCH /api/diet/{id} - Update diet item
- DELETE /api/diet/{id} - Delete diet item
- GET /api/supplements - All supplements
- POST /api/supplements - Create supplement
- PATCH /api/supplements/{id} - Update supplement
- DELETE /api/supplements/{id} - Delete supplement
- GET /api/body-focus - All active/monitoring body focus areas
- GET /api/body-focus/resolved - Resolved body focus areas
- POST /api/body-focus - Create body focus area
- PATCH /api/body-focus/{id} - Update body focus area
- DELETE /api/body-focus/{id} - Delete body focus area
- GET /api/body-checkins?focus_id=X - Check-ins for a focus area
- GET /api/body-checkins/latest - Latest check-in date + all ratings
- POST /api/body-checkins - Save weekly check-in (batch)
- GET /api/budget - All active budget items
- POST /api/budget - Create budget item
- PATCH /api/budget/{id} - Update budget item
- DELETE /api/budget/{id} - Delete budget item
- GET /api/transactions - Transactions with filters (start_date, end_date, category, limit)
- POST /api/transactions/upload - Upload and parse CommBank CSV
- POST /api/transactions/confirm - Confirm and save parsed transactions
- GET /api/spending-summary - Spending summary with pro-rated budget (period: week/month/quarter)
- GET /api/investments - All active investment assets with latest values
- POST /api/investments - Create investment asset
- PATCH /api/investments/{id} - Update investment asset
- DELETE /api/investments/{id} - Delete investment asset
- GET /api/investment-values?asset_id=X - Value history for an asset
- POST /api/investment-values - Log an investment value
- GET /api/community/overview - All communities with member counts, health, next event
- GET /api/community/here-summary - Here project summary from JSON files
- GET /api/community-members?community_id=X - Members for a community
- GET /api/community-interactions?community_id=X&limit=N - Interaction timeline
- GET /api/community-interactions/stale?community_id=X&days=N - Nudge list
- GET /api/community-events?community_id=X - Events by community
- POST /api/community-members - Create member
- POST /api/community-interactions - Log interaction + update last_interaction_date
- POST /api/community-events - Create event
- PATCH /api/community-members/{id} - Edit member
- PATCH /api/community-events/{id} - Edit event
- DELETE /api/community-members/{id} - Delete member
- DELETE /api/community-interactions/{id} - Delete interaction
- DELETE /api/community-events/{id} - Delete event
- GET /api/community-contacts?community_id=X - Shared contacts for a community
- POST /api/community-contacts - Create shared contact
- PATCH /api/community-contacts/{id} - Update shared contact
- DELETE /api/community-contacts/{id} - Delete shared contact
- GET /api/enrichment/{activity_log_id} - Get enrichment for an activity log
- POST /api/enrichment - Create enrichment for an activity log
- PATCH /api/enrichment/{id} - Update enrichment
- DELETE /api/enrichment/{id} - Delete enrichment
- GET /api/play/spots?sport=X - Active spots
- GET /api/play/goals?activity=X - Goals/focus areas
- POST /api/play/spots - Add a spot
- POST /api/play/goals - Add a goal
- PATCH /api/play/goals/{id} - Update goal
- DELETE /api/play/spots/{id} - Delete spot
- DELETE /api/play/goals/{id} - Delete goal
- GET /api/recovery/protocols - Recovery protocols
- POST /api/recovery/protocols - Upsert recovery protocol
- GET /api/training/programs - Training programs
- POST /api/training/programs - Upsert training program

Usage:
    python dashboard-server.py

Then open: http://localhost:8765/dashboard.html
    Ndatetime)Path)ZoneInfozAustralia/Brisbanec                  4    t          j        t                    S )z)Get current datetime in Brisbane timezone)r   nowBRISBANE_TZ     dashboard-server.pyget_brisbane_nowr   u   s    <$$$r   .claudeskillszsupabase-connectori="  c                      t           Z	 ddlm}   |             a t          d           n9# t          $ r,}t          d| d           t          d           Y d}~nd}~ww xY wt           S )z)Get Supabase client (lazy initialization)Nr   )get_supabase_clientz  Connected to Supabasez!  Warning: Supabase unavailable ()z  Captures will not be saved!)	_supabaseclientr   print	Exception)r   es     r   get_supabaser      s     	3222222++--I+,,,, 	3 	3 	3:a:::;;;122222222	3 s   ) 
A"AAc                  <   t           t          t                    j        dz  dz  dz  } 	 t	          |           5 }t          j        |          a ddd           n# 1 swxY w Y   n0# t          $ r#}t          d| d           i i i da Y d}~nd}~ww xY wt           S )z#Load activity config from JSON fileNr   contextactivity-config.jsonz+  Warning: Could not load activity config (r   )
activitiestasker_mappingsapi_sources)	_activity_configr   __file__parentopenjsonloadr   r   config_pathfr   s      r   get_activity_configr(      s    8nn+i7)CF\\	\k"" 0a#'9Q<< 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 	\ 	\ 	\DDDDEEE.0RXZ[[	\ :   A' AA' AA' "A#A' '
B1BBc                  "    da t                      S )zForce reload of activity configN)r   r(   r
   r   r   reload_activity_configr+      s        r   r   zhouse-admin.jsonc                      t           p	 t          t                    5 } t          j        |           a ddd           n# 1 swxY w Y   n.# t
          $ r!}t          d| d           dg ia Y d}~nd}~ww xY wt           S )z$Load house admin data from JSON fileNz'  Warning: Could not load house admin (r   contacts)_house_adminr"   HOUSE_ADMIN_PATHr#   r$   r   r   )r'   r   s     r   get_house_adminr0      s     	,&'' ,1#y||, , , , , , , , , , , , , , , 	, 	, 	,@A@@@AAA&+LLLLLL	, s7   A
 >A
 AA
 AA
 

A5A00A5c                     t          t          d          5 }t          j        | |d           ddd           n# 1 swxY w Y   | a| S )z"Save house admin data to JSON filew   indentN)r"   r/   r#   dumpr.   )datar'   s     r   save_house_adminr8      s     
	$	$ %	$!$$$$% % % % % % % % % % % % % % %LKs   :>>c                  <   t           t          t                    j        dz  dz  dz  } 	 t	          |           5 }t          j        |          a ddd           n# 1 swxY w Y   n0# t          $ r#}t          d| d           i g dda Y d}~nd}~ww xY wt           S )	z'Load merchant categories from JSON fileNr   r   zmerchant-categories.jsonz/  Warning: Could not load merchant categories (r   other)
categoriesmappingsunknown_default)	_merchant_categoriesr   r    r!   r"   r#   r$   r   r   r%   s      r   get_merchant_categoriesr?      s    #8nn+i7)CF``	bk"" 4a'+y||$4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 	b 	b 	bHAHHHIII24"Y`#a#a      	b  r)   c                   <    e Zd Z fdZd3dZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zd Zd Zd4dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd  Z d! Z!d" Z"d# Z#d$ Z$d% Z%d& Z&d' Z'd( Z(d) Z)d* Z*d+ Z+d, Z,d- Z-d. Z.d/ Z/d0 Z0d1 Z1d2 Z2 xZ3S )5DashboardHandlerc                    | j         dk    r|                                  d3S | j         dk    r|                     d           d3S | j         dk    r|                                  d3S | j         dk    r|                                  d3S | j                             d          rbt          | j                             d                    d	k    r7| j                             d          d
         }|                     |           d3S | j         dk    r|                                  d3S | j         dk    r| 	                                 d3S | j         dk    r| 
                                 d3S | j         dk    r|                                  d3S | j         dk    s| j                             d          r|                                  d3S | j         dk    r|                                  d3S | j         dk    r|                                  d3S | j         dk    r|                                  d3S | j         dk    r|                                  d3S | j         dk    r|                                  d3S | j         dk    r|                                  d3S | j         dk    r|                     d           d3S | j                             d          r|                                  d3S | j                             d          r|                                  d3S | j         dk    r|                                  d3S | j                             d          r|                                  d3S | j                             d          r|                                  d3S | j         dk    r|                                  d3S | j                             d           r|                                  d3S | j         d!k    r|                                  d3S | j         d"k    r|                                  d3S | j         d#k    r|                                  d3S | j         d$k    r|                                  d3S | j         d%k    r|                                  d3S | j                             d&          rbt          | j                             d                    d	k    r7| j                             d          d
         }|                     |           d3S | j         d'k    r|                                   d3S | j         d(k    r| !                                 d3S | j                             d)          r| "                                 d3S | j                             d*          r| #                                 d3S | j                             d+          r| $                                 d3S | j                             d,          r| %                                 d3S | j                             d-          r| &                                 d3S | j                             d.          r7| j                             d          d
         }| '                    |           d3S | j                             d/          r| (                                 d3S | j                             d0          r| )                                 d3S | j         d1k    r| *                                 d3S | j         d2k    r| +                                 d3S tY                      -                                 d3S )4z3Handle GET requests - serve files and API endpointsz/api/capturesz/api/captures/archivedarchived)statusz/api/research/latestz/api/research/history/api/research//      z/api/longevity/dashboardz/api/bioage/latestz/api/bioage/trendz/api/activities/configz/api/activities/logsz/api/activities/logs?z/api/activities/stats
/api/adminz/api/sync-status	/api/diet/api/supplements/api/body-focusz/api/body-focus/resolvedT)resolvedz/api/body-checkins/latest/api/body-checkins/api/budgetz/api/transactionsz/api/spending-summary/api/investments/api/investment-values/api/bloodtestsz/api/bloodtests/latestz/api/bloodtests/trendsz/api/bloodtests/actionsz/api/bloodtests/health-context/api/bloodtests/z/api/community/overviewz/api/community/here-summary/api/community-membersz!/api/community-interactions/stale/api/community-interactions/api/community-events/api/community-contacts/api/enrichment//api/play/spots/api/play/goals/api/recovery/protocols/api/training/programsN).path_get_captures_get_latest_research_get_research_history
startswithlensplit_get_research_by_id_get_longevity_dashboard_get_latest_bioage_get_bioage_trend_get_activities_config_get_activities_logs_get_activities_stats_get_admin_contacts_get_sync_status_get_diet_items_get_supplements_get_body_focus_get_body_checkins_latest_get_body_checkins_get_budget_get_transactions_get_spending_summary_get_investments_get_investment_values_get_bloodtests_get_bloodtest_latest_get_bloodtest_trends_get_bloodtest_actions_all_get_bloodtest_health_context_get_bloodtest_by_id_get_community_overview_get_here_summary_get_community_members!_get_community_interactions_stale_get_community_interactions_get_community_events_get_community_contacts_get_enrichment_get_play_spots_get_play_goals_get_recovery_protocols_get_training_programssuperdo_GET)selfresearch_idpanel_idactivity_log_id	__class__s       r   r   zDashboardHandler.do_GET   s   9''     Y222j11111Y000%%'''''Y111&&(((((Y!!"233 c	DIOOC<P<P8Q8QUV8V8V)//#..q1K$$[11111Y444))+++++Y...##%%%%%Y---""$$$$$Y222'')))))Y000DI4H4HI`4a4a0%%'''''Y111&&(((((Y,&&$$&&&&&Y,,,!!#####Y+%%  """""Y,,,!!#####Y+++  """""Y444  $ /////Y!!"=>> ;	**,,,,,Y!!"677 8	##%%%%%Y-''Y!!"566 3	""$$$$$Y!!"9:: 1	&&(((((Y,,,!!#####Y!!":;; -	'')))))Y+++  """""Y222&&(((((Y222&&(((((Y333++-----Y:::..00000Y!!"455  	#diooc>R>R:S:SWX:X:Xys++A.H%%h/////Y333((*****Y777""$$$$$Y!!":;; 	'')))))Y!!"EFF 	2244444Y!!"?@@ 	,,.....Y!!"9:: 	&&(((((Y!!";<< 	((*****Y!!"455 	"iooc2215O  11111Y!!"344 
	  """""Y!!"344 	  """""Y333((*****Y222''))))) GGNNr   activec           	         	 t                      }|r|                    d                              d                              d|                              dd                              dd                              d                                          }|j        pg }ng }|                     d	           | 	                    d
d           | 	                    dd           | 
                                 | j                            t          j        d|i                                                     dS # t           $ r}|                     d           | 	                    d
d           | 
                                 | j                            t          j        dt#          |          i                                                     Y d}~dS d}~ww xY w)zGet captures from Supabasechl_captures*rD   dateTdesctimed      Content-Typeapplication/jsonAccess-Control-Allow-Originlogs  errorN)r   tableselecteqorderlimitexecuter7   send_responsesend_headerend_headerswfilewriter#   dumpsencoder   str)r   rD   supabaseresultcapturesr   s         r   r^   zDashboardHandler._get_capturesK  s   	E#~~H 
!77VC[[R&))U6U--U6U--U3ZZWYY  ";,"s###^-?@@@:C@@@JTZ(:;;BBDDEEEEE 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   D<E   
G!
BGG!c           	         	 t                      }|ry|                    d                              d                              dd                              d                                          }|j        r|j        d         ni }ni }|                     d           |                     d	d
           |                     dd           | 	                                 | j
                            t          j        |                                                     dS # t          $ r}|                     d           |                     d	d
           | 	                                 | j
                            t          j        dt!          |          i                                                     Y d}~dS d}~ww xY w)z4Get most recent health research digest from Supabasechl_health_researchr   r   Tr      r   r   r   r   r   r   r   Nr   r   r   r   r   r   r7   r   r   r   r   r   r#   r   r   r   r   )r   r   r   researchr   s        r   r_   z%DashboardHandler._get_latest_researchg  s   	E#~~H !(=>>VC[[U6U--U1XXWYY	 
 .4[@6;q>>bs###^-?@@@:C@@@JTZ1188::;;;;; 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		E   DD" "
G,BF>>Gc           	      v   	 t                      }|rl|                    d                              d                              dd                              d                                          }|j        pg }ng }|                     d           |                     dd	           |                     d
d           | 	                                 | j
                            t          j        d|i                                                     dS # t          $ r}|                     d           |                     dd	           | 	                                 | j
                            t          j        dt!          |          i                                                     Y d}~dS d}~ww xY w)z)Get health research history from Supabaser   z=id, date, topic, executive_summary, quality_score, created_atr   Tr      r   r   r   r   r   historyr   r   Nr   )r   r   r   r   r   s        r   r`   z&DashboardHandler._get_research_history  s   	E#~~H !(=>>V[\\U6U--U2YYWYY	 
 !++s###^-?@@@:C@@@JTZG(<==DDFFGGGGG 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		E   DD 
F8!BF33F8c           	      d   	 t                      }|re|                    d                              d                              d|                                          }|j        r|j        d         ni }ni }|                     d           |                     dd           |                     dd           |                                  | j	        
                    t          j        |                                                     dS # t          $ r}|                     d	           |                     dd           |                                  | j	        
                    t          j        d
t          |          i                                                     Y d}~dS d}~ww xY w)z1Get specific health research digest from Supabaser   r   idr   r   r   r   r   r   r   N)r   r   r   r   r   r7   r   r   r   r   r   r#   r   r   r   r   )r   r   r   r   r   r   s         r   rd   z$DashboardHandler._get_research_by_id  s   	E#~~H !(=>>VC[[Rk**WYY  .4[@6;q>>bs###^-?@@@:C@@@JTZ1188::;;;;; 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   D
D 
F/BF**F/c                   3 	 ddl m} t                      }|s|                     d           |                     dd           |                     dd           |                                  | j                            t          j	        dd	i          
                                           d
S |                    d                              d                              d                                          }|j        pg }|                    d                              d                              dd                              d                                          }|j        r|j        d         ni }i }d
}	 |                    d                              d                              dd                              d                                          }	|	j        r|	j        d         d         }
|	j        d         d         }|                    d                              d                              d|
                                          }|j        pg D ])}t%          |d                   |d         d||d         <   *n# t&          $ r Y nw xY wt)                       |d          z
                      d          }i }	 |                    d                              d                               d|                                          }|j        pg }|rg d!}|D ]B33fd"|D             }|r0t/          t1          |          t3          |          z  d          |3<   C|                    d#          rF|                    d$          r1|d$         dk    r%t/          |d#         |d$         z  d%z  d          |d&<   n# t&          $ r Y nw xY wd' }d( }t)                      }t          d)d*d+t6          ,          }t/          ||z
  j        d-z  d          }g }d}d}d}d}|D ]s}|                    d.g           }t;          |t<                    rt          j        |          }g }d} d}!|D ]3}"|dz  } ||"|||          }#|# ||#|"          nd
}$|"                    d/          |"                    d0          |"                    d1          |"                    d          |#|$|"                    d2          |"                    d3          |"                    d4          |"                    d5          |"                    d6          |"                    d7d          d8}%|                     |%           |$(|dz  }|"                    d7d          }&| |$|&z  z  } |!|&z  }!5|!dk    rt/          | |!z            nd
}'d
}(tC          d9 |D                       })d:|)v r|r|}(n;d;|)v r|                    d          }(n!d<|)v r|                    d          r|d         }(|                     |d         |d=         |d>         |                    d?d@          t%          |d7                   |'|(|dA           |'"t%          |d7                   }*||'|*z  z  }||*z  }u|dk    rt/          ||z            nd
}+d
},d
}-|+2t/          |dBz
  d%|+z
  dCz  d%z  z   d          },t/          |,|z
  d          }-|dk    rt/          ||z  d%z            nd}.|                    dD          }/||+|,|-|/|.||||dE
}0|                     d           |                     dd           |                     dd           |                                  | j                            t          j	        |0          
                                           d
S # t&          $ r}1dd
l"}2|2#                                 |                     dF           |                     dd           |                                  | j                            t          j	        dt=          |1          i          
                                           Y d
}1~1d
S d
}1~1ww xY w)GzUAssemble full longevity dashboard: domain config, scores, WHOOP averages, blood testsr   	timedeltar   r   r   r   r   r   zNo database connectionNchl_longevity_domains
sort_orderchl_bioage_logsr   Tr   r   chl_bloodtest_panelszid, dater   chl_bloodtest_markerszname, value, unitr   valueunit)r   r   name   days%Y-%m-%dchl_health_logszarecovery_hrv, recovery_rhr, recovery_score, sleep_efficiency, sleep_deep_hours, sleep_total_hours)recovery_hrvrecovery_rhrrecovery_scoresleep_efficiencysleep_deep_hourssleep_total_hoursc                 d    g | ],}|                               t          |                   -S N)getfloat).0rr'   s     r   
<listcomp>z=DashboardHandler._get_longevity_dashboard.<locals>.<listcomp>  s2    XXX15588CWadCWCWCWr   r   r   r   deep_sleep_pctc           
         | dS |                     d          }|                     d          }|                     d|          }|                     d|          }|                     dd          }||dS || cxk    r|k    rn ndS |d	k    r<| |k     rdS ||k    r,t          d
t          dd| |z
  ||z
  z  z
  z                      S d
S |dk    r9| |k    rdS ||k    r)t          d
t          d| |z
  z  ||z
  z                      S d
S | |k     r1||k    r)t          d
t          d| |z
  z  ||z
  z                      S d
S | |k    r4||k    r,t          d
t          dd| |z
  ||z
  z  z
  z                      S d
S dS )z8Score a biomarker 0-100 against longevity optimal rangesNoptimal_lowoptimal_highref_lowref_high	directionranger   lower_betterr   r   higher_better)r   maxround)r   bioopt_lowopt_highr   r   r   s          r   score_biomarkerzBDashboardHandler._get_longevity_dashboard.<locals>.score_biomarker  s   =4''-0077>22'')W5577:x88GGK99	?h&64 e////x/////3..w"s(**"1eC18HXX`M`7a3a,b&c&cddd1//x''"s(("1eC57?,CwQXGX,Y&Z&Z[[[1 7??(("1eC57?,CwQXGX,Y&Z&Z[[[18##(**"1eC18HXX`M`7a3a,b&c&cddd1sr   c                    |                      dd          }|dk    r*|                      dd          }||v r||         d         S n|dk    rY|                      dd          }|                      d          d	k    r|                     d	          S |                     |          S |d
k    r|                      dd          }ddddddd}|dk    r,|                     d          pi }	|	                     d          S |                     |          }
|
r*|                     |
          t          ||
                   S n|dk    r|                      d          dk    ro|                     di                                d          }|                     di                                d          }|||dk    rt          ||z  d          S dS )z3Resolve a biomarker's current value from its sourcesource 	bloodtestbloodtest_namer   whoopwhoop_fieldkeyr   manualvascular_ageN	whoop_agebody_fat_pctvisceral_fat_levelmuscle_mass_kg)r   vo2maxr   body_fatvisceral_fatmuscle_massr   functional_fitness
calculatedtrig_hdl_ratioTriglycerideszHDL Cholesterolr   r3   )r   r   r   )r   blood_markers
whoop_avgslatest_bioager   bt_namefieldr   	field_mapffmappedtrighdls                r   get_biomarker_valuezFDashboardHandler._get_longevity_dashboard.<locals>.get_biomarker_value(  s   2..[((!gg&6;;G-//,W5g>> 0w&&GGM266Ewwu~~)999)~~.>???%>>%000x''''%,,C(6"&%0$2(<'7! !I h*../CDDJ!vvh///&]]3//F <-"3"3F";";"G$]6%:;;;|++wwu~~)999,00"EEII'RR+//0A2FFJJ7SS+C!GG#(Q#7#77tr   i  	      )tzinfog     v@
biomarkersr   labelr   r   r   r   r   r   weight)r   r  r   r   r   scorer   r   r   r   r   r  c              3   @   K   | ]}|                     d           V  dS )r   Nr   )r   bs     r   	<genexpr>z<DashboardHandler._get_longevity_dashboard.<locals>.<genexpr>  s,      GG!aeeHooGGGGGGr   r   r   r   domaindisplay_nameiconr   )r   r  r  r  r  r  	freshnessr  
      pace_of_aging)
chronological_agecomposite_scorecomposite_bio_age	age_deltar  
confidencedomainswhoop_averagesr  blood_panel_dater   )$r   r   r   r   r   r   r   r   r#   r   r   r   r   r   r   r7   r   r   r   r   r   strftimegter   sumrb   r   r	   r   
isinstancer   loadsappendset	traceback	print_exc)4r   r   r   domains_resultr"  bioage_resultr  r   r$  panel_resultr   markers_resultmwhoop_startr  whoop_result
whoop_rowsfieldsvalsr   r
  r   birth
chrono_agedomain_resultstotal_weighted_scoretotal_weighttotal_biomarkersscored_biomarkersr  biomarkers_listscoreddomain_weighted_sumdomain_weight_sumr   r   r  
bio_resultr2   domain_scorer  sourcesdwr  r  r   r!  paceresponser   r,  r'   s4                                                      @r   re   z)DashboardHandler._get_longevity_dashboard  s	   K	E******#~~H ""3'''  1CDDD  !>DDD  """
  W6N,O!P!P!W!W!Y!YZZZ &^^,CDD|$$  %)/RG %NN+<==vD))q	 
 6C5GOM.q11RM M#'~~.DEEVJ''U6U--U1XXWYY	 
  $ c+03D9H'3'8';F'C$%-^^4K%L%L 344J11  # -17R c c=B1W:=N=NXYZ`Xa3b3bai00    ,--		r0B0B0BBLLZXXKJ'~~.?@@V  A  AS--WYY  *.4"
 J M  M  MF# L LXXXXZXXX L,1#d))c$ii2G,K,KJqM!~~&899 JjnnM`>a>a Jfp  rE  gF  IJ  gJ  gJ7<jI[>\_ij}_~>~  CF  >F  HI  8J  8J
#34   + + +Z# # #L #$$CT1a<<<Ee1F:A>>JN#$ L  !! >' >'"(**\2">">os33 B&*j&A&AO&'#$%!* / /C$)$//]JP]^^E;@;LOOE3777RVE  #wwu~~!$!1!1"%''("3"3 #!&!&'*ww}'='=(+(?(?#&779#5#5$'GGJ$7$7%(WW[%9%9"%''(A"6"6" "J MM*---()Q.)GGHa00+uqy8+)Q.)QbefQfQfu%8;L%LMMMlp !	GGGGGGG')).>) 0II'' #Z 8 8II((]->->v-F-F( -f 5I%% ,$X.$*>$:"JJvr22#F8$455)!*"(	' 	' 	 	 	  +vh/00B(L2,==( B&L MY[\L\L\e$8<$GHHHbfO !%I*$)*r/S?=RVX<X[^<^*^`a$b$b!!"3j"@!DD	 O_abNbNb03CCcIJJJhiJ !$$_55D &0#2%6&!%()",!.$4 H s###^-?@@@:C@@@JTZ1188::;;;;; 	E 	E 	E!!!s###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD	Esk   B+_ 0C_ DJ _ 
J!_  J!!3_ C=O _ 
O _ O  O/_ 
b
B$bb
c           	         	 t                      }|ry|                    d                              d                              dd                              d                                          }|j        r|j        d         ni }ni }|                     d           |                     d	d
           |                     dd           | 	                                 | j
                            t          j        |                                                     dS # t          $ r}|                     d           |                     d	d
           | 	                                 | j
                            t          j        dt!          |          i                                                     Y d}~dS d}~ww xY w)z*Get most recent bioage entry from Supabaser   r   r   Tr   r   r   r   r   r   r   r   r   Nr   )r   r   r   bioager   s        r   rf   z#DashboardHandler._get_latest_bioage  s   	E#~~H !(9::VC[[U6U--U1XXWYY	 
 ,2;>QBs###^-?@@@:C@@@JTZ//668899999 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Er   c           	         	 ddl m} t                       |d          z
                      d          }t	                      }|rm|                    d                              d                              d|                              dd	
          	                                }|j
        pg }ng }|                     d           |                     dd           |                     dd           |                                  | j                            t!          j        d|i                                                     dS # t&          $ r}|                     d           |                     dd           |                                  | j                            t!          j        dt)          |          i                                                     Y d}~dS d}~ww xY w)z:Get bioage trend data for the last 12 months from Supabaser   r   im  r   r   r   zldate, whoop_age, vascular_age, composite_bio_age, pace_of_aging, age_delta, chronological_age, domain_scoresr   Fr   r   r   r   r   r   trendr   r   N)r   r   r   r%  r   r   r   r&  r   r   r7   r   r   r   r   r   r#   r   r   r   r   )r   r   
start_dater   r   rL  r   s          r   rg   z"DashboardHandler._get_bioage_trend  s   	E*******,,yyc/B/B/BBLLZXXJ#~~H !(9::V  K  L  LS,,U6U..WYY	 
 )rs###^-?@@@:C@@@JTZ%(899@@BBCCCCC 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   EE 
G-BG((G-c           	         	 t                      }|                     d           |                     dd           |                     dd           |                                  | j                            t          j        |                                                     dS # t          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt          |          i                                                     Y d}~dS d}~ww xY w)	z#Get activity tracking configurationr   r   r   r   r   r   r   N)r(   r   r   r   r   r   r#   r   r   r   r   )r   configr   s      r   rh   z'DashboardHandler._get_activities_config  sB   	E(**Fs###^-?@@@:C@@@JTZ//668899999 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		E   B!B% %
E/BEEc           
      p   	 ddl m} t                       |d          z
                      d          }t	                      }g }|r|                    d                              d                              d|                              dd	
                              dd	
          	                                }|j
        pg }|                    d                              d                              d|          	                                }i }|j
        pg D ]"}|                    d          r|||d         <   #|D ]}	|                    |	d                   }
|
r|
d         |
                    d          |
                    d          |
                    d          |
                    d          |
                    d          |
                    d          d|	d<   d	|	d<   d|	d<   d|	d<   |                     d           |                     dd           |                     dd           |                                  | j                            t#          j        d|i                                                     dS # t(          $ r}|                     d           |                     dd           |                                  | j                            t#          j        d t+          |          i                                                     Y d}~dS d}~ww xY w)!zTGet activity logs for the last 90 days, LEFT JOIN enrichment from chl_sport_sessionsr   r   Z   r   r   chl_activity_logsr   r   Tr   r   chl_sport_sessionsr   r   	enjoymentspotnotes
focus_areaconditions_summary
highlights)r   rU  rV  rW  rX  rY  rZ  
enrichmentis_enrichedNFr   r   r   r   r   r   r   )r   r   r   r%  r   r   r   r&  r   r   r7   r   r   r   r   r   r   r#   r   r   r   r   )r   r   rM  r   r   r   enrichment_resultenrichment_mapr   logr[  s              r   ri   z%DashboardHandler._get_activities_logs	  s?   4	E*******,,yyb/A/A/AAKKJWWJ#~~HD "3!(;<<VC[[S,,U6U--U6U--WYY  {(b %-NN3G$H$HVC[[S,,WYY " "$+06B A AAuu.// A?@q):';< 3 3C!/!3!3CI!>!>J! 3",T"2)3)D)D$.NN6$:$:%/^^G%<%<*4..*F*F2<..AU2V2V*4..*F*F- -L) .2M**,0L)-2M**s###^-?@@@:C@@@JTZ77>>@@AAAAA 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   JJ 
L5BL00L5c           	          	 ddl m} ddlm} t	                      }|                    di           }t                                                      }| |d          z
                      d          }t                      }|s| 
                    d           |                     d	d
           |                     dd           |                                  | j                            t          j        i i i d                                                     dS |                    d                              d                              d|                              dd                                          }|j        pg }	 |t0                    }
|	D ]G}|                    d          }||dk     r |
|d                                      |d                    Hi }|                                D ]}t7          |
                    |g           d          }|s	ddd||<   3d}|}t9          t;          |                    D ]u}|                    d          }||v r|dz  }| |d          z  }0|dk    r?| |d          z  }|                    d          }||v r|dz  }| |d          z  }s n t7          |          }d}d}t9          dt;          |                    D ]}t          j        ||dz
           d                                          }t          j        ||         d                                          }||z
  j        dk    r|dz  }stA          ||          }d}|rtA          ||          nd}||d||<   | ||!                                          z
  }|                    d           i }|                                D ]C} fd|
                    |g           D             }t;          t1          |                    ||<   D|"                    d                              d          i }|                                D ]C}fd|
                    |g           D             }t;          t1          |                    ||<   D| 
                    d           |                     d	d
           |                     dd           |                                  | j                            t          j        |||d                                                     dS # tF          $ r}| 
                    d           |                     d	d
           |                                  | j                            t          j        dtI          |          i                                                     Y d}~dS d}~ww xY w)z'Get activity streaks and weekly summaryr   r   )defaultdictr   rR  r   r   r   r   r   r   r   )streaksweeklymonthlyNrS  z date, activity, duration_minutesr   Tr   duration_minutesr3   activity)reverse)currentlongestr   c                      g | ]
}|k    |S r
   r
   )r   dweek_start_strs     r   r   z:DashboardHandler._get_activities_stats.<locals>.<listcomp>  s%    eeeAQRVdQdQdaQdQdQdr   dayc                      g | ]
}|k    |S r
   r
   )r   rk  month_starts     r   r   z:DashboardHandler._get_activities_stats.<locals>.<listcomp>  s%    cccQRSWbRbRbqRbRbRbr   r   r   )%r   r   collectionsra  r(   r   r   r   r%  r   r   r   r   r   r   r#   r   r   r   r   r&  r   r   r7   r+  addkeyssortedr   rb   strptimer   r   weekdayreplacer   r   )!r   r   ra  rO  r   todayrM  r   r   r   activity_datesr_  durationrb  activity_keydatescurrent_streak
check_dateidate_strdates_sortedri  rh  prevcurr
week_startrc  
week_datesrd  month_datesr   rp  rl  s!                                  @@r   rj   z&DashboardHandler._get_activities_statsA  st   n	E******//////(**FL"55J$&&++--E))"4"4"44>>zJJJ#~~H ""3'''  1CDDD  !>DDD  """
  bUW,X,X!Y!Y!`!`!b!bccc^^$788:;;VZ((vD))	 
 ;$"D )[--N A A77#566'HqLLs:/33CK@@@@ G * 1 1 + +~11,CCTRRR 89a,H,HGL) "#"
s5zz**  A)22:>>H5((&!+"iiQ&7&7&77

a"iiQ&7&7&77
#-#6#6z#B#B#u,,*a/N&))*;*;*;;JJ!E  &e}}q#l"3"344 $ $A#,\!A#->
KKPPRRD#,\!_jIINNPPDt)Q..1"%gw"7"7"#3?F#gw///Q  .&) )%% !@!@!@@J'00<<NF * 1 1 < <eeee););L")M)Meee
'*3z??';';|$$  --A-..77
CCKG * 1 1 > >cccc.*<*<\2*N*Nccc(+C,<,<(=(=%%s###^-?@@@:C@@@JTZ" ") )   vxx	      	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es    DU P#U 
W%BW  W%c           	         	 t                      }|                     d           |                     dd           |                     dd           |                                  | j                            t          j        |                                                     dS # t          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt          |          i                                                     Y d}~dS d}~ww xY w)	zGet house admin contactsr   r   r   r   r   r   r   N)r0   r   r   r   r   r   r#   r   r   r   r   )r   r7   r   s      r   rk   z$DashboardHandler._get_admin_contacts  sB   	E"$$Ds###^-?@@@:C@@@JTZ--446677777 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		ErP  c           	         	 ddl m} t                      }t                      }|                                }d}d}|r|                    d                              d                              dd                              d	d
                              dd
          	                    d          
                                }|j        r|j        d         d	          d|j        d         d          }t          j        |j        d         d	         d                                          }||z
  j        }	|	dk    rd}n|	dk    rd}nd}d}
d}|r|                    d                              d                              dddg                              d	d
                              dd
          	                    d          
                                }|j        r|j        d         d	          d|j        d         d          }
t          j        |j        d         d	         d                                          }||z
  j        }	|	dk    rd}n|	dk    rd}nd}nd}|dk    rd}n|dk    rd}nd}|||d||
d|                    d          d}|                     d           |                     dd           |                     dd            |                                  | j                            t+          j        |                                                     dS # t0          $ r}|                     d!           |                     dd           |                                  | j                            t+          j        dt3          |          i                                                     Y d}~dS d}~ww xY w)"z#Get sync status for WHOOP and Chessr   r   NunknownrS  z
date, timer   r   r   Tr   r   r    r   healthyrH   staler   z	chess.comlichessr  r   warning)rD   	last_syncz%Y-%m-%d %H:%M:%S)overallr   chess
checked_atr   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r7   ru  r   in_r%  r   r   r   r   r   r#   r   r   r   r   )r   r   r   r   rx  
whoop_lastwhoop_statusr   	last_datedays_ago
chess_lastchess_statusr  rD   r   s                  r   rl   z!DashboardHandler._get_sync_status  s   V	E******#~~H"$$CHHJJE J$L /!(;<<VL))R'**U6U--U6U--U1XXWYY  ; 	/$*KN6$:!U!UV[^F=S!U!UJ ( 1&+a.2H* U U Z Z \ \I %	 17H1}}'0!Q'.'. J$L -!(;<<VL))SK#;<<U6U--U6U--U1XXWYY  ; -$*KN6$:!U!UV[^F=S!U!UJ ( 1&+a.2H* U U Z Z \ \I %	 17H1}}'0!R'.'. $-L w&&!((## #*!+ 
 +!+  "ll+>?? F s###^-?@@@:C@@@JTZ//668899999 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   L2L6 6
O BOOc           	      x   	 t                      }|rm|                    d                              d                              dd                              dd                                          }|j        pg }ng }|                     d           |                     d	d
           |                     dd           | 	                                 | j
                            t          j        d|i                                                     dS # t          $ r}|                     d           |                     d	d
           | 	                                 | j
                            t          j        dt!          |          i                                                     Y d}~dS d}~ww xY w)z=Get all active diet items ordered by meal_slot and sort_orderchl_diet_itemsr   	is_activeTr   Fr   r   r   r   r   itemsr   r   Nr   r   r   r   r   r   r7   r   r   r   r   r   r#   r   r   r   r   r   r   r   r  r   s        r   rm   z DashboardHandler._get_diet_items  s   	E#~~H !(899VC[[RT**U<eU44WYY	 
 )rs###^-?@@@:C@@@JTZ%(899@@BBCCCCC 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		E   DD 
F9"BF44F9c           	      P   	 t                      }|rY|                    d                              d                              dd                                          }|j        pg }ng }|                     d           |                     dd           |                     d	d           |                                  | j	        
                    t          j        d
|i                                                     dS # t          $ r}|                     d           |                     dd           |                                  | j	        
                    t          j        dt          |          i                                                     Y d}~dS d}~ww xY w)z6Get all supplements (active first, then by sort_order)chl_supplementsr   r   Fr   r   r   r   r   supplementsr   r   Nr   r   r   r   r   r7   r   r   r   r   r   r#   r   r   r   r   )r   r   r   r  r   s        r   rn   z!DashboardHandler._get_supplements6  s   	E#~~H !!(9::VC[[U<eU44WYY  %k/R s###^-?@@@:C@@@JTZ(DEELLNNOOOOO 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		E   D D 
F%BF  F%Fc           	         	 t                      }|r|                    d                              d                              dd          }|r|                    dd          }n|                    dd          }|                                }|j        pg }ng }|                     d           | 	                    d	d
           | 	                    dd           | 
                                 | j                            t          j        d|i                                                     dS # t           $ r}|                     d           | 	                    d	d
           | 
                                 | j                            t          j        dt#          |          i                                                     Y d}~dS d}~ww xY w)z"Get body focus areas from Supabasechl_body_focusr   r   Fr   rD   rM   r   r   r   r   r  r   r   N)r   r   r   r   r   neqr   r7   r   r   r   r   r   r#   r   r   r   r   )r   rM   r   queryr   r  r   s          r   ro   z DashboardHandler._get_body_focusO  s   	E#~~H  '788VC[[U<eU44   <!HHXz::EE!IIh
;;E)rs###^-?@@@:C@@@JTZ%(899@@BBCCCCC 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   D1D5 5
G?BGGc           	      4   	 ddl m}m}  || j                  } ||j                  }|                    ddg          d         }t                      }|r|                    d                              d          	                    dd	          
                    d
          }|r|                    d|          }|                                }|j        pg }	ng }	|                     d           |                     dd           |                     dd           |                                  | j                            t'          j        d|	i                                                     dS # t,          $ r}
|                     d           |                     dd           |                                  | j                            t'          j        dt/          |
          i                                                     Y d}
~
dS d}
~
ww xY w)z3Get body check-ins, optionally filtered by focus_idr   urlparseparse_qsfocus_idNchl_body_checkinsr   r   Tr   r   r   r   r   r   checkinsr   r   )urllib.parser  r  r]   r  r   r   r   r   r   r   r   r   r7   r   r   r   r   r   r#   r   r   r   r   )r   r  r  parsedparamsr  r   r  r   r  r   s              r   rq   z#DashboardHandler._get_body_checkinsl  s   	E77777777Xdi((FXfl++Fzz*tf55a8H#~~H 
 ':;;VC[[U6U--U2YY   ;!HHZ::E!;,"s###^-?@@@:C@@@JTZX(>??FFHHIIIII 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   E2E6 6
H BHHc           	      V   	 t                      }|r|                    d                              d                              dd                              d                                          }|j        rk|j        d         d         }|                    d                              d                              d|                                          }|j        pg }n	d}g }nd}g }|                     d	           | 	                    d
d           | 	                    dd           | 
                                 | j                            t          j        ||d                                                     dS # t           $ r}|                     d           | 	                    d
d           | 
                                 | j                            t          j        dt#          |          i                                                     Y d}~dS d}~ww xY w)z:Get the latest check-in date and all ratings for that dater  r   Tr   r   r   r   Nr   r   r   r   )latest_dater  r   r   )r   r   r   r   r   r   r7   r   r   r   r   r   r   r#   r   r   r   r   )r   r   r   r  result2r  r   s          r   rp   z*DashboardHandler._get_body_checkins_latest  s$   %	E#~~H !(;<<VF^^U6U--U1XXWYY	 
 ; 
""(+a."8K&nn-@AAFK00    '|1rHH"&K!HH"s###^-?@@@:C@@@JTZ*$) )   vxx    
  	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   FF 
H(BH##H(c           	      x   	 t                      }|rm|                    d                              d                              dd                              dd                                          }|j        pg }ng }|                     d           |                     d	d
           |                     dd           | 	                                 | j
                            t          j        d|i                                                     dS # t          $ r}|                     d           |                     d	d
           | 	                                 | j
                            t          j        dt!          |          i                                                     Y d}~dS d}~ww xY w)z1Get all active budget items ordered by sort_order
chl_budgetr   r  Tr   Fr   r   r   r   r   r  r   r   Nr  r  s        r   rr   zDashboardHandler._get_budget  s   	E#~~H !55VC[[RT**U<eU44WYY	 
 )rs###^-?@@@:C@@@JTZ%(899@@BBCCCCC 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Er  c           	         	 ddl m}m}  || j                  } ||j                  }|                    ddg          d         }|                    ddg          d         }|                    ddg          d         }t          |                    ddg          d                   }t                      }	|	r|	                    d	          	                    d
          
                    dd                              dd                              |          }
|r|
                    d|          }
|r|
                    d|          }
|r|
                    d|          }
|
                                }|j        pg }ng }|                     d           |                     dd           |                     dd
           |                                  | j                            t/          j        d|i                                                     dS # t4          $ r}|                     d           |                     dd           |                                  | j                            t/          j        dt7          |          i                                                     Y d}~dS d}~ww xY w)z&Get transactions with optional filtersr   r  rM  Nend_datecategoryr   r   chl_transactionsr   amountr   Tr   r   r   r   transactionsr   r   )r  r  r  r]   r  r   intr   r   r   ltr   r   r&  lter   r   r7   r   r   r   r   r   r#   r   r   r   r   )r   r  r  r  r  rM  r  r  r   r   r  r   r  r   s                 r   rs   z"DashboardHandler._get_transactions  s   %	E77777777Xdi((FXfl++FL4&99!<Jzz*tf55a8Hzz*tf55a8H

7SE221566E#~~H " '9::VC[[R!__U6U--U5\\	 
  :!IIfj99E 8!IIfh77E ;!HHZ::E%{0b!s###^-?@@@:C@@@JTZ(FGGNNPPQQQQQ 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   HH 
J?(BJ::J?c                   #$ 	 ddl m}m} ddlm} ddl# || j                  } ||j                  }|                    ddg          d         }t                      
                                $|dk    r3$ |$                                          z
  }$}||z
  j        d	z   }	d
}
n|dk    rx$j        d	z
  dz  dz  d	z   }$                    |d	          }$}||z
  j        d	z   }	|dz   dk    r3|dz   }t          #$fdt!          ||dz             D                       }
nNd}
nK$                    d	          }$}||z
  j        d	z   }	#                    $j        $j                  d	         }
|                    d          }|                    d          }t)                      }|s|                     d           |                     dd           |                     dd           |                                  | j                            t5          j        i g d                                                     dS |                    d                              d                              dd                                           }|j!        pg }|                    d                              d          "                    d|          #                    d|          $                    dd                                           }|j!        pg }i }|D ]G}|                    d d!          }|                    |d          tK          |d                   z   ||<   Hg }d}d}|D ] }|                    d"d          pd}|                    d d#          }|dk    r|d$z  }n|dk    r|dz  |	z  |
z  }n||	z  |
z  }tM          |                    |d          d          }tM          |d          }tM          ||z
  d          }|dk    rtM          ||z  d%z  d	          nd}|'                    |                    d&          ||                    d'|          |                    d(d#          |||||d)	           ||z  }||z  }"tM          ||z
  d          } tM          |d          tM          |d          | ||||	|
d*d+	}!|                     d           |                     dd           |                     dd           |                                  | j                            t5          j        |!|d                                                     dS # tP          $ r}"|                     d,           |                     dd           |                                  | j                            t5          j        d-tS          |"          i                                                     Y d}"~"dS d}"~"ww xY w).z7Get spending summary with pro-rated budget for a periodr   r  r   Nperiodmonthweekr   r   r  quarterrH   )r  rn  r3   r   c              3   Z   K   | ]%}                     j        |          d          V  &dS )r   N)
monthrangeyear)r   r2  calendarrx  s     r   r  z9DashboardHandler._get_spending_summary.<locals>.<genexpr>  sN       ) ) !++EJ::1=) ) ) ) ) )r   rR  rm  r   r   r   r   r   r   )summaryr;   r  r  Tr  r   r  r  r:   monthly_amountr   gRQ@r   r   r  budget_type)	r   r  r  r  r  budgetedspent	remainingpct_usedi+  )	total_budgetedtotal_spenttotal_remainingr  rM  r  days_elapseddays_in_periodmonthly_incomer   r   )*r  r  r  r   r   r  r]   r  r   r   r   rv  r   r  rw  r'  r   r  r  r%  r   r   r   r   r   r   r#   r   r   r   r   r   r   r7   r&  r  r  absr   r*  r   r   )%r   r  r  r   r  r  r  rM  r  r  r  quarter_month
last_month	start_strend_strr   budget_resultbudget_items
txn_resultr  spending_by_categorytxncatr;   r  r  itemr  r  r  r  r  r  r  r   r  rx  s%                                      @@r   rt   z&DashboardHandler._get_spending_summary  s   D	E77777777******OOOXdi((FXfl++FZZ7)44Q7F$&&++--E "YYEMMOO%D%D%DD
  (: 5;a?!"9$$"'+/a!71 <q @"]]A]FF
  (: 5;a? 1$**!.!2J%( ) ) ) ) )!&}ma6G!H!H) ) ) & &NN
 &(NN"]]q]11
  (: 5;a?!)!4!4UZ!M!Ma!P"++J77I''
33G#~~H ""3'''  1CDDD  !>DDD  """
  ",M,M!N!N!U!U!W!WXXX %NN<88K&&  )-3L "(:;;VY''VW%%Ha  &?0bL $& # b bggj'22,@,D,DS!,L,LsSVW_S`OaOa,a$S)) JNK$ % %!%*:A!>!>!C!hhz2.. V##-4HHy((-1L@>QHH-<~MH266sA>>BB 1--!(U"2A66	AIA5%("2S"81===ST!!((4.. #$(HH^S$A$A#'88M2#>#>&4 ("!* (
# 
# 
 
 
 (*u$#N[$@!DDO #(":":$[!44#2 '# ,"0"'
 
G s###^-?@@@:C@@@JTZG:(V(VWW^^``aaaaa 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es    IU& LU& &
X0BXXc           	         	 t                      }|r,|                    d                              d                              dd                              dd                                          }|j        pg }|D ]}|                    d                              d	                              d
|d                                       dd                              d                                          }|j        r-|j        d         d         |d<   |j        d         d         |d<   d|d<   d|d<   ng }|                     d           | 	                    dd           | 	                    dd           | 
                                 | j                            t          j        d|i                                                     dS # t           $ r}|                     d           | 	                    dd           | 
                                 | j                            t          j        dt#          |          i                                                     Y d}~dS d}~ww xY w)z3Get all active investment assets with latest valueschl_investment_assetsr   r  Tr   Fr   chl_investment_valueszvalue, dateasset_idr   r   r   r   r   latest_valuer  Nr   r   r   r   assetsr   r   )r   r   r   r   r   r   r7   r   r   r   r   r   r   r#   r   r   r   r   )r   r   r   r  asset
val_resultr   s          r   ru   z!DashboardHandler._get_investments  sm   %	E#~~H !(?@@VC[[RT**U<eU44WYY	 
  * $ 4 4E!)0G!H!H..Jd44vD11q   " 40:0B70Kn-/9q/A&/Im,,04n-/3m,,4 s###^-?@@@:C@@@JTZ6(:;;BBDDEEEEE 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   GG 
I9"BI44I9c           	      Z   	 ddl m}m}  || j                  } ||j                  }|                    ddg          d         }|s|                     d           |                     dd           |                     dd	           |                                  | j	        
                    t          j        d
di                                                     dS t                      }|r|                    d                              d	                              d|                              dd                              d                                          }|j        pg }ng }|                     d           |                     dd           |                     dd	           |                                  | j	        
                    t          j        d|i                                                     dS # t,          $ r}	|                     d           |                     dd           |                                  | j	        
                    t          j        d
t/          |	          i                                                     Y d}	~	dS d}	~	ww xY w)z)Get value history for an investment assetr   r  r  N  r   r   r   r   r   zasset_id is requiredr  r   Tr   2   r   valuesr   )r  r  r  r]   r  r   r   r   r   r   r   r#   r   r   r   r   r   r   r   r   r   r7   r   r   )
r   r  r  r  r  r  r   r   r  r   s
             r   rv   z'DashboardHandler._get_investment_values  s   $	E77777777Xdi((FXfl++Fzz*tf55a8H ""3'''  1CDDD  !>DDD  """
  W6L,M!N!N!U!U!W!WXXX#~~H 	!(?@@VC[[R
H--U6U--U2YYWYY   *s###^-?@@@:C@@@JTZ6(:;;BBDDEEEEE 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es    CH	  D'H	 	
J*BJ%%J*c           	      P   	 t                      }|rY|                    d                              d                              dd                                          }|j        pg }ng }|                     d           |                     dd           |                     d	d
           |                                  | j	        
                    t          j        d|i                                                     dS # t          $ r}|                     d           |                     dd           |                                  | j	        
                    t          j        dt          |          i                                                     Y d}~dS d}~ww xY w)z#Get all blood test panels (summary)r   zid, date, lab_name, ordered_by, panel_name, analysis_summary, health_score, markers_optimal, markers_good, markers_warning, markers_high, markers_low, created_atr   Tr   r   r   r   r   r   panelsr   r   Nr  )r   r   r   r  r   s        r   rw   z DashboardHandler._get_bloodtests  s   	E#~~H !(>??V  @  A  AU6U--WYY   *s###^-?@@@:C@@@JTZ6(:;;BBDDEEEEE 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Er  c           	         	 t                      }i }g }g }|r|                    d                              d                              dd                              d                                          }|j        r|j        d         }|                    d                              d                              d	|d
                                       d                              d                                          }|j        pg }|                    d                              d                              d	|d
                                       dddg                              d                                          }|j        pg }| 	                    d           | 
                    dd           | 
                    dd           |                                  | j                            t          j        |||d                                                     dS # t"          $ r}| 	                    d           | 
                    dd           |                                  | j                            t          j        dt%          |          i                                                     Y d}~dS d}~ww xY w)z+Get latest panel + markers + active actionsr   r   r   Tr   r   r   r   r   r   r  r   chl_bloodtest_actionsrD   pendingin_progresspriorityr   r   r   r   panelmarkersactionsr   r   N)r   r   r   r   r   r   r7   r   r  r   r   r   r   r   r#   r   r   r   r   )	r   r   r  r  r  p_resultm_resulta_resultr   s	            r   rx   z&DashboardHandler._get_bloodtest_latest  s   .	E#~~HEGG 2#>>*@AAVC[[U6U--U1XXWYY	 
 = 2$M!,E'~~.EFFJd44z**|,,   'm1rG'~~.EFFJd44X	='ABBz**   'm1rGs###^-?@@@:C@@@JTZ"") )   vxx	      	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   H.H2 2
K<BKKc           	      >   	 t                      }i }g }g }|rI|                    d                              d                              d|                                          }|j        r|j        d         }|                    d                              d                              d|                              d                              d                                          }|j        pg }|                    d	                              d                              d|                              d
                                          }|j        pg }|                     d           |                     dd           |                     dd           | 	                                 | j
                            t          j        |||d                                                     dS # t          $ r}	|                     d           |                     dd           | 	                                 | j
                            t          j        dt!          |	          i                                                     Y d}	~	dS d}	~	ww xY w)z&Get specific panel + markers + actionsr   r   r   r   r   r   r  r   r  r  r   r   r   r   r  r   r   N)r   r   r   r   r   r7   r   r   r   r   r   r   r#   r   r   r   r   )
r   r   r   r  r  r  r  r  r  r   s
             r   r|   z%DashboardHandler._get_bloodtest_by_id!  sz   )	E#~~HEGG 2#>>*@AAVC[[Rh''WYY  = 2$M!,E'~~.EFFJ11z**|,,   'm1rG'~~.EFFJ11z** 	 
 'm1rGs###^-?@@@:C@@@JTZ"") )   vxx	      	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   G7G; ;
JBJJc                    	 t                      }g }|r|                    d                              d                              dd                                          }|j        pg }|                    d                              d                                          }|j        pg }i }|D ]d         }||vr?d         d	         d
         d         d         d         d         d         g d	||<   t          fd|D             d          }	|	r7||         d                             |	d         d         d         d           |D ]%}||         d                             d            &t          |
                                          }|                     d           |                     dd           |                     dd           |                                  | j                            t!          j        ||d                                                     dS # t&          $ r}
|                     d           |                     dd           |                                  | j                            t!          j        d t)          |
          i                                                     Y d}
~
dS d}
~
ww xY w)!z#Get marker trends across all panelsr   z id, date, lab_name, health_scorer   Fr   r   zgpanel_id, name, short_name, category, value, unit, ref_low, ref_high, optimal_low, optimal_high, statusr   
short_namer  r   r   r   r   r   )	r   r   r  r   r   r   r   r   r  c              3   @   K   | ]}|d          d         k    |V  dS )r   r   Nr
   )r   pr2  s     r   r  z9DashboardHandler._get_bloodtest_trends.<locals>.<genexpr>s  s5      !P!Pqw!J-7O7O!7O7O7O7O!P!Pr   Nr  r   rD   )r   r   rD   c                     | d         S )Nr   r
   )vs    r   <lambda>z8DashboardHandler._get_bloodtest_trends.<locals>.<lambda>}  s
    6 r   )r   r   r   r   r   r   )trendsr  r   r   )r   r   r   r   r   r7   nextr*  sortlistr  r   r   r   r   r   r#   r   r   r   r   )r   r   r  r  r  r  all_markers
marker_mapr   r  r   r2  s              @r   ry   z&DashboardHandler._get_bloodtest_trendsN  s    ;	E#~~HF +3#>>*@AAV>??U6U..WYY  "," $>>*ABBV  F  G  GWYY  'm1r  
$  AF)C*,,$%fI*+L/()*$%fI'(|()*+,]+;,-n,=&(
+ 
+
3 !!P!P!P!PV!P!P!PRVWWE "3188$)&M%&wZ&'k: :    & L LCsOH-227J7J2KKKKj//1122s###^-?@@@:C@@@JTZ6V(L(LMMTTVVWWWWW 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   H4H9 9
KBKKc           	      v   	 t                      }g }|rl|                    d                              d                              dddg                              d                                          }|j        pg }|                     d           |                     dd	           |                     d
d           | 	                                 | j
                            t          j        d|i                                                     dS # t          $ r}|                     d           |                     dd	           | 	                                 | j
                            t          j        dt!          |          i                                                     Y d}~dS d}~ww xY w)z(Get all active actions across all panelsr  r   rD   r  r  r  r   r   r   r   r  r   r   N)r   r   r   r  r   r   r7   r   r   r   r   r   r#   r   r   r   r   )r   r   r  r   r   s        r   rz   z+DashboardHandler._get_bloodtest_actions_all  s   	E#~~HG ,!(?@@VC[[SI}#=>>U:&&WYY	 
 !++s###^-?@@@:C@@@JTZG(<==DDFFGGGGG 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Er   c           	      H   	 ddl m} t                      }i }|rOt                                                      }	 | |d          z
                      d          }|                    d                              d                              d|          	                                }|j
        pg rKfd	}t                     |d
           |d           |d           |d           |d          d|d<   n# t          $ r Y nw xY w	 | |d          z
                      d          }|                    d                              d                              d|          	                                }	|	j
        pg }
|
r=ddlm}  |d |
D                       }t          |
          t          |          d|d<   n# t          $ r Y nw xY w	 |                    d                              d                              dd          	                                }|j
        pg }|r>i }|D ]4}|d         }||vrg ||<   ||                             |d                    5||d<   n# t          $ r Y nw xY w	 |                    d                              d                               d!d"          	                                }|j
        pg }|r||d#<   n# t          $ r Y nw xY w	 |                    d$                              d%                              d!d&          	                                }|j
        pg }|r||d'<   n# t          $ r Y nw xY w	 |                    d(                              d)                              dd*                              d+          	                                }|j
        r|j
        d         |d,<   n# t          $ r Y nw xY w	 |                    d-                              d.                              dd*                              d+          	                                }|j
        r|j
        d         }||d/<   |                    d0                              d1                              d2|d3                                       d!g d4          	                                }|j
        pg |d/         d5<   n# t          $ r Y nw xY w	 |                    d6                              d7                              d!d"          	                                }|j
        pg }|r||d8<   n# t          $ r Y nw xY w|                     d9           |                     d:d;           |                     d<d=           |                                  | j                            t7          j        |                                                     d@S # t          $ r}|                     d>           |                     d:d;           |                                  | j                            t7          j        d?t=          |          i                                                     Y d@}~d@S d@}~ww xY w)Az=Aggregate snapshot of all health data for holistic evaluationr   r   r   r   r   r   zPrecovery_score, recovery_hrv, recovery_rhr, sleep_total_hours, strain_day_strainr   c                       fdD             }|r-t          t          |          t          |          z  d          nd S )Nc                 J    g | ]}|                               |          S r   r  )r   hr   s     r   r   zODashboardHandler._get_bloodtest_health_context.<locals>.avg.<locals>.<listcomp>  s,    #Z#Z#Zq155::CYAcFCYCYCYr   r   )r   r'  rb   )r   r7  health_logss   ` r   avgz;DashboardHandler._get_bloodtest_health_context.<locals>.avg  sI    #Z#Z#Z#ZK#Z#Z#ZDFJ#T5TSYY)>#B#B#BPTTr   r   r   r   r   strain_day_strain)r   avg_recoveryavg_hrvavg_rhr	avg_sleep
avg_strainr      rS  zactivity, date)Counterc              3   &   K   | ]}|d          V  dS )rf  Nr
   )r   as     r   r  zADashboardHandler._get_bloodtest_health_context.<locals>.<genexpr>  s&      ,M,MqQz],M,M,M,M,M,Mr   )total_sessions	breakdownr   r  zmeal_slot, titler  T	meal_slottitledietr  zname, dose, timingrD   r   r  r  z,title, body_area, severity, category, statusrM   
body_focusr   zNdate, composite_bio_age, chronological_age, age_delta, whoop_age, vascular_ager   r   bio_ager   zBid, date, health_score, markers_warning, markers_high, markers_lowblood_testsr   z name, value, unit, status, notesr   r   )r  highlowcritical
borderlineflagged_markerschl_experimentsz!title, category, protocol, statusexperimentsr   r   r   r   r   r   r   N)r   r   r   r   r   r%  r   r   r&  r   r7   rb   r   rq  r  dictr   r*  r  r   r   r  r   r   r   r   r   r#   r   r   r   )r   r   r   r   rx  	start_14dh_resultr  	start_30dr  act_logsr  
act_countsd_resultr!  diet_by_slotrk  slots_resultsupps	bf_resultbody	ba_result	bt_resultr  warn_result
exp_resultexpsr   r  s                                @r   r{   z.DashboardHandler._get_bloodtest_health_context  sq   R	E******#~~HG A(**//11
!&);););!; E Ej Q QI'~~.?@@ rssVY//   #+-"52K" U U U U U %($4$4,/C0@,A,A'*s>':':'*s>':':),-@)A)A*-#.A*B*B, ,( !   D!&);););!; E Ej Q QI'~~.ABB 011VY//    (}2H 777777%,W,M,MH,M,M,M%M%M
.1(mm)-j)9)91 1- !   D'~~.>?? 233K..   $=.BD 7')!% B BA#$[>D#<7757T 2(.55ajAAAA*6    D	'~~.?@@ 455Hh//   %M/RE 716.    D	 (/? @ @ NOOXz22   %>/RD 504-    D	 (/@ A A pqqvD11q 	 
 !~ ?-6^A->	*    D (/E F F deevD11q 	 
 !~ [ )q 116.&.nn5L&M&M#V$FGGR
E$K88 S+_+_+_``$WYY	 $
 EPDTDZXZ./@A    D	!)0A!B!B CDDHh//   &?0bD 615.    D s###^-?@@@:C@@@JTZ007799::::: 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es@  9X  CD X  
DX  DX  B8G X  
GX  GX  BI7 6X  7
JX  JX  AK' &X  '
K41X  3K44X  8AM X  
M$!X  #M$$X  (A9O" !X  "
O/,X  .O//X  3C7S+ *X  +
S85X  7S88X  <AU X  
U(%X  'U((BX   
Z!
BZZ!c           	      
   	 t                      }g }|r|                    d                              d                              dd                              d                                          }|j        pg }|D ]}|d         }|                    d                              dd	                              d
|                              dd                                          }|j        pd|d<   ddlm	} t                                                       |d          z
                      d          }|                    d                              dd	                              d
|                              d|                                          }	|	j        pd|d<   t                                                                          d          }
|                    d                              d                              d
|                              dddg                              d|
                              d                              d                                          }|j        r|j        d         nd|d<   t                                                       |d          z
                      d          }t                                                       |d          z
                      d          }|                    d                              dd	                              d
|                              d|                                          }|j        pddk    rd|d<   |                    d                              dd	                              d
|                              d|                                          }|j        pddk    rdnd |d<   |                     d!           |                     d"d#           |                     d$d           |                                  | j                            t+          j        d%|i                                                     dS # t0          $ r}|                     d&           |                     d"d#           |                                  | j                            t+          j        d't3          |          i                                                     Y d}~dS d}~ww xY w)(zCAll communities with member counts, recent interactions, next eventchl_communitiesr   rD   r   r   r   chl_community_membersexact)countcommunity_idr   member_countr   r  r   r   chl_community_interactionsr   recent_interactionschl_community_eventszname, date, statusplanned	confirmedr   N
next_eventr  r   greenhealthyellowredr   r   r   r   communitiesr   r   )r   r   r   r   r   r   r7   rB  r   r   r   r   r%  r&  r  r   r   r   r   r   r   r#   r   r   r   r   )r   r   rO  r   ccidr  r   
thirty_agoi_resultrx  e_result	seven_agofourteen_agorecent_7	recent_14r   s                    r   r}   z(DashboardHandler._get_community_overviewA  s   G	E#~~HK 8X!(9::VC[[R(++U<((WYY	 
 %k/R$ 0X 0XAD'C'~~.EFFG44NC00Hh// 	 
 )1(;!An% 322222"2"4"4"9"9";";iiR>P>P>P"P!Z!Z[e!f!fJ'~~.JKKG44NC00VZ00 	 
 08~/BA+, -..3355>>zJJE'~~.DEE 455NC00X	;'?@@VU++vq   ;C-&QhmA&6&6TAlO "2!3!3!8!8!:!:YYA=N=N=N!N X XYc d dI$4$6$6$;$;$=$=		r@R@R@R$R#\#\]g#h#hL'~~.JKKG44NC00VY// 	 
 !+!q00&-($,NN3O$P$P#VDV88R44 S66$WYY	 "
 4=?3Ga12L2LhhRW(s###^-?@@@:C@@@JTZ(DEELLNNOOOOO 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   R!R% %
U/BUUc           	      p   	 t          d          }i }dD ]m}||z  }|                                rRt          |          5 }t          j        |          ||                    dd          <   ddd           n# 1 swxY w Y   n|                    dg           }|                    dg           }t          |t                    rt          |          ndt          |t                    rt          |          ndd	|d
<   | 
                    d           |                     dd           |                     dd           |                                  | j                            t          j        |                                                     dS # t"          $ r}| 
                    d           |                     dd           |                                  | j                            t          j        dt%          |          i                                                     Y d}~dS d}~ww xY w)z(Read Here project's JSON files from diskzE/Users/kimhansen/Desktop/03 Workspace/ceo-agents/here-community/data/)zmembers.jsonzevents.jsonzmetrics.jsonz.jsonr   Nmemberseventsr   )total_memberstotal_eventsstatsr   r   r   r   r   r   r   )r   existsr"   r#   r$   rw  r   r(  r	  rb   r   r   r   r   r   r   r   r   r   )	r   here_data_pathr  fnamefpathr'   rZ  r[  r   s	            r   r~   z"DashboardHandler._get_here_summary  sy   	E!"ijjNGH K K&.<<>> Ke K>Billgr : :;K K K K K K K K K K K K K K K kk)R00G[[2..F1;GT1J1J!QWPQ/9&$/G/G NFQ   GG
 s###^-?@@@:C@@@JTZ007799::::: 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es<   =F ,A7+F 7A;	;F >A;	?DF 
H5BH00H5c           	      $   	 ddl m}m}  | || j                  j                  }|                    ddg          d         }t                      }g }|r|r~|                    d                              d          	                    d|          
                    dd                              d	                                          }|j        pg }|                     d
           |                     dd           |                     dd           |                                  | j                            t'          j        d|i                                                     dS # t,          $ r}|                     d           |                     dd           |                                  | j                            t'          j        dt/          |          i                                                     Y d}~dS d}~ww xY w)zGet members for a communityr   r  rC  Nr@  r   rD   movedr   r   r   r   r   rZ  r   r   )r  r  r  r]   r  r   r   r   r   r   r  r   r   r7   r   r   r   r   r   r#   r   r   r   r   )	r   r  r  r  rC  r   rZ  r   r   s	            r   r   z'DashboardHandler._get_community_members  s	   	E77777777Xhhty11788F!::ntf==a@L#~~HG ,L ,!(?@@VC[[R55S7++U6]]WYY  !++s###^-?@@@:C@@@JTZG(<==DDFFGGGGG 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   E*E. .
H8BH

Hc           	         	 ddl m}m}  | || j                  j                  }|                    ddg          d         }t          |                    ddg          d                   }t                      }g }|r|r|                    d          	                    d          
                    d|                              d	d
                              dd
                              |                                          }|j        pg }|                     d           |                     dd           |                     dd           |                                  | j                            t)          j        d|i                                                     dS # t.          $ r}	|                     d           |                     dd           |                                  | j                            t)          j        dt1          |	          i                                                     Y d}	~	dS d}	~	ww xY w)z Get interactions for a communityr   r  rC  Nr   50rE  r   r   Tr   
created_atr   r   r   r   interactionsr   r   )r  r  r  r]   r  r   r  r   r   r   r   r   r   r   r7   r   r   r   r   r   r#   r   r   r   r   )
r   r  r  r  rC  r   r   rh  r   r   s
             r   r   z,DashboardHandler._get_community_interactions  s>   	E77777777Xhhty11788F!::ntf==a@L

7TF33A677E#~~HL 1L 1!(DEEVC[[R55U6U--U<dU33U5\\WYY   &{0bs###^-?@@@:C@@@JTZ(FGGNNPPQQQQQ 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   F*F. .
I8BI

Ic           	      T   	 ddl m}m} ddlm}  | || j                  j                  }|                    ddg          d         }t          |                    ddg          d                   }t                      }g }|r|rt                                                       ||          z
                      d	          }	|                    d
                              d                              d|                              dd                                          }
|
j        pg }|D ]8}|                    d          r|d         |	k     r|                    |           9|                     d           |                     dd           |                     dd           |                                  | j                            t1          j        d|i                                                     dS # t6          $ r}|                     d           |                     dd           |                                  | j                            t1          j        dt9          |          i                                                     Y d}~dS d}~ww xY w)zMembers not contacted in N daysr   r  r   rC  Nr   14r   r   r@  r   rD   r   last_interaction_dater   r   r   r   stale_membersr   r   )r  r  r  r   r   r]   r  r   r  r   r   r   r%  r   r   r   r   r7   r*  r   r   r   r   r   r#   r   r   r   r   )r   r  r  r   r  rC  r   r   r  cutoffr   all_membersr2  r   s                 r   r   z2DashboardHandler._get_community_interactions_stale  s    	E77777777******Xhhty11788F!::ntf==a@Lvzz&4&11!455D#~~HE (L (*,,1133iiT6J6J6JJTTU_``!(?@@VC[[R55R(++WYY	 
 %k/R$ ( (A55!899 (Q?V=WZ`=`=`Qs###^-?@@@:C@@@JTZ%(@AAHHJJKKKKK 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   HH 
J'BJ""J'c           	          	 ddl m}m}  | || j                  j                  }|                    ddg          d         }t                      }g }|rn|rl|                    d                              d          	                    d|          
                    dd	                                          }|j        pg }|                     d
           |                     dd           |                     dd           |                                  | j                            t%          j        d|i                                                     dS # t*          $ r}|                     d           |                     dd           |                                  | j                            t%          j        dt-          |          i                                                     Y d}~dS d}~ww xY w)zGet events for a communityr   r  rC  NrG  r   r   Tr   r   r   r   r   r[  r   r   r  r  r  r]   r  r   r   r   r   r   r   r   r7   r   r   r   r   r   r#   r   r   r   r   )	r   r  r  r  rC  r   r[  r   r   s	            r   r   z&DashboardHandler._get_community_events  s    	E77777777Xhhty11788F!::ntf==a@L#~~HF +L +!(>??VC[[R55U6U--WYY	 
  *s###^-?@@@:C@@@JTZ6(:;;BBDDEEEEE 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   EE 
G=&BG88G=c           	         	 ddl m}m}  | || j                  j                  }|                    ddg          d         }t                      }g }|rl|rj|                    d                              d          	                    d|          
                    d                                          }|j        pg }|                     d           |                     d	d
           |                     dd           |                                  | j                            t%          j        d|i                                                     dS # t*          $ r}|                     d           |                     d	d
           |                                  | j                            t%          j        dt-          |          i                                                     Y d}~dS d}~ww xY w)z#Get shared contacts for a communityr   r  rC  Nchl_community_contactsr   r  r   r   r   r   r-   r   r   rp  )	r   r  r  r  rC  r   r-   r   r   s	            r   r   z(DashboardHandler._get_community_contacts*  s   	E77777777Xhhty11788F!::ntf==a@L#~~HH -L -!(@AAVC[[R55U:&&WYY	 
 ";,"s###^-?@@@:C@@@JTZX(>??FFHHIIIII 	E 	E 	Es###^-?@@@JTZ#a&&(9::AACCDDDDDDDDD		Es   EE 
G;$BG66G;c           	         	 t                      }d}|ru|                    d                              d                              d|                              d                                          }|j        r|j        d         }|                     d           |                     dd	           |                     d
d           | 	                                 | j
                            t          j        d|i                                                     dS # t          $ r}t!          d|            |                     d           |                     dd	           |                     d
d           | 	                                 | j
                            t          j        dt#          |          i                                                     Y d}~dS d}~ww xY w)z/Get full enrichment for a specific activity logNrT  r   r   r   r   r   r   r   r   r[  z[ERROR] GET /api/enrichment: r   r   )r   r   r   r   r   r   r7   r   r   r   r   r   r#   r   r   r   r   r   )r   r   r   r[  r   r   s         r   r   z DashboardHandler._get_enrichmentK  s   	E#~~HJ 0!(<==VC[[R)?;;U1XXWYY	 
 ; 0!'QJs###^-?@@@:C@@@JTZz(BCCJJLLMMMMM 	E 	E 	E5!55666s###^-?@@@:C@@@JTZ#a&&(9::AACCDDDDDDDDD	Es   DD   
G)*B4G$$G)c           	         	 ddl m}m}  | || j                  j                  }|                    ddg          d         }t                      }g }|r|                    d                              d          	                    dd          
                    d          
                    d	          }|r|	                    d|          }|                                }|j        pg }|                     d
           |                     dd           |                     dd           |                                  | j                            t%          j        d|i                                                     dS # t*          $ r}	t-          d|	            |                     d           |                     dd           |                     dd           |                                  | j                            t%          j        dt/          |	          i                                                     Y d}	~	dS d}	~	ww xY w)z'Get active spots, optional sport filterr   r  sportNchl_sport_spotsr   r  Tdrive_time_minutesr   r   r   r   spotsz[ERROR] GET /api/play/spots: r   r   )r  r  r  r]   r  r   r   r   r   r   r   r   r7   r   r   r   r   r   r#   r   r   r   r   r   )
r   r  r  r  sport_filterr   rx  r  r   r   s
             r   r   z DashboardHandler._get_play_spotsg  sN    	E77777777Xhhty11788F!::gv66q9L#~~HE * '899VC[[RT**U7^^U/00	    <!HHWl;;E)rs###^-?@@@:C@@@JTZ%(899@@BBCCCCC 	E 	E 	E5!55666s###^-?@@@:C@@@JTZ#a&&(9::AACCDDDDDDDDD	Es   FF 
IB4I		Ic           	         	 ddl m}m}  | || j                  j                  }|                    ddg          d         p|                    ddg          d         }t                      }g }|r|                    d                              d          	                    d          	                    dd	
          }|r|
                    d|          }|                                }|j        pg }|                     d           |                     dd           |                     dd           |                                  | j                            t%          j        d|i                                                     dS # t*          $ r}	t-          d|	            |                     d           |                     dd           |                     dd           |                                  | j                            t%          j        dt/          |	          i                                                     Y d}	~	dS d}	~	ww xY w)z/Get goals/focus areas, optional activity filterr   r  rf  Nru  chl_sport_goalsr   rg  Tr   r   r   r   r   goalsz[ERROR] GET /api/play/goals: r   r   )r  r  r  r]   r  r   r   r   r   r   r   r   r7   r   r   r   r   r   r#   r   r   r   r   r   )
r   r  r  r  activity_filterr   r|  r  r   r   s
             r   r   z DashboardHandler._get_play_goals  sb   	E77777777Xhhty11788F$jjdV<<Q?a6::gX\W]C^C^_`CaO#~~HE 
* '899VC[[U:&&U<dU33 
 # B!HHZAAE)rs###^-?@@@:C@@@JTZ%(899@@BBCCCCC 	E 	E 	E5!55666s###^-?@@@:C@@@JTZ#a&&(9::AACCDDDDDDDDD	Es   FF 
IB4IIc           	         	 t                      }g }|rV|                    d                              d                              d                                          }|j        pg }|                     d           |                     dd           |                     dd           |                                  | j	        
                    t          j        d|i                                                     dS # t          $ r}t          d	|            |                     d
           |                     dd           |                     dd           |                                  | j	        
                    t          j        dt!          |          i                                                     Y d}~dS d}~ww xY w)z$Get recovery protocols from Supabasechl_recovery_protocolsr   sequence_orderr   r   r   r   	protocolsz%[ERROR] GET /api/recovery/protocols: r   r   N)r   r   r   r   r   r7   r   r   r   r   r   r#   r   r   r   r   r   )r   r   r  r   r   s        r   r   z(DashboardHandler._get_recovery_protocols  s   	E#~~HI .!(@AAVC[[U+,,WYY  #K-2	s###^-?@@@:C@@@JTZi(@AAHHJJKKKKK 	E 	E 	E=!==>>>s###^-?@@@:C@@@JTZ#a&&(9::AACCDDDDDDDDD	Es   C=D 
G
B4GG
c           	         	 t                      }g }|rj|                    d                              d                              dd                              d                                          }|j        pg }|                     d           |                     dd           |                     d	d           | 	                                 | j
                            t          j        d
|i                                                     dS # t          $ r}t!          d|            |                     d           |                     dd           |                     d	d           | 	                                 | j
                            t          j        dt#          |          i                                                     Y d}~dS d}~ww xY w)z#Get training programs from Supabasechl_training_programsr   r   Tday_of_weekr   r   r   r   programsz$[ERROR] GET /api/training/programs: r   r   N)r   r   r   r   r   r   r7   r   r   r   r   r   r#   r   r   r   r   r   )r   r   r  r   r   s        r   r   z'DashboardHandler._get_training_programs  s   	E#~~HH -!(?@@VC[[R$''U=))WYY	 
 ";,"s###^-?@@@:C@@@JTZX(>??FFHHIIIII 	E 	E 	E<<<===s###^-?@@@:C@@@JTZ#a&&(9::AACCDDDDDDDDD	Es   DD 
GB4GGc           	         	 t          | j        d                   }| j                            |          }t	          j        |                    d                    }t                      }|r|                    d          }t                      
                                |d<   |rmd |                                D             }|                    d                              |                              d|                                          }nP|                    dd           |                    d                              |                                          }|j        r|j        d         n|}|                     d	           |                     d
d           |                     dd           |                                  | j                            t	          j        |                                                     dS |                     d           |                     d
d           |                     dd           |                                  | j                            t	          j        ddi                                                     dS # t4          $ r}	t7          d|	            |                     d           |                     d
d           |                     dd           |                                  | j                            t	          j        dt9          |	          i                                                     Y d}	~	dS d}	~	ww xY w)zUpsert a recovery protocolContent-Lengthutf-8r   
updated_atc                 2    i | ]\  }}|d k    |dk    ||S r   rg  r
   r   kr  s      r   
<dictcomp>z<DashboardHandler._post_recovery_protocol.<locals>.<dictcomp>  2    "d"d"dDAqAIIRSWcRcRc1aRcRcRcr   r  Nr   r   r   r   r   r   r   r   Supabase not availablez&[ERROR] POST /api/recovery/protocols: r  headersrfilereadr#   r)  decoder   r   r   	isoformatr  r   updater   r   popinsertr7   r   r   r   r   r   r   r   r   r   r   )
r   content_lengthr8  r7   r   protocol_idupdate_datar   savedr   s
             r   _post_recovery_protocolz(DashboardHandler._post_recovery_protocol  s'   ,	E .>!?@@N:??>22D:dkk'2233D#~~H ["hhtnn%5%7%7%A%A%C%C\" #"d"dDJJLL"d"d"dK%^^,DEE,,D+..  F HHT4(((%^^,DEE   +1+?A4""3'''  1CDDD  !>DDD  """
  E!2!2!9!9!;!;<<<<<""3'''  1CDDD  !>DDD  """
  W6N,O!P!P!W!W!Y!YZZZZZ 	E 	E 	E>1>>???s###^-?@@@:C@@@JTZ#a&&(9::AACCDDDDDDDDD	E    HJ' BJ' '
M01B4M++M0c           	         	 t          | j        d                   }| j                            |          }t	          j        |                    d                    }t                      }|r|                    d          }t                      
                                |d<   |rmd |                                D             }|                    d                              |                              d|                                          }nP|                    dd           |                    d                              |                                          }|j        r|j        d         n|}|                     d	           |                     d
d           |                     dd           |                                  | j                            t	          j        |                                                     dS |                     d           |                     d
d           |                     dd           |                                  | j                            t	          j        ddi                                                     dS # t4          $ r}	t7          d|	            |                     d           |                     d
d           |                     dd           |                                  | j                            t	          j        dt9          |	          i                                                     Y d}	~	dS d}	~	ww xY w)zUpsert a training programr  r  r   r  c                 2    i | ]\  }}|d k    |dk    ||S r  r
   r  s      r   r  z;DashboardHandler._post_training_program.<locals>.<dictcomp> 	  r  r   r  Nr   r   r   r   r   r   r   r   r  z%[ERROR] POST /api/training/programs: r  )
r   r  r8  r7   r   
program_idr  r   r  r   s
             r   _post_training_programz'DashboardHandler._post_training_program	  s'   *	E .>!?@@N:??>22D:dkk'2233D#~~H [!XXd^^
%5%7%7%A%A%C%C\" 
#"d"dDJJLL"d"d"dK%^^,CDD,,D*--  F
 HHT4(((%^^,CDD   +1+?A4""3'''  1CDDD  !>DDD  """
  E!2!2!9!9!;!;<<<<<""3'''  1CDDD  !>DDD  """
  W6N,O!P!P!W!W!Y!YZZZZZ 	E 	E 	E=!==>>>s###^-?@@@:C@@@JTZ#a&&(9::AACCDDDDDDDDD	Er  c                   W | j         dk    r	 t          | j        d                   }| j                            |          }t          j        |          }t                      }t          j	        |
                                 |                    dd                                                                                     d d         }||                    d          |                    d          |                    dd          |                    d	d          d
dd}t                      }|r:|                    d                              |                                           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        |                                                     d S # t2          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j                             d          r| j                             d          r| j                             d          d         }	 t                      }|rP|                    d                              ddi                              d|                                           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        ddi                                                     d S # t2          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j                             d          r| j                             d          r| j                             d          d         }	 t                      }|rP|                    d                              ddi                              d|                                           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        ddi                                                     d S # t2          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         dk    r	 t          | j        d                   }| j                            |          }t          j        |          }i }	|                                 D ]\  }
}|||	|
<   d |	vr$t                                          d          |	d <   d!|	v retC          |	d!         tD                    rJd" |	d!                                          D             }|rt          j        |          nd |	d!<   |	d!         |	d!= d#|	v r8tC          |	d#         tD                    rt          j        |	d#                   |	d#<   d$|	v r8tC          |	d$         tD                    rt          j        |	d$                   |	d$<   t                      }|r:|                    d%                              |	                                           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        d|	d&                                                     d S # t2          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         d'k    r	 t          | j        d                   }| j                            |          }t          j        |          }tG                      }t                      }|                    d(          }|sd)|v r|d)         }|                    d*i                               |          }|s|                     d+           |                     dd           |                     dd           |                                  | j                            t          j        d,| d-d.                                                     d S |s|                     d+           |                     dd           |                     dd           |                                  | j                            t          j        dd/i                                                     d S ||                    d0i           vr|                     d+           |                     dd           |                     dd           |                                  | j                            t          j        d1| d2d.                                                     d S d3|v r	 tI          j%        |d3         &                    d4d5                    }|                    d          }|                    d          }n#  |                    d          }|                    d          }Y nUxY w|                    d |                    d                    }|                    d6|                    d                    }t          j	        | | | |                    d7d8                                                                                     d d9         }|||||                    d7d8          |                    d:          p|                    d;d<          d=z  pd |                    d>          d?}d@ |                                 D             }t                      }|r:|                    dA          '                    |                                           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        d|d&                                                     d S # t2          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         dBk    r	 t          | j        d                   }| j                            |          }t          j        |          }t                      }|                    d          pit          j	        |
                                 |                    dd                                                                                     d d9         }||                    dCd          |                    dDd<          |                    dd          |                    d	d          |                    dEd          |                    dFd          |                    dGd          dH}t                      }|r:|                    dI                              |                                           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        d|dJ                                                     d S # t2          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         dKk    rw	 t          | j        d                   }| j                            |          }t          j        |          }t                      }|                    d          pit          j	        |
                                 |                    dLd                                                                                     d d9         }||                    dLd          |                    dMd          |                    dNd          |                    dOd          |                    dPd          |                    dQd          |                    dd          |                    dDd<          |                    dR          |                    dS          |                    dT          |                    dGd          dU}dV |                                 D             }t                      }|r:|                    dW                              |                                           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        d|dX                                                     d S # t2          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         dYk    r	 t          | j        d                   }| j                            |          }t          j        |          }t                      }|                    d          pit          j	        |
                                 |                    dZd                                                                                     d d9         }||                    dZd          |                    dd          |                    d[d\          |                    d]d          |                    d	d          |                    d^d          |                    d_g           |                    d`g           |                    dd          |                    da|                    d                    |                    dDd<          |                    dGd          db}dc |                                 D             }t                      }|r:|                    dd                              |                                           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        d|dJ                                                     d S # t2          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         dek    rT	 t          | j        d                   }| j                            |          }t          j        |          }t                      }|                    d |                    d                    }|                    dfg           }t                      }g }|ro|rl|D ]h}t          j	        | |                    dgd                                                                                     d d9         }|||                    dgd          |                    d]d          |                    dGd          dh}|                    di          '                    |djk                                           |                    dd                              d]|                    d]d          i                              d|                    dgd                                                     |(                    |           j|                     d           |                     dd           |                     dd           |                                  | j                            t          j        d|dl                                                     d S # t2          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         dmk    r	 t          | j        d                   }| j                            |          }t          j        |          }|                    d          put          j	        t                      
                                 |                    d[d                                                                                     d d9         }||                    d[d          |                    dnd          |                    dod          |                    dpd          |                    dqd          |                    dGd          dr}tS                      } | ds         (                    |           tU          |            |                     d           |                     dd           |                     dd           |                                  | j                            t          j        d|dt                                                     d S # t2          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         duk    r	 t          | j        d                   }| j                            |          }t          j        |          }t                      }|                    d          pit          j	        |
                                 |                    d[d                                                                                     d d9         }||                    d[d          |                    dvd          |                    dwd<          |                    dxdy          |                    dDd<          |                    dFd          |                    dGd          dz}t                      }|r:|                    d{                              |                                           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        d|dJ                                                     d S # t2          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         d|k    r	 t          | j        d                   }| j                            |          }t          j        |          }|                    d}d          }!|                    d~d          }"d }#tW                      }$|$                    dg           WWfd}%g }&|!,                                                    d          D ]}'|',                                }'|'s |#|'          }(|(r |%|(d	                   \  })}*t          j	        |(d           d|(d	          d|(d          d|(                    dd                                                                                     d d         }+|+|(d<   |)|(d[<   |*|(d<   |"|(d~<   |&(                    |(           |&r	t                      }t[                      },t[                      }-|rd |&D             }.t]          d<t_          |.          d          D ]}/|.|/|/dz            }0|                    d          0                    d          1                    d|0                                          }1|,                    d |1j2        pg D                        tg          t[          d |&D                                 }2t]          d<t_          |2          d          D ]}/|2|/|/dz            }3|                    d          0                    d          1                    d |3                                          }1|1j2        pg D ];}4|4d          |4d	         ti          |4d                   f}5|-5                    |5           <|&D ]D}(|(d         |,v |(d<   |(d         s-|(d          |(d	         ti          |(d                   f}5|5|-v rd|(d<   Etm          d |&D                       }6tm          d |&D                       }7|                     d           |                     dd           |                     dd           |                                  | j                            t          j        |&|6|7d                                                     d S # t2          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         dk    r	 t          | j        d                   }| j                            |          }t          j        |          }|                    dg           }8t                      }d<}|r|8rg }9|8D ]u}(|(d         |(d          |(d	         |(d         |(                    d[d          |(                    dd          |(                    d~d          d}:|9(                    |:           vt[                      };g }<|9D ]<}:|:d         |;vr0|;5                    |:d                    |<(                    |:           =|<}9|                    d          '                    |9dk                                          }1t_          |9          }|                     d           |                     dd           |                     dd           |                                  | j                            t          j        d|dl                                                     d S # t2          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         dk    r	 t          | j        d                   }| j                            |          }t          j        |          }t                      }|                    d          pit          j	        |
                                 |                    dLd                                                                                     d d9         }=|=|                    dd          |                    dLd          |                    d	d          |                    dd          |                    d>          |                    dDd<          |                    dFd          d}>d |>                                 D             }>t                      }|r:|                    d                              |>                                           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        d|>d                                                     d S # t2          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         dk    r	 t          | j        d                   }| j                            |          }t          j        |          }t          j	        |                    dd           d|                    d d           d|                    dd                                                                                     d d9         }?|?|                    dd          |                    d t                                          d                    |                    dd<          |                    dGd          d}t                      }|r:|                    d                              |                                           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        d|d&                                                     d S # t2          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         dk    r	 t          | j        d                   }| j                            |          }t          j        |          }t                      }|                    d          pit          j	        |
                                 |                    d d                                                                                     d d9         }@i d|@d |                    d |                    d                    d|                    dd          d|                    dd          d|                    dd          d|                    dd          d|                    dd          d|                    d          d|                    dd<          d|                    dd<          d|                    dd<          d|                    dd<          d|                    dd<          d|                    d          d7|                    d7d          dG|                    dGd          }Ad |A                                 D             }At                      }|r:|                    d          '                    |A                                           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        d|Ad                                                     d S # t2          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j                             d          r| j                             d          r| j                             d          d         }@	 t          | j        d                   }| j                            |          }t          j        |          }|                    dg           }Bg }t                      }|r|Brg }9|BD ]}C|C                    d          pXt          j	        |@ d|C                    dLd                                                                                     d d9         }D|D|@|C                    dLd          |C                    dd          |C                    d[d          |C                    dDd<          |C                    d          |C                    dd          |C                    d          |C                    d          |C                    d          |C                    d          |C                    dd          |C                    dGd          d}:d |:                                 D             }:|9(                    |:           |                    d¦          '                    |9dìk                                           |9}|                     d           |                     dd           |                     dd           |                                  | j                            t          j        dt_          |          dl                                                     d S # t2          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j                             d          r| j                             dĦ          r| j                             d          d         }@	 t          | j        d                   }| j                            |          }t          j        |          }t                      }|                    dd|v r|gng           }Eg }t                      }|r|Er|ED ]}F|F                    d          pmt          j	        |@ d|
                                 d|F                    dd                                                                                     d d9         }G|G|@|F                    dd          |F                    d	d          |F                    d[dƦ          |F                    ddȦ          |F                    dg           |F                    ddʦ          |F                    d˦          |F                    dd          d͜
}:d΄ |:                                 D             }:|                    dϦ          '                    |:                                           |(                    |:           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        dt_          |          dl                                                     d S # t2          $ r}|                     d           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         dk    r	 t          | j        d                   }| j                            |          }t          j        |          }t                      }|                    d          pit          j	        |
                                 |                    dLd                                                                                     d d9         }Hi d|Hd|                    dѦ          dL|                    dLd          d|                    dd          do|                    dod          d|                    dd          d|                    dd          d|                    dd          d|                    dg           d|                    dg           d|                    dd          d|                    dd          d|                    dڦ          d|                    dd          d|                    dd          dG|                    dGd          }Id܄ |I                                 D             }It                      }|r:|                    dݦ                              |I                                           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        |I                                                     d S # t2          $ r}to          d|            |                     d           |                     dd           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         dk    r	 t          | j        d                   }| j                            |          }t          j        |          }t                      }t          j	        |
                                 |                    d	d                                                                                     d d9         }J|J|                    dѦ          |                    dg           |                    d |                    d                    |                    dd          |                    d	d          |                    d          |                    dGd          d}Kd |K                                 D             }Kt                      }|r|                    d                              |K                                           |                    dg           }L|K                    d |                    d                    }M|LD ]c}N	 |                    dݦ                              d|Mi                              d|N                                           T# t2          $ r Y `w xY w|                     d           |                     dd           |                     dd           |                                  | j                            t          j        |K                                                     d S # t2          $ r}to          d|            |                     d           |                     dd           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         dk    rI	 t          | j        d                   }| j                            |          }t          j        |          }t                      }t          j	        |
                                 |                    dLd                                                                                     d d9         }O|O|                    dѦ          |                    dLd          |                    d           |                    d6d          |                    d	d          |                    dg           |                    dd          |                    d[d          |                    dd          d
}Pd |P                                 D             }Pt                      }|r:|                    d                              |P                                           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        |P                                                     d S # t2          $ r}to          d|            |                     d           |                     dd           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         dk    r 	 t          | j        d                   }| j                            |          }t          j        |          }t                      }t          j	        |
                                 |                    dLd                                                                                     d d9         }||                    dѦ          |                    d[d          |                    dLd          |                    dod          |                    dqd          |                    d	d          |                    dd          d}d |                                 D             }t                      }|r:|                    d                              |                                           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        |                                                     d S # t2          $ r}to          d|            |                     d           |                     dd           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         dk    r	 t          | j        d                   }| j                            |          }t          j        |          }t                      }t          j	        |
                                 |                    d(d           |                    d d                                                                                     d d9         }Q|Q|                    d          |                    d |                    d                    |                    d(          |                    d          |                    d:          |                    d          |                    d          |                    dG          |                    d          |                    d          |                    d          |                    d          |                    d           |                    d          d}Rd |R                                 D             }Rt                      }|r;|                    d                              |R                                           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        |R                                                     d S # t2          $ r}to          d|            |                     d           |                     dd           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         dk    r&	 t          | j        d                   }| j                            |          }t          j        |          }t                      }t          j	        |
                                 |                    dLd                                                                                     d d9         }S|S|                    d          |                    dL          |                    d	          |                    dd<          |                    d	          |                    d
d          |                    d          d}Td |T                                 D             }Tt                      }|r;|                    d                              |T                                           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        |T                                                     d S # t2          $ r}to          d|            |                     d           |                     dd           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         dk    r	 t          | j        d                   }| j                            |          }t          j        |          }t                      }t          j	        |
                                 |                    dd                                                                                     d d9         }U|U|                    d(          p|                    d          |                    d          |                    dd          |                    dG          d}Vd |V                                 D             }Vt                      }|r;|                    d                              |V                                           |                     d           |                     dd           |                     dd           |                                  | j                            t          j        |V                                                     d S # t2          $ r}to          d|            |                     d           |                     dd           |                     dd           |                                  | j                            t          j        dt5          |          i                                                     Y d }~d S d }~ww xY w| j         dk    r| 8                                 d S | j         dk    r| 9                                 d S | :                    d           d S (  Nz/api/capturer  r   r      r   %H:%M:%SUntitleddescriptionwebr   )r   r   r   r   r  r   rD   r   r   r   r   r   r   r   r   /api/capture/z/archiverF   rH   rD   rC   r   okTz
/unarchivez/api/bioager   r   c                     i | ]
\  }}|||S r   r
   r  s      r   r  z,DashboardHandler.do_POST.<locals>.<dictcomp>	  s$    ggg41aYZYf!QYfYfYfr   domain_scoresdata_freshnessr   )r  entryz/api/activityrf  packager   r  zUnknown package: z#Add mapping to activity-config.json)r   hintzMissing 'activity' or 'package'r   zUnknown activity: z)Add to activities in activity-config.json	timestampZz+00:00r   r   tasker   re  duration_secondsr   <   metadata)r   r   r   rf  r   re  r  c                     i | ]
\  }}|||S r   r
   r  s      r   r  z,DashboardHandler.do_POST.<locals>.<dictcomp>
      III$!Q1=A===r   rS  rJ   r  r   	frequencyr  rW  )r   r  r   r   r  r  r  rW  r  )r  r  rK   r   dosetimingpurposeformbrandexperiment_idrM  expected_duration)r   r   r  r  r  r  r  rD   r   r  rM  r  rW  c                     i | ]
\  }}|||S r   r
   r  s      r   r  z,DashboardHandler.do_POST.<locals>.<dictcomp>n
  s    SSStq!Q]a]]]r   r  )r  
supplementrL   	body_arear  injuryseverityprotocolaggravated_by	helped_bystarted_date)r   r  r   r  r  r  r  r  r  rD   r  r   rW  c                     i | ]
\  }}|||S r   r
   r  s      r   r  z,DashboardHandler.do_POST.<locals>.<dictcomp>
      GGGA1r   r  rN   entriesr  )r   r   r  r  rW  r  zdate,focus_id)on_conflict)r  r  rI   personphoneplacewebsite)r   r  r  r  r  r  rW  r-   )r  contactrO   r  r  r  variable)r   r  r  r  r  r   r  rW  r  z/api/transactions/uploadcsv_contentsource_filez
web-uploadc                 (   g }d}d}| D ]V}|dk    r| }|dk    r?|s=|                     |                                                    d                     d}Q||z  }W|                     |                                                    d                     t          |          dk    r|d         }|d                             dd                              dd          }|d	         }	 t	          |          }dd
lm}	 |	                    |d                              d          }
t          |          dk    rB|d                             dd                              dd                                          nd}|
|||dS #  Y d S xY wd S )Nr   F",rH   r   r   +r3   r   z%d/%m/%Yr   rG   )r   r  r  balance)r*  striprb   rw  r   r   ru  r%  )linepartsrh  	in_quotescharr  
amount_strr  r  dtr   r  s               r   parse_csv_linez0DashboardHandler.do_POST.<locals>.parse_csv_line7  s   E G %I $ , ,3;;,5II!S[[[!LL)>)>s)C)CDDD&(GG#tOGGLL!6!6s!;!;<<<5zzQ#(8%*1X%5%5c2%>%>%F%FsB%O%O
&+Ah(%*:%6%6F??????#%;;x#D#D#M#Mj#Y#YD\_`e\f\fjk\k\keAh&6&6sB&?&?&G&GR&P&P&V&V&X&X&XqsG,0FS^kr#s#ss(#'444s   .BF
 
Fr<   c                     D ]f}|                     dd          }t          j        || t          j                  r.|                     dd          |                     dd          fc S gdS )Npatternr   r  r:   rW  )r:   r   )r   research
IGNORECASE)r  mappingr  r<   s      r   
categorizez,DashboardHandler.do_POST.<locals>.categorizeV  sz    #+ ^ ^")++i"<"<9Wk2=II ^#*;;z7#C#CW[[QXZ\E]E]#]]]]^&;r   
|r  r  r   category_notesc                     g | ]
}|d          S r   r
   r   ts     r   r   z,DashboardHandler.do_POST.<locals>.<listcomp>u  s    '@'@'@A$'@'@'@r   r  r  c              3   &   K   | ]}|d          V  dS )r   Nr
   )r   r   s     r   r  z+DashboardHandler.do_POST.<locals>.<genexpr>}  s&      /U/UA$/U/U/U/U/U/Ur   c              3   &   K   | ]}|d          V  dS )r   Nr
   r  s     r   r  z+DashboardHandler.do_POST.<locals>.<genexpr>  s&      1L1L!F)1L1L1L1L1L1Lr   r  zdate,description,amountis_duplicatec              3   D   K   | ]}|                     d           dV  dS r  r   Nr  r  s     r   r  z+DashboardHandler.do_POST.<locals>.<genexpr>  s3      OOa~9N9NOOOOOOOr   c              3   D   K   | ]}|                     d           dV  dS r  r  r  s     r   r  z+DashboardHandler.do_POST.<locals>.<genexpr>  s3      KKaQUU>5J5JKKKKKKKr   )r  	new_countduplicate_countz/api/transactions/confirmr  r:   )r   r   r  r  r  r  r  rP   asset_classcurrencyAUD)r   r  r   r  r  r  r   r  c                     i | ]
\  }}|||S r   r
   r  s      r   r  z,DashboardHandler.do_POST.<locals>.<dictcomp>  r  r   r  )r  r  rQ   r  r   )r   r  r   r   rW  r  rR   lab_name
ordered_by
panel_nameanalysis_reportanalysis_summaryhealth_scoremarkers_optimalmarkers_goodmarkers_warningmarkers_highmarkers_lowcontext_snapshotr   c                     i | ]
\  }}|||S r   r
   r  s      r   r  z,DashboardHandler.do_POST.<locals>.<dictcomp>B  r  r   r   )r  r  rS   z/markersr  r   r   r   r   r   r   good)r   r   r   r   r  r   r   r   r   r   r   r   rD   rW  c                     i | ]
\  }}|||S r   r
   r  s      r   r  z,DashboardHandler.do_POST.<locals>.<dictcomp>v      MMM1q}q!}}}r   r   zpanel_id,namez/actionsr  	lifestyler  mediumrelated_markersr  due_dateoutcome_notes)
r   r   r   r  r  r  r  rD   r  r  c                     i | ]
\  }}|||S r   r
   r  s      r   r  z,DashboardHandler.do_POST.<locals>.<dictcomp>  r  r   r  rT   rC  unit_or_houseemailpartner_namekids	interestsr   offersneedsbirthday	photo_urlc                 *    i | ]\  }}||dk    ||S Nr   r
   r  s      r   r  z,DashboardHandler.do_POST.<locals>.<dictcomp>  s(    WWW41aQ]qTVww!Qwwwr   r@  z%[ERROR] POST /api/community-members: rU   
member_idstypechatquality)r   rC  r   r   r!  r  r#  rW  c                 *    i | ]\  }}||dk    ||S r  r
   r  s      r   r  z,DashboardHandler.do_POST.<locals>.<dictcomp>   s.    aaa1q}YZ^`Y`Y`q!Y`Y`Y`r   rE  rk  z*[ERROR] POST /api/community-interactions: rV   attendee_idsidea	gathering)
r   rC  r   r   r   r  r%  rD   r  r  c                 *    i | ]\  }}||dk    ||S r  r
   r  s      r   r  z,DashboardHandler.do_POST.<locals>.<dictcomp>7  s(    UUU$!Q1=QRTWWAWWWr   rG  z$[ERROR] POST /api/community-events: rW   recommended_by)r   rC  r  r   r  r  r  r)  c                 *    i | ]\  }}||dk    ||S r  r
   r  s      r   r  z,DashboardHandler.do_POST.<locals>.<dictcomp>`  s.    YYYDAqq}QRVXQXQX1aQXQXQXr   rr  z&[ERROR] POST /api/community-contacts: z/api/enrichmentr   rV  rU  rY  rX  rZ  strainavg_hrmax_hrcalories_kj)r   r   r   rf  rV  re  rU  rY  rW  rX  rZ  r+  r,  r-  r.  c                     i | ]
\  }}|||S r   r
   r  s      r   r  z,DashboardHandler.do_POST.<locals>.<dictcomp>  s    MMMDAqq}1a}}}r   rT  z[ERROR] POST /api/enrichment: rY   ru  rw  best_conditions
difficultyintermediate
risk_notes)r   ru  r   r  rw  r0  r1  r3  c                     i | ]
\  }}|||S r   r
   r  s      r   r  z,DashboardHandler.do_POST.<locals>.<dictcomp>  r  r   rv  z[ERROR] POST /api/play/spots: rZ   goal)r   rf  r5  rD   rW  c                     i | ]
\  }}|||S r   r
   r  s      r   r  z,DashboardHandler.do_POST.<locals>.<dictcomp>  r  r   r{  z[ERROR] POST /api/play/goals: r[   r\     );r]   r  r  r  r  r#   r)  r   hashlibmd5r  r   r   	hexdigestr%  r   r   r  r   r   r   r   r   r   r   r   r   ra   endswithrc   r  r   r  r(  r,  r(   r   fromisoformatrw  upsertr*  r0   r8   r?   r  r+  r   rb   r   r  r7   r	  r   rr  r'  r   r  r  
send_error)Xr   r  	post_datar7   r   
capture_idcapturer   r   bioage_entryr  r  r  rO  rf  r  tsr  time_stractivity_idr  item_idr  supp_idr  checkin_dater  r  
checkin_idcheckin
contact_idr  
admin_datar  r  r  mcr  r  r  r  r  rW  txn_idexisting_idsexisting_keysids_to_checkr  batchr   dates_in_batchbatch_datesexistingr   r  	dup_countr  rowsrowseen_idsunique_rowsr  r  value_idr   r  markers_listr2  	marker_idactions_listr  	action_id	member_idmemberinteraction_idinteractionr   interaction_datemidevent_idevent
session_idsessionspot_idrV  goal_idr5  r<   sX                                                                                          @r   do_POSTzDashboardHandler.do_POSTA	  sP   9&&&I!$T\2B%C!D!D JOON;;	z),, '(($[}}?"(=(=??FFHH )++bqb"

 %LL44LL44!XXgz::#'88M2#>#>#&  (>> MNN>2299'BBJJLLL ""3'''  1CDDD  !>DDD  """
  G!4!4!;!;!=!=>>>>> I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y!!/22 N	!ty7I7I*7U7U N	!--a0JI'>> #NN>22: 677D*-- ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y!!/22 w	!ty7I7I,7W7W w	!--a0JI'>> #NN>228 455D*-- ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y-''.I!$T\2B%C!D!D JOON;;	z),,  " JJLL , ,DAq}*+Q --+;+=+=+F+Fz+R+RL( (<77J|ThGiko<p<p7gg<8L+M+S+S+U+UgggBKM9WBSWL!56#$89A()=> #l22z,B_ae7f7f248J|O?\4]4]L1 $|33
<P`Cacg8h8h359ZM]@^5_5_L!12 (>> UNN#455<<\JJRRTTT""3'''  1CDDD  !>DDD  """
  4,,O,O!P!P!W!W!Y!YZZZZZ I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y/))\I!$T\2B%C!D!D JOON;;	z),,,..&((  88J// I$5$5"9oG%zz*;R@@DDWMMH# 	**3///((9KLLL(()FLLL((***
((%B%B%B$I5 5 * * "688% % %  &&s+++$$^5GHHH$$%BCHHH$$&&&J$$TZ:[0\%]%]%d%d%f%fgggF 6::lB#?#???&&s+++$$^5GHHH$$%BCHHH$$&&&J$$TZ!@h!@!@ K1 1 & & vxx! ! ! F $&&<%3D4E4M4McS[4\4\]]#%;;z#:#:#%;;z#:#:<#&<<
#;#;#&<<
#;#;#xxZ0H0HIIH#xxZ0H0HIIH &kSS8STXXh5Q5QSSZZ\\ )++bqb"
 &$$ ("hhx::(,1C(D(D(uQcefHgHgkmHm(uqu $ 4 4  JI%++--III (>> PNN#677>>uEEMMOOO""3'''  1CDDD  !>DDD  """
  4%,H,H!I!I!P!P!R!RSSSSS I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y+%%#I!$T\2B%C!D!D JOON;;	z),,&((((4.. "GK}}?"(=(=??FFHH- -)++bqb-"
 "!%+r!:!:"&((<";";!XXgr22#'88M2#>#>!%+r!:!:!%+t!<!<!XXgr22	 	 (>> LNN#344;;DAAIIKKK""3'''  1CDDD  !>DDD  """
  4,F,F!G!G!N!N!P!PQQQQQ I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y,,,*I!$T\2B%C!D!D JOON;;	z),,&((((4.. "GK}}>(<(<>>EEGG- -)++bqb-"
 " HHVR00 HHVR00"hhx44#xx	266 HHVR00!XXgr22"hhx::"&((<";";%)XXo%>%>"&((<"8"8)-2E)F)F!XXgr22 
  TSz/?/?/A/ASSS
'>> SNN#455<<ZHHPPRRR""3'''  1CDDD  !>DDD  """
  4z,R,R!S!S!Z!Z!\!\]]]]] I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y+++)I!$T\2B%C!D!D JOON;;	z),,&((((4.. "GK}}Cb(A(ACCJJLL- -)++bqb-"
 "!%+r!:!:!XXgr22 $X > > $Q 7 7#'88M2#>#> $R 8 8%)XXor%B%B!%+r!:!:"hhx::$(HH^S\\*=U=U$V$V"&((<";";!XXgr22  HGGGG'>> LNN#344;;DAAIIKKK""3'''  1CDDD  !>DDD  """
  4,F,F!G!G!N!N!P!PQQQQQ I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y....I!$T\2B%C!D!D JOON;;	z),,&((#xxZ0H0HII((9b11'>> . .!( . .%,[+HUYYz2-F-FHHOOQQ& &#)++bqb&*

 #-$0(-		*b(A(A(-		*a(@(@%*YYw%;%;# # !':;;BB# C  !'))) !'788#VZ:q1I1I$JKKReii
B&?&?@@$WYYYW----""3'''  1CDDD  !>DDD  """
  4%,H,H!I!I!P!P!R!RSSSSS I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y,&&"I!$T\2B%C!D!D JOON;;	z),, "XXd^^ "w{'))3355Qtxx
B7O7OQQXXZZ0 0)++bqb0"

 % $R 8 8"hhx44!XXgr22!XXgr22#xx	266!XXgr22  -..
:&--g666 ,,,""3'''  1CDDD  !>DDD  """
  4G,L,L!M!M!T!T!V!VWWWWW I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y-''#I!$T\2B%C!D!D JOON;;	z),,&((((4.. "GK}}BR(@(@BBIIKK- -)++bqb-"
 " $R 8 8$(HH^R$@$@&*hh/?&C&C#'88M:#F#F"&((<";";!%+t!<!<!XXgr22	 	 (>> HNN<0077==EEGGG""3'''  1CDDD  !>DDD  """
  4,F,F!G!G!N!N!P!PQQQQQ I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y444uI!$T\2B%C!D!D JOON;;	z),,"hh}b99"hh}lCC     8 -..66*b11' ' ' ' ' '--//55d;; + +D::<<D ! (...C 	+%/ZM0B%C%C
U!("6{jjS-?jj#h-jjRURYRYZcegRhRhjjqqss" "#)++crc"+ %+D	*-J05,--8M*c***   ;+~~H#&55L$'EEM 7'@'@'@'@'@!&q#l*;*;R!@!@ V VA$01R4$8E%-^^4F%G%G!'!$T5!1!1!( # )///U/U&+BSQS/U/U/UUUUU *.c1L1LV1L1L1L.L.L)M)M!&q#n*=*=r!B!B 7 7A*81R4*@K%-^^4F%G%G!'(A!B!B!$V[!9!9!( # .4[->B 7 7'/'7-9PRWX`aiXjRkRk&l - 1 1# 6 6 6 67  & ; ;.1$i<.GN+">2 ;#&v;M0BE#h-DXDX"YC"m336:N 3OO6OOOOO	KK6KKKKK	""3'''  1CDDD  !>DDD  """
  $*!*'0- - " " 688	      I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y555/I!$T\2B%C!D!D JOON;;	z),,#xx;;'>> & &D+ 
) 
)"%d)$'K+.}+=&)(m(+
G(D(D.1gg6F.K.K+.77="+E+E  C((((  #uuH"$K# 4 4t9H44$LLT333'..s333&D%^^,>??$77    IIE""3'''  1CDDD  !>DDD  """
  4%,H,H!I!I!P!P!R!RSSSSS I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y,,,$I!$T\2B%C!D!D JOON;;	z),,&((88D>> "W[}}>(<(<>>EEGG. .)++bqb."
 ##'88M2#>#> HHVR00#'88M2#>#> $U ; ; $ 4 4"&((<";";!%+t!<!<	 	 JI%++--III'>> TNN#:;;BB5IIQQSSS""3'''  1CDDD  !>DDD  """
  4%,H,H!I!I!P!P!R!RSSSSS I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y222I!$T\2B%C!D!D JOON;;	z),,";xx
B//``$((622F2F``RY[]I^I^``ggii )++bqb"
 # $R 8 8 HHV-=-?-?-H-H-T-TUU!XXgq11!XXgr22  (>> TNN#:;;BB5IIQQSSS""3'''  1CDDD  !>DDD  """
  4%,H,H!I!I!P!P!R!RSSSSS I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y+++,I!$T\2B%C!D!D JOON;;	z),,&((88D>> "W[}}>(<(<>>EEGG. .)++bqb."(DHHVS\\*-E-EFF R 8 8 !$((<"<"<	
 !$((<"<"< &txx0A2'F'F '1CR(H(H #DHH^$<$< &txx0A1'E'E #DHH^Q$?$? &txx0A1'E'E #DHH^Q$?$? "488M1#=#= '1C(D(D dhhx::  TXXgr22!$ JI%++--III'>> SNN#9::AA%HHPPRRR""3'''  1CDDD  !>DDD  """
  4%,H,H!I!I!P!P!R!RSSSSS I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y!!"455 e	!$):L:LZ:X:X e	!ys++A.H1I!$T\2B%C!D!D JOON;;	z),,#xx	266'>> ! !D) ) )$%EE$KK %*7;'==!%%*;*;==DDFF4 4#)++bqb4*	 #,(0$%EE&"$5$5*+%%b*A*A()j'(B(B*+%%a*@*@%&UU7^^$%EE&"$5$5'(uuY'7'7()j(9(9+,55+?+?,-EE.,A,A&'eeHf&=&=%&UU7B%7%7   NM		MMMC((((NN#:;;/BB  E""3'''  1CDDD  !>DDD  """
  4#e**,M,M!N!N!U!U!W!WXXXXX I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y!!"455 o	!$):L:LZ:X:X o	!ys++A.H*I!$T\2B%C!D!D JOON;;	z),,&((#xx	W__D66RTUU'>> * *) * *$%EE$KK %*7;'PP#--//PPAEE'2<N<NPPWWYY4 4#)++bqb4*	 #,(0%&UU7B%7%7+,55+C+C()j+(F(F()j((C(C/0uu5F/K/K&'eeHi&@&@()j(9(9-.UU?B-G-G  NM		MMM '>??FFsKKSSUUUS))))""3'''  1CDDD  !>DDD  """
  4#e**,M,M!N!N!U!U!W!WXXXXX I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y222.I!$T\2B%C!D!D JOON;;	z),,&(( HHTNN "gk}}>(<(<>>EEGG/ /)++bqb/"	)"DHH^$<$< DHHVR00 $TXXor%B%B	
 TXXgr22 TXXgr22 #DHH^R$@$@ DHHVR00  +r!:!: dhhx44 dhhx44 TXXgr22  4 4  +r!:!: dhhx::  TXXgr22!$ XW6<<>>WWW'>> UNN#:;;BB6JJRRTTT""3'''  1CDDD  !>DDD  """
  F!3!3!:!:!<!<===== I I IAaAABBB""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y7772I!$T\2B%C!D!D JOON;;	z),,&((!(}}E(C(CEELLNN" ")++bqb""
 )$(HH^$<$<"&((<"<"< HHVS\\*-E-EFF HHVV44#'88M2#>#>#xx	22!XXgr22	 	 ba0A0A0C0Caaa'>> !NN#?@@GGTT\\^^^ "&,!;!;J'2vs||J?W?W'X'X$) ! !!$NN+BCC!')@BR(S!T!T!#D#!(( ! ! ! D! ""3'''  1CDDD  !>DDD  """
  K!8!8!?!?!A!ABBBBB I I IF1FFGGG""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y111(I!$T\2B%C!D!D JOON;;	z),,&((";}}>(<(<>>EEGG )++bqb"
 #$(HH^$<$< HHVR00 HHV,, HHVR00#'88M2#>#>$(HH^R$@$@"hhx88 $[ A A%)XXor%B%B  VU%++--UUU'>> SNN#9::AA%HHPPRRR""3'''  1CDDD  !>DDD  """
  E!2!2!9!9!;!;<<<<< I I I@Q@@AAA""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y333&I!$T\2B%C!D!D JOON;;	z),,&(($[}}>(<(<>>EEGG )++bqb"

 %$(HH^$<$< $R 8 8 HHVR00!XXgr22#xx	266#'88M2#>#>&*hh/?&D&D	 	 ZYGMMOOYYY'>> WNN#;<<CCGLLTTVVV""3'''  1CDDD  !>DDD  """
  G!4!4!;!;!=!=>>>>> I I IBqBBCCC""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y+++-I!$T\2B%C!D!D JOON;;	z),,&(($[}}XR(@(@X$((6SUBVBVXX__aa )++bqb"

 %'+xx0A'B'B HHVS\\*-E-EFF $ 4 4 HHV,,(,1C(D(D!%+!6!6*.((3G*H*H!XXg.."&((<"8"8"&((<"8"8"hhx00"hhx00"hhx00#'88M#:#: " NMGMMOOMMM'>> SNN#788??HHPPRRR""3'''  1CDDD  !>DDD  """
  G!4!4!;!;!=!=>>>>> I I I:q::;;;""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y+++&I!$T\2B%C!D!D JOON;;	z),,&((!+}}>(<(<>>EEGG )++bqb"
 "!XXg.. HHV,,#'88M#:#:*.((3G*K*K'+xx0A'B'B"&((<"H"H"&((<"8"8	 	 HGGGG'>> MNN#455<<TBBJJLLL""3'''  1CDDD  !>DDD  """
  D!1!1!8!8!:!:;;;;; I I I:q::;;;""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y+++#I!$T\2B%C!D!D JOON;;	z),,&((!+}}>(<(<>>EEGG )++bqb"
 " $ 4 4 I8I8I HHV,,"hhx::!XXg..  HGGGG'>> MNN#455<<TBBJJLLL""3'''  1CDDD  !>DDD  """
  D!1!1!8!8!:!:;;;;; I I I:q::;;;""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y333((*****Y222'')))))OOC     s  G5H 
J'BJ""J'C5O8 8
RBRR3C5W* *
Z4BZZIc1 1
f;Bff"E{ /B{ B1{ ;{  Ar { ,sH{ 
}8!B}33}8IAG G
AI7G BAI2I2AI7JKAU U
AW:U#BAW5W5AW:X
K&Ac2 c2
Afc<BAffAff#J-Aq q
As3qBAs.s.As3tH#A|( |(
A	|2BAA	IBH' H'
BKH1BBKKBKKQ3B] ]
B_.]BB_)_)B_._>H Bh  h 
Bkh*BBj<j<BkkI)Bt< t<
BwuBBwwBww-H#C@ @
CB3@BCB.B.CB3CMCP P
CR(PBCR#R#CR(TK;C_? _?
Cb `	BCbbCb c:KCo o
Cq,oBCq'q'Cq,q<L,C~* ~*
DA3~4B4DA.A.DA3BHDN JADK(K'DN K(
DK5K2DN K4DK5K5BDN N
DQNB4DQQDQQ&I:D[" ["
D^+[,B4D^&^&D^+^;IDh h
DkhB4DkkDkk'LDw/ w/
Dz9w9B5Dz4z4Dz9{
IED" D"
EG,D,B5EG'G'EG,G=H+EP* P*
ES4P4B5ES/S/ES4c           	      bD   | j                             d          r| j                             d          d         }	 t                      }|rM|                    d                                                              d|                                           |                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        ddi                                                     d S # t           $ r}|                     d           | 	                    dd           | 
                                 | j                            t          j        dt#          |          i                                                     Y d }~d S d }~ww xY w| j                             d          r| j                             d          d         }	 t                      }|rM|                    d                                                              d|                                           |                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        ddi                                                     d S # t           $ r}|                     d           | 	                    dd           | 
                                 | j                            t          j        dt#          |          i                                                     Y d }~d S d }~ww xY w| j                             d          r| j                             d          d         }	 t                      }|rM|                    d                                                              d|                                           |                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        ddi                                                     d S # t           $ r}|                     d           | 	                    dd           | 
                                 | j                            t          j        dt#          |          i                                                     Y d }~d S d }~ww xY w| j                             d          r| j                             d          d         }	 t                      }|rM|                    d                                                              d|                                           |                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        ddi                                                     d S # t           $ r}|                     d           | 	                    dd           | 
                                 | j                            t          j        dt#          |          i                                                     Y d }~d S d }~ww xY w| j                             d          r| j                             d          d         }	 t                      }|rrt%                                          d          }|                    d                              d|d                              d|                                           |                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        ddi                                                     d S # t           $ r}|                     d           | 	                    dd           | 
                                 | j                            t          j        dt#          |          i                                                     Y d }~d S d }~ww xY w| j                             d          r| j                             d          d         }	 t                      }|rM|                    d                                                              d|                                           |                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        ddi                                                     d S # t           $ r}|                     d           | 	                    dd           | 
                                 | j                            t          j        dt#          |          i                                                     Y d }~d S d }~ww xY w| j                             d          r| j                             d          d         	 t+                      }	fd|	d         D             |	d<   t-          |	           |                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        ddi                                                     d S # t           $ r}|                     d           | 	                    dd           | 
                                 | j                            t          j        dt#          |          i                                                     Y d }~d S d }~ww xY w| j                             d          r| j                             d          d         }	 t                      }|rM|                    d                                                               d|                                           |                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        ddi                                                     d S # t           $ r}|                     d           | 	                    dd           | 
                                 | j                            t          j        dt#          |          i                                                     Y d }~d S d }~ww xY w| j                             d!          r| j                             d          d         }
	 t                      }|rM|                    d"                                                              d|
                                           |                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        ddi                                                     d S # t           $ r}|                     d           | 	                    dd           | 
                                 | j                            t          j        dt#          |          i                                                     Y d }~d S d }~ww xY w| j                             d#          r| j                             d          d$         }	 t                      }|rM|                    d%                                                              d|                                           |                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        ddi                                                     d S # t           $ r}|                     d           | 	                    dd           | 
                                 | j                            t          j        dt#          |          i                                                     Y d }~d S d }~ww xY w| j                             d&          rS| j                             d          d         }	 t                      }|r|                    d%                                                              d'|                                           |                    d(                                                              d'|                                           |                    d)                                                              d|                                           |                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        ddi                                                     d S # t           $ r}|                     d           | 	                    dd           | 
                                 | j                            t          j        dt#          |          i                                                     Y d }~d S d }~ww xY w| j                             d*          r| j                             d          d         }	 t                      }|rM|                    d+                                                              d|                                           |                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        ddi                                                     d S # t           $ r}|                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        dt#          |          i                                                     Y d }~d S d }~ww xY w| j                             d,          r| j                             d          d         }	 t                      }|rM|                    d-                                                              d|                                           |                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        ddi                                                     d S # t           $ r}|                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        dt#          |          i                                                     Y d }~d S d }~ww xY w| j                             d.          r| j                             d          d         }	 t                      }|rM|                    d/                                                              d|                                           |                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        ddi                                                     d S # t           $ r}|                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        dt#          |          i                                                     Y d }~d S d }~ww xY w| j                             d0          r| j                             d          d         	 t                      }|rM|                    d1                                                              d                                           |                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        ddi                                                     d S # t           $ r}|                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        dt#          |          i                                                     Y d }~d S d }~ww xY w| j                             d2          r| j                             d          d         }	 t                      }|rM|                    d3                                                              d|                                           |                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        ddi                                                     d S # t           $ r}|                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        dt#          |          i                                                     Y d }~d S d }~ww xY w| j                             d4          r| j                             d          d$         }	 t                      }|rM|                    d5                                                              d|                                           |                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        ddi                                                     d S # t           $ r}|                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        dt#          |          i                                                     Y d }~d S d }~ww xY w| j                             d6          r| j                             d          d$         }	 t                      }|rM|                    d7                                                              d|                                           |                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        ddi                                                     d S # t           $ r}|                     d           | 	                    dd           | 	                    d	d
           | 
                                 | j                            t          j        dt#          |          i                                                     Y d }~d S d }~ww xY w|                     d8           d S )9Nr  rF   rH   r   r   r   r   r   r   r   r  Tr   r   z/api/activity/rS  rE   r   
/api/diet/r  /api/supplements/r   r  discontinued)rD   discontinued_date/api/body-focus/r  /api/admin/c                 ,    g | ]}|d          k    |S r  r
   )r   rP  rK  s     r   r   z.DashboardHandler.do_DELETE.<locals>.<listcomp>  s)    )e)e)eqQUwZdOdOd!OdOdOdr   r-   /api/budget/r  /api/investments/r  /api/bloodtests/actions/rG   r  rS   r   r   r   /api/community-members/r@  z/api/community-interactions/rE  /api/community-events/rG  /api/community-contacts/rr  rX   rT  z/api/play/spots/rv  /api/play/goals/r{  r7  )r]   ra   rc   r   r   deleter   r   r   r   r   r   r   r#   r   r   r   r   r   r%  r  r0   r8   r>  )r   r@  r   r   rE  r   rF  rG  now_daterL  r  r_  r   r`  rb  rf  enrichment_idrj  rk  rK  s                      @r   	do_DELETEzDashboardHandler.do_DELETE  s   900 e	!--a0JI'>> #NN>22D*-- ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y!!"233 O	!)//#..q1KI'>> #NN#677D+.. ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y!!"233 y	!)//#..q1KI'>> #NN#899D+.. ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y!!,// c	!iooc**1-GI'>> #NN#344D'** ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y!!"566 L	!iooc**1-GI'>> #/11:::FFHNN#455>PX Y YZZD'** ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y!!"455 t	!iooc**1-GI'>> #NN#344D'** ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y!!-00 ]	!--a0JI,..
)e)e)e)eZ
5K)e)e)e
:& ,,,""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y!!.11 I	!iooc**1-GI'>> #NN<00D'** ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y!!"566 r	!ys++A.HI'>> #NN#:;;D(++ ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y!!"<== [	!	,,Q/II'>> #NN#:;;D),, ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y!!"455 D	!ys++A.HI'>> #NN#:;;J11 NN#:;;J11 NN#9::D(++ ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHH	I Y!!";<< c	!	,,Q/II'>> #NN#:;;D),, ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!"@AA L	!!Y__S11!4NI'>> #NN#?@@D.11 ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!":;; u	!ys++A.HI'>> #NN#9::D(++ ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!"<== ^	!--a0JI'>> #NN#;<<D*-- ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!"455 F	! IOOC003MI'>> #NN#788D-00 ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!"455 /	!iooc**1-GI'>> #NN#455D'** ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!"455 	!iooc**1-GI'>> #NN#455D'** ""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI OOC     s  C2D2 2
G<BGGC2L 
N'BN""N'&C2S 
U;$BU66U;:C2Z. .
]8B]

]Db' '
e1BeeC2i; ;
lBllC	p& &
s0BssC2w: :
zBzzC2 
AA/BAA*A*AA/B.C2AF" F"
AIF,BAH>H>AIJFAP P
AR1PBAR,R,AR1S0C2AW$ W$
AZW.B"AZZAZ[C2A_ _
Ab_B"Ab b AbcC2Af8 f8
Ai/gB"Ai*i*Ai/j.C2An" n"
Aqn,B"AqqAqrC2Av v
AyvB"Ax>x>AyzC2A}6 }6
B@-~ B"B@(@(B@-A,C2BE  E 
BHE*B"BHHBHc           	       P   | j                             d          r?| j                             d          d         }	 t          | j                            dd                    }| j                            |          }|rt          j	        |          ni }t                      }|rc|rai }d|v r|d         |d<   |rN|                    d                              |                              d|                                           |                     d	           |                     d
d           |                     dd           |                                  | j                            t          j        ddi                                                     dS # t,          $ r}|                     d           |                     d
d           |                     dd           |                                  | j                            t          j        dt/          |          i                                                     Y d}~dS d}~ww xY w| j                             d          rD| j                             d          d         }	 t          | j                            dd                    }| j                            |          }|rt          j	        |          ni }t                      }|rh|rfi }dD ]}	|	|v r||	         ||	<   |rN|                    d                              |                              d|                                           |                     d	           |                     d
d           |                     dd           |                                  | j                            t          j        ddi                                                     dS # t,          $ r}|                     d           |                     d
d           |                     dd           |                                  | j                            t          j        dt/          |          i                                                     Y d}~dS d}~ww xY w| j                             d          rD| j                             d          d         }
	 t          | j                            dd                    }| j                            |          }|rt          j	        |          ni }t                      }|rh|rfi }dD ]}	|	|v r||	         ||	<   |rN|                    d                              |                              d|
                                           |                     d	           |                     d
d           |                     dd           |                                  | j                            t          j        ddi                                                     dS # t,          $ r}|                     d           |                     d
d           |                     dd           |                                  | j                            t          j        dt/          |          i                                                     Y d}~dS d}~ww xY w| j                             d          rD| j                             d          d         }	 t          | j                            dd                    }| j                            |          }|rt          j	        |          ni }t                      }|rh|rfi }dD ]}	|	|v r||	         ||	<   |rN|                    d                              |                              d|                                           |                     d	           |                     d
d           |                     dd           |                                  | j                            t          j        ddi                                                     dS # t,          $ r}|                     d           |                     d
d           |                     dd           |                                  | j                            t          j        dt/          |          i                                                     Y d}~dS d}~ww xY w| j                             d          r2| j                             d          d         }	 t          | j                            dd                    }| j                            |          }|rt          j	        |          ni }t1                      }t3          |d                   D ]3\  }}|d         |k    r"dD ]}	|	|v r||	         |d         |         |	<    n4t5          |           |                     d	           |                     d
d           |                     dd           |                                  | j                            t          j        ddi                                                     dS # t,          $ r}|                     d           |                     d
d           |                     dd           |                                  | j                            t          j        dt/          |          i                                                     Y d}~dS d}~ww xY w| j                             d          rD| j                             d          d         }	 t          | j                            dd                    }| j                            |          }|rt          j	        |          ni }t                      }|rh|rfi }d D ]}	|	|v r||	         ||	<   |rN|                    d!                              |                              d|                                           |                     d	           |                     d
d           |                     dd           |                                  | j                            t          j        ddi                                                     dS # t,          $ r}|                     d           |                     d
d           |                     dd           |                                  | j                            t          j        dt/          |          i                                                     Y d}~dS d}~ww xY w| j                             d"          rD| j                             d          d         }	 t          | j                            dd                    }| j                            |          }|rt          j	        |          ni }t                      }|rh|rfi }d#D ]}	|	|v r||	         ||	<   |rN|                    d$                              |                              d|                                           |                     d	           |                     d
d           |                     dd           |                                  | j                            t          j        ddi                                                     dS # t,          $ r}|                     d           |                     d
d           |                     dd           |                                  | j                            t          j        dt/          |          i                                                     Y d}~dS d}~ww xY w| j                             d%          rD| j                             d          d         }	 t          | j                            dd                    }| j                            |          }|rt          j	        |          ni }t                      }|rh|rfi }d&D ]}	|	|v r||	         ||	<   |rN|                    d'                              |                              d|                                           |                     d	           |                     d
d           |                     dd           |                                  | j                            t          j        ddi                                                     dS # t,          $ r}|                     d           |                     d
d           |                     dd           |                                  | j                            t          j        dt/          |          i                                                     Y d}~dS d}~ww xY w| j                             d(          rD| j                             d          d)         }	 t          | j                            dd                    }| j                            |          }|rt          j	        |          ni }t                      }|rh|rfi }d*D ]}	|	|v r||	         ||	<   |rN|                    d+                              |                              d|                                           |                     d	           |                     d
d           |                     dd           |                                  | j                            t          j        ddi                                                     dS # t,          $ r}|                     d           |                     d
d           |                     dd           |                                  | j                            t          j        dt/          |          i                                                     Y d}~dS d}~ww xY w| j                             d,          rD| j                             d          d         }	 t          | j                            dd                    }| j                            |          }|rt          j	        |          ni }t                      }|rh|rfi }d-D ]}	|	|v r||	         ||	<   |rN|                    d.                              |                              d|                                           |                     d	           |                     d
d           |                     dd           |                                  | j                            t          j        ddi                                                     dS # t,          $ r}|                     d           |                     d
d           |                     dd           |                                  | j                            t          j        dt/          |          i                                                     Y d}~dS d}~ww xY w| j         d/k    r"	 t          | j                            dd                    }| j                            |          }|rt          j	        |          ni }|                    d0          }|                    d1          }t7                      }|                    d2i           }|r||vr|                     d3           |                     d
d           |                     dd           |                                  | j                            t          j        dd4| i                                                     dS t9          |t                    r|d5k     s|d6k    r|                     d3           |                     d
d           |                     dd           |                                  | j                            t          j        dd7i                                                     dS t;          t<                    j        d8z  d9z  d:z  }tA          |          5 }t          j!        |          }ddd           n# 1 swxY w Y   ||d2         |         d1<   tA          |d;          5 }t          j"        ||d<=           |                    d>           ddd           n# 1 swxY w Y   tG                       |                     d	           |                     d
d           |                     dd           |                                  | j                            t          j        ddi                                                     dS # t,          $ r}|                     d           |                     d
d           |                     dd           |                                  | j                            t          j        dt/          |          i                                                     Y d}~dS d}~ww xY w| j                             d?          rD| j                             d          d         }	 t          | j                            dd                    }| j                            |          }|rt          j	        |          ni }t                      }|rh|rfi }d@D ]}	|	|v r||	         ||	<   |rN|                    dA                              |                              d|                                           |                     d	           |                     d
d           |                     dd           |                                  | j                            t          j        ddi                                                     dS # t,          $ r}|                     d           |                     d
d           |                     dd           |                                  | j                            t          j        dt/          |          i                                                     Y d}~dS d}~ww xY w| j                             dB          rD| j                             d          d         }	 t          | j                            dd                    }| j                            |          }|rt          j	        |          ni }t                      }|rh|rfi }dCD ]}	|	|v r||	         ||	<   |rN|                    dD                              |                              d|                                           |                     d	           |                     d
d           |                     dd           |                                  | j                            t          j        ddi                                                     dS # t,          $ r}|                     d           |                     d
d           |                     dd           |                                  | j                            t          j        dt/          |          i                                                     Y d}~dS d}~ww xY w| j                             dE          rD| j                             d          d         }	 t          | j                            dd                    }| j                            |          }|rt          j	        |          ni }t                      }|rh|rfi }dFD ]}	|	|v r||	         ||	<   |rN|                    dG                              |                              d|                                           |                     d	           |                     d
d           |                     dd           |                                  | j                            t          j        ddi                                                     dS # t,          $ r}|                     d           |                     d
d           |                     dd           |                                  | j                            t          j        dt/          |          i                                                     Y d}~dS d}~ww xY w| j                             dH          rD| j                             d          d         }	 t          | j                            dd                    }| j                            |          }|rt          j	        |          ni }t                      }|rh|rfi }dID ]}	|	|v r||	         ||	<   |rN|                    dJ                              |                              d|                                           |                     d	           |                     d
d           |                     dd           |                                  | j                            t          j        ddi                                                     dS # t,          $ r}|                     d           |                     d
d           |                     dd           |                                  | j                            t          j        dt/          |          i                                                     Y d}~dS d}~ww xY w| j                             dK          r| j                             d          d)         }	 t          | j                            dd                    }| j                            |          }|rt          j	        |          ni }t                      }|r|ri }dLD ]}	|	|v r||	         ||	<   |                    dM          dNk    r'dO|vr#tI                      %                                |dO<   |rN|                    dP                              |                              d|                                           |                     d	           |                     d
d           |                     dd           |                                  | j                            t          j        ddi                                                     dS # t,          $ r}|                     d           |                     d
d           |                     dd           |                                  | j                            t          j        dt/          |          i                                                     Y d}~dS d}~ww xY w| &                    dQ           dS )Rz)Handle PATCH requests for partial updatesrE   rF   rH   r  r   topicr   r   r   r   r   r   r   r  Tr   r   Nrn  )r  r   r   r  r  r  rW  r  ro  )r   r  r  r  r  r  rD   r   r  rM  r  rq  discontinued_reasonrW  r  rr  )r  r   r  r  r  r  r  r  rD   r  resolved_dater   rW  r  rs  r-   )r  r  r  r  r  rW  ru  )r  r  r  r  r   r  rW  r  z/api/transactions/)r  r  r  rv  )r  r   r  r  r  r   r  r  rw  rG   )	r   r  r  r  r  rD   r  completed_dater  r  rS   )r   r  r   r  r  r  r  r  r  r  r  r	  r
  r   rW  r   z/api/activities/config/targetgroupweekly_targetidentity_groupsr  zUnknown group: r   r   zweekly_target must be int 1-14r   r   r   r2   r3   r4   r  rx  )r   r  r  r  r  r  r  r   r  r  r  r  rD   rk  rW  r@  ry  )r   r   r   r  r%  rD   r  r  rG  rz  )r  r   r  r  r  r)  rr  rX   )rV  rU  rY  rW  rX  rZ  re  r+  r,  r-  r.  rT  r{  )r5  rD   rW  rD   achievedcompleted_atr{  r7  )'r]   ra   rc   r  r  r   r  r  r#   r)  r   r   r  r   r   r   r   r   r   r   r   r   r   r   r0   	enumerater8   r(   r(  r   r    r!   r"   r$   r6   r+   r   r  r>  )r   r   r  r8  r7   r   r  r   rF  r   rG  rK  rL  r  r  rN  r  r_  r   r  r  rO  r  r&   r'   file_configr`  rf  r~  rk  s                                 r   do_PATCHzDashboardHandler.do_PATCH  s'   9 011 G		!)//#..q1KI!$T\%5%56F%J%J!K!Kz~66+/7tz$'''R'>> 
' 
'"$K$/3G}G," ' '<==#VK00Rk22$WYYY""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!,// f	!iooc**1-GI!$T\%5%56F%J%J!K!Kz~66+/7tz$'''R'>> ' '"$K C 9 9$;;/3CyK," ' '788#VK00Rg..$WYYY""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!"566 C	!iooc**1-G I!$T\%5%56F%J%J!K!Kz~66+/7tz$'''R'>> ' '"$K U 9 9 $;;/3CyK," ' '899#VK00Rg..$WYYY""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!"455 ^	!iooc**1-G I!$T\%5%56F%J%J!K!Kz~66+/7tz$'''R'>> ' '"$K H 9 9 $;;/3CyK," ' '788#VK00Rg..$WYYY""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!-00 y	!--a0JI!$T\%5%56F%J%J!K!Kz~66+/7tz$'''R,..
"+Jz,B"C"C  JAwt}
22#_ K KC"d{{AEc
: 6q 9# > 3 !,,,""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!.11 Y	!iooc**1-GI!$T\%5%56F%J%J!K!Kz~66+/7tz$'''R'>> ' '"$K S 9 9$;;/3CyK," ' |44#VK00Rg..$WYYY""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!"677 v	!Y__S))!,FI!$T\%5%56F%J%J!K!Kz~66+/7tz$'''R'>> 
' 
'"$K= 9 9$;;/3CyK," ' '9::#VK00Rf--$WYYY""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!"566 T	!ys++A.HI!$T\%5%56F%J%J!K!Kz~66+/7tz$'''R'>> ' '"$K G 9 9$;;/3CyK," ' '>??#VK00Rh//$WYYY""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!"<== q	!	,,Q/II!$T\%5%56F%J%J!K!Kz~66+/7tz$'''R'>> ' '"$K C 9 9 $;;/3CyK," ' '>??#VK00Ri00$WYYY""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!"455 M	!ys++A.H!I!$T\%5%56F%J%J!K!Kz~66+/7tz$'''R'>> ' '"$K 3 9 9
 $;;/3CyK," ' '=>>#VK00Rh//$WYYY""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y9991I!$T\%5%56F%J%J!K!Kz~66+/7tz$'''R)) $ 9 9,.."(**->"C"C _ < <&&s+++$$^5GHHH$$%BCHHH$$&&&J$$TZ:SE:S:S0T%U%U%\%\%^%^___F!-55 9J9Jm^`N`N`&&s+++$$^5GHHH$$%BCHHH$$&&&J$$TZ:Z0[%\%\%c%c%e%efffF #8nn3i?)KNdd+&& /!"&)A,,K/ / / / / / / / / / / / / / /IV-.u5oF+s++ "qIk1Q7777GGDMMM" " " " " " " " " " " " " " " '(((""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!";<< r	!	,,Q/I I!$T\%5%56F%J%J!K!Kz~66+/7tz$'''R'>> ' '"$K L 9 9 $;;/3CyK," ' '>??#VK00Ri00$WYYY""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!":;; N	!ys++A.HI!$T\%5%56F%J%J!K!Kz~66+/7tz$'''R'>> ' '"$K 1 9 9 $;;/3CyK," ' '=>>#VK00Rh//$WYYY""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!"<== k	!--a0JI!$T\%5%56F%J%J!K!Kz~66+/7tz$'''R'>> ' '"$K A 9 9$;;/3CyK," ' '?@@#VK00Rj11$WYYY""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!"455 H	! IOOC003MI!$T\%5%56F%J%J!K!Kz~66+/7tz$'''R'>> ' '"$K M 9 9 $;;/3CyK," ' ';<<#VK00Rm44$WYYY""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI Y!!"455 %	!iooc**1-G I!$T\%5%56F%J%J!K!Kz~66+/7tz$'''R'>> ' '"$K: 9 9$;;/3CyK,xx))Z77NRV<V<V6F6H6H6R6R6T6TN3" ' '899#VK00Rg..$WYYY""3'''  1CDDD  !>DDD  """
  T4L!9!9!@!@!B!BCCCCC I I I""3'''  1CDDD  !>DDD  """
  Wc!ff,=!>!>!E!E!G!GHHHHHHHHHI OOC     s]  E"F! !
I+B"IIE'P   
R7
B"R22R76E'Y 
\)B"\\E'b> >
e5B"e00e54El 
oB"n==oE'u* *
x!4B"xx! E'	 	
AB B"AA;A;AB B?E'AH( H(
AKH2B"AKKAKLE'AR R
AT>RB"AT9T9AT>U=E'A[& [&
A^[0B"A^^A^^-EAl c5B6Al f-1Al gAg?g3Al g?AhhAl hAhh$Al h+-Ai$iAl i$Ai(i(Al i+Ai(i,B&Al l
AolB"AooAop
E'Au3 u3
Ax*u=B"Ax%x%Ax*y)E'A 
BB	B"BBBBB	CE'BH1 H1
BK(H;B"BK#K#BK(L'E'BR R
BURB"BUUBUVF'B\/ \/
B_&\9B"B_!_!B_&c                     |                      d           |                     dd           |                     dd           |                     dd           |                                  d S )Nr   r   r   zAccess-Control-Allow-Methodsz!GET, POST, DELETE, PATCH, OPTIONSzAccess-Control-Allow-Headersr   )r   r   r   )r   s    r   
do_OPTIONSzDashboardHandler.do_OPTIONS  st    36<<<79\]]]7HHHr   c                 
   d|d         v s7d|d         v s-d|d         v s#dt          |                                          v rAt          dt          j                                        d           d|d                     d S d S )	NPOSTr   DELETEPATCHr   [r  z] )r   lowerr   r   r   r%  )r   formatargss      r   log_messagezDashboardHandler.log_message  s    T!WDG 3 3w$q'7I7IWX[\`XaXaXgXgXiXiMiMiFhlnn--j99FFT!WFFGGGGG NjMir   )r   )F)4__name__
__module____qualname__r   r^   r_   r`   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rq   rp   rr   rs   rt   ru   rv   rw   rx   r|   ry   rz   r{   r}   r~   r   r   r   r   r   r   r   r   r   r   r  r  rl  r  r  r  r  __classcell__)r   s   @r   rA   rA      s       q q q q qfE E E E8E E E4E E E4E E E2ME ME ME^E E E4E E E:E E E6E 6E 6EppE pE pEdE E EXE XE XEtE E E4E E E2E E E E:E E EB'E 'E 'ERE E E4'E 'E 'ERFE FE FEP'E 'E 'ER&E &E &EXE E E20E 0E 0Ed+E +E +EZ=E =E =E~E E E4TE TE TEtIE IE IEVE E E>E E E<E E E@"E "E "EHE E E:E E EBE E E8"E "E "EH!E !E !EFE E E4E E E6.E .E .E`,E ,E ,E\x! x! x!t%f! f! f!PI	! I	! I	!V  H H H H H H Hr   rA   __main__z
  Starting Dashboard Server...Tr   z0
  Dashboard server running at http://localhost:z  Open http://localhost:z/dashboard.htmlz
  Press Ctrl+C to stop
z
  Server stopped.)/__doc__r#   http.serverhttpsocketserverr   pathlibr   r8  osr  syszoneinfor   r	   ImportErrorpytztimezoner   r]   r  r   r    r!   PORTr   r   r   r(   r+   r.   r/   r0   r8   r>   r?   serverSimpleHTTPRequestHandlerrA   r  chdirr   	TCPServerallow_reuse_addresshttpdserve_foreverKeyboardInterruptr
   r   r   <module>r     s}  ] ]~                       				 				 



6!!!!!!(/00KK 6 6 6KKK$- 455KKK6% % %
 33ttH~~,y88CFZZ[[ \ \ \ 	      ! ! ! 4>>(94y@CUU 
 
 
         cDH cDH cDH cDH cDHt{; cDH cDH cDHLI zBHTT(^^"###	E
-... LNNN 26L.		T
,<	=	= )H$HHIII>>>>???+,,,	)!!!!  	) 	) 	)E'(((((	)) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) sE   > AA )F"*E?>F"?FF"FF""F&)F&