Ë
    zëj²(  ã                  óš  — U d dl mZ d dlmZmZ d dlmZ d dlmZm	Z	 d dl
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 d	Zd
ed<   ddddddœZded<   ddddd	œZded<   d,d„Zd-d„Zd.d„Zd/d„Zd0d„Zd1d„Zd2d „Z	 	 	 	 	 	 d3d!„Z 	 	 	 	 	 	 	 	 	 	 d4d"„Z!d-d#„Z"d5d$„Z#d5d%„Z$d6d&„Z%	 	 	 	 	 	 	 	 	 	 d7d'„Z&	 	 	 	 	 	 	 	 d8d(„Z'	 	 	 	 	 	 	 	 d9d)„Z(d:d*„Z)y+);é    )Úannotations)ÚHTTPExceptionÚstatus)ÚSession)ÚUserÚUserRegisterStep)ÚProgrammeSession)Ú seed_prior_programme_completions)Úselectinload)ÚRegisterStepItemOutÚRegisterStepStatusÚUserRegisterStepAcceptRequestÚUserRegisterStepSaveRequestÚUserRegisterStepStateResponse©ÚlevelÚmoduleÚweekÚsessionztuple[str, ...]ÚREGISTER_STEP_ORDERÚLevelÚModuleÚWeekr   Ú	Completed)r   r   r   r   Ú	completedzdict[str, str]ÚREGISTER_STEP_LABELS)Úlevel_idÚ
level_name)Ú	module_idÚmodule_name)Úweek_idÚ	week_name)Ú
session_idÚsession_namezdict[str, tuple[str, str]]Ú_STEP_FIELDSc                óœ   — | j                  t        «      j                  t        j                  |j                  k(  «      j                  «       S ©N)Úqueryr   ÚfilterÚuser_idÚidÚfirst)ÚdbÚusers     úL/var/www/html/kelly/kelly-backend/app/services/user_register_step_service.pyÚget_user_register_stepr0   #   s6   € Ø�8‰8Ô$Ó%×,Ñ,Ô-=×-EÑ-EÈÏÉÑ-PÓQ×WÑWÓYÐYó    c                ó€   — t        | |«      }|�0| j                  |«       d |_        d |_        | j	                  «        y y r'   )r0   ÚdeleteÚprogramme_session_idÚprogramme_assessment_idÚcommit©r-   r.   Úrows      r/   Údelete_user_register_stepr9   '   s<   € Ü
   TÓ
*€CØ
€Ø
�	‰	�#ŒØ$(ˆÔ!Ø'+ˆÔ$Ø
�	‰	�ð	 r1   c                óì   — | j                  «       j                  «       }|dk(  rt        t        «      S 	 t        j	                  |«      S # t
        $ r!}t        t        j                  d¬«      |‚d }~ww xY w)Nr   zDcurrent_step must be one of: level, module, week, session, completed©Ústatus_codeÚdetail)	ÚstripÚlowerÚlenr   ÚindexÚ
ValueErrorr   r   ÚHTTP_400_BAD_REQUEST)ÚstepÚ
normalizedÚexcs      r/   Ú_step_indexrG   0   sn   € Ø—‘“×#Ñ#Ó%€JØ�[Ò ÜÔ&Ó'Ð'ðÜ"×(Ñ(¨Ó4Ð4øÜò ÜÜ×3Ñ3ØYô
ð ð	ûðús   ´A	 Á		A3ÁA.Á.A3c                óê   — | €y| j                   | j                  f| j                  | j                  f| j                  | j
                  f| j                  | j                  fdœ}|j                  |d«      S )N)NNr   )	r   r   r   r    r!   r"   r#   r$   Úget)r8   rD   Úmappings      r/   Ú_selected_for_steprK   =   sf   € Ø
€{Øà—,‘, §¡Ð/Ø—=‘= #§/¡/Ð2Ø—‘˜cŸm™mÐ,Ø—N‘N C×$4Ñ$4Ð5ñ	€Gð �;‰;�t˜\Ó*Ð*r1   c                óf   — t        | |«      \  }}|d uxs t        |xr |j                  «       «      S r'   )rK   Úboolr>   )r8   rD   Úselected_idÚselected_names       r/   Ú_step_has_selectionrP   I   s6   € Ü!3°C¸Ó!>Ñ€K�Ø˜dÐ"ÒS¤d¨=Ò+R¸]×=PÑ=PÓ=RÓ&SÐSr1   c                óZ   — t        | |«      st        t        j                  d|› d�¬«      ‚y )Nz	Select a z before continuing.r;   )rP   r   r   rC   )r8   rD   s     r/   Ú_validate_step_selectionrR   N   s4   € Ü˜s DÔ)ÜÜ×3Ñ3Ø˜t˜fÐ$7Ð8ô
ð 	
ð *r1   c           
     óV  — | €d}d}d}nd| j                   s| j                  dk(  rd}t        t        «      }d}n5| j                  j	                  «       j                  «       }t        |«      }d}g }t        t        «      D ]x  \  }}|s||k  rt        j                  }n&||k(  rt        j                  }nt        j                  }t        | |«      \  }}	|j                  t        |t        |   |||	¬«      «       Œz | xr | d uxr t!        | |t        v r|nd«      }
t#        |||
|| ¬«      S )	Nr   r   Fr   T)rD   Úlabelr   rN   rO   r   )Úcurrent_stepÚis_completedÚcan_proceedÚstepsÚ	selection)rV   rU   r@   r   r>   r?   rG   Ú	enumerater   r   ÚopenÚlockedrK   Úappendr   r   rP   r   )r8   rU   Úcurrent_idxrV   rX   ÚidxrD   Ústep_statusrN   rO   rW   s              r/   Úbuild_register_step_statera   V   sE  € Ø
€{ØˆØˆØ‰Ø	×	Ò	˜S×-Ñ-°Ò<Ø"ˆÜÔ-Ó.ˆØ‰à×'Ñ'×-Ñ-Ó/×5Ñ5Ó7ˆÜ! ,Ó/ˆØˆà')€EÜÔ2Ö3‰	ˆˆTÙ˜3 Ò,Ü,×6Ñ6‰KØ�KÒÜ,×1Ñ1‰Kä,×3Ñ3ˆKä%7¸¸TÓ%BÑ"ˆ�]Ø�‰ÜØÜ*¨4Ñ0Ø"Ø'Ø+ôõ	
ð 4ð( Ðò 	iØ�tˆOò	iä °\ÔEXÑ5X¡\Ð^gÓhð ô )Ø!Ø!ØØØôð r1   c                óÆ   — t         |   \  }}| j                  }||v rt        | |d «      �y||v r3t        | |d «      }t        |xr t	        |«      j                  «       «      S y)NTF)r%   Úmodel_fields_setÚgetattrrM   Ústrr>   )ÚbodyrD   Úid_fieldÚ
name_fieldÚsent_fieldsÚvalues         r/   Ú_step_data_in_bodyrk   ‡   sm   € ô (¨Ñ-Ñ€HˆjØ×'Ñ'€KØ�;Ñ¤7¨4°¸4Ó#@Ð#LØØ�[Ñ Ü˜˜j¨$Ó/ˆÜ�EÒ0œc %›j×.Ñ.Ó0Ó1Ð1Ør1   c               ó"  — t         |   \  }}|j                  }|r||v r"t        ||d«      }|€|r||v rt        | ||«       |r||v rIt        ||d«      }t	        |t
        «      r|j                  «       xs d}|€|r||v rt        | ||«       yyyy)zTUpdate id/name fields for one step only; never touches current_step or is_completed.N)r%   rc   rd   ÚsetattrÚ
isinstancere   r>   )r8   rf   rD   Úonly_sent_fieldsrg   rh   ri   rj   s           r/   Ú_apply_step_fieldsrp   •   s®   € ô (¨Ñ-Ñ€HˆjØ×'Ñ'€Ká˜x¨;Ñ6Ü˜˜h¨Ó-ˆØÐÑ!1°hÀ+Ñ6MÜ�C˜ 5Ô)á˜z¨[Ñ8Ü˜˜j¨$Ó/ˆÜ�eœSÔ!Ø—K‘K“MÒ) TˆEØÐÑ!1°jÀKÑ6OÜ�C˜ UÕ+ð 7PÐ!1ð	  9r1   c                ó  — t        | |«      }|�|j                  r|j                  €y| j                  t        «      j                  t        t        j                  «      «      j                  t        j                  |j                  k(  «      j                  «       }|€yt        |j                  d„ ¬«      }|r|d   nd}t        | |j                  ||«       |j                  |_        |r|j                  nd|_        | j                  «        y)zCMark everything before the user's registration anchor as completed.Nc                ó   — | j                   S r'   )Ú
sort_order)Úitems    r/   Ú<lambda>z1reseed_track_from_register_step.<locals>.<lambda>¼   s   € ¸t¿ºr1   )Úkeyr   )r0   rV   r#   r(   r	   Úoptionsr   Úassessmentsr)   r+   r,   Úsortedr
   r4   r5   Úflush)r-   r.   Úregister_stepr   rx   Úfirst_assessments         r/   Úreseed_track_from_register_stepr}   ­   sÞ   € ä*¨2¨tÓ4€MØÐ M×$>Ò$>À-×BZÑBZÐBbØð 	�‰Ô!Ó"ß	‰”Ô.×:Ñ:Ó;Ó	<ß	‰Ô ×#Ñ# }×'?Ñ'?Ñ?Ó	@ß	‰‹ð	 ð €Øä˜×,Ñ,Ñ2NÔO€KÙ)4�{ 1’~¸$ÐÜ$ R¨¯©°'Ð;KÔLØ '§
¡
€DÔÙ:JÐ#3×#6Ò#6ÐPT€DÔ Ø‡H�H…Jr1   c                ó6   — |j                   €y t        | |«       y r'   )r#   r}   r7   s      r/   Ú_sync_user_programme_pointerr   Ä   s   € Ø
‡~�~ÐØÜ# B¨Õ-r1   c                óì   — t        ||j                  «       t        |j                  «      }|t        t        «      dz
  k\  rd|_        d|_        t        | ||«       y t        |dz      |_        d|_        y )Né   r   TF)rR   rU   rG   r@   r   rV   r   )r-   r.   r8   r^   s       r/   Ú_advance_register_stepr‚   Ê   sm   € Ü˜S #×"2Ñ"2Ô3Ü˜c×.Ñ.Ó/€Kà”cÔ-Ó.°Ñ2Ò2Ø&ˆÔØˆÔÜ$ R¨¨sÔ3Øä*¨;¸©?Ñ;€CÔØ€CÕr1   c                ó”   — t        | |«      }|€9t        |j                  dd¬«      }| j                  |«       | j	                  «        |S )Nr   F)r*   rU   rV   )r0   r   r+   Úaddrz   r7   s      r/   Ú_get_or_create_rowr…   Ø   s?   € Ü
   TÓ
*€CØ
€{Ü t§w¡w¸WÐSXÔYˆØ
�‰ˆsŒØ
�‰Œ
Ø€Jr1   c                ó  — t         D ]  }t        ||«      sŒt        |||d¬«       Œ  t         D ]  }t        ||«       Œ d|_        d|_        t        | ||«       | j                  «        | j                  |«       t        |«      S )uV   Session submit with level/module/week/session ids â€” complete onboarding in one call.T©ro   r   )
r   rk   rp   rR   rU   rV   r   r6   Úrefreshra   )r-   r.   r8   rf   rD   s        r/   Ú_finish_register_step_from_bodyr‰   á   sy   € ÷ $ˆÜ˜d DÕ)Ü˜s D¨$ÀÖFð $÷ $ˆÜ   dÕ+ð $ð #€CÔØ€CÔÜ   T¨3Ô/Ø‡I�I„KØ‡J�Jˆs„OÜ$ SÓ)Ð)r1   c           	     ó¢  — t        | |«      }|j                  s|j                  dk(  rt        t        j
                  d¬«      ‚t        D ]  }t        ||«      sŒt        |||d¬«       Œ  t        |d«      r/t        | ||t        j                  |j                  «       «      «      S | j                  «        | j                  |«       t        |«      S )Nr   z"Registration is already completed.r;   Tr‡   r   )r…   rV   rU   r   r   rC   r   rk   rp   r‰   r   Úmodel_validateÚ
model_dumpr6   rˆ   ra   ©r-   r.   rf   r8   rD   s        r/   Úsave_user_register_steprŽ   ô   s¹   € ô ˜R Ó
&€Cà
×Ò˜3×+Ñ+¨{Ò:ÜÜ×3Ñ3Ø7ô
ð 	
÷
 $ˆÜ˜d DÕ)Ü˜s D¨$ÀÖFð $ô ˜$ 	Ô*Ü.Ø��cÔ8×GÑGÈÏÉÓHYÓZó
ð 	
ð ‡I�I„KØ‡J�Jˆs„OÜ$ SÓ)Ð)r1   c                óø  — t        | |«      }|j                  s|j                  dk(  rt        t        j
                  d¬«      ‚t        |d«      rt        | |||«      S |j                  j                  «       j                  «       }|t        vrt        t        j
                  d¬«      ‚t        |||d¬«       t        ||«       t        | ||«       | j                  «        | j                  |«       t!        |«      S )Nr   ú)Registration steps are already completed.r;   r   zInvalid current step.Fr‡   )r…   rV   rU   r   r   rC   rk   r‰   r>   r?   r%   rp   rR   r‚   r6   rˆ   ra   r�   s        r/   Úaccept_user_register_stepr‘     sØ   € ô ˜R Ó
&€Cà
×Ò˜3×+Ñ+¨{Ò:ÜÜ×3Ñ3Ø>ô
ð 	
ô
 ˜$ 	Ô*Ü.¨r°4¸¸dÓCÐCà×Ñ×!Ñ!Ó#×)Ñ)Ó+€DØ”<ÑÜ¬×(CÑ(CÐLcÔdÐdä�s˜D $¸Õ?Ü˜S $Ô'Ü˜2˜t SÔ)à‡I�I„KØ‡J�Jˆs„OÜ$ SÓ)Ð)r1   c                óø   — t        | |«      }|j                  s|j                  dk(  rt        t        j
                  d¬«      ‚t        | ||«       | j                  «        | j                  |«       t        |«      S )Nr   r�   r;   )
r…   rV   rU   r   r   rC   r‚   r6   rˆ   ra   r7   s      r/   Úcomplete_user_register_stepr“   (  sj   € Ü
˜R Ó
&€Cà
×Ò˜3×+Ñ+¨{Ò:ÜÜ×3Ñ3Ø>ô
ð 	
ô
 ˜2˜t SÔ)Ø‡I�I„KØ‡J�Jˆs„OÜ$ SÓ)Ð)r1   N)r-   r   r.   r   ÚreturnúUserRegisterStep | None)r-   r   r.   r   r”   ÚNone)rD   re   r”   Úint)r8   r•   rD   re   r”   ztuple[int | None, str | None])r8   r•   rD   re   r”   rM   )r8   r   rD   re   r”   r–   )r8   r•   r”   r   )rf   ú;UserRegisterStepSaveRequest | UserRegisterStepAcceptRequestrD   re   r”   rM   )
r8   r   rf   r˜   rD   re   ro   rM   r”   r–   )r-   r   r.   r   r8   r   r”   r–   )r-   r   r.   r   r”   r   )
r-   r   r.   r   r8   r   rf   r   r”   r   )r-   r   r.   r   rf   r   r”   r   )r-   r   r.   r   rf   r   r”   r   )r-   r   r.   r   r”   r   )*Ú
__future__r   Úfastapir   r   Úsqlalchemy.ormr   Ú
app.modelsr   r   Úapp.programme.models_programmer	   Ú(app.programme.services.programme_servicer
   r   Úapp.schemasr   r   r   r   r   r   Ú__annotations__r   r%   r0   r9   rG   rK   rP   rR   ra   rk   rp   r}   r   r‚   r…   r‰   rŽ   r‘   r“   © r1   r/   Ú<module>r¢      su  ðÞ "ç )Ý "ç -Ý ;Ý UÝ '÷õ ð (NÐ �_Ó MàØØØØñ(Ð �nó ð (Ø*Ø$Ø-ñ	,€Ð(ó óZóó
ó	+óTó

ó.ðbØ
Eðà
ðð 
óð,Ø	ð,à
Eð,ð ð,ð
 ð,ð 
ó,ó0ó..óóð*Øð*Øð*Ø"2ð*Ø:Wð*à"ó*ð&*Øð*Øð*Ø#>ð*à"ó*ð2*Øð*Øð*Ø#@ð*à"ó*ô6*r1   