
    bu1jR)              
       h   d dl mZmZ d dlmZmZmZmZmZ d dl	m
Z
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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#  ed	g
          Z$ edd           ee          fde%dz  deddfdZ& G d de
          Z' G d de
          Z( G d de
          Z) G d de
          Z* G d de
          Z+e$,                    d           ee          fdede-fd            Z.e$,                    d           edd !           ee          fd"edede-fd#            Z/e$,                    d$ ee&          g%           ee          fdede-fd&            Z0e$,                    d' ee&          g%           ee          fdede-fd(            Z1e$2                    d'd) ee&          g*           ee          fd+e'dede-fd,            Z3e$4                    d- ee&          g%           ee          fd.e5d+e(dede-fd/            Z6ded0e5d1e5defd2Z7d3ed4e-ddfd5Z8e$2                    d6d) ee&          g*           ee          fd+e)dede-fd7            Z9e$4                    d8 ee&          g%           ee          fd9e5d+e+dede-fd:            Z:e$;                    d8 ee&          g%           ee          fd9e5dede-fd;            Z<e$2                    d< ee&          g%           ee          fd+e*dede-fd=            Z=dS )>    )datetime)	APIRouterDependsHeaderHTTPExceptionQuery)	BaseModelFieldmodel_validator)Sessionselect)get_sessionseed_schedule_blocksseed_schedule_daysseed_time_slots)ChildScheduleBlockScheduleBlockTypeScheduleDayScheduleTimeSlotget_admin_session)build_current_schedulebuild_schedule_summarydetect_overlapserialize_blockserialize_time_slotvalidate_block_timesschedule)tagsNzX-Admin-Session)defaultaliasx_admin_sessionsessionreturnc                 &    t          ||            d S Nr   )r$   r%   s     backend/app/api/schedule.pyrequire_adminr*      s     g/////    c                       e Zd ZU  edd          Zeed<   dZedz  ed<   dZ	edz  ed<   dZ
eed	<   d
Zeed<   dZeed<    ed          d             ZdS )TimeSlotCreate   P   
min_length
max_lengthlabelN
start_timeend_timer   
sort_orderFis_lunch_breakTactiveaftermodec                     | j         s| j        | j        t          d          | j        r!| j        rt	          | j        | j                   | S )Nz"Zeitfenster braucht Start und Ende)r7   r4   r5   
ValueErrorr   )selfs    r)   validate_rangezTimeSlotCreate.validate_range%   sY    " 	C(?4=CXABBB? 	At} 	A $-@@@r+   )__name__
__module____qualname__r   r3   str__annotations__r4   r   r5   r6   intr7   boolr8   r   r?    r+   r)   r-   r-      s         !333E3333"Jt""" HdTk   J ND   FD_'"""  #"  r+   r-   c                       e Zd ZU  eddd          Zedz  ed<   dZedz  ed<   dZ	edz  ed<   dZ
edz  ed<   dZedz  ed	<   dZedz  ed
<   dS )TimeSlotUpdateNr.   r/   r"   r1   r2   r3   r4   r5   r6   r7   r8   )r@   rA   rB   r   r3   rC   rD   r4   r   r5   r6   rE   r7   rF   r8   rG   r+   r)   rI   rI   .   s         dqRHHHE3:HHH"Jt""" HdTk   !Jd
!!!"&ND4K&&&FD4Kr+   rI   c                   h   e Zd ZU eed<    edd          Zeed<    edd          Zeed<   e	ed	<   e	ed
<   e
j        Ze
ed<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dZeed<   dZedz  ed<   dZedz  ed<   dZeed<   dZeed<   dZeed<    ed          d             ZdS )ScheduleBlockCreatechild_idr.      )geleweekdayx   r0   titler4   r5   
block_typeNsubjectlocationcounts_as_schoolrequires_sports_gearTaffects_timelinecolornotesr   r6   r8   Fallow_overlapr9   r:   c                     t          | j        | j                   | j                                        }| j        | j        t          j        k    | _        | j	         | j        t          j
        k    p|dk    | _	        | S )Nturnen)r   r4   r5   rS   lowerrW   rT   r   school_subjectrX   sports)r>   lower_titles     r)   validate_times_and_defaultsz/ScheduleBlockCreate.validate_times_and_defaultsI   sr    T_dm<<<j&&(( ($(O7H7W$WD!$,(,;L;S(S(nWbfnWnD%r+   )r@   rA   rB   rE   rD   r   rQ   rS   rC   r   r   r`   rT   rU   rV   rW   rF   rX   rY   rZ   r[   r6   r8   r\   r   rc   rG   r+   r)   rL   rL   7   sh        MMM5A!$$$GS$$$!444E3444NNN$5$DJ!DDDGS4ZHcDj$(dTk((((,$+,,,!d!!!E3:E3:JFDM4_'"""  #"  r+   rL   c                       e Zd ZU eed<   dS )SeedReferenceConfirmconfirmN)r@   rA   rB   rC   rD   rG   r+   r)   re   re   V   s         LLLLLr+   re   c                   z   e Zd ZU dZedz  ed<    eddd          Zedz  ed<    eddd          Ze	dz  ed	<   dZ
edz  ed
<   dZedz  ed<   dZedz  ed<   dZe	dz  ed<   dZe	dz  ed<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dZe	dz  ed<   dZe	dz  ed<   dZedz  ed<   dZedz  ed<   dZeed<   dS )ScheduleBlockUpdateNrM   r.   rN   )r"   rO   rP   rQ   rR   rJ   rS   r4   r5   rT   rU   rV   rW   rX   rY   rZ   r[   r6   r8   Fr\   )r@   rA   rB   rM   rE   rD   r   rQ   rS   rC   r4   r   r5   rT   r   rU   rV   rW   rF   rX   rY   rZ   r[   r6   r8   r\   rG   r+   r)   rh   rh   Z   su        HcDj%q999GS4Z999dqSIIIE3:III"Jt""" HdTk   +/J!D(///GS4ZHcDj$(dTk((((,$+,,,$(dTk(((E3:E3:!Jd
!!!FD4KM4r+   rh   z/schedule/currentc                      t          |           S r(   r   r%   s    r)   get_current_schedulerl   m       !'***r+   z/schedule/summary.r   )r#   
date_valuec                 "    t          ||           S r(   )r   )rn   r%   s     r)   get_schedule_summaryrp   r   s    !':666r+   z/admin/schedule)dependenciesc                      t          |           S r(   rj   rk   s    r)   admin_schedulers   w   rm   r+   z/admin/schedule/time-slotsc                     |                      t          t                                        t          j                                                            }dd |D             iS )N
time_slotsc                 ,    g | ]}t          |          S rG   )r   ).0rows     r)   
<listcomp>z$admin_time_slots.<locals>.<listcomp>   s!    DDD.s33DDDr+   )execr   r   order_byr6   all)r%   rowss     r)   admin_time_slotsr~   |   sT    <</0099:J:UVVWW[[]]DDDtDDDEEr+      )status_coderq   payloadc                     t          di |                                 }|                    |           |                                 |                    |           dt          |          iS )N	time_slotrG   )r   
model_dumpaddcommitrefreshr   )r   r%   rx   s      r)   admin_create_time_slotr      si    

2
2W//11
2
2CKKNNOOC,S1122r+   z$/admin/schedule/time-slots/{slot_id}slot_idc                    |                     t          |           }|t          dddd          |                    d                                          D ]\  }}t          |||           |j        r!|j        rt          |j        |j                   |	                    |           |
                                 |                    |           dt          |          iS )	N  time_slot_not_foundzZeitfenster nicht gefundencodemessager   detailTexclude_unsetr   )getr   r   r   itemssetattrr4   r5   r   r   r   r   r   )r   r   r%   rx   keyvalues         r)   admin_update_time_slotr      s    
++&
0
0C
{=R_{4|4|}}}}((t(<<BBDD ! !
US%    
~ ;#, ;S^S\:::KKNNOOC,S1122r+   rM   rQ   c                 T   |                      t          t                                        t          j        |k    t          j        |k                                                        }|<t          ||dd          }|                     |           |                                  |S )NT)rM   rQ   
has_schoolis_school_day)	rz   r   r   whererM   rQ   firstr   flush)r%   rM   rQ   days       r)   _ensure_dayr      s    
,,vk**001E1QS^SfjqSqrr
s
s
y
y
{
{C
{8W]abbbCJr+   rx   datac                    d|v r|                     d          | _        d|v r|                     d          | _        |                     dd            |                                D ]\  }}t	          | ||           | j        t          j        k    s| j        	                                dk    rd| _
        | j        p| j        | _        | j        p| j        pd| _        d S )Nr4   r5   r\   r^   T )pop	starts_atends_atr   r   rT   r   ra   rS   r_   rX   rU   rV   room)rx   r   r   r   s       r)   _apply_block_payloadr      s    t..Thhz**HH_d###jjll ! !
US%    
~*111SY__5F5F(5R5R#' +*CK|-sx-2CHHHr+   z/admin/schedule/blocksc                    |                     t          | j                  t          dddd          t	          || j        | j        | j        | j                  }|r| j        sdfd|D             dS t          || j        | j                  }t          di d	|j        d
| j        d| j        d| j        d| j        d| j        d| j        d| j        p| j        d| j        d| j        pddt!          | j                  dt!          | j                  d| j        d| j        pj        d| j        d| j        d| j        }|j        t0          j        k    s|j                                        dk    rd|_        |                    |           |                                 |                    |           dt=          |          iS )Nr   child_not_foundzKind nicht gefundenr   r   overlapc                 0    g | ]}t          |          S rG   r   rw   blockchilds     r)   ry   z/admin_create_schedule_block.<locals>.<listcomp>   $    2g2g2gUZ?5%3P3P2g2g2gr+   warningoverlapsschedule_day_idrM   rQ   rS   r   r   rT   rU   rV   r   r   rW   rX   rY   rZ   r[   r6   r8   r^   Tschedule_blockrG   )r   r   rM   r   r   rQ   r4   r5   r\   r   r   idrS   rT   rU   rV   rF   rW   rX   rY   rZ   r[   r6   r8   r   ra   r_   r   r   r   r   )r   r%   r   r   rx   r   s        @r)   admin_create_schedule_blockr      sU   KKw/00E}=N[p4q4qrrrrgw'7'J\^e^nooH i- i$2g2g2g2g^f2g2g2ghhh
gw/
A
AC
   !!  mm	
 $$    %% 07= !! # g6777 "'">??? !11 m*u{ mm  %%!" ~~#C& ~*111SY__5F5F(5R5R#' KKNNOOCoc599::r+   z!/admin/schedule/blocks/{block_id}block_idc                 d  
 |                     t          |           }|t          dddd          |                    d          }|                     d|j                  }|                     d	|j                  }|                     d
|j                  }|                     d|j                  }t          ||           t          ||||||           }	|	r3|j
        s,|                     t          |          
d
fd|	D             dS t          ||           t          ||j        |j                  j        |_        |                    |           |                                 |                    |           dt'          ||                     t          |j                            iS )Nr   schedule_block_not_foundStundenplanblock nicht gefundenr   r   Tr   r4   r5   rM   rQ   )ignore_block_idr   c                 0    g | ]}t          |          S rG   r   r   s     r)   ry   z/admin_update_schedule_block.<locals>.<listcomp>   r   r+   r   r   )r   r   r   r   r   r   rM   rQ   r   r   r\   r   r   r   r   r   r   r   r   r   )r   r   r%   rx   r   
next_startnext_end
next_childnext_weekdayr   r   s             @r)   admin_update_schedule_blockr      s   
++mX
.
.C
{=W  eF  5G  5G  H  H  H  	HD11D,66Jxx
CK00H*cl33J88Is{33LX...gz<XgopppH i- iE:..$2g2g2g2g^f2g2g2ghhhd###%gs|S[IILCKKNNOOCoc7;;ucl3S3STTUUr+   c                     |                     t          |           }|t          dddd          d|_        |                    |           |                                 ddiS )	Nr   r   r   r   r   FokT)r   r   r   r8   r   r   )r   r%   rx   s      r)   admin_delete_schedule_blockr      s    
++mX
.
.C
{=W  eF  5G  5G  H  H  H  	HCJKKNN$<r+   z#/admin/schedule/seed-from-referencec                 n   | j         dk    rt          dddd          d |                    t          t                                                              D             }t          |           t          ||           t          ||d	           |	                                 t          |          S )
NRESET_STUNDENPLANi  confirmation_requiredu3   Zum Zurücksetzen confirm=RESET_STUNDENPLAN senden.r   r   c                     i | ]
}|j         |S rG   )name)rw   r   s     r)   
<dictcomp>z-admin_seed_from_reference.<locals>.<dictcomp>   s    QQQe
EQQQr+   T)reset_to_reference)rf   r   rz   r   r   r|   r   r   r   r   r   )r   r%   childrens      r)   admin_seed_from_referencer      s    ---=T  bW  5X  5X  Y  Y  Y  	YQQw||F5MM/J/J/N/N/P/PQQQHGw)))(tDDDDNN!'***r+   )>datetimer   r   fastapir   r   r   r   r	   pydanticr
   r   r   sqlmodelr   r   app.db.sessionr   r   r   r   
app.modelsr   r   r   r   r   app.services.admin_authr   app.services.scheduler   r   r   r   r   r   routerrC   r*   r-   rI   rL   re   rh   r   dictrl   rp   rs   r~   postr   patchrE   r   r   r   r   r   deleter   r   rG   r+   r)   <module>r      s           D D D D D D D D D D D D D D 6 6 6 6 6 6 6 6 6 6 $ $ $ $ $ $ $ $ a a a a a a a a a a a a ] ] ] ] ] ] ] ] ] ] ] ] ] ] 5 5 5 5 5 5                
	%	%	% #)&=N"O"O"Ow{++0 04Z00 
0 0 0 0    Y   "    Y       )   >    9            )      &   ,3GK,@,@ + +' +T + + + ! +   ,1E#V,D,D,DY`Y`alYmYm 7 7T 7w 7rv 7 7 7 ! 7 WW]-C-C,DEE&-gk&:&: + +G +t + + + FE+ (8N8N7OPP(/(<(< F Fg F F F F QPF
 )s''R_J`J`IabbGNw{G[G[ 3 3N 3W 3`d 3 3 3 cb3 4GGMDZDZC[\\U\U\]hUiUi 3 3C 3. 37 3nr 3 3 3 ]\3 C # +    .m .4 .D . . . . %3ggmF\F\E]^^QXQXYdQeQe  ;  ;)<  ;w  ;jn  ;  ;  ; _^ ;F 1AWAW@XYY`g`ghs`t`t V V# V8K VV] Vy} V V V ZYV, 2''-BXBXAYZZBI'+BVBV  #  [_    [Z 2''-BXBXAYZZPWPWXcPdPd + +'; +g +im + + + [Z+ + +r+   