
    \Cj                        d dl Z d dlZd dlZd dlZd dlmZmZ d dlmZ d dl	m
Z
mZmZmZ d dlmZmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1  e            Z2 ej3        d	          Z4e2j5        Z5e5e5j6        7                    d
d
           e2j8        9                    d          rddini Z: ee2j8        de:          Z;d9de<de=dz  de<fdZ>d:dZ?de
de@fdZAde
deBe<e@f         fdZCde<ddfdZDd:dZEd:dZFd:dZGde
deBe<ef         fdZHde
deBe<ef         ddfdZIde
deBe<ef         ddfd ZJd!e1deKfd"ZLde
ddfd#ZMde
ddfd$ZNde
ddfd%ZOde
deBe<ef         ddfd&ZPde
ddfd'ZQde
deBe<ef         ddfd(ZRdeSeTe<e@e<eee<eKeKe<f	                  fd)ZUdd*de
deBe<ef         d+eKddfd,ZVde
deBe<ef         ddfd-ZWde
deBe<ef         ddfd.ZXde
ddfd/ZYde
ddfd0ZZde
ddfd1Z[de
ddfd2Z\d3 Z]de
deBe<ef         ddfd4Z^d5e_d6e_deTe_e_f         fd7Z`de
ddfd8ZadS );    N)datetime)Path)SessionSQLModelcreate_engineselect)functext)get_settings)Child)AdminCredential
AppSettingBenefitExamDailyPhraseDailyMathAssignmentDailyMathAttemptDailyMathTaskDailyKnowledgeQuestionGeoChallengeAttemptGeoChallengeTargetCalendarEventChallengePlayerChallengeWeeklyConversionChildSettingsRoutineDaySettingScheduleBlockScheduleBlockTypeScheduleDayScheduleTimeSlotScreenTimeDayAllowanceScreenTimeEarnCompletionScreenTimeEarnRuleScreenTimeSessionTaskKindTaskInstance
TaskStatusTaskTemplatezfamilydashboard.persistenceT)parentsexist_oksqlitecheck_same_threadF)echoconnect_argspinsaltreturnc                 &   |pt          j        d          }t          j        d|                     d          |d          }dt          j        |                              d          dt          j        |                              d          S )N   sha256utf-8i zpbkdf2_sha256$240000$ascii$)osurandomhashlibpbkdf2_hmacencodebase64	b64encodedecode)r0   r1   digests      >/home/agent/projects/FamilyDashboard/backend/app/db/session.pyhash_pinrC   7   s    !2:b>>D 3::g+>+>gNNFF%%g....  ''000     c                      dd l } dd l} t          j                            t
                     t                       t                       t          d           t                       t          d           d S )Nr   before_seed
after_seed)
app.models.childapp.models.domainr   metadata
create_allenginemigrate_sqlite_schema3assert_persistent_database_not_empty_if_initializedlog_database_stateseed_database)apps    rB   init_dbrR   @   st      (((7999}%%%OOO|$$$$$rD   sessionc           	          t          |                     t          t          j        |j                                                                      pd          S )Nr   )intexecr	   r
   countidone)rS   models     rB   _count_rowsr[   L   sA    w||F4:eh#7#78899==??D1EEErD   c                    t          | t                    t          | t                    t          | t                    t          | t                    t          | t
                    t          | t                    t          | t                    t          | t                    t          | t                    t          | t                    t          | t                    t          | t                    dS )N)childscheduleblocktasktemplatebenefitexamcalendareventgeochallengetargetscreentimeallowancescreentimeearnrulescreentimeearncompletionscreentimesessionroutine_day_setting)r[   r   r   r)   r   r   r   r   r"   r$   r#   r%   r   rS   s    rB   database_health_countsrj   P   s    We,,$Wm<<#G\::w00GT**$Wm<<)'3EFF*74JKK)'3EFF$/9Q$R$R(2CDD*74EFF  rD   stagec                    t           t          t                     nt          j        }t           7t                                           rt                                           j        nd }t          t                    5 }t          |          }d d d            n# 1 swxY w Y   |d         dk    s|d         dk    rt          j        nt          j        } |d| |||           d S )Nr^   r   r_   z-db_startup stage=%s path=%s size=%s counts=%s)sqlite_pathstrsettingsdatabase_urlexistsstatst_sizer   rL   rj   loggererrorinfo)rk   db_pathdb_sizerS   countslevels         rB   rO   rO   a   s   "-"9c+x?TG,7,CHZHZH\H\,Ck  ((bfG	 1G'001 1 1 1 1 1 1 1 1 1 1 1 1 1 1"?3q88F><RVW<W<WFLL]c]hE	E
95'7TZ[[[[[s   <BBBc                     t          t                    5 } |                     t          d          }t	          |           }d d d            n# 1 swxY w Y   |rp|d         dk    s|d         dk    rZt
          t          t
                    nt          j        }d| d| }t          
                    |           t          |          d S d S )Nproduction_db_initializedr^   r   r_   u@   Persistenzfehler: Produktiv-DB wirkt leer. Backup prüfen. path=z counts=)r   rL   getr   rj   rm   rn   ro   rp   rt   ru   RuntimeError)rS   markerry   rw   messages        rB   rN   rN   j   s   	 1GZ)DEE'001 1 1 1 1 1 1 1 1 1 1 1 1 1 1  $6/*a//6.3IQ3N3N&1&=#k"""8CX.. .%+. . 	 	W7###$ $3N3Ns   +AAAc                     t           j                            d          sd S t                                          5 } d |                     t          d                    D             }d|v rqd |                     t          d                    D             }ddd	d
d                                D ]+\  }}||vr"|                     t          |                     ,d|v rpd |                     t          d                    D             }dddd                                D ]+\  }}||vr"|                     t          |                     ,d|v rtd |                     t          d                    D             }dddddddd                                D ]+\  }}||vr"|                     t          |                     ,d|v rwd |                     t          d                     D             }d!d"d#d$d%d&d'd(d)d*d+
                                D ]+\  }}||vr"|                     t          |                     ,d,|v rRd- |                     t          d.                    D             }d/|vr"|                     t          d0                     d1|v rtd2 |                     t          d3                    D             }d4|vrD|                     t          d5                     |                     t          d6                     d7|v rxd8 |                     t          d9                    D             }d4|vr"|                     t          d:                     d;|vr"|                     t          d<                     d=D ]d}||v r^d>D ][}d?| d@}|                     t          dA| dB          t          |          dCz   t          |          dDz   dE| dF| dGdH           \edI|v rodJ |                     t          dK                    D             }dLdMdN                                D ]+\  }}||vr"|                     t          |                     ,dO|v rdP |                     t          dQ                    D             }t                      }dRdSdTdUdVdW                                D ]@\  }}||vr7|                     t          |                     |
                    |           A|dXdYhz  rD|                     t          dZ                     |                     t          d[                     d\D ]`}||v rZd] |                     t          d^| d_                    D             }d`|vr&|                     t          da| db                     a	 d d d            d S # 1 swxY w Y   d S )cNr,   c                     h | ]
}|d          S r    .0rows     rB   	<setcomp>z(migrate_sqlite_schema.<locals>.<setcomp>|   s    lllS#a&lllrD   z1SELECT name FROM sqlite_master WHERE type='table'childsettingsc                     h | ]
}|d          S    r   r   s     rB   r   z(migrate_sqlite_schema.<locals>.<setcomp>~       ```#s1v```rD   z PRAGMA table_info(childsettings)zYALTER TABLE childsettings ADD COLUMN language_quiz_language VARCHAR NOT NULL DEFAULT 'en'zSALTER TABLE childsettings ADD COLUMN language_quiz_level INTEGER NOT NULL DEFAULT 2zOALTER TABLE childsettings ADD COLUMN math_quiz_level INTEGER NOT NULL DEFAULT 2zTALTER TABLE childsettings ADD COLUMN knowledge_quiz_level INTEGER NOT NULL DEFAULT 2language_quiz_languagelanguage_quiz_levelmath_quiz_levelknowledge_quiz_levelscheduledayc                     h | ]
}|d          S r   r   r   s     rB   r   z(migrate_sqlite_schema.<locals>.<setcomp>   s    ^^^#s1v^^^rD   zPRAGMA table_info(scheduleday)zHALTER TABLE scheduleday ADD COLUMN has_school BOOLEAN NOT NULL DEFAULT 1z2ALTER TABLE scheduleday ADD COLUMN valid_from DATEz0ALTER TABLE scheduleday ADD COLUMN valid_to DATE)
has_school
valid_fromvalid_toroutinedaysettingc                     h | ]
}|d          S r   r   r   s     rB   r   z(migrate_sqlite_schema.<locals>.<setcomp>   s    ddd#s1vdddrD   z$PRAGMA table_info(routinedaysetting)z7ALTER TABLE routinedaysetting ADD COLUMN wake_time TIMEz9ALTER TABLE routinedaysetting ADD COLUMN teeth_start TIMEz\ALTER TABLE routinedaysetting ADD COLUMN leave_countdown_minutes INTEGER NOT NULL DEFAULT 10zTALTER TABLE routinedaysetting ADD COLUMN timer_hooks VARCHAR NOT NULL DEFAULT '10,3'zJALTER TABLE routinedaysetting ADD COLUMN notes VARCHAR NOT NULL DEFAULT ''zJALTER TABLE routinedaysetting ADD COLUMN active BOOLEAN NOT NULL DEFAULT 1z<ALTER TABLE routinedaysetting ADD COLUMN updated_at DATETIME)	wake_timeteeth_startleave_countdown_minutestimer_hooksnotesactive
updated_atr^   c                     h | ]
}|d          S r   r   r   s     rB   r   z(migrate_sqlite_schema.<locals>.<setcomp>   r   rD   z PRAGMA table_info(scheduleblock)zHALTER TABLE scheduleblock ADD COLUMN child_id INTEGER NOT NULL DEFAULT 0zGALTER TABLE scheduleblock ADD COLUMN weekday INTEGER NOT NULL DEFAULT 1zFALTER TABLE scheduleblock ADD COLUMN title VARCHAR NOT NULL DEFAULT ''zYALTER TABLE scheduleblock ADD COLUMN block_type VARCHAR NOT NULL DEFAULT 'school_subject'z5ALTER TABLE scheduleblock ADD COLUMN location VARCHARzPALTER TABLE scheduleblock ADD COLUMN counts_as_school BOOLEAN NOT NULL DEFAULT 1zPALTER TABLE scheduleblock ADD COLUMN affects_timeline BOOLEAN NOT NULL DEFAULT 1z2ALTER TABLE scheduleblock ADD COLUMN color VARCHARz2ALTER TABLE scheduleblock ADD COLUMN notes VARCHARzFALTER TABLE scheduleblock ADD COLUMN active BOOLEAN NOT NULL DEFAULT 1)
child_idweekdaytitle
block_typelocationcounts_as_schoolaffects_timelinecolorr   r   cointransactionc                     h | ]
}|d          S r   r   r   s     rB   r   z(migrate_sqlite_schema.<locals>.<setcomp>   s    bbb#s1vbbbrD   z"PRAGMA table_info(cointransaction)reference_transaction_idzGALTER TABLE cointransaction ADD COLUMN reference_transaction_id INTEGERre   c                     h | ]
}|d          S r   r   r   s     rB   r   z(migrate_sqlite_schema.<locals>.<setcomp>       eee#s1veeerD   z%PRAGMA table_info(screentimeearnrule)coin_rewardzPALTER TABLE screentimeearnrule ADD COLUMN coin_reward INTEGER NOT NULL DEFAULT 1zmUPDATE screentimeearnrule SET coin_reward = 1 WHERE slug IN ('buch-lesen-20', 'sport-20') AND coin_reward = 0rf   c                     h | ]
}|d          S r   r   r   s     rB   r   z(migrate_sqlite_schema.<locals>.<setcomp>   s    kkk#s1vkkkrD   z+PRAGMA table_info(screentimeearncompletion)zVALTER TABLE screentimeearncompletion ADD COLUMN coin_reward INTEGER NOT NULL DEFAULT 0coin_transaction_idzKALTER TABLE screentimeearncompletion ADD COLUMN coin_transaction_id INTEGER)dailymathassignmentdailymathtask)               z1/z von zUPDATE zb SET prompt = substr(prompt, :start, length(prompt) - :trim) || :suffix WHERE prompt LIKE :patternr   r   z : z = ?z% = ?)starttrimsuffixpatternrc   c                     h | ]
}|d          S r   r   r   s     rB   r   z(migrate_sqlite_schema.<locals>.<setcomp>   r   rD   z%PRAGMA table_info(geochallengetarget)zOALTER TABLE geochallengetarget ADD COLUMN x_percent FLOAT NOT NULL DEFAULT 50.0zOALTER TABLE geochallengetarget ADD COLUMN y_percent FLOAT NOT NULL DEFAULT 50.0)	x_percent	y_percentgeochallengeattemptc                     h | ]
}|d          S r   r   r   s     rB   r   z(migrate_sqlite_schema.<locals>.<setcomp>   s    fff#s1vfffrD   z&PRAGMA table_info(geochallengeattempt)zYALTER TABLE geochallengeattempt ADD COLUMN selected_x_percent FLOAT NOT NULL DEFAULT 50.0zYALTER TABLE geochallengeattempt ADD COLUMN selected_y_percent FLOAT NOT NULL DEFAULT 50.0zPALTER TABLE geochallengeattempt ADD COLUMN raw_points FLOAT NOT NULL DEFAULT 0.0zUALTER TABLE geochallengeattempt ADD COLUMN credited_points FLOAT NOT NULL DEFAULT 0.0zWALTER TABLE geochallengeattempt ADD COLUMN daily_cap_reached BOOLEAN NOT NULL DEFAULT 0)selected_x_percentselected_y_percent
raw_pointscredited_pointsdaily_cap_reachedr   r   zIUPDATE geochallengeattempt SET raw_points = points WHERE raw_points = 0.0zSUPDATE geochallengeattempt SET credited_points = points WHERE credited_points = 0.0)dailyphraseassignmentphrasequizattemptc                     h | ]
}|d          S r   r   r   s     rB   r   z(migrate_sqlite_schema.<locals>.<setcomp>   s    ___c3q6___rD   zPRAGMA table_info()slotzALTER TABLE z1 ADD COLUMN slot VARCHAR NOT NULL DEFAULT '06:00')ro   rp   
startswithrL   beginexecuter   itemslensetadd)	conntablescolumnscolumnddltabledenomprefixadded_columnss	            rB   rM   rM   x   sS    ++H55 	 gp4llDLL6i1j1j$k$klllf$$``d;]6^6^)_)_```G +F'|#t(~	   
 egg, , ((LLc+++F""^^d;[6\6\)])]^^^GhRN    egg	, ,
 ((LLc+++&((ddd;a6b6b)c)cdddGVZ ,Juef\    egg
, 
, ((LLc+++f$$``d;]6^6^)_)_```GfdayS$v$vMMb    egg, , ((LLc+++&&bbd;_6`6`)a)abbbG)88T"kllmmm6))eed;b6c6c)d)deeeGG++T"tuuvvvT  #R  S  S  T  T  T%//kkd;h6i6i)j)jkkkGG++T"z{{|||$G33T"oppqqq= 	F 	FE, F FE.%...FLL5% 5 5 5" " "%Vq#f++/Uf[`UfUfUfv|  tD  tD  tD  E  E	F F F F
  6))eed;b6c6c)d)deeeGnn    egg, , ((LLc+++ F**ffd;c6d6d)e)efffG&)eeM 'B 'Bp#z%~    egg	. 	. ((LLc+++!%%f---.?@@ zT"mnnoooT"wxxyyyC 	p 	pE__T\\$?\TY?\?\?\:]:]-^-^___((LL&mU&m&m&m!n!nooo		pGgp gp gp gp gp gp gp gp gp gp gp gp gp gp gp gp gp gps   U4V==WWc                  V   t          t                    5 } t          |           }t          | |           t	          | |           t          |            t          |            t          | |           t          | |           t          | |           t          |            t          |            t          | |           t          |            t          |            t          |            t!          |            |                                  d d d            d S # 1 swxY w Y   d S N)r   rL   seed_childrenseed_child_settingsseed_task_templates+deactivate_timeline_replaced_task_templatesseed_benefitsseed_scheduleseed_calendar_eventsseed_challenge_playersseed_geo_challenge_targetsseed_screen_time_earn_rulesseed_reference_examsseed_daily_phrasesseed_daily_knowledge_questionsseed_app_settingsseed_admin_credentialcommitrS   childrens     rB   rP   rP      s\   	 G ))GX...GX...3G<<<ggx(((Wh///w111"7+++#G,,,Wh///7###&w///'"""g&&&!                 s   C<DD"%D"c                 r   ddddddddd	dg}i }|D ]}|                      t          t                                        t          j        |d
         k                                                        }|5t          di |}|                     |           |                                  |||j        <   |S )NEmilia#E879A8   🌸r   )namer   avatar
sort_orderValerie#22B8A0   🦋r   r   r   )rV   r	   r   wherer   firstr   flush)rS   seedresultitemr]   s        rB   r   r      s    IqQQY&PQRRD  "F # #VE]]00tF|1KLLMMSSUU=MMDMMEKKMMOOO"uzMrD   r   c                    ddddddddddd}|                                 D ]R}|                     t          t                                        t          j        |j        k                                                        }|                    |j	        dddd          }|F| 
                    t          d|j        t          d	d
          t          dd          dd|           d}|j        dk    r	d|_        d}|j	        |v r4|j        dk    r)|j	        dk    rd|_        d|_        d|_        d|_        d}|j	        dk    r|j        dk    r	d|_        d}|r| 
                    |           Td S )Nfrr   r   r   enr   r   r   )r   r   r   r   -   r      )r   default_wake_timedefault_school_startcommute_minutesF   Tr   r   r   )valuesrV   r	   r   r   r   rX   r   r}   r   r   r   r  r   r   r   r   )rS   r   defaultsr]   rq   child_defaultschangeds          rB   r   r   	  s   -1!`a{|}}.21ab|}~~ H "" $ $f]3399-:PTYT\:\]]^^ddff!ejTjk  AB  3C  3C  D  D>KK  `ux4PQSU;;mqrsuwmxmx  KM  `  `  Q_  `  `  a  a  a  aG%++)+&zX%%&*G4*O*OTYT^bjTjTj04--.*)*&./+zY&&6+F!+K+K./+ $F###+$ $rD   c                 p   d ddt           j        dddfd ddt           j        dddfd d	d
t           j        dddfd ddt           j        dddfg}|                                D ]}|D ]\  }}}}}}	}
|                     t
          d|j         d|           }|3|                     t          t                    
                    t          j        |j        k    t          j        |k                                                        }|.|                     t          |j        |||||	|
                     Ҍd S )Nzschultasche-checkzSchultasche bereitstellenr      zmusikinstrument-uebenu   Musikinstrument üben   zwuschi-fuetternu   Wuschi fütternr   d   zzimmer-10-minu   Zimmer 10 Minuten aufräumenr   n   zdeleted_task_template::)r   slugr   kind
coin_valuepenalty_valuer   )r&   requiredbonusr
  r}   r   rX   rV   r	   r)   r   r   r  r   r   )rS   r   	templatesr]   _r  r   r  r  r  r   	tombstonerq   s                rB   r   r   &  sw   	"$?ARTUWY[]^	&(?ARTUWY[]^	 "3X^Q3O	 >PQSTVYZ	I ""  KT 	 	GAtUD*mZJ0Z0Z0ZTX0Z0Z[[I$\\|$$**<+@EH+LlN_cgNghh egg  ~ !&!#!#-&3#-  
 
 
	 rD   templatec                     | j          d| j                                         t          fddD                       S )N c              3       K   | ]}|v V  	d S r   r   )r   partr   s     rB   	<genexpr>z,is_toothbrushing_template.<locals>.<genexpr>E  s'      [[tt|[[[[[[rD   )zaehneu   zähne
zahnputzenu   zähneputzen)r  r   lowerany)r  r   s    @rB   is_toothbrushing_templater(  C  sJ    m..hn..4466D[[[[(Z[[[[[[rD   c           	      `   t          j                    }|                     t          t                                                              D ]}t          |          sd|_        |                     |           |                     t          t                    
                    t          j        |j        k    t          j        t          j        k    t          j        |k                                                        }|D ](}t          j        |_        |                     |           )d S )NF)r   todayrV   r	   r)   allr(  r   r   r'   r   task_template_idrX   statusr(   open	task_date	cancelled)rS   r*  r  	instancesinstances        rB   r   r   H  s   JLLELL!5!566::<< " "(22 	HLL<  &&-<#z6&%/ 
 
 #%% 	 " 	" 	"H(2HOKK!!!!	"" "rD   c                 @   ddddddddd	d
ddddddddg}|D ]}|                      t          t                                        t          j        |d         k                                                        }||                     t          di |           d S )N	filmabendzFilmabend aussuchenu!   Ein Kind wählt den Familienfilm.r	  
   )r  r   descriptionpricer   zdessert-wunschzDessert-Wunschu#   Dessert für einen Abend aussuchen.r   r  zextra-vorlesenzExtra Vorlesenu$   15 Minuten zusätzliche Vorlesezeit.r   r  r  r   )rV   r	   r   r   r  r   r   )rS   benefitsr   rq   s       rB   r   r   [  s    '<Mp{}  NP  	Q  	Q!,<Mr}~  OQ  	R  	R!,<Ms~  PR  	S  	SH
  ) )fWoo33GLDL4PQQRRXXZZ>KK$((() )rD   c           	         dddddddddd	d
dddddg}|D ]}|                      t          t                                        t          j        |d         k                                                        }| |                     t          di |           |j        dk    r"|d         |_        |                     |           d S )Nzbuch-lesen-20z20 Minuten Buch lesenz$Lies ruhig 20 Minuten in einem Buch.r  r5  r   )r  r   r6  required_minutesreward_minutesr   r   zsport-20z20 Minuten Sportz8Bewege dich 20 Minuten draussen, im Verein oder zuhause.r  r   r   r   )rV   r	   r$   r   r  r   r   r   )rS   rulesr   rq   s       rB   r   r   g  s%    +BSy  PR  fh  yz  JL  	M  	M&8  JD  Z\  pr  CD  TV  	W  	WE     f%788>>?Q?VZ^_eZf?fgghhnnpp>KK*22T2233331$$!%m!4FKK   rD   c                 d    t          |            t          | |           t          | |           d S r   )seed_time_slotsseed_schedule_daysseed_schedule_blocksr   s     rB   r   r   u  s6    Gw)))(+++++rD   c                    dt          dd          t          dd          ddfdt          dd	          t          d
d          d	dfdt          d
d          t          d
d          ddfdt          dd          t          dd          ddfdt          dd          t          dd          ddfddt          dd          t          dd          ddfdt          dd	          t          dd          ddfdt          dd	          t          dd          ddfdt          dd          t          dd          ddfd t          d!d          t          d!d"          d#dfd$t          d%d          t          d&d          d'dfg}|D ]\  }}}}}|                     t          t                                        t          j        |k                                                        }|'|                     t          |||||(                     d S ))Nu   07:30–08:15   r  r   r  r5  Fu   08:20–09:05r  	      u   09:10–09:557   u   10:15–11:00   r   (   u   11:05–11:502   )MittagspauseNN<   Tu   13:30–14:15      F   u   14:20–15:05P   u   15:20–16:05r4   Z   u   16:10–16:55r  u   17:00–17:45   r  r  u   18:30–19:30      x   )label
start_timeend_timer   is_lunch_break)r   rV   r	   r!   r   rT  r   r   )rS   slotsrT  r   endr   lunchrq   s           rB   r>  r>  {  s   	$q"++tAr{{B>	$q"++tAqzz2u=	$q"++tAr{{B>	$r2,,RR?	$r1++tB||R?.	$r2,,Rb%@	$r2,,RR?	$r2,,RR?	$r2,,Rc5A	$r1++tB||S%@	$r2,,Rc5AE 16 D D,uc:uf%566<<=M=SW\=\]]^^ddff>KK(uQTak  }B  C  C  C  D  D  DD DrD   c                    |                                 D ]}t          dd          D ]}|                     t          t                                        t          j        |j        k    t          j        |k                        	                                }|_t	          |j        |t          dd          t          dd          dd          }|                     |           |                                  Ҍd S )	Nr   r   r   r  r  rD  T)r   r   school_start
school_endr   is_school_day)r
  rangerV   r	   r    r   r   rX   r   r   r   r   r   )rS   r   r]   r   days        rB   r?  r?    s    ""    Q{{ 	  	 G,,{##))+*>%(*JKL_cjLjkk egg  {!58WSWXY[]S^S^koprtukvkv  DH  X\  ]  ]  ]C   	    rD   c            $      V   dddt          dd          t          dd          dd	d
df	dddt          dd          t          dd          dd	d
df	dddt          dd          t          dd          dd	d	df	dddt          dd          t          dd          dd
d	df	dddt          dd          t          dd          dd	d
df	dddt          dd          t          dd          dd	d
df	dddt          dd          t          dd          dd
d	df	dddt          dd          t          dd          dd	d
df	dddt          dd          t          dd          dd	d	df	dddt          dd          t          dd          dd	d
df	dddt          dd          t          dd          dd
d
df	dddt          dd          t          dd          dd	d
df	dddt          dd          t          dd          dd	d	df	dddt          dd          t          dd           dd
d
d!f	dd"dt          d#d          t          dd          dd	d
df	dd"d$t          dd          t          dd          dd	d
d%f	dd"dt          dd          t          d&d          dd	d
df	dd"dt          d&d          t          d&d'          dd	d	df	dd"dt          dd          t          dd          dd	d
df	dd(dt          dd          t          d&d'          dd	d
df	dd(dt          dd          t          dd          dd	d
df	dd(d)t          dd          t          dd          dd	d
df	dd(dt          d#d          t          dd          dd	d
df	dd(dt          dd          t          dd          dd	d
df	dd(d$t          dd          t          dd          dd	d
d%f	dddt          dd          t          dd          dd	d
df	ddd*t          dd          t          dd          dd	d
df	dddt          dd          t          dd          dd	d
df	gS )+zManual reference timetable from the photo provided by the family.

    No OCR is used at runtime. Blank coloured school cells are stored as "Schule" so
    the dashboard can still calculate school start/end from structured data.
    r   r   Schuler   r  rF  rD  school_subjectTF EnglischrH  TurnenrK  r  r  sports	Turnhalle   MädchenriegerP  rR  r   r   r   r5  zGitarre ZI 205r	  musiczZI 205z
Klavier EG#   EGr   rB  TTGWerkraumrC  rE  r   Musik
Halbklasse)r   r   rD   rB   reference_schedule_blocksrq    s    
1hQT"a[[:JDRWY[\	1j$r1++tB||=MtUZ\^_	1hRd2qkk8T4Q\]	1otB||T"a[[(ESWYde	Axad2rll<LdTY[]^	Az4B<<b!>NPTV[]_`	ARd2qkk8UTXZef	1hQT"b\\;KTSXZ\]	1hRd2qkk8T4Q\]	1hRT"b\\;KTSXZ\]	1&Rd2rllGUTY[cd	Axad2rll<LdTY[]^	Axb"tB{{HdDR]^	A|T"b\\4B<<%QVX\]	1hQT"b\\;KTSXZ\]	1eT"b\\4B<<9I4QVXbc	Axad1bkk;KTSXZ\]	Axad1bkk8T4Q\]	Axb"tB||=MtUZ\^_	1j$q"++tAr{{<LdTY[]^	1hRd2rll<LdTY[]^	1gtB||T"a[[:JDRWY[\	Az42;;Q=MtUZ\^_	Axad2rll<LdTY[]^	Aud2rllDQKK9I4QVXbc	1hQT"b\\;KTSXZ\]	1lDRLL$r1++?OQUW\^`a	Axad2rll<LdTY[]^C" "rD   )reset_to_referencerr  c                4   ddd}t                      }|rl|                     t          t                                                              D ]}d|_        |                     |           |                                  |D ]\	  }}}}	}
}}}}||         }|                     t          t                    	                    t          j
        |j        k    t          j        |k                                                        }d }|s|                     t          t                    	                    t          j
        |j        k    t          j        |k    t          j        |k    t          j        |	k    t          j        dk                                                        }|&t          |r|j        nd |j        ||	|
          }|r|j        nd |_        ||_        |
|_        t%          |          |_        ||_        ||_        ||_        ||_        |p|                                dk    p|dk    |_        d|_        ||         |_        d	|_        |d
z  |	j        dz  z   |	j        dz  z   |_        d|_        |                     |           d S )Nr   r   r  FT)schedule_day_idr   r   	starts_atends_atturnenrg  zReferenz Stundenplan IMG_4167r  r   r  ) rq  rV   r	   r   r+  r   r   r   r    r   r   rX   r   r   r   ru  rt  rv  r   r   subjectr   roomr   r&  requires_sports_gearr   r   r   hourminuter   )rS   r   rr  colors
block_seedr   
child_namer   r   r   rY  r   r   rg  r   r]   r`  rq   s                     rB   r@  r@    s   !i88F*,,J <<} 5 566::<< 	 	CCJKKbl  ^
GUE3
<LfV^$ll6+..44[5IUX5UWbWjnuWuvvww}}! 		\\}%%++!*eh6!)W4!'50!+u4!(D0   egg  c,CCFFteh`gsx  CF  G  G  G(+5cff	*:66/#)#`U[[]]h-F#`*X`J` #:&	3	 3a7%,":LL
C? rD   c                 0   |                     d          }dddddd|r|j        nd dfd	d
dddddddddddddddddddddd g}|D ]\  }}}}}t          d!          j                            |          }	|                     t          t                                        t          j	        |	k    t          j
        |k    t          j        |k                                                        }
|
(|                     t          |	||||d"#                     d S )$Nr   )
2026-06-16zProbe Amphitheater/Aula (?)z'Turnschuhe, Trinken, Kappe, SonnencremeN   🎭)r  z
Jimmy CarrWhiteboard-EintragNu   🎤)z
2026-06-17zProbe Amphitheaterr  Nr  z
2026-06-18zSchwimmen Er  u   🏊)
2026-06-19Jokertagr  Nu   ⭐)r  
Europaparkr  N   🎢)z
2026-06-20r  r  Nr  )
2026-06-21zMarcel/Rocky (?)Unsicherer Whiteboard-EintragN   ❔)r  zAgility (?)r  Nu   🐕)
2026-06-22z	DH Marcelr  Nu   📌)r  ri  /Informativ; beeinflusst Aufgaben/Timeline nichtN   🤸)
2026-06-23
Bibliothekr  Nu   📚)r  z
Instr. (?)r  Nr  )z
2026-06-24z	Bei Rahelr  Nu   🏡)z
2026-06-26
Jugendfestr  N   🎉)z
2026-06-27r  r  Nr  )
2026-06-29	Schulfreir  Nu   🏖️)r  ri  r  Nr  )z
2026-07-02z	Mutti (?)r  Nr  )z
2026-07-03u   FDP Brätelnr  Nu   🔥)z
2026-07-04u   Fionna zügelnr  Nu   📦)z
2026-07-06Sommerferienr  N   ☀️)z
2026-07-07r  r  Nr  )z
2026-07-08r  r  Nr  )z
2026-07-09r  r  Nr  )z
2026-07-10r  r  Nr  )z
2026-07-11r  r  Nr  )z
2026-07-12r  r  Nr  datetimeT)r`  r   r6  r   iconr   )r}   rX   
__import__r   fromisoformatrV   r	   r   r   r`  r   r   r   r   )rS   r   emiliaeventsday_textr   r6  r   r  r`  rq   s              rB   r   r     s   \\(##FnHP	}&:<YFIIUY[abEHHXTGhHRGHHJhQJLLLLLLLL9F< 9? A A4%h$$)77AAf]3399-:Ks:RTaTgkpTpr  sI  MU  sU  V  V  W  W  ]  ]  _  _>KK#U^fmqz~  A  A  A	A ArD   c           	      :   |                     d          }|d S ddlm} ddlm} ddlm}  |ddd          }|                     t          t                    
                    t          j        |j        k    t          j        d	k    t          j        |k    t          j        |j        k                                                        }|Ct          |j        d	d
|dd          }|                     |           |                                   || |           d S )Nr   r   )r   )
ExamStatus)generate_study_plani  r      MatheDivisionr   F)r   rx  topic	exam_datestudy_sessionsinclude_weekends)r}   r  r   rI   r  app.services.calendarr  rV   r	   r   r   r   rX   rx  r  r-  r0  r   r   r   )rS   r   r  _dater  r  r  rq   s           rB   r   r     s8   \\(##F~&&&&&&,,,,,,999999dAr""I\\tMVY&LG#Ni'K://		
 	
  egg  ~vy'W`qr  FK  L  L  LF(((((rD   c                 r   g d}g d}d|fd|ffD ]\  }}|D ]\  }}}}}	|                      t          t                                        t          j        |k    t          j        |k                                                        }
|
*|                     t          |d|||||	d                     d S )N))zI am ready for school.u   Ich bin bereit für die Schule.u   Ich bin müde nach der Schule.Ich suche meine Schuhe.school)zCan I have some water, please?z"Kann ich bitte etwas Wasser haben?zKann ich bitte mein Buch haben?zIch habe heute Sport.
politeness)zI like reading books.u   Ich lese gern Bücher.zIch schreibe gern Briefe.u   Ich mag keine Bücher.hobby)zToday is a good day.zHeute ist ein guter Tag.zMorgen ist mein Geburtstag.zHeute ist sehr kalt.daily)zI need my sports bag.zIch brauche meine Sporttasche.u   Ich brauche meine Zahnbürste.zIch habe meine Tasche gefunden.r  )zWhere is my pencil?zWo ist mein Bleistift?zWo ist mein Mittagessen?zIch habe einen Bleistift.r  )zI can help you.zIch kann dir helfen.zDu kannst mir helfen.u   Ich kann dich hören.family)zPlease wait for me.zBitte warte auf mich.zBitte ruf mich an.zBitte lies mir vor.r  )zI am hungry.Ich habe Hunger.zIch bin durstig.zIch bin fertig.food)zThis is my sister.Das ist meine Schwester.zDas ist meine Freundin.Das ist mein Zimmer.r  )zI brush my teeth.   Ich putze meine Zähne.   Ich wasche meine Hände.zIch ziehe meine Schuhe an.routine)zMy homework is finished.zMeine Hausaufgaben sind fertig.zMeine Tasche ist leer.Meine Jacke ist blau.r  )zI have music today.zIch habe heute Musik.zIch habe heute frei.zIch habe morgen Musik.r  )zThe book is on the table.zDas Buch liegt auf dem Tisch.z!Die Tasche steht unter dem Tisch.zDas Buch ist in der Schule.objects)zI go home at four o'clock.z Ich gehe um vier Uhr nach Hause.u   Ich gehe um fünf Uhr schlafen.z Ich gehe um vier Uhr zur Schule.r   )zCan you repeat that, please?z Kannst du das bitte wiederholen?z Kannst du bitte schneller gehen?zKannst du mir Wasser bringen?r  )zI don't understand.Ich verstehe nicht.   Ich höre nicht zu.zIch bin nicht zu Hause.r  )zSee you tomorrow.Bis morgen.Bis heute Abend.Guten Morgen.r  )zI am proud of you.zIch bin stolz auf dich.u   Ich bin wütend auf dich.zIch warte auf dich.r  )zIt is time for dinner.u   Es ist Zeit fürs Abendessen.u   Es ist Zeit fürs Frühstück.u   Es ist Zeit für die Schule.r  )zI need a break.zIch brauche eine Pause.zIch brauche eine Jacke.zIch mache eine Aufgabe.feelings)zMy favourite colour is blue.zMeine Lieblingsfarbe ist blau.Mein Lieblingsessen ist Reis.r  personal)zI play the piano.Ich spiele Klavier.zIch spiele Fussball.u   Ich höre Musik.rj  )zThe weather is sunny.zDas Wetter ist sonnig.zDas Wasser ist kalt.zDer Weg ist lang.weather)zI am going to bed.zIch gehe ins Bett.u   Ich gehe in die Küche.zIch gehe nach draussen.bedtime)zGood night and sleep well.zGute Nacht und schlaf gut.zGuten Morgen und viel Spass.zGuten Appetit und danke.r  )zI packed my school bag.z#Ich habe meine Schultasche gepackt.u!   Ich habe mein Zimmer aufgeräumt.zIch habe meine Schuhe geputzt.r  )zI would like an apple.   Ich möchte einen Apfel.u   Ich möchte ein Buch.zIch esse einen Apfel nicht.r  )zThat was fun.zDas hat Spass gemacht.zDas war sehr schwer.zDas ist morgen.r  )zI am learning English.zIch lerne Englisch.u   Ich lerne Französisch.zIch spreche Deutsch.r  ))zBonjour, je m'appelle Emilia.zHallo, ich heisse Emilia.u   Guten Abend, ich bin müde.zHallo, ich suche Emilia.intro)zJ'ai onze ans.zIch bin elf Jahre alt.u   Ich habe elf Bücher.zIch bin neun Jahre alt.r  )u   Je vais à l'école.zIch gehe zur Schule.zIch gehe nach Hause.zIch bleibe im Bett.r  )zJ'aime lire.zIch lese gern.zIch schreibe gern.zIch schlafe gern.r  )zMerci beaucoup.zVielen Dank.r  zBitte warte.r  )u   Où est mon sac?zWo ist meine Tasche?zWo ist mein Buch?zDas ist meine Tasche.r  )u   Je suis prête.Ich bin bereit.u   Ich bin müde.zIch bin hungrig.r  )zJe voudrais de l'eau.u   Ich möchte Wasser.u   Ich möchte Brot.zIch trinke Milch.r  )u   C'est ma sœur.r  zDas ist meine Mutter.r  r  )zJe ne comprends pas.r  u   Ich höre nicht.zIch weiss es.r  )u   Répète, s'il te plaît.zWiederhole es bitte.zWarte bitte.zLies bitte.r  )z
J'ai faim.r  Ich habe Durst.zIch habe Zeit.r  )z
J'ai soif.r  r  zIch habe Angst.r  )zIl est temps de dormir.zEs ist Zeit zu schlafen.zEs ist Zeit zu essen.zEs ist Zeit zu lernen.r  )zBonne nuit.zGute Nacht.z
Guten Tag.r  r  )u
   À demain.r  r  zGuten Appetit.r  )zJe range ma chambre.u   Ich räume mein Zimmer auf.r  zIch packe meine Tasche.r  )zJe brosse mes dents.r  r  u   Ich kämme meine Haare.r  )zMon livre est ici.zMein Buch ist hier.zMeine Tasche ist dort.zMein Heft ist blau.r  )zJ'aime la musique.zIch mag Musik.zIch mache Musik.r  rj  )zJe joue de la guitare.zIch spiele Gitarre.r  zIch singe ein Lied.rj  )zAujourd'hui, il fait beau.u   Heute ist schönes Wetter.zHeute ist Schule.u   Heute ist es spät.r  )zJe suis contente.u   Ich bin glücklich.r  zIch bin zu Hause.r  )zC'est facile.zDas ist einfach.zDas ist schwer.zDas ist fertig.r  )zC'est difficile.zDas ist schwierig.zDas ist lustig.zDas ist klein.r  )zJe prends mon sac.zIch nehme meine Tasche.r  zIch packe mein Essen.r  )zJe mange une pomme.zIch esse einen Apfel.zIch trinke Wasser.r  r  )u    Ma couleur préférée est rose.zMeine Lieblingsfarbe ist rosa.r  zMeine Jacke ist rosa.r  )u   Je parle un peu français.u&   Ich spreche ein bisschen Französisch.zIch spreche sehr gut Englisch.zIch lerne ein bisschen Mathe.r  )zBravo, c'est super!zBravo, das ist super!zGuten Abend, schlaf gut!zBitte komm schnell!encouragementr  r  beginnerT)languagerz   foreign_textgerman_translationwrong_option_1wrong_option_2themer   )rV   r	   r   r   r  r  r   r   )rS   r  r  r  rowsr  germanwrong1wrong2r  rq   s              rB   r   r   1  s=   
 
 
B@
 
 
B@ !":bz2 L L$;? 	L 	L7L&&&%\\&"5"5";";K<PT\<\^i^v  {G  _G  #H  #H  I  I  O  O  Q  QF~KZf  |B  SY  jp  x}  FJ  K  K  K  L  L  L	LL LrD   c                 4   g d}|D ]\  }}}}}}}|                      t          t                                        t          j        |k                                                        }	|	*|                     t          |||||||d                     d S )N)<)r   Natur & Tierez%Was braucht eine Pflanze zum Wachsen?zLicht und Wasser
SchokoladeFernbedienungz/Pflanzen brauchen Licht, Wasser, Luft und Erde.)r   Zeitz&Wie viele Tage hat eine normale Woche?7510zEine Woche hat sieben Tage.)r   Schweizz%Welche Farbe hat das Schweizer Kreuz?Weissu   GrünBlauz.Das Schweizer Kreuz ist weiss auf rotem Grund.)r      Körper & Gesundheitz5Was hilft nach dem Spielen besonders gut gegen Durst?zWasser trinkenzNoch mehr rennenz
Salz essenu#   Wasser ist ein guter Durstlöscher.)r   Freundlichkeitz$Was sagst du, wenn dir jemand hilft?DankezGeh wegz
Nie wiederzDanke sagen ist freundlich.)r   Medienz@Solltest du fremden Personen im Internet deine Adresse schicken?Neinz	Ja, immerzNur wenn sie nett schreibenu"   Persönliche Daten bleiben privat.)r   Umweltu   Wohin gehört Papier meistens?zIns Altpapierz
In den SeezIn den Backofenz Papier kann oft recycelt werden.)r   GeldzWas ist ein Sparschwein?zEin Ort zum Geld sparenzEin Tier im ZoozEin Schulbusu   Darin kann man Münzen sammeln.)r   KalenderzWas kommt nach Montag?DienstagSonntagFreitagzNach Montag kommt Dienstag.)r   Logikz#Was passt nicht: Apfel, Birne, Zug?ZugApfelBirneu   Apfel und Birne sind Früchte.)r   r  u   Welcher See liegt bei Zürich?
   ZürichseeBodensee	Thunerseeu   Zürich liegt am Zürichsee.)r   r  z Was bedeutet es, Geld zu sparen?zNicht alles sofort ausgebenzAlles sofort kaufenzGeld verlierenu+   Sparen heisst, etwas für später behalten.)r   r  zWarum sind Bienen wichtig?u   Sie bestäuben viele PflanzenzSie machen SchneezSie fressen Plastiku/   Viele Früchte entstehen erst nach Bestäubung.)r   r  z,In welchem Kanton liegen Brugg und Windisch?AargauTessinWallisz+Brugg und Windisch liegen im Kanton Aargau.)r   r  zWie viele Monate hat ein Jahr?12r  14u   Ein Jahr hat zwölf Monate.)r   r  z7Warum sollte man bei Internet-Informationen nachdenken?zWeil nicht alles stimmen musszWeil Lesen verboten istu   Weil Bilder immer lügenz&Im Internet kann auch Falsches stehen.)r   r  u*   Warum löscht man Licht in leeren Zimmern?zUm Energie zu sparenzDamit Pflanzen schlafenzDamit der Boden sauber bleibtu"   Unnötiges Licht verbraucht Strom.)r   r  u+   Warum wäscht man vor dem Essen die Hände?z$Damit weniger Keime ans Essen kommenu   Damit die Hände blau werdenzDamit man schneller isstu/   Händewaschen entfernt Schmutz und viele Keime.)r   r  z&Was ist in einem Streit oft hilfreich?u   Ruhig sagen, was man fühltzSofort schreienzEinfach wegrennen und nie redenu)   Ruhige Worte helfen, Lösungen zu finden.)r   
GeschichtezWas war Vindonissa?u   Ein römisches LegionslagerzEin moderner FlughafenzEin See im Tessinz&Vindonissa lag beim heutigen Windisch.)r   Deutschz&Was hilft beim Verstehen eines Textes?zWichtige Stellen nochmals lesenu   Nur die Überschrift anschauenzDas Buch schliessenz#Nochmal lesen hilft beim Verstehen.)r   zMathe-Anwendungz.Wenn du Preise vergleichst, worauf achtest du?u   Was ich für mein Geld bekommeu   Nur auf die schönste FarbezNie auf den Preisz+Vergleichen hilft bei guten Entscheidungen.)r   r  u!   Was machen Regenwürmer im Boden?zSie lockern den BodenzSie bauen ComputerzSie trinken Benzinu   Regenwürmer helfen dem Boden.)r   r  z'Wie heisst die Bundesstadt der Schweiz?Bern   ZürichLuganozBern ist die Bundesstadt.)r   r  zWas zeigt der Minutenzeiger?zDie Minutenz	Den Monatz
Das Wetterz'Der lange Zeiger zeigt oft die Minuten.)r   r  zWas ist Recycling?z'Aus alten Dingen wieder Material nutzenzAlles verbrennenzDinge im Wald versteckenzRecycling spart Rohstoffe.)r   r  z#Was ist ein sicheres Passwort eher?zEin langes geheimes Passwort1234zDer eigene Vornameu)   Lange, geheime Passwörter sind sicherer.)r   r  u4   Was ist ein Wunsch im Vergleich zu einem Bedürfnis?u'   Etwas Schönes, aber nicht immer nötigzImmer lebenswichtigu"   Ein anderes Wort für Hausaufgabenu)   Bedürfnisse sind wichtiger als Wünsche.)r   NaturuC   Warum fällt ein Stein schneller zu Boden als eine Feder im Zimmer?u)   Die Feder wird stärker von Luft gebremstzDer Stein kennt den Wegu   Die Feder schläftz Luft bremst leichte Dinge stark.)r   r  z<Alle Katzen sind Tiere. Minka ist eine Katze. Was ist Minka?zEin TierzEine Pflanzez
Ein Kantonz,Wenn Minka eine Katze ist, ist sie ein Tier.)r   r  z-Wie heisst die Hauptstadt des Kantons Aargau?AarauBruggBaden,Aarau ist die Hauptstadt des Kantons Aargau.)r   r  zWas ist ein Budget?u$   Ein Plan für Einnahmen und AusgabenzEine EinkaufstaschezEin Schulfachz#Ein Budget hilft, Geld einzuteilen.)r   r  u-   Warum sollte man Quellen im Internet prüfen?z#Weil nicht alles im Internet stimmtz&Weil das Internet sonst langsamer wirdzWeil Bilder keine Texte habenu4   Quellenprüfung schützt vor falschen Informationen.)r   r  u?   Welche drei Orte gehören zur Region Wasserschloss der Schweiz?z(Aare, Reuss und Limmat treffen sich dortu   Drei Berge berühren sichu$   Drei Flughäfen liegen nebeneinanderu3   Beim Wasserschloss treffen grosse Flüsse zusammen.)r   r  z*Was ist Photosynthese ganz einfach gesagt?z!Pflanzen machen mit Licht NahrungzSteine wachsen im Wasseru   Tiere bauen Häuserz'Pflanzen nutzen Licht, Wasser und Luft.)r      Körperu%   Warum ist Schlaf für Kinder wichtig?u,   Der Körper erholt sich und das Gehirn lerntzMan verpasst dann jede Mahlzeitz Schlaf macht Hausaufgaben fertigz)Im Schlaf verarbeitet das Gehirn den Tag.)r   r  zWas ist ein Schaltjahr?u/   Ein Jahr mit einem zusätzlichen Tag im FebruarzEin Jahr ohne SommerzEin Jahr mit 13 Wochenz&Schaltjahre gleichen den Kalender aus.)r   r  u*   Warum sind erneuerbare Energien nützlich?u$   Sie können sich natürlich erneuernz Sie verbrauchen immer mehr Kohlez Sie funktionieren nur im Weltallu7   Sonne, Wind und Wasser können laufend Energie liefern.)r   r  z&Was ist die Hauptaussage eines Textes?zDie wichtigste Botschaftu   Das längste WortzDie Seitenzahlz/Die Hauptaussage fasst das Wichtigste zusammen.)r   r  zBWenn alle Quadrate Rechtecke sind, ist jedes Rechteck ein Quadrat?r  JazNur am Montagz,Ein Quadrat ist spezieller als ein Rechteck.)r   r  u   Warum bauten Römer Strassen?u    Für Handel, Reisen und Soldatenu   Damit Kühe tanzenzNur als Spielplatzu,   Strassen verbanden Orte im Römischen Reich.)r   r  zWas ist ein guter Kompromiss?zBeide Seiten geben etwas nachzEine Person gewinnt allesu   Niemand hört zuz$Kompromisse suchen eine faire Mitte.)r   r  z Warum lohnt sich Preisvergleich?zMan kann bewusster entscheidenz"Man muss immer das Teuerste nehmenzPreise sind immer gleichz Vergleichen spart manchmal Geld.)r   r  zWas bedeutet Werbung?u#   Sie will dich von etwas überzeugenzSie ist immer SchulstoffzSie ist nie geplantu4   Werbung soll Aufmerksamkeit und Kaufwünsche wecken.)r   r  z#Warum schwimmt Holz oft auf Wasser?z%Es ist meist weniger dicht als WasserzEs hat einen MotorzEs ist magnetischz&Dichte beeinflusst, ob etwas schwimmt.)r   r  u1   Welche Sprache hört man im Tessin besonders oft?Italienischu   Rätoromanischre  z&Im Tessin ist Italienisch Amtssprache.)r   r  zWas bedeutet Quartal?zEin Viertel eines JahreszEin halber TagzEine SchulnotezEin Jahr hat vier Quartale.)r   r  zWelche Aufgabe hat das Herz?u   Blut durch den Körper pumpenzGedanken speichernzEssen zerkleinernzDas Herz ist eine Pumpe.)r   r  u>   Warum sollte man Batterien nicht in den normalen Müll werfen?u:   Sie enthalten Stoffe, die speziell entsorgt werden müssenzSie sind essbarzSie werden sonst zu Papieru$   Batterien gehören in Sammelstellen.)r   r  zDDu hast drei Wege. Zwei sind gesperrt. Wie viele Wege bleiben offen?123u8   Von drei Wegen bleibt nach zwei gesperrten einer übrig.)r   r  z;Was bedeutet direkte Demokratie in der Schweiz vereinfacht?u9   Bürgerinnen und Bürger können über Vorlagen abstimmenu   Nur Könige entscheidenu    Kinder müssen Gesetze schreibenz)In der Schweiz gibt es Volksabstimmungen.)r   r  z2Was ist der Unterschied zwischen Meinung und Fakt?uF   Ein Fakt ist überprüfbar, eine Meinung ist eine persönliche AnsichtzBeides ist immer gleichz Eine Meinung ist immer eine Zahlu   Fakten kann man prüfen.)r   r  u*   Warum sind Wälder für das Klima wichtig?u5   Bäume speichern Kohlenstoff und kühlen die Umgebungu"   Bäume heizen die Luft absichtlichu   Wälder machen Metallu1   Wälder beeinflussen Luft, Wasser und Temperatur.)r   r  z+Was bedeutet Zins beim Sparen ganz einfach?u6   Zusätzliches Geld für geliehenes oder gespartes GeldzEine SportartzEin Kalenderblattu(   Zins ist ein Preis für Geld über Zeit.)r   r  z Welche Aufgabe haben die Lungen?z-Sauerstoff aufnehmen und Kohlendioxid abgebenu   Blut zählenzKnochen bauenzDie Lungen helfen beim Atmen.)r   r  z'Warum sind historische Quellen wichtig?u0   Sie zeigen, woher wir Wissen über früher habenzSie ersetzen jedes MuseumzSie sind immer erfundenz+Quellen helfen, Vergangenheit zu verstehen.)r   r  zIWenn eine Aussage durch ein Gegenbeispiel widerlegt wird, was heisst das?zSie gilt nicht immeru   Sie ist dadurch stärkerzSie wird zu Musikz&Ein Gegenbeispiel zeigt eine Ausnahme.)r   r  zWas ist der Wasserkreislauf?u<   Wasser verdunstet, bildet Wolken und fällt als Niederschlagu   Wasser verschwindet für immerzWasser wird zu Steinz&Wasser bewegt sich in einem Kreislauf.)r   r  zWas ist eine Schlussfolgerung?z%Etwas, das man aus Hinweisen ableitetzDer erste BuchstabezEin Satzzeichenz,Man kombiniert Hinweise zu einer Erkenntnis.)r   r  z"Warum haben Kantone eigene Regeln?u"   Die Schweiz ist föderal aufgebautzKantone sind private Firmenu   Regeln sind überall verbotenu+   Föderalismus verteilt Aufgaben auf Ebenen.T)rz   categoryquestioncorrect_answerr  r  explanationr   )rV   r	   r   r   r  r   r   )
rS   r  rz   r  r  correctr  r  r
  rq   s
             rB   r   r   y  s    A A ADD LP O OGx7FFKf%;<<BBCYCbfnCnooppvvxx>KK.UXX`qx  JP  ag  u@  IM  N  N  N  O  O  OO OrD   c                 L   ddddddddd	d
ddd}|                                 D ]\  }\  }}|                     t          |          }|&|                     t          |||                     K|dk    r.|j        dk    r#d|_        ||_        |                     |           d S )N)zEurope/Zurichu1   Lokale Zeitzone für Tagesabschluss und Kalender.)zGasser-Coinsu!   Anzeigename der Familienwährung.)truez)Initiale Admin-PIN wurde gehasht gesetzt.)r  uk   Schutzmarker: Produktivdatenbank wurde initialisiert; zentrale Tabellen dürfen beim Start nicht leer sein.)r  z.Warnton drei Minuten vor Loslaufen aktivieren.)r  u-   Coins pro korrekt gelöster Sprach-Challenge.)r  u/   Coins pro korrekt gelöster Rechnung des Tages.)r  u2   Coins pro korrekt gelöster Allgemeinwissen-Frage.)40z0Standard-Pensum Bildschirmzeit pro Kind und Tag.)4u3   Shop: Coin-Kosten für zusätzliche Bildschirmzeit.)r  u5   Shop: zusätzliche Minuten pro Bildschirmzeit-Tausch.)classiczBAlarmton bei abgelaufener Bildschirmzeit: classic, gentle, arcade.)timezone	coin_nameinitial_admin_pin_setr|   departure_warning_sound_enabledlanguage_quiz_coin_valuemath_quiz_coin_valueknowledge_quiz_coin_value!screen_time_default_daily_minutesscreen_time_exchange_coin_costscreen_time_exchange_minutesscreen_time_alarm_soundkeyvaluer6  r  60r  )r   r}   r   r   r  r6  )rS   settings_seedr  r  r6  rq   s         rB   r   r     s    ZJ!V &]+e$Z X%`-g*f(g#t M &3%8%8%:%:    !!e[Z-->KK
s%[QQQRRRR777FLD<P<PFL!,FKK   rD   c                    t          j        dd          }|dk    rdnCdt          j        |                    d                                                    d d          }|                     t          d          }|                     t          t                                        t          j        dk                                                        }|2|                     t          dt          |          	                     n6||j        |k    r)t          |          |_        |                     |           |'|                     t          d|d
                     d S ||_        |                     |           d S )N!FAMILYDASHBOARD_INITIAL_ADMIN_PIN9999admin_pin_seed_2026_06_9999admin_pin_seed_env_r6   r	  admin_pin_markeradmin)usernamepin_hashuE   Marker für zuletzt gesetzte Admin-PIN; speichert nie die PIN selbst.r  )r9   getenvr;   r5   r=   	hexdigestr}   r   rV   r	   r   r   r(  r   r   rC   r  r)  )rS   
target_pintarget_markerr   
credentials        rB   r   r     s   >GGJ5?65I5I11  Pcelest~  uF  uF  GN  uO  uO  fP  fP  fZ  fZ  f\  f\  ]`  ^`  ]`  fa  Pc  PcM[[%788Ff_55;;O<TX_<_``aaggiiJOWx
?S?STTTUUUU	6<=88&z22
J~J#5]  Y`  a  a  a  	b  	b  	b  	b  	b$FrD   c               #   l   K   t          t                    5 } | V  d d d            d S # 1 swxY w Y   d S r   )r   rL   ri   s    rB   get_sessionr0    s|      	 G                 s   )--c           
         dddd|d         j         ddddd	d|d         j         d
dddddd ddddddd ddg}|D ]}|                     t          t                                        t          j        |d         k                                                        }| |                     t          di |           |                                D ]\  }}t          |||           d|_
        |                     |           d S )Nr   r   r   Tr   )r   r   r   is_childlinked_child_idr   r   r   r   r   Marcelu   🧔z#3b82f6Fr   Melanieu   👩z#a855f7r   r   r   )rX   rV   r	   r   r   r   r   r   r   setattrr   )rS   r   r   r   existingr  r  s          rB   r   r     sU   ViTfnowfxf{  LM  	N  	Nfydgopygzg}  NO  	P  	PViUgk{|}}fyehl|}~~	D  " "<< 7 7 = =o>RVYZ`Va>a b bcciikkKK..#..////!iikk . .
U#u----"HOKK!!!!" "rD   latitude	longitudec                     d\  }}}}||z
  ||z
  z  dz  }|| z
  ||z
  z  dz  }t          dt          d|                    t          dt          d|                    fS )N)g333333@gffffff%@g33333G@g     F@r  r   )maxmin)r8  r9  leftrighttopbottomxys           rB   _geo_target_xyrC    sn    5D%f
d
ut|	,3A
.S6\	*c1Aq#c1++As3{{ 3 333rD   c                 J   g d}d |D             }|                      t          t                                                              }|D ]0}|j        |vr%|j        dv rd|_        |                     |           1t          |d          D ]\  }\  }}}}	}
}}t          ||	          \  }}|                      t          t                    	                    t          j        |k                        
                                }t          ||||	t          |d          t          |d          |
||d|	          }| |                     t          d
i |           |                                D ]\  }}t          |||           |                     |           d S )N)*)r  citygcZB>G@g|гY!@ZHr   uC   Zürich ist die grösste Stadt der Schweiz und liegt am Zürichsee.)r  rE  gMbXyG@g9#@BEr   z@Bern ist die Bundesstadt der Schweiz. Dort steht das Bundeshaus.)BaselrE  gk	G@gгYZ@BSr   z>Basel liegt am Rhein und grenzt an Deutschland und Frankreich.)LuzernrE  g-!lG@g<Nё\ @LUr   uK   Luzern liegt am Vierwaldstättersee und ist bekannt für die Kapellbrücke.)GenfrE  gy)G@g&S@GEr   zKGenf liegt am Genfersee und ist Sitz vieler internationaler Organisationen.)LausannerE  gݓBG@gy@VDr   zHLausanne liegt am Genfersee und ist eine wichtige Stadt in der Romandie.)z
St. GallenrE  guVG@gpΈ"@SGr   u3   St. Gallen ist bekannt für seine Stiftsbibliothek.)r  rE  gc=y G@gsF!@TIr   z%Lugano liegt im Tessin am Luganersee.)ChurrE  g鷯lG@gMb#@GRr   u0   Chur ist die Hauptstadt des Kantons Graubünden.)r  lakegq=
ףG@g\(\!@zZH/SG/SZr   u4   Der Zürichsee liegt südöstlich der Stadt Zürich.)	GenferseerT  g9G@g333333@zVD/GE/VSr   u3   Der Genfersee ist einer der grössten Seen Europas.)r  rT  g33333G@g33333"@zTG/SGr   uJ   Der Bodensee liegt im Dreiländereck Schweiz, Deutschland und Österreich.)u   VierwaldstätterseerT  g     G@g @zLU/UR/SZ/OW/NWr   uG   Der Vierwaldstättersee liegt in der Zentralschweiz und hat viele Arme.)r  rE  g
ףp=G@gfa @AGr   r   )r  rE  g1*G@g[잜 @rV  r   u>   Baden liegt an der Limmat und ist für Thermalquellen bekannt.)r  rE  g cZBG@g	gj @rV  r   z@Brugg liegt im Kanton Aargau nahe dem Wasserschloss der Schweiz.)WindischrE  g_LG@gV-o @rV  r   uW   Windisch liegt im Kanton Aargau bei Brugg. Dort gibt es das Legionärslager Vindonissa.)	SolothurnrE  gгYG@gN@!@SOr   u3   Solothurn gilt als schöne Barockstadt an der Aare.)SchaffhausenrE  gx&G@gjqD!@SHr   z0Schaffhausen liegt am Rhein nahe beim Rheinfall.)ThunrE  g/$aG@gPn@rG  r   z+Thun liegt am Thunersee im Berner Oberland.)
InterlakenrE  gVWG@ggs@rG  r   z4Interlaken liegt zwischen Thunersee und Brienzersee.)zBiel/BiennerE  gG@gx#@rG  r   u7   Biel/Bienne ist zweisprachig: Deutsch und Französisch.)r  rE  g0L
FG@g-!@ZGr   z9Zug liegt am Zugersee und ist Hauptstadt des Kantons Zug.)	NeuenburgrE  gjM~G@gMbX@NEr   z"Neuenburg liegt am Neuenburgersee.)	MurtenseerT  g-vG@g\(\@zFR/VDr   z&Der Murtensee liegt im Drei-Seen-Land.)WalenseerT  g(\G@g(\u"@zSG/GLr   z+Der Walensee liegt zwischen steilen Bergen.)r  rT  gYG@g=,Ԛ@rG  r   z'Der Thunersee liegt im Berner Oberland.)BrienzerseerT  grh\G@gʡE@rG  r   u<   Der Brienzersee ist für seine türkisfarbene Farbe bekannt.)zLago MaggiorerT  gRG@g(\u!@rQ  r   z1Der Lago Maggiore liegt im Tessin und in Italien.)SionrE  gKY8G@g[ Aq@VSr   z+Sion ist die Hauptstadt des Kantons Wallis.)
BellinzonarE  gG@gx$(~"@rQ  r   u)   Bellinzona ist bekannt für seine Burgen.)DavosrE  g?߾fG@gQ#@rS  r   u'   Davos liegt hoch in den Bündner Alpen.)ZermattrE  g{/LG@g@re  r   z&Zermatt liegt am Fuss des Matterhorns.)GrindelwaldrE  gOG@g|a2 @rG  r   uD   Grindelwald liegt im Berner Oberland bei Eiger, Mönch und Jungfrau.)	AndermattrE  goTQG@gV-/!@URr   u:   Andermatt liegt im Urserental nahe wichtigen Alpenpässen.)ArosarE  g<dG@g$[#@rS  r   u,   Arosa ist ein Bergort im Kanton Graubünden.)LocarnorE  gHG@glV}!@rQ  r   zLocarno liegt am Lago Maggiore.)zLa Chaux-de-FondsrE  gh|?G@gioT@r`  r   u/   La Chaux-de-Fonds ist bekannt für Uhrmacherei.)u   SäntismountaingVG@g oů"@zAI/AR/SGr   u5   Der Säntis ist ein markanter Berg in der Ostschweiz.)Pilatusrn  gAf}G@gn4@ @zLU/OW/NWr   zDer Pilatus steht bei Luzern.)
Matterhornrn  gۊeF@g	h@re  r   z9Das Matterhorn ist einer der bekanntesten Berge der Welt.)Gotthardpassregiongm4GG@gZd;!@zUR/TIr   u5   Der Gotthardpass verbindet die Nord- und Südschweiz.c                     h | ]
}|d          S r   r   r   s     rB   r   z-seed_geo_challenge_targets.<locals>.<setcomp>:  s    ...sCF...rD   >   Rheinquelle / TomaseeSamedan	Rheinfall
WinterthurFr   )r   r   T)r   target_typer8  r9  r   r   canton
difficulty	info_textr   r   r   )rV   r	   r   r+  r   r   r   	enumeraterC  r   r   dictroundr   r6  )rS   targetsactive_namesexisting_targetsr7  r   r   rx  latlonry  rz  r{  r   r   datar  r  s                     rB   r   r     s   + + +GX /.g...L||F+=$>$>??CCEE$ " "=,,  CB  2B  2B#HOKK!!!T]^emnToToTo 	" 	"P
PT;S&*i-c377	9<<'9 : : @ @ASAX\`A` a abbhhjj;PS_denpq_r_r  D  EN  PQ  R  R  [a  nx  DM  VZ  gq  r  r  rKK*22T223333"jjll . .
U#u----KK!!!!	" 	"rD   r   )r2   N)br>   r;   loggingr9   r  r   r   pathlibr   sqlmodelr   r   r   r	   
sqlalchemyr
   r   app.core.configr   rH   r   rI   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   ro   	getLoggerrt   rm   parentmkdirrp   r   r/   rL   rn   bytesrC   rR   rU   r[   r}  rj   rO   rN   rM   rP   r   r   r   boolr(  r   r   r   r   r>  r?  listtuplerq  r@  r   r   r   r   r   r   r0  r   floatrC  r   r   rD   rB   <module>r     sM      				               = = = = = = = = = = = = ! ! ! ! ! ! ! ! ( ( ( ( ( ( " " " " " "                                                           > <>>		8	9	9"TD999/7/D/O/OPX/Y/Ya#U++_a	x,5|	T	T	T # UT\ S    	% 	% 	% 	%F FC F F F FG S#X    "\c \d \ \ \ \$ $ $ $jp jp jp jpZ   (7 tCJ'7     $ $De4D $ $ $ $ $: De4D     :\ \ \ \ \ \
" "T " " " "&	)7 	)t 	) 	) 	) 	)   T        ,7 ,d3:.> ,4 , , , ,DW D D D D D*	  	 4U
3C 	  	  	  	  	 (4c3T4dTXZ].](^#_ ( ( ( (V fk ' ' '' 'T#u*5E '^b 'os ' ' ' 'V$A' $AT#u*5E $A$ $A $A $A $AP)' )T#u*5E )$ ) ) ) ).EL ELD EL EL EL ELPFOG FO FO FO FO FOR w  4        27 t    &  
"G "tCJ7G "D " " " "$4U 4u 4ue|9L 4 4 4 4<" <"D <" <" <" <" <" <"rD   