Ë
    ¦VjþO  ã                  óÖ  — d dl mZ d dlmZ d dlmZmZ d dlmZm	Z	 d dl
mZmZ d dlmZmZmZmZ d dlmZ d dlmZmZmZmZmZmZmZ d d	lmZmZmZ d d
l m!Z! e G d„ d«      «       Z"ddœ	 	 	 	 	 	 	 dd„Z#	 	 	 	 	 	 	 	 	 	 	 	 	 	 dd„Z$	 	 	 	 	 	 	 	 	 	 	 	 dd„Z%	 	 	 	 	 	 dd„Z&ddœ	 	 	 	 	 	 	 dd„Z'	 	 	 	 	 	 	 	 	 	 	 	 d d„Z(	 	 	 	 	 	 	 	 	 	 	 	 d!d„Z)d"d„Z*d#d„Z+	 	 	 	 	 	 	 	 	 	 d$d„Z,d%d„Z-y)&é    )Úannotations)Údefaultdict)Ú	dataclassÚfield)ÚfuncÚor_)ÚSessionÚselectinload)ÚUserÚUserCompletedAssessmentÚUserCompletedSessionÚUserRegisterStep)ÚMemberSessionProgress)ÚProgrammeAssessmentÚProgrammeLevelÚProgrammeModuleÚProgrammeSessionÚProgrammeWeekÚprogramme_level_slug_strÚprogramme_module_kind_str)Úcalculate_member_pointsÚget_member_pointsÚmedia_public_url)Úget_user_register_stepc                  óŽ   — e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<    ee¬«      Zded<   y)Ú_DashboardSessionRowÚintÚ
session_idÚsession_numberÚstrÚsession_titleÚweek_idÚ
week_indexÚ
week_labelÚ	module_idÚmodule_kindÚmodule_nameÚmodule_sort_order)Údefault_factoryzlist[tuple[int, str]]ÚassessmentsN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   Úlistr*   © ó    úH/var/www/html/kelly/kelly-backend/app/services/user_dashboard_service.pyr   r      sI   … àƒOØÓØÓØƒLØƒOØƒOØƒNØÓØÓØÓÙ).¸tÔ)D€KÐ&ÔDr1   r   N©Úregister_stepc               óJ  — |xsM | j                  t        «      j                  t        j                  |j                  k(  «      j                  «       }|rú|j                  �$| j                  t        |j                  «      }|�|S |j                  r¾|j                  j                  «       }| j                  t        «      j                  t        t        j                  t        j                  «      |j                  «       k(  t        j                  t        j                  «      |j                  «       k(  «      «      j                  «       }|�|S |j                   ��Š| j                  t"        «      j%                  t&        t"        j(                  t&        j                  k(  «      j%                  t*        t&        j,                  t*        j                  k(  «      j%                  t        t*        j                  t        j                  k(  «      j/                  t1        t"        j2                  «      j1                  t&        j4                  «      j1                  t*        j6                  «      «      j                  t"        j                  |j                   k(  «      j                  «       }|rB|j2                  r6|j2                  j4                  r |j2                  j4                  j6                  S | j                  t        «      j9                  t        j:                  «      j                  «       S )z9Pick the level shown on the user's home/dashboard screen.)Úqueryr   ÚfilterÚuser_idÚidÚfirstÚlevel_idÚgetr   Ú
level_nameÚstripr   r   ÚlowerÚdisplay_nameÚslugÚprogramme_session_idr   Újoinr   r"   r   r%   Úoptionsr
   ÚweekÚmoduleÚlevelÚorder_byÚ
sort_order)ÚdbÚuserr4   ÚsteprG   ÚrawÚsessions          r2   Ú_resolve_current_levelrO   '   s"  € ð Òj˜BŸH™HÔ%5Ó6×=Ñ=Ô>N×>VÑ>VÐZ^×ZaÑZaÑ>aÓb×hÑhÓj€DÙØ�=‰=Ð$Ø—F‘Fœ>¨4¯=©=Ó9ˆEØÐ Ø�Ø�?Š?Ø—/‘/×'Ñ'Ó)ˆCà—‘œÓ(ß‘ÜÜŸ
™
¤>×#>Ñ#>Ó?À3Ç9Á9Ã;ÑNÜŸ
™
¤>×#6Ñ#6Ó7¸3¿9¹9»;ÑFóó÷ ‘“ð ð Ð Ø�à× Ñ Ñ,à�H‰HÔ%Ó&ß‰T”-Ô!1×!9Ñ!9¼]×=MÑ=MÑ!MÓNß‰T”/¤=×#:Ñ#:¼o×>PÑ>PÑ#PÓQß‰T”.¤/×":Ñ":¼n×>OÑ>OÑ"OÓPß‰W”\Ô"2×"7Ñ"7Ó8×EÑEÄm×FZÑFZÓ[×hÑhÔix×i~Ñi~Óó  Aß‰VÔ$×'Ñ'¨4×+DÑ+DÑDÓEß‰U‹Wð 	ñ �w—|’|¨¯©×(;Ò(;Ø—<‘<×&Ñ&×,Ñ,Ð,à�8‰8”NÓ#×,Ñ,¬^×-FÑ-FÓG×MÑMÓOÐOr1   c               óì   ‡— t        | j                  d„ ¬«      }|rt        ˆfd„|D «       «      S | j                  |v xs6 |j                  | j                  f|v xs |j
                  | j                  f|v S )Nc                ó   — | j                   S ©N©rI   ©Úitems    r2   Ú<lambda>z'_is_session_completed.<locals>.<lambda>\   s   € ¸t¿ºr1   ©Úkeyc              3  ó:   •K  — | ]  }|j                   ‰v –— Œ y ­wrR   ©r9   )Ú.0Ú
assessmentÚcompleted_assessment_idss     €r2   Ú	<genexpr>z(_is_session_completed.<locals>.<genexpr>^   s   øè ø€ Ð[É{À�:—=‘=Ð$<Ô<É{ùs   ƒ)Úsortedr*   Úallr9   r   r#   )rN   rE   Úcompleted_session_idsr]   Úcompleted_week_session_keysÚcompleted_index_session_keysr*   s      `   r2   Ú_is_session_completedrd   S   sz   ø€ ô ˜×,Ñ,Ñ2NÔO€KÙÜÓ[É{Ó[Ó[Ð[à�
‰
Ð+Ð+ò 	UØ�G‰G�W×+Ñ+Ð,Ð0KÐKò	Uà�O‰O˜W×3Ñ3Ð4Ð8TÐTðr1   c               óä   ‡— | j                   rt        ˆfd„| j                   D «       «      S | j                  |v xs6 | j                  | j                  f|v xs | j
                  | j                  f|v S )Nc              3  ó,   •K  — | ]  \  }}|‰v –— Œ y ­wrR   r0   )r[   Úassessment_idÚ_r]   s      €r2   r^   z-_is_flat_session_completed.<locals>.<genexpr>o   s    øè ø€ ÐeÑUdÑAQÀÐPQ�=Ð$<Ô<ÑUdùs   ƒ)r*   r`   r   r"   r   r#   )Úrowra   r]   rb   rc   s     `  r2   Ú_is_flat_session_completedrj   f   sr   ø€ ð ‡‚ÜÓeÐUX×UdÒUdÓeÓeÐeà�‰Ð/Ð/ò 	PØ�K‰K˜×+Ñ+Ð,Ð0KÐKò	Pà�N‰N˜C×.Ñ.Ð/Ð3OÐOðr1   c           
     ó®  — | j                  t        j                  «      j                  t        j                  |k(  «      j                  «       D �ch c]  }|d   ’Œ	 }}| j                  t        j                  «      j                  t        j                  |k(  «      j                  «       D �ch c]  }|d   ’Œ	 }}| j                  t        j                  t        j                  t        j                  t        j                  «      j                  t        j                  |k(  t        j                  j                  d«      «      j                  «       }||D ��ch c]  \  }}}}|€Œ|’Œ c}}z  }|D ��	�
ch c]  \  }}	}}
|	�|
�|	|
f’Œ }}	}}
|D ��	��
ch c]  \  }}	}}
|€
|	€|�|
�||
f’Œ }}}	}}
||||fS c c}w c c}w c c}}w c c}
}	}w c c}
}}	}w )Nr   T)r6   r   rg   r7   r8   r`   r   r   r   r"   r#   r   Úis_completedÚis_)rJ   r8   ri   r]   Úcompleted_track_session_idsÚcompleted_progressr   rh   ra   r"   r   rb   r#   rc   s                 r2   Ú_load_completion_setsrp   w   s  € ð
 —8‘8Ô3×AÑAÓBß	‰Ô'×/Ñ/°7Ñ:Ó	;ß	‰‹ðó ñˆCð 	ˆA‹ðð ð  ð —8‘8Ô0×;Ñ;Ó<ß	‰Ô$×,Ñ,°Ñ7Ó	8ß	‰‹ðó#ñˆCð 	ˆA‹ðð  ð #ð 	�‰Ü!×,Ñ,Ü!×)Ñ)Ü!×,Ñ,Ü!×0Ñ0ó		
÷ 
‰Ü!×)Ñ)¨WÑ4Ü!×.Ñ.×2Ñ2°4Ó8ó

÷ 
‰‹ð ð 8Ù.@ô;Ù.@Ñ*�z 1 a¨ÀJÑDZŠ
Ð.@ò;ñ Ðñ
 .@õ#á-?Ñ)ˆAˆw˜˜>ØÐ >Ð#=ð 
�.Ò!Ø-?ð  ò #ñ @Rö$á?QÑ;ˆJ˜ ¨^ØÐØˆOØÐ"ØÐ&ð 
�^Ò$Ø?Qð !ó $ð 	!ØØ#Ø$ð	ð ùòS ùò#ùó&;ùô#ùõ
$s$   ÁF8Â-F=ÅGÅ&GÅ6GÆG
©r%   c               óÔ  — | j                  t        j                  t        j                  t        j                  t
        j                  t
        j                  t
        j                  t        j                  t        j                  t        j                  t        j                  «
      j                  t
        t        j                  t
        j                  k(  «      j                  t        t
        j                  t        j                  k(  «      j                  t        j                   |k(  «      j#                  t        j                  t
        j                  t        j                  «      }|�"|j                  t        j                  |k(  «      }|j%                  «       }|sg S |D �cg c]  }|d   ‘Œ	 }}t'        t(        «      }|r³| j                  t*        j,                  t*        j                  t*        j                  «      j                  t*        j,                  j/                  |«      «      j#                  t*        j                  «      j%                  «       D ]  \  }}	}
||   j1                  |	|
f«       Œ |D ����������cg c]C  \
  }}}}}}}}}}t3        |||xs d|› �||||t5        |«      |||j7                  |g «      ¬«      ‘ŒE c}}}}}}}}}}S c c}w c c}}}}}}}}}}w )uO   Flat session rows for one level â€” avoids loading the full ORM programme tree.r   úSession )r   r   r!   r"   r#   r$   r%   r&   r'   r(   r*   )r6   r   r9   r   Útitler   r#   Údisplay_labelr   Úkindr@   rI   rC   r"   r%   r7   r;   rH   r`   r   r/   r   r   Úin_Úappendr   r   r<   )rJ   r;   r%   r6   Úraw_rowsri   Úsession_idsÚassessments_by_sessionr   rg   Úassessment_titler   rt   r"   r#   r$   r&   r'   r(   s                      r2   Ú_load_level_sessions_flatr}   «   st  € ð 	�‰Ü×ÑÜ×+Ñ+Ü×"Ñ"Ü×ÑÜ×$Ñ$Ü×'Ñ'Ü×ÑÜ× Ñ Ü×(Ñ(Ü×&Ñ&ó	
÷ 
‰ŒmÔ-×5Ñ5¼×9IÑ9IÑIÓ	Jß	‰Œoœ}×6Ñ6¼/×:LÑ:LÑLÓ	Mß	‰”×(Ñ(¨HÑ4Ó	5ß	‰”/×,Ñ,¬m×.FÑ.FÔHX×HgÑHgÓ	hð! 
ð$ ÐØ—‘œ_×/Ñ/°9Ñ<Ó=ˆà�y‰y‹{€HÙØˆ	á%-Ó.¡X˜c�3�q“6 X€KÐ.Ü?JÌ4Ó?PÐÙà�H‰HÜ#×.Ñ.Ü#×&Ñ&Ü#×)Ñ)ó÷
 ‰VÔ'×2Ñ2×6Ñ6°{ÓCÓDß‰XÔ)×4Ñ4Ó5ß‰S‹Uòñ 8ˆJ˜Ð'7ð # :Ñ.×5Ñ5°}ÐFVÐ6WÕXðñ2 KS÷ô ñ KSñ  GˆJ˜¨¨w¸
ÀJÐPYÐ[fÐhsð  vGô 	Ø!Ø)ØÒ> X¨nÐ-=Ð#>ØØ!Ø!ØÜ1°+Ó>Ø#Ø/Ø.×2Ñ2°:¸rÓBö	
ð KS÷ò ð ùò /ù÷ó s   Æ$KÊAKc               ó&  ‡— g }d}d}t        t        «      }t        t        «      Š| D ]H  }	‰|	j                     j	                  |	«       ||	j                     j                  |	j                  «       ŒJ t        ‰ˆfd„¬«      D ]ˆ  }
‰|
   }d}d}|d   }|D ]  }	|dz  }t        |	||||¬«      sŒ|dz  }Œ ||z  }||z  }|j	                  |
|j                  |j                  |||rt        ||z  dz  «      ndt        ||
   «      dœ«       ŒŠ |||fS )Nr   c                ó(   •— ‰|    d   j                   S )Nr   )r(   )ÚmidÚ	by_modules    €r2   rV   z*_compute_module_progress.<locals>.<lambda>þ   s   ø€ °yÀ±~ÀaÑ7H×7ZÒ7Zr1   rW   é   ©ra   r]   rb   rc   éd   )r%   r&   r'   Úcompleted_sessionsÚtotal_sessionsÚprogress_percentÚtotal_weeks)r   Úsetr/   r%   rx   Úaddr#   r_   rj   r&   r'   ÚroundÚlen)Úsession_rowsra   r]   rb   rc   Úmodules_outr†   r…   Úweeks_by_moduleri   r%   ÚrowsÚmodule_totalÚmodule_completedÚsampler�   s                  @r2   Ú_compute_module_progressr”   ì   sK  ø€ ð !€KØ€NØÐÜ+6´sÓ+;€Oä7BÄ4Ó7H€IÛˆØ�#—-‘-Ñ ×'Ñ'¨Ô,Ø˜Ÿ™Ñ&×*Ñ*¨3¯>©>Õ:ð ô ˜IÓ+Z×[ˆ	Ø˜Ñ#ˆØˆØÐØ�a‘ˆÛˆCØ˜AÑˆLÜ)ØØ&;Ø)AØ,GØ-Iöð ! AÑ%Ñ ð ð 	˜,Ñ&ˆØÐ.Ñ.ÐØ×Ñà&Ø%×1Ñ1Ø%×1Ñ1Ø&6Ø".ÙVb¤EÐ+;¸lÑ+JÈcÑ*QÔ$RÐhiÜ" ?°9Ñ#=Ó>ñõ
	
ð% \ð< ˜Ð(:Ð:Ð:r1   c               ó|  — |�|�|j                   sy | sy t        | d„ ¬«      }d}|j                  �0t        |«      D ]"  \  }}|j                  |j                  k(  sŒ |} n t        |«      D �]M  \  }}||k  rŒ|j                  D ]’  \  }	}
|	|vsŒ|j
                  |j                  |j                  |j                  |j                  |	|
|j                  t        |j                  «      dj                  |j                  d|j                  › �|
g«      dœ
c c S  |j                  rŒ»|j                  |v rŒÊ|j
                  |j                  |j                  |j                  |j                  d d |j                  t        |j                  «      dj                  |j                  d|j                  › �g«      dœ
c S  y )Nc                óH   — | j                   | j                  | j                  fS rR   )r(   r#   r   ©ri   s    r2   rV   z3_build_current_step_from_sessions.<locals>.<lambda>.  s   € ˜×.Ñ.°·±À×@RÑ@RÑSr1   rW   r   õ    Â· rs   ©
r"   r$   r   r!   r   rg   r|   r&   Ú
level_slugÚlabel)rl   r_   r   Ú	enumerater*   r"   r$   r!   r   r&   r   rA   rC   )r�   r4   rG   r]   ra   ÚorderedÚanchor_indexÚindexri   rg   r|   s              r2   Ú!_build_current_step_from_sessionsr      s°  € ð €}˜Ð-°]×5OÒ5OØÙØäØÙSô€Gð
 €LØ×ÑÐ+Ü# GÖ,‰JˆE�3Ø�~‰~ ×!9Ñ!9Ó9Ø$�Ùð -ô
   ×(‰
ˆˆsØ�<ÒØà/2¯¬Ñ+ˆMÐ+ØÐ$<Ò<à"Ÿ{™{Ø"%§.¡.Ø"%§.¡.Ø%(×%6Ñ%6Ø&)×&8Ñ&8Ø%2Ø(8Ø#&§?¡?Ü":¸5¿:¹:Ó"FØ#Ÿ[™[ØŸ™¨8°C×4FÑ4FÐ3GÐ)HÐJZÐ[óñô ð 0?ð" �?Š?ØØ�>‰>Ð2Ñ2Øð —{‘{ØŸ.™.ØŸ.™.Ø ×.Ñ.Ø!×0Ñ0Ø!Ø $ØŸ?™?Ü2°5·:±:Ó>Ø—[‘[ #§.¡.°H¸S×=OÑ=OÐ<PÐ2QÐ!RÓSñ
ò 	
ð5 )ðN r1   c                ó   — | j                   xs i }|j                  d«      sy g }d }d }d }| j                  r| j                  j                  ng D �]|  }|j                  D �]i  }|j
                  D �]V  }|j                  |j                  d«      k7  rŒ#|j                  }|j                  }|j                  |j                  «       |j                  d|j                  › �«       |j                  D ]I  }	|	j                  |j                  d«      k(  sŒ"|	j                  }|j                  |	j                  «        n |j                  ||j                  ||j                  |j                  d«      |t        |j                  «      | j                  rt        | j                  j                  «      nd dj!                  |«      dœ
c c c S  �Œl �Œ y )Nr   rs   rg   r˜   r™   )Úcurrent_openr<   rG   ÚmodulesÚweeksÚsessionsr9   ru   rt   rx   r   r*   r   rv   r   rA   rC   )
Útrackr¢   Úlabel_partsr$   r!   r|   rF   rE   rN   r\   s
             r2   Ú_build_track_current_stepr¨   b  s�  € Ø×%Ñ%Ò+¨€LØ×Ñ˜LÔ)Øà€KØ€JØ€MØÐà).¯ª�%—+‘+×%Ò%¸"Ó<ˆØ—L•LˆDØŸ=�=�Ø—:‘: ×!1Ñ!1°,Ó!?Ò?ØØ!×/Ñ/�
Ø '§¡�Ø×"Ñ" 4×#5Ñ#5Ô6Ø×"Ñ" X¨g×.DÑ.DÐ-EÐ#FÔGØ")×"5Ô"5�JØ!—}‘}¨×(8Ñ(8¸Ó(IÓIØ+5×+;Ñ+;Ð(Ø#×*Ñ*¨:×+;Ñ+;Ô<Ùð	 #6ð  $Ÿw™wØ",Ø")§*¡*Ø%2Ø&-×&<Ñ&<Ø%1×%5Ñ%5°oÓ%FØ(8Ü#<¸V¿[¹[Ó#IØPU×P[ÒP[Ô":¸5¿;¹;×;KÑ;KÔ"LÐaeØ#Ÿ[™[¨Ó5ñö ò )ò !ð =ð4 r1   c                ó(  — | €y | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  t        | j                  «      | j                  | j                  dœS )N)r9   r"   Ú	week_namer#   r   Úsession_namer   Úassigned_pointsÚfeedbackÚ	image_urlrl   Ú
updated_at)r9   r"   rª   r#   r   r«   r   r¬   r­   r   Ú
image_pathrl   r¯   r—   s    r2   Ú_serialize_last_progressr±   ‰  su   € Ø
€{Øà�f‰fØ—;‘;Ø—]‘]Ø—n‘nØ—n‘nØ×(Ñ(Ø×,Ñ,Ø×.Ñ.Ø—L‘LÜ% c§n¡nÓ5Ø×(Ñ(Ø—n‘nñð r1   c               óX  ‡— | �|�|j                   sy t        | j                  d„ ¬«      }|j                  �)|D �cg c]  }|j                  |j                  k(  sŒ|‘Œ  }}g }|D ]P  }t        |j
                  d„ ¬«      D ]3  }t        |j                  d„ ¬«      D ]  }|j                  |||f«       Œ Œ5 ŒR |sy d}	|j                  �4t        |«      D ]&  \  }
\  }}}|j                  |j                  k(  sŒ$|
}	 n t        |«      D �]  \  }
\  }}}|
|	k  rŒt        |j                  d„ ¬«      }t        ˆfd„|D «       d «      }|€|rŒC|€|j                  |v rŒT|j                  d|j                  › �g}|�|j                  |j                  «       |j                  |j                  |j                  |j                  |j                  |r|j                  nd |r|j                  nd t        |j                   «      t#        | j$                  «      d	j'                  |«      d
œ
c S  y c c}w )Nc                ó   — | j                   S rR   rS   rT   s    r2   rV   z0_build_current_step_from_level.<locals>.<lambda>¦  s   € °T·_²_r1   rW   c                ó   — | j                   S rR   )r#   rT   s    r2   rV   z0_build_current_step_from_level.<locals>.<lambda>¬  s   € ¸$¿/º/r1   c                ó   — | j                   S rR   )r   rT   s    r2   rV   z0_build_current_step_from_level.<locals>.<lambda>­  s
   € À$×BUÒBUr1   r   c                ó   — | j                   S rR   rS   rT   s    r2   rV   z0_build_current_step_from_level.<locals>.<lambda>¾  s   € À4Ç?Â?r1   c              3  ó@   •K  — | ]  }|j                   ‰vsŒ|–— Œ y ­wrR   rZ   )r[   rU   r]   s     €r2   r^   z1_build_current_step_from_level.<locals>.<genexpr>À  s   øè ø€ ÐU™k�d¨T¯W©WÐ<TÒ-TŒT™kùs   ƒ—rs   r˜   r™   )rl   r_   r£   r%   r9   r¤   r¥   rx   r   rœ   r*   Únextru   r   rt   r   rv   r   rA   rC   )rG   r4   r]   ra   r£   rF   ÚrefsrE   rN   rž   rŸ   rh   r*   r\   r§   s     `            r2   Ú_build_current_step_from_levelrº   œ  s  ø€ ð €}˜Ð-°]×5OÒ5OØä�U—]‘]Ñ(DÔE€GØ×ÑÐ*Ù(/ÓX©˜f°6·9±9À×@WÑ@WÓ3W’6¨ˆÐXàJL€DÛˆÜ˜6Ÿ<™<Ñ-I×JˆDÜ! $§-¡-Ñ5U×V�Ø—‘˜V T¨7Ð3Õ4ñ Wñ Kð ñ
 Øà€LØ×ÑÐ+Ü&/°¦oÑ"ˆE‘?�A�q˜'Ø�z‰z˜]×5Ñ5Ó5Ø$�Ùð '6ô
 +4°D¯/Ñ&ˆÑ&�˜˜gØ�<ÒØä˜W×0Ñ0Ñ6RÔSˆÜÛU™kÓUØó
ˆ
ð Ð¡+ØØÐ '§*¡*Ð0EÑ"EØà×)Ñ)¨X°g×6LÑ6LÐ5MÐ+NÐOˆØÐ!Ø×Ñ˜z×/Ñ/Ô0ð —w‘wØ×,Ñ,Ø!Ÿ*™*Ø$Ÿ]™]Ø%×4Ñ4Ù.8˜ZŸ]š]¸dÙ4> 
× 0Ò 0ÀDÜ4°V·[±[ÓAÜ2°5·:±:Ó>Ø—[‘[ Ó-ñ
ò 	
ð% +:ð> ùòc Ys   »H'ÁH'c                óö  — t        | |«      }t        | ||¬«      }t        | |j                  «      \  }}}}| j	                  t
        «      j                  t
        j                  |j                  k(  «      j                  t
        j                  j                  «       t
        j                  j                  «       «      j                  «       }t        | |j                  «      xs t        | |j                  «      }	|	d   }
|	d   }g }d}d}g }|�H|r|j                  r|j                  nd }t        | |j                  |¬«      }t!        |||||¬«      \  }}}|rt#        ||z  dz  «      nd}|�|j$                  › d�nd }t'        |||||¬	«      }|j                  |j(                  |r|j                  nd |rt+        |j,                  «      nd ||
|
||||d
|d|
› �dœd|› d|› �ddœd|› d�ddœg|t/        |«      |dœS )Nr3   Úassigned_points_totalÚavailable_pointsr   rq   rƒ   r„   z Level)r]   ra   ÚPointszTotal assigned: )r›   ÚvalueÚhelper_textzSession CompleteÚ/z#Completed sessions in current levelzLast ProgressÚ%zCurrent level completion)r8   Ú	full_namer;   rš   r=   Útotal_pointsr¼   r½   r…   r†   Úlast_progress_percentÚstatsÚcurrent_level_progressÚlast_progressÚtrack_current_step)r   rO   rp   r9   r6   r   r7   r8   rH   r¯   Údescr:   r   r   r%   r}   r”   r‹   r@   r    rÃ   r   rA   r±   )rJ   rK   r4   rG   r]   ra   rb   rc   Úlatest_progressÚpointsrÄ   r½   rŽ   r†   r…   r�   Úmodule_filterrÅ   Úlevel_labelrÉ   s                       r2   Úget_user_dashboardrÏ   Ü  s=  € Ü*¨2¨tÓ4€MÜ" 2 t¸=ÔI€Eô 	˜b $§'¡'Ó*ñØ ØØ#Ø$ð 	�‰Ô&Ó'ß	‰Ô%×-Ñ-°·±Ñ8Ó	9ß	‰Ô'×2Ñ2×7Ñ7Ó9Ô;P×;SÑ;S×;XÑ;XÓ;ZÓ	[ß	‰‹ð	 ô ˜r 4§7¡7Ó+ÒSÔ/FÀrÈ4Ï7É7Ó/S€FØÐ1Ñ2€LØÐ0Ñ1Ðà €KØ€NØÐØ/1€LàÐÙ3@À]×E\ÒE\˜×/Ò/ÐbfˆÜ0°°U·X±XÈÔWˆÜ:RØØ"7Ø%=Ø(CØ)Eô;
Ñ7ˆ�^Ð%7ñ SaœEÐ#5¸Ñ#FÈ#Ñ"MÔNÐfgÐØ38Ð3D�U×'Ñ'Ð(¨Ñ/È$€Kä:ØØØØ!9Ø3ôÐð —7‘7Ø—^‘^Ù %�E—H’H¨4Ù>CÔ.¨u¯z©zÔ:ÈØ!Ø$Ø!-Ø,Ø0Ø(Ø!6ð "Ø)Ø!1°,°Ð@ñð ,Ø.Ð/¨q°Ð0@ÐAØDñð )Ø1Ð2°!Ð4Ø9ñð
ð" #.Ü1°/ÓBØ0ñ? ð  r1   )rJ   r	   rK   r   r4   úUserRegisterStep | NoneÚreturnúProgrammeLevel | None)rN   r   rE   r   ra   úset[int]r]   rÓ   rb   úset[tuple[int, int]]rc   rÔ   rÑ   Úbool)ri   r   ra   rÓ   r]   rÓ   rb   rÔ   rc   rÔ   rÑ   rÕ   )rJ   r	   r8   r   rÑ   zEtuple[set[int], set[int], set[tuple[int, int]], set[tuple[int, int]]])rJ   r	   r;   r   r%   z
int | NonerÑ   úlist[_DashboardSessionRow])r�   rÖ   ra   rÓ   r]   rÓ   rb   rÔ   rc   rÔ   rÑ   ztuple[list[dict], int, int])r�   rÖ   r4   rÐ   rG   rÒ   r]   rÓ   ra   rÓ   rÑ   údict | None)rÑ   r×   )ri   zMemberSessionProgress | NonerÑ   r×   )
rG   rÒ   r4   rÐ   r]   rÓ   ra   rÓ   rÑ   r×   )rJ   r	   rK   r   rÑ   Údict).Ú
__future__r   Úcollectionsr   Údataclassesr   r   Ú
sqlalchemyr   r   Úsqlalchemy.ormr	   r
   Ú
app.modelsr   r   r   r   Úapp.models_adminr   Úapp.programme.models_programmer   r   r   r   r   r   r   Úapp.services.admin_servicer   r   r   Ú'app.services.user_register_step_servicer   r   rO   rd   rj   rp   r}   r”   r    r¨   r±   rº   rÏ   r0   r1   r2   Ú<module>rã      s%  ðÝ "å #ß (ç  ß 0ç \Ó \Ý 2÷÷ ñ ÷ dÑ cÝ Jð ÷Eð Eó ðEð$ .2ñ	)PØð)Pà
ð)Pð +ð	)Pð
 ó)PðXØðà
ðð $ð	ð
 'ðð "6ðð #7ðð 
óð&Ø	ðð $ðð 'ð	ð
 "6ðð #7ðð 
óð"1Øð1Øð1àJó1ðp !ñ	>Øð>àð>ð ð	>ð
  ó>ðB0;Ø,ð0;ð $ð0;ð 'ð	0;ð
 "6ð0;ð #7ð0;ð !ó0;ðf@Ø,ð@à*ð@ð !ð@ð
 'ð@ð $ð@ð ó@óF$óNð&=Ø ð=à*ð=ð 'ð	=ð
 $ð=ð ó=ô@Qr1   