§
    z¿Mj|I  ã                   óÒ  — 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mZmZmZ d dlmZ d dlmZ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" 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- d dl.m/Z/ d dl0m1Z1m2Z2m3Z3m4Z4  e	ddg¬¦  «        Z5dede6defd„Z7dedede8fd„Z9e5 :                    de*e&         ¬¦  «         ed¦  «         ed¦  «         ed¦  «         edd¬¦  «         eddd ¬!¦  «         e
e¦  «         e
e,¦  «        fd"ee;         d#ee6         d$ee;         d%e6d&e6ded'efd(„¦   «         Z<e5 :                    d)e*e&         ¬¦  «         ed¦  «         ed¦  «         ed¦  «         edd¬¦  «         eddd ¬!¦  «         e
e¦  «         e
 e-d*¦  «        ¦  «        fd"ee;         d+ee6         d$ee;         d%e6d&e6ded,efd-„¦   «         Z=e5 :                    d.e'¬¦  «         e
e¦  «         e
e,¦  «        fde6ded,efd/„¦   «         Z>e5 ?                    de&d0¬1¦  «         e
e¦  «         e
e,¦  «        fd2e$ded'efd3„¦   «         Z@e5 A                    d.e&¬¦  «         e
e¦  «         e
e,¦  «        fde6d2e%ded'efd4„¦   «         ZBe5 C                    d.d5¬6¦  «         e
e¦  «         e
e,¦  «        fde6ded'efd7„¦   «         ZDejE         F                    ejE         G                    eH¦  «        d8¦  «        ZId9ede;fd:„ZJe5 ?                    d;e(d0¬1¦  «         ed<¦  «         ed¦  «         e
e¦  «         e
e,¦  «        fde6d2e;d9ee         ded'ef
d=„¦   «         ZKe5 C                    d>d5¬6¦  «         e
e¦  «         e
e,¦  «        fde6d?e6ded'efd@„¦   «         ZLe5 :                    dA¦  «         e
e¦  «         e
e,¦  «        fde6ded,efdB„¦   «         ZMdS )Cé    N)ÚdatetimeÚdate)ÚOptional)Ú	APIRouterÚDependsÚHTTPExceptionÚQueryÚFormÚ
UploadFileÚFile)ÚAsyncSession)ÚselectÚfuncÚand_)Úget_db)ÚTaskÚTaskComment)ÚRecurringTask)ÚUser)ÚIncomingEmail)ÚNotification)Ú
TaskCreateÚ
TaskUpdateÚTaskOutÚTaskDetailOutÚTaskCommentOut)ÚPagedOut)Úget_current_userÚrequire_role)Úget_next_due_date)ÚnotifyÚnotify_user_by_idÚnotify_user_groupÚnotify_admin_groupz/tasksÚtasks)ÚprefixÚtagsÚdbÚtask_idÚreturnc              ƒ   óò   K  — |                       t          t          ¦  «                             t          j        |k    ¦  «        ¦  «        ƒ d {V —†}|                     ¦   «         }|st          dd¦  «        ‚|S )Né”  zTask not found)Úexecuter   r   ÚwhereÚidÚscalar_one_or_noner   )r(   r)   ÚresultÚtasks       ú9/var/www/html/jarvis.com/web/backend/app/routers/tasks.pyÚ_get_task_or_404r4      ss   è è € Ø—:’:�f¥T™lœl×0Ò0µ´¸GÒ1CÑDÔDÑEÔEÐEÐEÐEÐEÐEÐE€FØ×$Ò$Ñ&Ô&€DØð 3Ý˜CÐ!1Ñ2Ô2Ð2Ø€Kó    r2   c              ƒ   ót  K  — d}| j         rg|                     t          t          ¦  «                             t          j        | j         k    ¦  «        ¦  «        ƒ d{V —†}|                     ¦   «         }|                     t          t          ¦  «                             t          j        | j        k    ¦  «        ¦  «        ƒ d{V —†}|                     ¦   «         }|                     t          t          j
        ¦   «         ¦  «                             t          j        | j        k    ¦  «        ¦  «        ƒ d{V —†}|                     t          t          j
        ¦   «         ¦  «                             t          j        | j        k    ¦  «        ¦  «        ƒ d{V —†}i | j        ¥|r|j        nd|r|j        nd||dœ¥S )z0Attach username fields and counts to a Task row.NÚ )Úassigned_usernameÚcreated_by_usernameÚsubtask_countÚcomment_count)Úassigned_tor-   r   r   r.   r/   r0   Ú
created_byÚscalarr   Úcountr   Ú	parent_idr   r)   Ú__dict__Úusername)r2   r(   Úassigned_userÚrÚcreator_resÚcreatorr:   r;   s           r3   Ú_enrich_taskrG   #   s—  è è € à€MØÔð /Ø—*’*�V¥D™\œ\×/Ò/µ´¸4Ô;KÒ0KÑLÔLÑMÔMÐMÐMÐMÐMÐMÐMˆØ×,Ò,Ñ.Ô.ˆàŸ
š
¥6­$¡<¤<×#5Ò#5µd´gÀÄÒ6PÑ#QÔ#QÑRÔRÐRÐRÐRÐRÐRÐR€KØ×,Ò,Ñ.Ô.€GàŸ)š)¥F­4¬:©<¬<Ñ$8Ô$8×$>Ò$>½t¼~ÐQUÔQXÒ?XÑ$YÔ$YÑZÔZÐZÐZÐZÐZÐZÐZ€MØŸ)š)¥F­4¬:©<¬<Ñ$8Ô$8×$>Ò$>½{Ô?RÐVZÔV]Ò?]Ñ$^Ô$^Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ð_€MðØ
Œ-ðà9FÐP˜}Ô5Ð5ÈDØ3:ÐB˜wÔ/Ð/ÀØ,Ø,ðð ð ð r5   r7   )Úresponse_modelé   )Úgeé   iô  )rJ   ÚleÚstatusr@   ÚsearchÚpageÚlimitÚcurrent_userc              ƒ   óš  ‡K  — t           j        |j        k    g}| r#|                     t           j        | k    ¦  «         |dk    r$|                     t           j        d k    ¦  «         n%|r#|                     t           j        |k    ¦  «         |r6|                     t           j                             d|› d�¦  «        ¦  «         ‰                     t          t          j        ¦   «         ¦  «                             t           ¦  «                             t          |Ž ¦  «        ¦  «        ƒ d {V —†}‰                     t          t           ¦  «                             t          |Ž ¦  «                             t           j                             ¦   «                              ¦   «         t           j                             ¦   «         ¦  «                             |dz
  |z  ¦  «                             |¦  «        ¦  «        ƒ d {V —†}	ˆfd„|	                     ¦   «                              ¦   «         D ¦   «         ƒ d {V —†}
t5          |
|||¬¦  «        S )Nr   ú%rI   c              “   ó@   •K  — g | ]}t          |‰¦  «        ƒ d {V —†‘ŒS ©N©rG   ©Ú.0Útr(   s     €r3   ú
<listcomp>zlist_tasks.<locals>.<listcomp>X   ó9   øè è € ÐGÐGÐG¨1•<  2Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&ÐGÐGÐGr5   ©ÚitemsÚtotalrO   rP   )r   r<   r/   ÚappendrM   r@   ÚtitleÚiliker>   r   r   r?   Úselect_fromr.   r   r-   Úorder_byÚdue_dateÚascÚ	nullslastÚ
created_atÚdescÚoffsetrP   ÚscalarsÚallr   )rM   r@   rN   rO   rP   r(   rQ   Úfiltersr^   r1   r]   s        `     r3   Ú
list_tasksrm   ;   s  øè è € õ Ô <¤?Ò2Ð3€GØð .Ø�Š•t”{ fÒ,Ñ-Ô-Ð-Ø�A‚~€~Ø�Š•t”~¨Ò-Ñ.Ô.Ð.Ð.Ø	ð 4Ø�Š•t”~¨Ò2Ñ3Ô3Ð3Øð 8Ø�Š•t”z×'Ò'¨¨F¨¨¨Ñ6Ô6Ñ7Ô7Ð7à—)’)Ý�tŒz‰|Œ|ÑÔ×(Ò(­Ñ.Ô.×4Ò4µT¸7°^ÑDÔDñô ð ð ð ð ð ð €Eð —:’:Ý�t‰Œß	Š�t�Wˆ~Ñ	Ô	ß	Š•$”-×#Ò#Ñ%Ô%×/Ò/Ñ1Ô1µ4´?×3GÒ3GÑ3IÔ3IÑ	JÔ	Jß	Š�˜‘˜UÑ"Ñ	#Ô	#§E¢E¨%¡L¤Lñ	ô ð ð ð ð ð ð €Fð HÐGÐGÐG°·²Ñ0@Ô0@×0DÒ0DÑ0FÔ0FÐGÑGÔGÐGÐGÐGÐGÐGÐG€EÝ˜% u°4¸uÐEÑEÔEÐEr5   z/adminÚadminr<   Ú_c              ƒ   ó<  ‡K  — t           j        d k    g}| r#|                     t           j        | k    ¦  «         |r#|                     t           j        |k    ¦  «         |r6|                     t           j                             d|› d�¦  «        ¦  «         ‰                     t          t          j
        ¦   «         ¦  «                             t           ¦  «                             t          |Ž ¦  «        ¦  «        ƒ d {V —†}‰                     t          t           ¦  «                             t          |Ž ¦  «                             t           j                             ¦   «                              ¦   «         t           j                             ¦   «         ¦  «                             |dz
  |z  ¦  «                             |¦  «        ¦  «        ƒ d {V —†}	ˆfd„|	                     ¦   «                              ¦   «         D ¦   «         ƒ d {V —†}
t3          |
|||¬¦  «        S )NrS   rI   c              “   ó@   •K  — g | ]}t          |‰¦  «        ƒ d {V —†‘ŒS rU   rV   rW   s     €r3   rZ   z"list_all_tasks.<locals>.<listcomp>y   r[   r5   r\   )r   r@   r_   rM   r<   r`   ra   r>   r   r   r?   rb   r.   r   r-   rc   rd   re   rf   rg   rh   ri   rP   rj   rk   r   )rM   r<   rN   rO   rP   r(   ro   rl   r^   r1   r]   s        `     r3   Úlist_all_tasksrr   ^   sî  øè è € õ Œ~ Ò%Ð&€GØð .Ø�Š•t”{ fÒ,Ñ-Ô-Ð-Øð 8Ø�Š•tÔ'¨;Ò6Ñ7Ô7Ð7Øð 8Ø�Š•t”z×'Ò'¨¨F¨¨¨Ñ6Ô6Ñ7Ô7Ð7à—)’)Ý�tŒz‰|Œ|ÑÔ×(Ò(­Ñ.Ô.×4Ò4µT¸7°^ÑDÔDñô ð ð ð ð ð ð €Eð —:’:Ý�t‰Œß	Š�t�Wˆ~Ñ	Ô	ß	Š•$”-×#Ò#Ñ%Ô%×/Ò/Ñ1Ô1µ4´?×3GÒ3GÑ3IÔ3IÑ	JÔ	Jß	Š�˜‘˜UÑ"Ñ	#Ô	#§E¢E¨%¡L¤Lñ	ô ð ð ð ð ð ð €Fð HÐGÐGÐG°·²Ñ0@Ô0@×0DÒ0DÑ0FÔ0FÐGÑGÔGÐGÐGÐGÐGÐGÐG€EÝ˜% u°4¸uÐEÑEÔEÐEr5   z
/{task_id}c              ƒ   óB  ‡K  — t          ‰| ¦  «        ƒ d {V —†}t          |‰¦  «        ƒ d {V —†}‰                     t          t          ¦  «                             t          j        | k    ¦  «                             t          j        ¦  «        ¦  «        ƒ d {V —†}ˆfd„| 	                    ¦   «          
                    ¦   «         D ¦   «         ƒ d {V —†}‰                     t          t          t          j        ¦  «                             t          t          j        t          j        k    ¦  «                             t          j        | k    ¦  «                             t          j        ¦  «        ¦  «        ƒ d {V —†}d„ | 
                    ¦   «         D ¦   «         }i |¥||dœ¥S )Nc              “   ó@   •K  — g | ]}t          |‰¦  «        ƒ d {V —†‘ŒS rU   rV   rW   s     €r3   rZ   zget_task.<locals>.<listcomp>‹   s9   øè è € ÐNÐNÐN¨a•l 1 bÑ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)ÐNÐNÐNr5   c                 ó|   — g | ]9\  }}t          |j        |j        |j        ||j        |j        |j        ¬ ¦  «        ‘Œ:S )©r/   r)   Úuser_idrB   ÚbodyÚattachment_pathrg   )r   r/   r)   rw   rx   ry   rg   )rX   ÚcrB   s      r3   rZ   zget_task.<locals>.<listcomp>“   s[   € ð ð ð ñ ˆAˆxõ 	ØŒt˜QœY°´	Ø A¤F¸AÔ<MØ”|ð	
ñ 	
ô 	
ðð ð r5   )ÚsubtasksÚcomments)r4   rG   r-   r   r   r.   r@   rc   rg   rj   rk   r   r   rB   Újoinrw   r/   r)   )	r)   r(   ro   r2   ÚenrichedÚ
sub_resultr{   Ú
cmt_resultr|   s	    `       r3   Úget_taskr�      s³  øè è € õ " " gÑ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.€DÝ! $¨Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+€Hà—z’zÝ�t‰Œ×Ò�4œ>¨WÒ4Ñ5Ô5×>Ò>½t¼ÑOÔOñô ð ð ð ð ð ð €Jð OÐNÐNÐN°:×3EÒ3EÑ3GÔ3G×3KÒ3KÑ3MÔ3MÐNÑNÔNÐNÐNÐNÐNÐNÐN€Hà—z’zÝ�{�DœMÑ*Ô*ß	Š�d•KÔ'­4¬7Ò2Ñ	3Ô	3ß	Š�{Ô" gÒ-Ñ	.Ô	.ß	Š•+Ô(Ñ	)Ô	)ñ	ô ð ð ð ð ð ð €Jðð ð &Ÿ>š>Ñ+Ô+ðñ ô €Hð DˆhÐC H¸(ÐCÐCÐCÐCr5   éÉ   )rH   Ústatus_coderx   c           	   ƒ   ó  K  — t          di |                      ¦   «         ¤d|j        i¤Ž}|                     |¦  «         	 |                     ¦   «         ƒ d {V —† | j        r¹| j        |j        k    r©|                     t          | j        ¦  «        ƒ d {V —†}|r|j        nd}|                     t          | j        d| j
        › �d|j        › �d|j        › �¬¦  «        ¦  «         t          |d| j
        › �d|› d	|j        › �d|j        › �d
¬¦  «        ƒ d {V —† |                     ¦   «         ƒ d {V —† |                     |¦  «        ƒ d {V —† n)# t          $ r |                     ¦   «         ƒ d {V —† ‚ w xY wt!          ||¦  «        ƒ d {V —†S )Nr=   Ú-z
New task: úAssigned by ú/tasks/©rw   r`   rx   ÚlinkzTask baru: ú
Assignee: ú | By: Útelegram_thread_task©Ú
thread_key© )r   Ú
model_dumpr/   ÚaddÚflushr<   Úgetr   rB   r   r`   r#   ÚcommitÚrefreshÚ	ExceptionÚrollbackrG   )rx   r(   rQ   r2   ÚassigneeÚassignee_names         r3   Úcreate_taskrš   ¡   s)  è è € õ Ð@Ð@�$—/’/Ñ#Ô#Ð@Ð@°´Ð@Ð@Ð@€DØ‡F‚Fˆ4�L„L€LðØ�hŠh‰jŒjÐÐÐÐÐÐÐð Ôð 	 Ô 0°L´OÒ CÐ CØŸVšV¥D¨$Ô*:Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;ˆHØ19ÐB˜HÔ-Ð-¸sˆMØ�FŠF•<ØÔ(Ø/ 4¤:Ð/Ð/Ø; LÔ$9Ð;Ð;Ø(˜tœwÐ(Ð(ð	ñ ô ñ ô ð õ $ØÐ. $¤*Ð.Ð.ØJ˜]ÐJÐJ°<Ô3HÐJÐJØ#˜$œ'Ð#Ð#Ø1ð	ñ ô ð ð ð ð ð ð ð ð �iŠi‰kŒkÐÐÐÐÐÐÐØ�jŠj˜ÑÔÐÐÐÐÐÐÐÐøÝð ð ð Ø�kŠk‰mŒmÐÐÐÐÐÐÐØðøøøõ ˜d BÑ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð's   Á DE Å&E6c           	   ƒ   ód  K  — t          || ¦  «        ƒ d {V —†}|                     d¬¦  «        }d„ |D ¦   «         }|r+|j        dk    r |j        |j        k    rt          dd¦  «        ‚|                     d¦  «        }|o||j        k    o
||j        k    }|                     d¦  «        d	k    �r|j        d	k    �r| 	                    t          t          j        ¦   «         ¦  «                             t          j        | k    t          j        d	k    ¦  «        ¦  «        ƒ d {V —†}	|	rt          d
d|	› d�¦  «        ‚t!          j        ¦   «         |_        |j        rA|j        |j        k    r1t'          ||j        d|j        › �d|j        › �d| › �¦  «        ƒ d {V —† t-          |d|j        › �d|j        › �d| › �d¬¦  «        ƒ d {V —† |j        rð| 	                    t          t          j        ¦   «         ¦  «                             t          j        |j        k    t          j        | k    t          j        d	k    ¦  «        ¦  «        ƒ d {V —†}
|
dk    rm|                     t          |j        ¦  «        ƒ d {V —†}|rE|j        r>|j        |j        k    r.t'          ||j        d|j        › �dd|j        › �¦  «        ƒ d {V —† nd|v r|d         d	k    rd |_        |                     ¦   «         D ]\  }}t1          |||¦  «         Œ|                     d¦  «        d	k    �r
|j        �r|                     t4          |j        ¦  «        ƒ d {V —†}|�rÙ|j        �rÑ|j        dv �rÇ|j        r|j        nt=          j        ¦   «         }tA          |t           ¦  «        r|                     ¦   «         }	 tC          |j"        |j#        |¦  «        }| 	                    t          t          ¦  «                             t          j        |j        k    t          j        |k    ¦  «        ¦  «        ƒ d {V —†}|sÓt          |j        |j        |j        ||j        ¬¦  «        }| $                    |¦  «         | %                    ¦   «         ƒ d {V —† ||_&        |j        rA|j        |j        k    r1t'          ||j        d|j        › �d|› �d|j        › �¦  «        ƒ d {V —† t-          |d|j        › �d|› �d|j        › �d¬¦  «        ƒ d {V —† n)# tN          $ r}tQ          d|› �¦  «         Y d }~nd }~ww xY w|r•|                     tR          |¦  «        ƒ d {V —†}|r|j        nd}| $                    tU          |d|j        › �d|j        › �d| › �¬¦  «        ¦  «         t-          |d|j        › �d|› d |j        › �d| › �d¬¦  «        ƒ d {V —† 	 | +                    ¦   «         ƒ d {V —† | ,                    |¦  «        ƒ d {V —† n)# tN          $ r | -                    ¦   «         ƒ d {V —† ‚ w xY wt]          ||¦  «        ƒ d {V —†S )!NT)Úexclude_unsetc                 ó   — h | ]
}|d k    ¯|’ŒS )rM   r�   )rX   Úks     r3   ú	<setcomp>zupdate_task.<locals>.<setcomp>Ò   s   € Ð:Ð:Ð:˜q¨A°ªM¨M˜¨M¨M¨Mr5   rn   é“  z;Hanya pembuat task atau admin yang dapat mengubah task ini.r<   rM   Údonei¦  z#Tidak bisa menutup task: masih ada z subtask yang belum selesai.zTask selesai: zDiselesaikan oleh r‡   rŒ   r�   r   zSemua subtask selesai: z0Semua subtask sudah done. Task ini siap ditutup.)Úon_completionÚboth)r`   r<   r=   rd   Úrecurring_task_idzTask recurring baru: z
Due date: z*[recurring] on_completion generate error: r…   zTask assigned to you: r†   rˆ   zTask re-assigned: rŠ   r‹   )/r4   r�   Úroler=   r/   r   r“   r<   rM   r>   r   r   r?   r.   r   r@   r   ÚutcnowÚcompleted_atr"   r`   rB   r#   r]   Úsetattrr¤   r   Ú	is_activeÚtrigger_moderd   r   ÚtodayÚ
isinstancer    Úrecurrence_typeÚrecurrence_configr‘   r’   Úlast_generated_duer–   Úprintr   r   r”   r•   r—   rG   )r)   rx   r(   rQ   r2   ÚdataÚrestricted_fieldsÚnew_assigneeÚ
reassignedÚactive_subtasksÚremaining_siblingsÚparentrž   ÚvÚrtÚafterÚnext_dueÚexistingÚnew_taskÚeÚ
reassigneeÚreassignee_names                         r3   Úupdate_taskrÁ   Ç   sO  è è € õ " " gÑ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.€DØ�?Š?¨ˆ?Ñ.Ô.€Dð ;Ð: DÐ:Ñ:Ô:ÐØð `˜\Ô.°'Ò9Ð9¸d¼oÐQ]ÔQ`Ò>`Ð>`Ý˜CÐ!^Ñ_Ô_Ð_à—8’8˜MÑ*Ô*€LØÐf ,°$Ô2BÒ"BÐfÀ|ÐWcÔWfÒGf€Jà‡x‚x�ÑÔ˜VÒ#Ñ#¨¬°vÒ(=Ñ(=à "§	¢	Ý•4”:‘<”<Ñ Ô ×&Ò&Ý” 'Ò)Ý”˜vÒ%ñô ñ!
ô !
ð 
ð 
ð 
ð 
ð 
ð 
ˆð ð 	ÝØØc°oÐcÐcÐcñô ð õ %œOÑ-Ô-ˆÔð Œ?ð 	˜tœ°,´/ÒAÐAÝ#Ø�D”OØ- ¤Ð-Ð-Ø< \Ô%:Ð<Ð<Ø#˜'Ð#Ð#ñ	ô ð ð ð ð ð ð ð õ   Ð$A°T´ZÐ$AÐ$AÐCoÐXdÔXmÐCoÐCoð  rEð  |Cð  rEð  rEð  Rhð  iñ  iô  ið  	ið  	ið  	ið  	ið  	ið  	ið  	ið Œ>ð 	Ø')§y¢yÝ•t”z‘|”|Ñ$Ô$×*Ò*Ý”N d¤nÒ4Ý”G˜wÒ&Ý”K 6Ò)ñô ñ(ô (ð "ð "ð "ð "ð "ð "Ðð " QÒ&Ð&Ø!Ÿvšv¥d¨D¬NÑ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;�Øð ˜fÔ/ð °FÔ4EÈÌÒ4XÐ4XÝ+Ø˜FÔ-Ø@°&´,Ð@Ð@ØJØ2 $¤.Ð2Ð2ñ	ô ð ð ð ð ð ð ð øð 
�TÐ	Ð	˜d 8œn°Ò6Ð6Ø ˆÔà—
’
‘”ð ð ‰ˆˆ1Ý��a˜ÑÔÐÐð ‡x‚x�ÑÔ˜VÒ#Ñ#¨Ô(>Ñ#Ø—6’6�-¨Ô)?Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@ˆØñ $	H�"”,ñ $	H 2¤?Ð6OÐ#OÑ#OØ%)¤]ÐD�D”M�M½¼
¹¼ˆEÝ˜%¥Ñ*Ô*ð %ØŸ
š
™œ�ð HÝ,¨RÔ-?ÀÔAUÐW\Ñ]Ô]�Ø!#§¢Ý�4‘L”L×&Ò&¥tÔ'=ÀÄÒ'FÍÌÐYaÒHaÑbÔbñ"ô "ð ð ð ð ð ð �ð  ð Ý#Ø œhØ$&¤NØ#%¤=Ø!)Ø*,¬%ð ñ  ô  �Hð —F’F˜8Ñ$Ô$Ð$ØŸ(š(™*œ*Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ø,4�BÔ)à”~ð ¨"¬.¸B¼MÒ*IÐ*IÝ/Ø ¤Ø>°B´HÐ>Ð>Ø3¨Ð3Ð3Ø3 h¤kÐ3Ð3ñ	ô ð ð ð ð ð ð ð õ ,ØØ:°´Ð:Ð:Ø/ XÐ/Ð/Ø/ (¤+Ð/Ð/Ø#9ðñ ô ð ð ð ð ð ð ð øøõ ð Hð Hð HÝÐFÀ1ÐFÐFÑGÔGÐGÐGÐGÐGÐGÐGøøøøðHøøøð ð 
ØŸ6š6¥$¨Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5ˆ
Ø1;ÐD˜*Ô-Ð-ÀˆØ
�Š�|Ø Ø7¨4¬:Ð7Ð7Ø7 Ô 5Ð7Ð7Ø$˜7Ð$Ð$ð	
ñ 
ô 
ñ 	ô 	ð 	õ  ØÐ1 T¤ZÐ1Ð1ØH˜ÐHÐH°Ô1FÐHÐHØ�gÐÐØ-ð	
ñ 
ô 
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ðØ�iŠi‰kŒkÐÐÐÐÐÐÐØ�jŠj˜ÑÔÐÐÐÐÐÐÐÐøÝð ð ð Ø�kŠk‰mŒmÐÐÐÐÐÐÐØðøøøõ ˜d BÑ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð's%   Î)ES< Ó<
T"ÔTÔT"Ö=5W3 ×3&XéÌ   )rƒ   c              ƒ   óJ  K  — t          || ¦  «        ƒ d {V —†}|j        |j        k    r|j        dk    rt	          dd¦  «        ‚	 |                     |¦  «        ƒ d {V —† |                     ¦   «         ƒ d {V —† d S # t          $ r |                     ¦   «         ƒ d {V —† ‚ w xY w)Nrn   r    úNot allowed)	r4   r=   r/   r¥   r   Údeleter”   r–   r—   )r)   r(   rQ   r2   s       r3   Údelete_taskrÆ   O  sà   è è € õ " " gÑ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.€DØ„˜,œ/Ò)Ð)¨lÔ.?À7Ò.JÐ.JÝ˜C Ñ/Ô/Ð/ðØ�iŠi˜‰oŒoÐÐÐÐÐÐÐØ�iŠi‰kŒkÐÐÐÐÐÐÐÐÐøÝð ð ð Ø�kŠk‰mŒmÐÐÐÐÐÐÐØðøøøs   Á5A< Á<&B"z../../uploads/commentsÚfilec              ƒ   ó`  K  — | j         pd                     d¦  «        st          dd¦  «        ‚t          j        t
          d¬¦  «         t          j                             | j        pd¦  «        d         pd}t          j
        ¦   «         j        › |› �}t          j                             t
          |¦  «        }t          j        |d	¦  «        4 ƒd {V —†}|                     |                      ¦   «         ƒ d {V —†¦  «        ƒ d {V —† d d d ¦  «        ƒd {V —† n# 1 ƒd {V —†swxY w Y   d
|› �S )Nr7   zimage/i�  zAttachment must be an imageT)Úexist_okrI   z.pngÚwbz/uploads/comments/)Úcontent_typeÚ
startswithr   ÚosÚmakedirsÚCOMMENT_UPLOAD_DIRÚpathÚsplitextÚfilenameÚuuidÚuuid4Úhexr}   ÚaiofilesÚopenÚwriteÚread)rÇ   ÚextÚfnameÚfpathÚfs        r3   Ú_save_comment_attachmentrÞ   e  s«  è è € ØÔÐ# ×/Ò/°Ñ9Ô9ð @Ý˜CÐ!>Ñ?Ô?Ð?Ý„KÕ"¨TÐ2Ñ2Ô2Ð2Ý
Œ'×
Ò
˜4œ=Ð.¨BÑ
/Ô
/°Ô
2Ð
<°f€CÝŒz‰|Œ|ÔÐ& Ð&Ð&€EÝŒG�LŠLÕ+¨UÑ3Ô3€EÝŒ}˜U DÑ)Ô)ð )ð )ð )ð )ð )ð )ð )¨QØ�gŠg˜DŸIšI™KœKÐ'Ð'Ð'Ð'Ð'Ð'Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ð)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )à' Ð'Ð'Ð's   Ã4DÄ
D$Ä'D$z/{task_id}/comments.c           
   ƒ   óî  K  — t          || ¦  «        ƒ d {V —†}|rt          |¦  «        ƒ d {V —†nd }t          | |j        ||¬¦  «        }|                     |¦  «         t          ¦   «         }|j        r*|j        |j        k    r|                     |j        ¦  «         |j        r*|j        |j        k    r|                     |j        ¦  «         |d d…         t          |¦  «        dk    rdndz   }	|D ];}
|                     t          |
|j
        › d|j        › d�|	d| › �¬¦  «        ¦  «         Œ<t          |d	|j        › �|j
        › d
|	› �d| › �d¬¦  «        ƒ d {V —† 	 |                     ¦   «         ƒ d {V —† |                     |¦  «        ƒ d {V —† n)# t          $ r |                     ¦   «         ƒ d {V —† ‚ w xY wt#          |j        |j        |j        |j
        |j        |j        |j        ¬¦  «        S )N)r)   rw   rx   ry   éP   u   â€¦r7   z commented on "ú"r‡   rˆ   zKomentar baru: z: rŒ   r�   rv   )r4   rÞ   r   r/   r‘   Úsetr<   r=   Úlenr   rB   r`   r#   r”   r•   r–   r—   r   r)   rw   rx   ry   rg   )r)   rx   rÇ   r(   rQ   r2   ry   ÚcommentÚ
notify_idsÚsnippetÚuids              r3   Úadd_commentrè   q  s¯  è è € õ " " gÑ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.€DØ>BÐLÕ4°TÑ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:È€OÝØ ¤°tØ'ðñ ô €Gð ‡F‚Fˆ7�O„O€Oõ ™5œ5€JØÔð )˜DÔ,°´Ò?Ð?Ø�Š�tÔ'Ñ(Ô(Ð(à„ð (˜4œ?¨l¬oÒ=Ð=Ø�Š�t”Ñ'Ô'Ð'à�3�B�3Œi¥C¨¡I¤I°¢N N˜5˜5¸Ñ;€GØð ð ˆØ
�Š�|ØØ!Ô*ÐJÐJ¸D¼JÐJÐJÐJØØ$˜7Ð$Ð$ð	
ñ 
ô 
ñ 	ô 	ð 	ð 	õ ˜BÐ >°$´*Ð >Ð >À<ÔCXÐ@eÐ@eÐ\cÐ@eÐ@eÐgzÐqxÐgzÐgzð  H^ð  _ñ  _ô  _ð  _ð  _ð  _ð  _ð  _ð  _ð  _ðØ�iŠi‰kŒkÐÐÐÐÐÐÐØ�jŠj˜Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ð!øÝð ð ð Ø�kŠk‰mŒmÐÐÐÐÐÐÐØðøøøõ ØŒ:˜wœ¸¼ØÔ&¨W¬\ØÔ/¸GÔ<Nðñ ô ð s   Å5F Æ&F;z /{task_id}/comments/{comment_id}Ú
comment_idc              ƒ   ó$  K  — |                      t          t          ¦  «                             t          j        |k    t          j        | k    ¦  «        ¦  «        ƒ d {V —†}|                     ¦   «         }|st          dd¦  «        ‚|j        |j        k    r|j	        dk    rt          dd¦  «        ‚	 | 
                    |¦  «        ƒ d {V —† |                     ¦   «         ƒ d {V —† d S # t          $ r |                     ¦   «         ƒ d {V —† ‚ w xY w)Nr,   zComment not foundrn   r    rÄ   )r-   r   r   r.   r/   r)   r0   r   rw   r¥   rÅ   r”   r–   r—   )r)   ré   r(   rQ   r1   rä   s         r3   Údelete_commentrë      sI  è è € ð —:’:Ý�{ÑÔ×!Ò!¥+¤.°JÒ">ÅÔ@SÐW^Ò@^Ñ_Ô_ñô ð ð ð ð ð ð €Fð ×'Ò'Ñ)Ô)€GØð 6Ý˜CÐ!4Ñ5Ô5Ð5Ø„˜,œ/Ò)Ð)¨lÔ.?À7Ò.JÐ.JÝ˜C Ñ/Ô/Ð/ðØ�iŠi˜Ñ Ô Ð Ð Ð Ð Ð Ð Ð Ø�iŠi‰kŒkÐÐÐÐÐÐÐÐÐøÝð ð ð Ø�kŠk‰mŒmÐÐÐÐÐÐÐØðøøøs   Â25C) Ã)&Dz/{task_id}/letter-prefillc           	   ƒ   óö  K  — t          || ¦  «        ƒ d{V —†}|                     t          t          ¦  «                             t          j        | k    ¦  «        ¦  «        ƒ d{V —†}|                     ¦   «         }g }|r2|j        r+	 t          j	        |j        ¦  «        }n# t          $ r Y nw xY w|j        |r|j        nd|r4|j        |j        |j        |j        ||j                             ¦   «         dœnddœS )zAReturn pre-filled subject/body for creating a Letter from a Task.Nr7   )r/   Ú
from_emailÚsubjectÚbody_rawÚattachmentsÚreceived_at)rî   rx   Úincoming_email)r4   r-   r   r   r.   r)   r0   rð   ÚjsonÚloadsr–   r`   Úai_draftr/   rí   rî   rï   rñ   Ú	isoformat)r)   r(   ro   r2   Ú
inc_resultÚincomingrð   s          r3   Úletter_prefillrù   ¹  sN  è è € õ " " gÑ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.€Dà—z’zÝ�}ÑÔ×#Ò#¥MÔ$9¸WÒ$DÑEÔEñô ð ð ð ð ð ð €Jð ×,Ò,Ñ.Ô.€Hà€KØð �HÔ(ð ð	Ýœ* XÔ%9Ñ:Ô:ˆKˆKøÝð 	ð 	ð 	ØˆDð	øøøð ”:Ø(0Ð8�8Ô$Ð$°bð ð Ø#œ;Ø#Ô.Ø#Ô+Ø#Ô,Ø&Ø#Ô/×9Ò9Ñ;Ô;ð
ð 
ð 
ð  ðð ð s   ÂB! Â!
B.Â-B.)Nró   rÍ   rÓ   rÖ   r   r   Útypingr   Úfastapir   r   r   r	   r
   r   r   Úsqlalchemy.ext.asyncior   Ú
sqlalchemyr   r   r   Úapp.databaser   Úapp.models.taskr   r   Úapp.models.recurring_taskr   Úapp.models.userr   Úapp.models.incoming_emailr   Úapp.models.notificationr   Úapp.schemas.taskr   r   r   r   r   Úapp.schemas.pagedr   Úapp.depsr   r   Úapp.services.recurrencer    Úapp.services.notifierr!   r"   r#   r$   ÚrouterÚintr4   ÚdictrG   r“   Ústrrm   rr   r�   Úpostrš   ÚpatchrÁ   rÅ   rÆ   rÐ   r}   ÚdirnameÚ__file__rÏ   rÞ   rè   rë   rù   r�   r5   r3   ú<module>r     s©  ðØ €€€Ø 	€	€	€	Ø €€€Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð à TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TØ /Ð /Ð /Ð /Ð /Ð /Ø )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )Ð )à Ð Ð Ð Ð Ð Ø -Ð -Ð -Ð -Ð -Ð -Ð -Ð -Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø  Ð  Ð  Ð  Ð  Ð  Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ð [Ø &Ð &Ð &Ð &Ð &Ð &Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ø bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bÐ bà	ˆ˜(¨'¨Ð	3Ñ	3Ô	3€ð˜|ð °cð ¸dð ð ð ð ð˜Tð  |ð ¸ð ð ð ð ð0 ‡‚ˆB˜x¨Ô0€Ñ1Ô1à!˜E $™KœKØ$˜u T™{œ{Ø!˜E $™KœKØ��a˜A�‘”Ø��r˜a CÐ(Ñ(Ô(Ø�w˜v‘”Ø ˜Ð!1Ñ2Ô2ðFð FØ�SŒMðFà˜Œ}ðFð �SŒMðFð ð	Fð
 ðFð 	ðFð ðFð Fð Fñ 2Ô1ðFðD ‡‚ˆH X¨gÔ%6€Ñ7Ô7à!˜E $™KœKØ!&  t¡¤Ø!˜E $™KœKØ��a˜A�‘”Ø��r˜a CÐ(Ñ(Ô(Ø�w˜v‘”Øˆg�l�l 7Ñ+Ô+Ñ,Ô,ðFð FØ�SŒMðFà˜#”ðFð �SŒMðFð ð	Fð
 ðFð 	ðFð ðFð Fð Fñ 8Ô7ðFð@ ‡‚ˆL¨€Ñ7Ô7ð �w˜v‘”ØˆgÐ&Ñ'Ô'ðDð DØðDàðDð ðDð Dð Dñ 8Ô7ðDðB ‡‚ˆR °S€Ñ9Ô9ð �w˜v‘”Ø ˜Ð!1Ñ2Ô2ð (ð  (Ø
ð (àð (ð ð (ð  (ð  (ñ :Ô9ð (ðJ ‡‚ˆl¨7€Ñ3Ô3ð �w˜v‘”Ø ˜Ð!1Ñ2Ô2ð	B(ð B(ØðB(à
ðB(ð 	ðB(ð ð	B(ð B(ð B(ñ 4Ô3ðB(ðN ‡‚ˆ|¨€Ñ-Ô-ð �w˜v‘”Ø ˜Ð!1Ñ2Ô2ðð Øðàðð ðð ð ñ .Ô-ðð$ ”W—\’\ "¤'§/¢/°(Ñ";Ô";Ð=UÑVÔVÐ ð	(¨ð 	(¸ð 	(ð 	(ð 	(ð 	(ð ‡‚Ð"°>Ès€ÑSÔSð ��S‘	”	Ø!%  d¡¤Ø�w˜v‘”Ø ˜Ð!1Ñ2Ô2ð+ð +Øð+à
ð+ð �:Ô
ð+ð 	ð	+ð
 ð+ð +ð +ñ TÔSð+ð\ ‡‚Ð1¸s€ÑCÔCð �w˜v‘”Ø ˜Ð!1Ñ2Ô2ð	ð Øðàðð 	ðð ð	ð ð ñ DÔCðð0 ‡‚Ð'Ñ(Ô(ð �w˜v‘”ØˆgÐ&Ñ'Ô'ðð Øðàðð ðð ð ñ )Ô(ðð ð r5   