Ë
    6\ìjž:  ã                   óÊ  — d Z ddlZddlZddlZddlZddlZddlZej                  j                  ej                  j                  e
«      «      Zej                  j                  ed«      Zej                  j                  ed«      Zej                  j                  ed«      Zej                  j                  ed«      Zej                  j                  ed«      Zej                  j                  ed«      Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z ej:                  d«      Z ej:                  d«      Zd„ Z g d¢Z!g d¢Z"d"d„Z#d"d„Z$d„ Z%d„ Z&d„ Z'd„ Z(d„ Z)d„ Z*d „ Z+d!„ Z,y)#uË  ç�­åŠ¡é€š /api/v1 å�ªè¯»æŸ¥è¯¢å±‚ï¼ˆé˜¶æ®µ 0 Â· AI ç”Ÿæ€�åŒ–åœ°åŸºï¼‰

è®¾è®¡åŽŸåˆ™ï¼š
- çº¯å�ªè¯»ï¼šæœ¬å±‚ä¸�å†™ä»»ä½•æ•°æ�®æ–‡ä»¶ï¼Œå†™æ“�ä½œä»�èµ°ç½‘é¡µç«¯ /api/* åŽŸæŽ¥å�£
- ä¸�ä¾µå…¥ï¼šç‹¬ç«‹æ¨¡å�—ï¼Œserver.py ä»…åœ¨ do_GET åŠ ä¸€è¡Œåˆ†å�‘
- ç»Ÿä¸€å“�åº”ï¼š{ok, data, meta} / {ok:false, error}
- é‰´æ�ƒï¼šæ•™å¸ˆå�£ä»¤ tokenï¼ˆä¸Žé¡µé�¢ ?k=<å�£ä»¤> ç›¸å�Œï¼‰ï¼Œå�£ä»¤ä¸�å†™æ­»åœ¨ä»£ç �
- é�¢å�‘ AI è°ƒç”¨ï¼šå­—æ®µå��è¯­ä¹‰åŒ–ï¼Œé™„å¸¦ä¸­æ–‡è¯´æ˜Žå­—æ®µï¼Œä¾¿äºŽå°�ç¨‹åº� SKILL / WorkBuddy MCP ç›´æŽ¥å¼•ç”¨

æŽ¥å�£æ¸…å�•ï¼ˆå…¨éƒ¨ GET /api/v1/<name>ï¼‰ï¼š
  /api/v1/ping            æ— é‰´æ�ƒï¼Œè¿žé€šæ€§æŽ¢æµ‹
  /api/v1/overview        å½“æ—¥ç�­åŠ¡æ€»è§ˆï¼ˆè€ƒå‹¤+å€¼æ—¥+ç�­å¹²éƒ¨ï¼‰
  /api/v1/attendance?date=YYYY-MM-DD[&name=å­¦ç”Ÿå§“å��]  æŸ�æ—¥è€ƒå‹¤ï¼ˆé»˜è®¤ä»Šå¤©ï¼‰
  /api/v1/attendance_summary?from=YYYY-MM-DD&to=YYYY-MM-DD&name=...  åŒºé—´ç»Ÿè®¡
  /api/v1/seating         åº§ä½�è¡¨ï¼ˆ9æŽ’Ã—8åˆ—ï¼‰
  /api/v1/beds            åºŠä½�è¡¨ï¼ˆ3èˆ�Ã—16åºŠï¼‰
  /api/v1/duty            æ¸…æ´�è½®å€¼ï¼ˆæŒ‰å®¿èˆ�Ã—æ˜ŸæœŸï¼‰
  /api/v1/cadres          ç�­å¹²éƒ¨åˆ†å·¥
  /api/v1/student?name=å¼ ä¸‰  å�•ä¸ªå­¦ç”Ÿå…¨æ™¯ï¼ˆåº§ä½�+åºŠä½�+å€¼æ—¥+è¿‘æœŸè€ƒå‹¤ï¼‰
  /api/v1/token æ ¡éªŒï¼š?token=<æ•™å¸ˆå�£ä»¤> æˆ– Header X-Banwu-Token
é    Nzkaoqin_data.jsonzzuowei_data.jsonzchuangwei_data.jsonzqingjie_data.jsonzganbu_data.jsonzapi_v1_token.txtc                 óœ   — 	 t        | dd¬«      5 }t        j                  |«      }|cd d d «       S # 1 sw Y   y xY w# t        $ r |cY S w xY w©NÚrzutf-8)Úencoding)ÚopenÚjsonÚloadÚ	Exception)ÚpathÚdefaultÚfÚds       ú/opt/banwu/api_v1.pyÚ_loadr   #   sO   € ðÜ�$˜ gÔ.ð 	°!Ü—	‘	˜!“ˆAØ÷	÷ 	ò 	ûô ò ØŠðús#   ‚= �1§	= ±:¶= º= ½AÁ
Ac                  ó"   — t        t        i «      S ©N)r   ÚF_KQ© ó    r   Úload_kaoqinr   +   s   € œ%¤ b›/Ð)r   c                  ó(   — t        t        d ddœ«      S ©Nr   )ÚvÚu)r   ÚF_ZWr   r   r   Úload_zuoweir   ,   s   € œ%¤¨D°qÑ&9Ó:Ð:r   c                  ó(   — t        t        d ddœ«      S r   )r   ÚF_CWr   r   r   Úload_chuangweir   -   s   € œU¤4¨t¸!Ñ)<Ó=Ð=r   c                  ó(   — t        t        d ddœ«      S r   )r   ÚF_QJr   r   r   Úload_qingjier"   .   s   € œ5¤¨T¸Ñ':Ó;Ð;r   c                  ó(   — t        t        d ddœ«      S r   )r   ÚF_GBr   r   r   Ú
load_ganbur%   /   s   € œœt¨4°aÑ%8Ó9Ð9r   c                  ó®   — 	 t        t        dd¬«      5 } | j                  «       j                  «       cd d d «       S # 1 sw Y   y xY w# t        $ r Y y w xY wr   )r   ÚF_TOKENÚreadÚstripr
   )r   s    r   Ú_load_tokenr*   1   sK   € ðÜ”'˜3¨Ô1ð 	$°QØ—6‘6“8—>‘>Ó#÷	$÷ 	$ò 	$ûäò Ùðús+   ‚A ”<²	A ¼AÁA ÁA Á	AÁAc                 ó&   — t        «       }|sy| |k(  S )uT   token æ–‡ä»¶ä¸�å­˜åœ¨ â†’ æ‹’ç»�æ‰€æœ‰å¸¦ token æ£€æŸ¥çš„æŽ¥å�£ï¼ˆå®‰å…¨é»˜è®¤ï¼‰ã€‚F)r*   )ÚsuppliedÚreals     r   Úcheck_tokenr.   8   s   € ä‹=€DÙØØ�tÑÐr   c                  óZ   — t         j                  j                  «       j                  «       S r   )ÚdatetimeÚdateÚtodayÚ	isoformatr   r   r   Ú_todayr4   @   s   € ”X—]‘]×(Ñ(Ó*×4Ñ4Ó6Ð6r   c                 óH   — t        t        j                  d| xs d«      «      S )Nz\d{4}-\d{2}-\d{2}Ú )ÚboolÚreÚ	fullmatch©Úss    r   Ú_valid_dater<   B   s   € Ü”—‘Ð1°1²7¸Ó;Ó<Ð<r   z^\d{4}-\d{2}-\d{2}$u)   ^[\u4e00-\u9fa5]{1,5}Â·?[a-zA-Z0-9]{0,4}$c                 óP   — t        | t        «      sy | j                  «       } | xs d S r   )Ú
isinstanceÚstrr)   r:   s    r   Ú
_norm_namer@   H   s$   € Ü�aœÔØØ	�‰‹	€AØŠ9�Ðr   )	Ú1Ú2Ú3Ú4Ú5Ú6Ú7Ú8Ú9)	u   ç¬¬1èŠ‚u   ç¬¬2èŠ‚u   ç¬¬3èŠ‚u   ç¬¬4èŠ‚u   5/6èŠ‚u   ç¬¬7èŠ‚u   8/9èŠ‚u   æ™šè‡ªä¹ ä¸€u   æ™šè‡ªä¹ äºŒc           
      ó�  — t        t        «       t        «      rt        «       j                  di «      ni }t        «       }t        |t        «      r0t        |j                  d«      t        «      r|j                  d«      nt        |t        «      r|ni }|j                  | «      xs i }i }g }t        D ]ì  }|j                  |«      xs i }g }	|j                  «       D ]i  \  }
}t        |t        «      sŒ|r|
|k7  rŒ|	j                  |
|j                  d«      xs |j                  d«      xs d|j                  dd«      dœ«       Œk |	j                  d„ ¬	«       |j                  «       r,d
t        |«      cxk  rdk  rn nt        t        |«      d
z
     n||	dœ||<   Œî t        d„ |j                  «       D «       «      }| ||ddœS )NÚrecordsÚstr;   õ   æœªçŸ¥r   r   )ÚnameÚstatusÚ	marked_atc                 ó   — | d   S )NrN   r   )Úes    r   ú<lambda>z!view_attendance.<locals>.<lambda>g   s
   €  1 V¡9€ r   )Úkeyé   é	   )ÚlabelÚentriesc              3   ó8   K  — | ]  }t        |d    «      –— Œ y­w)rX   N)Úlen)Ú.0r   s     r   ú	<genexpr>z"view_attendance.<locals>.<genexpr>i   s   è ø€ ÒB¨A”c˜!˜I™,×'ÑBùs   ‚uP   status å�«ï¼šæ­£å¸¸/ç—…å�‡/äº‹å�‡/æ—·è¯¾/è¿Ÿåˆ°/æ—©é€€ç­‰ï¼Œs ä¸ºé¡µé�¢å­—æ®µå��)r1   ÚperiodsÚmarked_totalÚnote)r>   r   ÚdictÚgetÚPERIODSÚitemsÚappendÚsortÚisdigitÚintÚPERIOD_LABELSÚsumÚvalues)r1   rN   ÚrecsÚdataÚdayr]   Ú
absent_allÚpÚprawrX   ÚnmÚentÚtotal_markss                r   Úview_attendancert   R   s¥  € Ü/9¼+»-ÌÔ/NŒ;‹=×Ñ˜Y¨Ô+ÐTV€Dä‹=€DÜ",¨T´4Ô"8¼ZÈÏÉÐQZÓH[Ô]aÔ=bˆ4�8‰8�IÔÔq{ð  }Aô  CGô  rHÑimð  NP€DØ
�(‰(�4‹.Ò
˜B€CØ€GØ€JÜò wˆØ�w‰w�q‹zÒ˜RˆØˆØ—z‘z“|ò 		‰GˆB�Ü˜c¤4Ô(ØÙ˜˜dš
ØØ�N‰NØØŸ'™' $›-ÒC¨3¯7©7°3«<ÒC¸8Ø ŸW™W S¨!›_ñõ ð		ð 	�‰Ñ,ˆÔ-Ø:;¿)¹)¼+È!ÌsÐSTËvÔJZÐYZÕJZœ}¬S°«V°A©XÒ6Ð`aÐnuÑvˆ�Š
ðwô ÑB°·±Ó1AÔBÓB€KàØØ#Øbñ	ð r   c                 ó`  — t        «       }t        |t        «      r0t        |j                  d«      t        «      r|j                  d«      nt        |t        «      r|ni }i }g }	 t        j
                  j                  | «      }t        j
                  j                  |«      }||z
  j                  dkD  rddiS |}	|	|k  r>|j                  |	j                  «       «       |	t	        j                  d¬«      z  }	|	|k  rŒ>|D ]É  }
|j                  |
«      xs i }|j                  «       D ]Ÿ  \  }}t        |t        «      sŒ|j                  «       D ]v  \  }}t        |t        «      sŒ|r||k7  rŒ|j                  d«      xs |j                  d	«      xs d
}|j                  |i «       ||   j                  |d«      dz   ||   |<   Œx Œ¡ ŒË | |t        |j                  «       «      D ��cg c]"  \  }}||t        |j!                  «       «      dœ‘Œ$ c}}|dœS # t        $ r ddicY S w xY wc c}}w )NrK   Úerrorzinvalid date rangeé\   z!date range too long (max 92 days)rU   ©ÚdaysrL   r;   rM   r   )rN   Úcountsrs   )ÚfromÚtoÚper_studentÚdays_covered)r   r>   r`   ra   r0   r1   Úfromisoformatr
   ry   rd   r3   Ú	timedeltarc   Ú
setdefaultÚsortedri   rj   )Úfrom_dÚto_drN   rl   rk   ÚstatsÚdatesÚd0Úd1Úcurr   rm   ro   rp   rq   rr   rL   Úkr   s                      r   Úview_attendance_summaryr‹   q   s!  € Ü‹=€DÜ",¨T´4Ô"8¼ZÈÏÉÐQZÓH[Ô]aÔ=bˆ4�8‰8�IÔÔq{ð  }Aô  CGô  rHÑimð  NP€DØ€EØ€Eð/Ü�]‰]×(Ñ(¨Ó0ˆÜ�]‰]×(Ñ(¨Ó.ˆð 	ˆR‰‡~�~˜ÒØÐ<Ð=Ð=Ø
€CØ
�Š)Ø�‰�S—]‘]“_Ô%ØŒx×!Ñ! qÔ)Ñ)ˆð �‹)ð ò 9ˆØ�h‰h�q‹kÒ˜RˆØ—y‘y“{ò 
	9‰GˆAˆtÜ˜d¤DÔ)ØØŸ:™:›<ò 9‘��CÜ! #¤tÔ,ØÙ˜B $šJØØ—W‘W˜T“]Ò> c§g¡g¨c£lÒ>°h�Ø× Ñ   RÔ(Ø % b¡	§¡¨b°!Ó 4°qÑ 8��b‘	˜"’ñ9ñ
	9ð9ð ˜dô ˜uŸ{™{›}Ó-÷
á��1ð  !´C¸¿¹»
³OÓDó
ð ñð øô+ ò /ØÐ-Ð.Ò.ð/üó.
s   Á$>H Ç)'H*
ÈH'È&H'c            	      óX  — t        «       j                  d«      } t        | t        «      sddiS g }t	        | «      D ]­  \  }}g }t	        |«      D ]�  \  }}g }t        |t
        «      rSt        |j                  d«      t        «      r4|d   D �cg c]&  }t        |t        «      sŒ|j                  «       sŒ%|‘Œ( }}|j                  |dz   |dœ«       Œƒ |j                  |dz   |dœ«       Œ¯ |D �	��cg c]  }	|	d   D ]  }|d   D ]  }|‘Œ Œ Œ }
}}	}|t        |
«      d	œS c c}w c c}}}	w )
Nr   rv   zno seating dataÚnamesrU   )Úcolr�   )ÚrowÚcellsr�   )ÚrowsÚseated_count)
r   ra   r>   ÚlistÚ	enumerater`   r?   r)   rd   rZ   )Úzwr‘   Úrir�   r�   ÚciÚcr�   Únr   Úseateds              r   Úview_seatingr›   —   s)  € Ü	‹×	Ñ	˜3Ó	€BÜ�bœ$ÔØÐ*Ð+Ð+Ø€DÜ˜R“=ò 5‰ˆˆCØˆÜ˜s“^ò 	:‰EˆB�ØˆEÜ˜!œTÔ"¤z°!·%±%¸³.Ä$Ô'GØ$% g¡JÖS˜q´*¸QÄÕ2DÈÏÉÍšÐS�ÐSØ�L‰L  a¡°%Ñ8Õ9ð		:ð
 	�‰˜B ™F¨UÑ3Õ4ð5ð ×FÐF�A q¨¡zÒF !¸1¸W¹:ÒF°aŠaÐFˆaÐFˆaÐF€FÒFØ¬#¨f«+Ñ6Ð6ùò	 Tùô Gs   ÂD Â"D Â3D Ã1D%c                  óh  — t        «       j                  d«      } t        | t        «      sddiS g d¢}g }t	        | «      D ]º  \  }}g }t        |t
        «      r|t        dd«      D ]m  }|j                  t        |«      «      xs i }|j                  ||j                  d«      t        |j                  d«      «      |j                  d	d
«      dœ«       Œo |j                  |dk  r||   n
t        |«      |dœ«       Œ¼ |D ��	cg c]  }|d   D ]  }	|	d   sŒ	|	d   ‘Œ Œ }
}}	|t        |
«      dœS c c}	}w )Nr   rv   zno bed data©Ú2103Ú2104Ú2105rU   é   rN   ÚhalfÚtr   )Úbed_norN   r¢   Ú
updated_até   )ÚdormÚbedsr¨   )ÚdormsÚresidents_count)r   ra   r>   r“   r”   r`   Úranger?   rd   r7   rZ   )ÚcwÚDORMSr©   Údir§   r¨   ÚirR   r   ÚbÚ	residentss              r   Ú	view_bedsr²   §   s+  € Ü	Ó	×	Ñ	˜cÓ	"€BÜ�bœ$ÔØ˜Ð'Ð'Ú$€EØ€EÜ˜b“Mò O‰ˆˆDØˆÜ�dœDÔ!Ü˜1˜b“\ò �Ø—H‘HœS ›VÓ$Ò*¨�Ø—‘ØØŸE™E &›MÜ  §¡ v£Ó/Ø"#§%¡%¨¨Q£-ñ	õ ðð 	�‰¨2°ª6˜e Bši´s¸2³wÈÑMÕNðOð %*×J˜q°1°V±9ÒJ¨aÀÀ&Ã	��6“ÐJ�ÐJ€IÑJØ¬s°9«~Ñ>Ð>ùó Ks   ÄD.Ä	D.c                  ó€  — t        «       j                  d«      } t        | t        «      sddiS g d¢}g d¢}| j                  d«      }| j                  d«      }g }t        |t        «      rÉt        |«      D ]»  \  }}g }t        |t        «      r}t        |«      D ]o  \  }	}
g }t        |
t        «      r%t        |
j                  d«      t        «      r|
d   }nt        |
t        «      r|
}|j                  |	d	k  r||	   nd
|	› �|dœ«       Œq |j                  |dk  r||   n
t        |«      |dœ«       Œ½ g }t        |t        «      rvt        |«      D ]h  \  }}t        |t        «      sŒt        |j                  d«      t        «      sŒ7|j                  |dk  r||   n
t        |«      |d   xs d gd   dœ«       Œj ||dœS )Nr   rv   zno duty data©õ   å‘¨ä¸€õ   å‘¨äºŒõ   å‘¨ä¸‰õ   å‘¨å››õ   å‘¨äº”r�   r   Úszr�   é   rm   )rm   r�   r¦   )r§   ry   r   )r§   Úleader)r©   Údorm_leaders)r"   ra   r>   r`   r“   r”   rd   r?   )ÚqjÚDAYSr­   r   rº   Úoutr®   r§   ry   Úday_irm   r�   Úleadersr;   s                 r   Ú	view_dutyrÃ   ¼   s¦  € Ü	‹×	Ñ	˜CÓ	 €BÜ�bœ$ÔØ˜Ð(Ð(Ú=€DÚ$€EØ
�‰ˆs‹€AØ	�‰�‹€BØ
€CÜ�!”TÔÜ! !›ò 
	Q‰HˆB�ØˆDÜ˜$¤Ô%Ü"+¨D£/ò f‘J�E˜3Ø�EÜ! #¤tÔ,´¸C¿G¹GÀGÓ<LÌdÔ1SØ # G¡™Ü# C¬Ô.Ø #˜Ø—K‘K°u¸q²y¨¨UªÈÈEÈ7ÀmÐ^cÑ dÕeðfð �J‰J¨R°!ªV  b¢	¼¸R»È$ÑOÕPð
	Qð €GÜ�"”dÔÜ˜r“]ò 	p‰EˆB�Ü˜!œTÕ"¤z°!·%±%¸³.Ä$Õ'GØ—‘°R¸!²V¨¨bª	ÄÀRÃÐUVÐW^ÑU_ÒUiÐdhÐciÐklÑTmÑnÕoð	pð ¨'Ñ2Ð2r   c                  óh  — t        «       j                  d«      } t        | t        «      sddiS | j                  d«      xs g }g }|D ]V  }t        |t        «      sŒt        |«      dk\  sŒ#t        d„ |d d D «       «      sŒ9|j                  |d   |d   |d	   d
œ«       ŒX | j                  d«      |dœS )Nr   rv   zno cadre datar‘   r¦   c              3   ó<   K  — | ]  }t        |t        «      –— Œ y ­wr   )r>   r?   )r[   r˜   s     r   r\   zview_cadres.<locals>.<genexpr>ß   s   è ø€ Ò6YÈa´zÀ!ÄS×7IÑ6Yùs   ‚r   rU   é   )ÚpositionÚdutyÚmembersÚtitle)rÊ   Ú	positions)r%   ra   r>   r`   r“   rZ   Úallrd   )Úgbr‘   rË   r   s       r   Úview_cadresrÎ   Ø   s²   € Ü	‹×	Ñ	˜#Ó	€BÜ�bœ$ÔØ˜Ð)Ð)Ø�6‰6�&‹>Ò˜R€DØ€IØò PˆÜ�aœÕ¤3 q£6¨Q£;´3Ñ6YÐSTÐUWÐVWÐSXÔ6YÕ3YØ×Ñ¨!¨A©$¸¸!¹ÈÈ1ÉÑNÕOðPð —V‘V˜G“_°9Ñ=Ð=r   c           
      ón  — t        | «      } | sddiS d| i}d }t        «       j                  d«      }t        |t        «      r}t        |«      D ]o  \  }}t        |«      D ]\  \  }}t        |t        «      sŒ| |j                  d«      xs g D �cg c]  }t        |t        «      sŒ|‘Œ c}v sŒNd|dz   › d|dz   › d	�}Œ^ Œq ||d
<   d }	t        «       j                  d«      }
t        |
t        «      r”g d¢}t        |
«      D ]‚  \  }}t        |t        «      sŒt        dd«      D ]]  }|j                  t        |«      «      xs i }|j                  d«      | k(  sŒ6|dk  r||   n|› d|› d�|j                  d«      rdndz   }	Œ_ Œ„ |	|d<   g }t        «       j                  d«      }t        |t        «      �rt        |j                  d«      t        «      räg d¢}g d¢}t        |d   «      D ]Ë  \  }}t        |t        «      sŒt        |«      D ]§  \  }}t        |t        «      r0t        |j                  d«      t        «      r|j                  d«      nt        |t        «      r|ng }| |D �cg c]  }t        |t        «      sŒ|‘Œ c}v sŒ~|j                  |dk  r||   n|› d|dk  r||   n|› �«       Œ© ŒÍ ||d<   t        j                  j                  «       }i }t        «       }t        |t        «      r0t        |j                  d«      t        «      r|j                  d«      nt        |t        «      r|ni }t        d«      D ]Û  }|t        j                   |¬«      z
  j#                  «       }|j                  |«      xs i }|j%                  «       D ]Š  \  }}t        |t        «      r|j                  | «      nd }t        |t        «      sŒ:|j                  d«      xs |j                  d«      }|sŒa|dk7  sŒg|j'                  |g «      j                  ||dœ«       ŒŒ ŒÝ |r|nd |d!<   |S c c}w c c}w )"Nrv   zmissing namerN   r   r�   u   ç¬¬rU   u   æŽ’ç¬¬u   åˆ—Úseatr�   r¡   r¦   u    ç¬¬u   åºŠr¢   u   ï¼ˆæ™šèµ°è¯»ï¼‰r6   Úbedr   r´   ú r»   rÈ   rK   é   rx   rL   r;   õ   æ­£å¸¸)ÚperiodrO   u   è¿‘7å¤©å…¨å‹¤ï¼ˆæˆ–æ— è®°å½•ï¼‰Úattendance_recent_7d)r@   r   ra   r>   r“   r”   r`   r?   r   r«   r"   rd   r0   r1   r2   r   r€   r3   rc   r�   ) rN   rÀ   rÐ   r•   r–   r�   r—   r˜   r™   rÑ   r¬   r­   r®   r§   r¯   rR   rÈ   r¾   r¿   rÁ   rm   r�   r2   Úrecentrl   rk   rŠ   r   ro   rp   rr   rL   s                                    r   Úview_studentrØ   ã   s  € Ü�dÓ€DÙØ˜Ð(Ð(Ø�4ˆ.€Cà€DÜ	‹×	Ñ	˜3Ó	€BÜ�"”dÔÜ  “}ò 	7‰GˆB�Ü" 3›ò 7‘��AÜ˜a¤Õ&¨4ÀÇÁÀgÃÒ@TÐRTÖ3l¸!ÔYcÐdeÔgjÕYk²AÒ3lÒ+lØ   A¡  f¨R°©T¨F°#Ð6‘Dñ7ð	7ð €Cˆ�Kà
€CÜ	Ó	×	Ñ	˜cÓ	"€BÜ�"”dÔÚ(ˆÜ! "›ò 	r‰HˆB�Ü˜d¤DÔ)ØÜ˜1˜b“\ò r�Ø—H‘HœS ›VÓ$Ò*¨�Ø—5‘5˜“= DÓ(Ø*,¨Qª$˜U 2šY°BÐ7°t¸A¸3¸cÐBÐ[\×[`Ñ[`ÐagÔ[hÑFWÐnpÑq‘Cñrð	rð €Cˆ�Jà€DÜ	‹×	Ñ	˜CÓ	 €BÜ�"”dÕ¤
¨2¯6©6°#«;¼Ô =ÚAˆÚ(ˆÜ! " S¡'Ó*ò 	d‰HˆB�Ü˜d¤DÔ)ØÜ'¨›oò d‘
��sÜ,6°s¼DÔ,AÄjÐQT×QXÑQXÐY`ÓQaÔcgÔFh˜Ÿ™ Ô(ô  wAð  BEô  GKô  wLÑorð  RT�Ø uÖC !´
¸1¼cÕ0BšAÒCÒCØ—K‘K°°1² 5¨¢9¸"Ð"=¸QÈeÐTUÊg¸tÀEº{Ð[`Ð>aÐ bÕcñdð	dð €Cˆ�Kä�M‰M×ÑÓ!€EØ€FÜ‹=€DÜ",¨T´4Ô"8¼ZÈÏÉÐQZÓH[Ô]aÔ=bˆ4�8‰8�IÔÔq{ð  }Aô  CGô  rHÑimð  NP€DÜ�1‹Xò QˆØ”X×'Ñ'¨QÔ/Ñ/×:Ñ:Ó<ˆØ�h‰h�q‹kÒ˜RˆØ—y‘y“{ò 	Q‰GˆAˆtÜ$.¨t´TÔ$:�$—(‘(˜4”.ÀˆCÜ˜#œtÕ$Ø—W‘W˜T“]Ò2 c§g¡g¨c£l�Ú˜" ›.Ø×%Ñ% a¨Ó,×3Ñ3¸qÈBÑ4OÕPñ	QðQñ -3¡&Ð8Y€CÐÑØ€Jùò[ 4mùò6 Ds   ÂP-
Â"P-
É)P2
É?P2
c                  ó®  — t        «       } t        | «      }i }|d   j                  «       D ]F  \  }}|d   D ]9  }|d   dvsŒ|j                  |d   t	        «       «      j                  |d   «       Œ; ŒH |j                  «       D ��ci c]  \  }}|t        |«      “Œ }}}g d¢t        j                  j                  «       j                  «          }t        «       }	g }
|	j                  dg «      D ]/  }|d   D ]%  }|d	   |k(  sŒ|
j                  |d
   |d   dœ«       Œ' Œ1 t        «       }| ||d   ||
t        |j                  dg «      «      ddœS c c}}w )Nr]   rX   rO   )rÔ   Nr6   rN   )rµ   r¶   r·   r¸   r¹   u   å‘¨å…­u   å‘¨æ—¥r©   ry   rm   r§   r�   )r§   r�   r^   rË   u7   åœ¨è¯» 50 äººï¼ˆåŽ†å�²å��å�• 54 äººï¼Œ4 äººå·²é€€å­¦ï¼‰)r1   ÚweekdayÚattendance_markedÚattendance_abnormalÚ
today_dutyÚcadre_positionsÚroster_note)r4   rt   rc   r�   ÚsetÚaddr‚   r0   r1   r2   rÚ   rÃ   ra   rd   rÎ   rZ   )r2   ÚattÚabnormalro   ÚblkrR   rŠ   r   ÚwkrÈ   rÝ   r§   ÚddÚcadress                 r   Úview_overviewrè     sn  € Ü‹H€EÜ
˜%Ó
 €Cà€HØ�i‘.×&Ñ&Ó(ò G‰ˆˆ3Ø�Y‘ò 	GˆAØ�‰{Ð"6Ò6Ø×#Ñ# A f¡I¬s«uÓ5×9Ñ9¸!¸H¹+ÕFñ	GðGð *2¯©Ó)9×:¡  A�”6˜!“9‘Ð:€HÑ:â	IÌ(Ï-É-×J]ÑJ]ÓJ_×JgÑJgÓJiÑ	j€BÜ‹;€DØ€JØ—‘˜ "Ó%ò PˆØ�v‘,ò 	PˆBØ�%‰y˜B‹Ø×!Ñ!¨4°©<À"ÀWÁ+Ñ"NÕOñ	PðPô ‹]€FàØØ  Ñ0Ø'Ø Ü˜vŸz™z¨+°rÓ:Ó;ØPñð ùó ;s   ÂEc           	      óþ  — | j                  d«      sy| t        d«      d }|xs i }|j                  d«      xs |r|j                  d«      nd}|dk(  rdddd	t        j                  d
«      dœdœfS t        |«      sddddœfS |dk(  rddt        «       dœfS |dk(  rP|j                  d«      xs
 t        «       }t        |«      sddddœfS ddt        ||j                  d«      ¬«      dœfS |dk(  ra|j                  d«      |j                  d«      }}t        |«      rt        |«      sddddœfS ddt        |||j                  d«      ¬«      dœfS |dk(  rddt        «       dœfS |dk(  s|dk(  rdddg d ¢idœfS |d!k(  rddt        «       dœfS |d"k(  rddt        «       dœfS |d#k(  rddt        «       dœfS |d$k(  r7|j                  d«      sddd%dœfS ddt        |j                  d«      «      dœfS d&dd'|› d(�dœfS ))uA   path: /api/v1/xxxï¼›è¿”å›ž (status_code, obj) æˆ– None(ä¸�åŒ¹é…�)z/api/v1/NÚtokenzX-Banwu-TokenÚpingéÈ   TÚbanwuÚv1z%Y-%m-%d %H:%M:%S)ÚserviceÚapiÚtime)Úokrl   i‘  FuT   unauthorized: token missing or wrong (token=<æ•™å¸ˆå�£ä»¤> æˆ– Header X-Banwu-Token))rò   rv   ÚoverviewÚ
attendancer1   i�  zbad date, use YYYY-MM-DDrN   )rN   Úattendance_summaryr{   r|   z"need from=YYYY-MM-DD&to=YYYY-MM-DDÚseatingrð   ÚdocsÚ	endpoints)	rë   ró   zattendance?date=&name=z"attendance_summary?from=&to=&name=rö   r¨   rÈ   rç   zstudent?name=r¨   rÈ   rç   Ústudentzneed name parameteri”  zunknown endpoint /api/v1/z, see /api/v1/docs)Ú
startswithrZ   ra   rñ   Ústrftimer.   rè   r4   r<   rt   r‹   r›   r²   rÃ   rÎ   rØ   )	r   ÚqueryÚheadersÚsubÚqrê   r   r   r£   s	            r   Úhandler   ;  s^  € à�?‰?˜:Ô&ØØ
Œs�:‹ÐÐ
 €CØŠ�€AØ�E‰E�'‹NÒQ¹w˜wŸ{™{¨?Ô;ÈD€Eà
ˆf‚}Ø˜4°WÀTÔSW×S`ÑS`ÐatÓSuÑ)vÑwÐwÐwô �uÔØ˜5ð  ,Bñ  Cð  Cð  	Cà
ˆjÒØ˜4¬«Ñ9Ð9Ð9Ø
ˆlÒØ�E‰E�&‹MÒ%œV›XˆÜ˜1Œ~Ø˜uÐ/IÑJÐJÐJØ˜4¬¸ÀÇÁÀvÃÔ)OÑPÐPÐPØ
Ð"Ò"Ø�u‰u�V‹}˜aŸe™e D›kˆ1ˆÜ˜A”¤;¨q¤>Ø˜uÐ/SÑTÐTÐTØ˜4Ô)@ÀÀAÈAÏEÉEÐRXËMÔ)ZÑ[Ð[Ð[Ø
ˆiÒØ˜4¬«Ñ8Ð8Ð8Ø
ˆe‚|�s˜f’}Ø˜4Øò Qð*
ñ ð ð 	ð ˆf‚}Ø˜4¬«Ñ5Ð5Ð5Ø
ˆf‚}Ø˜4¬«Ñ5Ð5Ð5Ø
ˆh‚Ø˜4¬«Ñ7Ð7Ð7Ø
ˆiÒØ�u‰u�VŒ}Ø˜uÐ/DÑEÐEÐEØ˜4¬°a·e±e¸F³mÓ)DÑEÐEÐEØ�uÐ)BÀ3À%ÐGYÐ'ZÑ[Ð[Ð[r   c                 ó€   — ddl m}  || xs d«      }|j                  «       D ��ci c]  \  }}||d   “Œ c}}S c c}}w )Nr   )Úparse_qsr6   )Úurllib.parser  rc   )Úqsr  ro   rŠ   r   s        r   Ú_parse_queryr  i  s9   € Ý%Ù�’�rÓ€AØ !§¡£	×*™˜˜1ˆAˆq�‰t‰GÓ*Ð*ùÓ*s   ¦:r   )-Ú__doc__r   Úosr8   rñ   r0   Úcalendarr   ÚdirnameÚabspathÚ__file__ÚBASEÚjoinr   r   r   r!   r$   r'   r   r   r   r   r"   r%   r*   r.   r4   r<   ÚcompileÚDATE_REÚNAME_REr@   rb   rh   rt   r‹   r›   r²   rÃ   rÎ   rØ   rè   r   r  r   r   r   ú<module>r     sG  ðñ÷* .× -× -à	‡w�w‡��r—w‘w—‘ xÓ0Ó1€Ø	‡w�w‡|�|�DÐ,Ó-€Ø	‡w�w‡|�|�DÐ,Ó-€Ø	‡w�w‡|�|�DÐ/Ó0€Ø	‡w�w‡|�|�DÐ-Ó.€Ø	‡w�w‡|�|�DÐ+Ó,€Ø
�'‰'�,‰,�tÐ/Ó
0€òò *Ú :Ú =Ú ;Ú 9òòò 7ò=ð ˆ"�*‰*Ð+Ó
,€Ø
ˆ"�*‰*ÐAÓ
B€òò 8€Ú{€óó>$òL7ò ?ò*3ò8	>ò8òtò<,\ó\+r   