Ë
    
.Úi³+  ã                   óD  — d Z ddlZddlmZmZmZmZ ddl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 dd	lmZmZmZ dd
lmZ ddlmZmZmZmZ ddlm Z m!Z!m"Z"m#Z# d„ Z$d„ Z%dde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+y)u}   
Messagerie cÃ´tÃ© tenant (agents / admins).
Permet aux agents de voir et rÃ©pondre aux messages des clients sur un dossier.
é    N)ÚExistsÚOuterRefÚQÚMax)ÚAPIView)ÚIsAuthenticated)ÚMultiPartParserÚ
FormParserÚ
JSONParser)ÚResponse©Ústatus)ÚNotFoundÚPermissionDeniedÚValidationError)Úget_active_tenant_for_user)ÚCaseÚCaseMessageÚCaseMessageAttachmentÚCaseMessageRead)Ú_validate_upload_filesÚ_set_typingÚ_clear_typingÚ_get_typing_labelsc                 óJ   — t        | j                  «      }|st        d«      ‚|S )NzNo active tenant for this user.)r   Úuserr   )ÚrequestÚtenants     ú0/var/www/html/acx/cases/views_tenant_messages.pyÚ_tenant_contextr       s$   € Ü'¨¯©Ó5€FÙÜÐ@ÓAÐAØ€Mó    c           	      ó‚   — | sy | j                   | j                  t        | dd «      t        | dd «      t        | dd «      dœS )NÚ
first_nameÚ	last_nameÚemail)ÚidÚusernamer#   r$   r%   )r&   r'   Úgetattr)Úus    r   Ú_user_to_dictr*   #   sD   € ÙØà�d‰dØ—J‘JÜ˜a ¨tÓ4Ü˜Q ¨TÓ2Ü˜˜G TÓ*ñð r!   Úmc                 ó¢  — |j                   |j                  t        |j                  dd «      t        |j                  dd «      t	        |j
                  «      |j                  |j                  |j                  |j                  |j                  j                  «       |�t        |«      nd |j                  j                  «       D �cg c]|  }|j                   |j                  |j                   |j"                  |j$                  r%| j'                  |j$                  j(                  «      nd |j                  j                  «       dœ‘Œ~ c}dœS c c}w )NÚ	referenceÚtitle)r&   ÚfilenameÚcontent_typeÚsizeÚfileÚ
created_at)r&   Úcase_idÚcase_referenceÚ
case_titleÚauthorÚauthor_sideÚbodyÚ
visibilityÚaction_requiredr3   Úis_readÚattachments)r&   r4   r(   Úcaser*   r7   r8   r9   r:   r;   r3   Ú	isoformatÚboolr=   Úallr/   r0   r1   r2   Úbuild_absolute_uriÚurl)r   r+   r<   Úas       r   Ú_msg_to_dictrE   /   sú   € à�d‰dØ—9‘9Ü! !§&¡&¨+°tÓ<Ü˜aŸf™f g¨tÓ4Ü §¡Ó)Ø—}‘}Ø—‘Ø—l‘lØ×,Ñ,Ø—l‘l×,Ñ,Ó.Ø$+Ð$7”4˜”=¸Tð —]‘]×&Ñ&Ó(ö

ð ð —d‘dØŸJ™JØ !§¡ØŸ™ØBCÇ&Â&˜×2Ñ2°1·6±6·:±:Ô>ÈdØŸl™l×4Ñ4Ó6óò

ñð ùò

s   ÃBEc                   ó   — e Zd ZdZegZd„ Zy)ÚTenantMessagingInboxViewup   
    GET /cases/messages/inbox/
    Liste tous les dossiers ayant des messages, triÃ©s par dernier message.
    c                 óÊ  — t        |«      }|j                  j                  d«      xs dj                  «       }|j                  j                  dd«      j	                  «       dv }t
        j                  j                  t        d«      |j                  ¬«      }t        j                  j                  ddd	«      j                  d
«      j                  |¬«      j                  t        |«      ¬«      }|rB|j                  t        |¬«      t        |¬«      z  t        |¬«      z  t        |¬«      z  «      }|r|j                  d¬«      }t!        |j#                  d«      d d «      }t%        «       }g }	|D ]Ò  }
|
j&                  |v rŒ|j)                  |
j&                  «       |	j+                  |
j&                  t-        |
j.                  dd «      t-        |
j.                  dd «      |
j.                  j0                  r!t-        |
j.                  j2                  dd «      nd t5        ||
t-        |
dd«      ¬«      t-        |
dd«       dœ«       ŒÔ t7        |	t8        j:                  ¬«      S )NÚqÚ Úunread)Ú1ÚtrueÚpk©Ú
message_idr   r>   Úcase__customerr7   r=   )Úcase__tenant©r<   )Úbody__icontains)Úcase__reference__icontains)Úcase__title__icontains)Úcase__customer__name__icontainsFú-idiô  r-   r.   Únamer<   T)r4   r5   r6   Úcustomer_nameÚlast_messagerK   r   )r    Úquery_paramsÚgetÚstripÚlowerr   ÚobjectsÚfilterr   r   r   Úselect_relatedÚprefetch_relatedÚannotater   r   ÚlistÚorder_byÚsetr4   ÚaddÚappendr(   r>   Úcustomer_idÚcustomerrE   r   Ú
drf_statusÚHTTP_200_OK)Úselfr   r   rI   Úunread_onlyÚread_existsÚqsÚrowsÚ
seen_casesÚthreadsr+   s              r   r]   zTenantMessagingInboxView.getS   s	  € Ü  Ó)ˆà×!Ñ!×%Ñ% cÓ*Ò0¨b×7Ñ7Ó9ˆØ×*Ñ*×.Ñ.¨x¸Ó<×BÑBÓDÈÐUˆä%×-Ñ-×4Ñ4Ü “~¨G¯L©Lð 5ó 
ˆô
 ×Ñß‰^˜FÐ$4°hÓ?ßÑ˜mÓ,ß‰V ˆVÓ(ß‰Xœf [Ó1ˆXÓ2ð 	ñ Ø—‘Ü !Ô$Ü¨qÔ1ñ2ä¨1Ô-ñ.ô °AÔ6ñ7óˆBñ Ø—‘ 5�Ó)ˆBô �B—K‘K Ó& t¨Ð,Ó-ˆä"›uˆ
ØˆØò 	ˆAØ�y‰y˜JÑ&ØØ�N‰N˜1Ÿ9™9Ô%Ø�N‰NØŸ9™9Ü")¨!¯&©&°+¸tÓ"DÜ% a§f¡f¨g°tÓ<ØKLÏ6É6×K]ÒK]¤¨¯©¯©¸&À$Ô!GÐcgÜ ,¨W°aÄÈÈIÐW\ÓA]Ô ^Ü% a¨°DÓ9Ð9ñõ ð		ô ˜¬
×(>Ñ(>Ô?Ð?r!   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úpermission_classesr]   © r!   r   rG   rG   L   s   „ ñð *Ð*Ðó/@r!   rG   c                   óH   — e Zd ZdZegZeeegZ	de
defd„Zde
fd„Zde
fd„Zy)ÚTenantCaseMessagesViewu¡   
    GET  /cases/{case_id}/messages/   â†’ liste les messages (shared + internal)
    POST /cases/{case_id}/messages/   â†’ envoyer un message (side=tenant)
    r4   Úreturnc                 ó”   — t        |«      }t        j                  j                  ||¬«      j	                  «       }|st        d«      ‚|S ©N©r&   r   úCase not found.©r    r   r`   ra   Úfirstr   ©rn   r   r4   r   Úcs        r   Ú	_get_casez TenantCaseMessagesView._get_case�   óB   € Ü  Ó)ˆÜ�L‰L×Ñ 7°6ÐÓ:×@Ñ@ÓBˆÙÜÐ,Ó-Ð-Øˆr!   c                 óh  — | j                  ||«      }|j                  j                  dd«      }t        j                  j                  t        d«      |j                  ¬«      }t        j                  j                  dd«      j                  d«      j                  |¬«      j                  t        |«      ¬	«      }|d
v r|j                  |¬«      }t        |j                  d«      d d «      }|D �cg c]  }t        ||t!        |dd«      ¬	«      ‘Œ }	}t#        |	t$        j&                  ¬«      S c c}w )Nr:   rJ   rN   rO   r>   r7   r=   )r>   rS   ©ÚsharedÚinternal)r:   rX   i,  r<   Fr   )r†   r\   r]   r   r`   ra   r   r   r   rb   rc   rd   r   re   rf   rE   r(   r   rl   rm   )
rn   r   r4   r…   r:   rp   rq   rr   r+   Údatas
             r   r]   zTenantCaseMessagesView.get”   s	  € Ø�N‰N˜7 GÓ,ˆà×)Ñ)×-Ñ-¨l¸BÓ?ˆ
ä%×-Ñ-×4Ñ4Ü “~¨G¯L©Lð 5ó 
ˆô ×Ñß‰^˜F HÓ-ßÑ˜mÓ,ß‰V˜ˆV‹^ß‰Xœf [Ó1ˆXÓ2ð 	ð Ð/Ñ/Ø—‘ j�Ó1ˆBä�B—K‘K Ó& t¨Ð,Ó-ˆØX\Ö]ÐST”˜W a´¸¸IÀuÓ1MÖNÐ]ˆÐ]Ü˜¤Z×%;Ñ%;Ô<Ð<ùò ^s   Ã2 D/c                 óZ  — | j                  ||«      }|j                  j                  d«      xs dj                  «       }|st	        ddi«      ‚|j                  j                  d«      xs dj                  «       j                  «       }|dvrd}t        |j                  j                  dd«      «      j                  «       dv }|j                  j                  d	«      }|rt        |«       t        |d
d «      }|st	        ddi«      ‚t        j                  j                  |||j                  d|||¬«      }	|D ]T  }
t        j                  j                  |	|
t        |
dd «      t        |
dd «      t!        t        |
dd«      xs d«      ¬«       ŒV t"        j                  j%                  |	|j                  ¬«       t        j                  j'                  dd«      j)                  d«      j                  |	j*                  ¬«      }	t-        t/        ||	d¬«      t0        j2                  ¬«      S )Nr9   rJ   zThis field is required.r:   rŠ   r‰   r;   )rL   rM   ÚyesÚfilesrk   Údetailz!This case has no linked customer.r   )r>   rk   r7   r8   r9   r:   r;   rY   r0   r1   r   )Úmessager2   r/   r0   r1   ©r‘   r   r>   r7   r=   )r&   TrS   r   )r†   rŒ   r]   r^   r   r_   ÚstrÚFILESÚgetlistr   r(   r   r`   Úcreater   r   Úintr   Úget_or_createrb   rc   r&   r   rE   rl   ÚHTTP_201_CREATED)rn   r   r4   r…   r9   Úvisibility_rawr;   r�   rk   r+   Úfs              r   ÚpostzTenantCaseMessagesView.postª   sõ  € Ø�N‰N˜7 GÓ,ˆà—‘× Ñ  Ó(Ò.¨B×5Ñ5Ó7ˆÙÜ! 6Ð+DÐ"EÓFÐFà!Ÿ,™,×*Ñ*¨<Ó8ÒD¸H×KÑKÓM×SÑSÓUˆØÐ!7Ñ7Ø%ˆNä˜gŸl™l×.Ñ.Ð/@À"ÓEÓF×LÑLÓNÐRfÐfˆà—‘×%Ñ% gÓ.ˆÙÜ" 5Ô)ô ˜1˜j¨$Ó/ˆÙÜ! 8Ð-PÐ"QÓRÐRä×Ñ×&Ñ&ØØØ—<‘<Ø ØØ%Ø+ð 'ó 
ˆð ò 	ˆAÜ!×)Ñ)×0Ñ0ØØÜ   F¨DÓ1Ü$ Q¨¸Ó=Üœ  F¨AÓ.Ò3°!Ó4ð 1õ ð	ô 	×Ñ×-Ñ-°a¸g¿l¹lÐ-ÔKä×Ñ×.Ñ.¨v°xÓ@×QÑQÐR_Ó`×dÑdÐhi×hlÑhlÐdÓmˆÜœ W¨a¸Ô>Äz×GbÑGbÔcÐcr!   N)ru   rv   rw   rx   r   ry   r	   r
   r   Úparser_classesr—   r   r†   r]   rœ   rz   r!   r   r|   r|   …   sK   „ ñð *Ð*ÐØ% z°:Ð>€Nð¨#ð °$ó ð= Có =ð,,d Sô ,dr!   r|   c                   óF   — e Zd ZdZegZdedefd„Zdedefd„Zdedefd„Z	y)ÚTenantCaseMessageDetailViewu€   
    PATCH  /cases/{case_id}/messages/{msg_id}/  â†’ modifier
    DELETE /cases/{case_id}/messages/{msg_id}/  â†’ supprimer
    r4   Úmsg_idc                 óN  — t        |«      }t        j                  j                  ||¬«      j	                  «       }|st        d«      ‚t        j                  j                  dd«      j                  d«      j                  ||¬«      j	                  «       }|st        d«      ‚||fS )Nr€   r�   r>   r7   r=   ©r&   r>   úMessage not found.)	r    r   r`   ra   rƒ   r   r   rb   rc   ©rn   r   r4   r    r   r…   r+   s          r   Ú_getz TenantCaseMessageDetailView._getà   s‘   € Ü  Ó)ˆÜ�L‰L×Ñ 7°6ÐÓ:×@Ñ@ÓBˆÙÜÐ,Ó-Ð-ä×Ñß‰^˜F HÓ-ßÑ˜mÓ,ß‰V�v AˆVÓ&ß‰U‹Wð 	
ñ ÜÐ/Ó0Ð0Ø�!ˆtˆr!   c                 ó&  — | j                  |||«      \  }}|j                  |j                  j                  k7  r!|j                  j                  st        d«      ‚|j                  j                  d«      xs dj                  «       }|st        ddi«      ‚||_
        |j                  dg¬«       t        j                  j                  ||j                  ¬«       |j                  «        t!        t#        ||d¬«      t$        j&                  ¬	«      S )
NúNot allowed.r9   rJ   z	Required.)Úupdate_fieldsr’   TrS   r   )r¥   Ú	author_idr   r&   Úis_superuserr   rŒ   r]   r^   r   r9   Úsaver   r`   r˜   Úrefresh_from_dbr   rE   rl   rm   )rn   r   r4   r    r…   r+   r9   s          r   Úpatchz!TenantCaseMessageDetailView.patchð   sÔ   € Ø�y‰y˜ '¨6Ó2‰ˆˆ1à�;‰;˜'Ÿ,™,Ÿ/™/Ò)°'·,±,×2KÒ2KÜ" >Ó2Ð2à—‘× Ñ  Ó(Ò.¨B×5Ñ5Ó7ˆÙÜ! 6¨;Ð"7Ó8Ð8àˆŒØ	�‰˜f˜XˆÔ&Ü×Ñ×-Ñ-°a¸g¿l¹lÐ-ÔKØ	×ÑÔÜœ W¨a¸Ô>Äz×G]ÑG]Ô^Ð^r!   c                 ó
  — | j                  |||«      \  }}|j                  |j                  j                  k7  r!|j                  j                  st        d«      ‚|j                  «        t        t        j                  ¬«      S )Nr§   r   )
r¥   r©   r   r&   rª   r   Údeleter   rl   ÚHTTP_204_NO_CONTENT)rn   r   r4   r    r…   r+   s         r   r¯   z"TenantCaseMessageDetailView.delete   s]   € Ø�y‰y˜ '¨6Ó2‰ˆˆ1Ø�;‰;˜'Ÿ,™,Ÿ/™/Ò)°'·,±,×2KÒ2KÜ" >Ó2Ð2Ø	�‰Œ
Üœz×=Ñ=Ô>Ð>r!   N)
ru   rv   rw   rx   r   ry   r—   r¥   r­   r¯   rz   r!   r   rŸ   rŸ   Ù   sN   „ ñð *Ð*Ðð Sð °#ó ð _ cð _°3ó _ð ? sð ?°Cô ?r!   rŸ   c                   ó&   — e Zd ZdZegZdedefd„Zy)ÚTenantCaseMessageReadViewz-POST /cases/{case_id}/messages/{msg_id}/read/r4   r    c                 ó˜  — t        |«      }t        j                  j                  ||¬«      j	                  «       }|st        d«      ‚t        j                  j                  ||¬«      j	                  «       }|st        d«      ‚t        j                  j                  ||j                  ¬«       t        ddit        j                  ¬«      S )	Nr€   r�   r¢   r£   r’   ÚokTr   )r    r   r`   ra   rƒ   r   r   r   r˜   r   r   rl   rm   r¤   s          r   rœ   zTenantCaseMessageReadView.post  s¤   € Ü  Ó)ˆÜ�L‰L×Ñ 7°6ÐÓ:×@Ñ@ÓBˆÙÜÐ,Ó-Ð-Ü×Ñ×&Ñ&¨&°qÐ&Ó9×?Ñ?ÓAˆÙÜÐ/Ó0Ð0Ü×Ñ×-Ñ-°a¸g¿l¹lÐ-ÔKÜ˜˜t˜¬Z×-CÑ-CÔDÐDr!   N)ru   rv   rw   rx   r   ry   r—   rœ   rz   r!   r   r²   r²     s$   „ Ù7Ø)Ð*Ðð	E Sð 	E°#ô 	Er!   r²   c                   óF   — e Zd ZdZegZdefd„Zdefd„Zdefd„Z	defd„Z
y)ÚTenantTypingViewz2
    GET/POST/DELETE /cases/{case_id}/typing/
    r4   c                 ó”   — t        |«      }t        j                  j                  ||¬«      j	                  «       }|st        d«      ‚|S r   r‚   r„   s        r   Ú_verifyzTenantTypingView._verify  r‡   r!   c                 ó€   — | j                  ||«       t        ||j                  j                  «      }t	        d|i«      S )NÚtyping)r¸   r   r   r&   r   )rn   r   r4   Úlabelss       r   r]   zTenantTypingView.get%  s4   € Ø�‰�W˜gÔ&Ü# G¨W¯\©\¯_©_Ó=ˆÜ˜ 6Ð*Ó+Ð+r!   c                 óü   — | j                  ||«       |j                  }|j                  › d|j                  › �j	                  «       xs |j
                  xs d}t        ||j                  |«       t        ddi«      S )NÚ ÚAgentr´   T)	r¸   r   r#   r$   r^   r'   r   r&   r   )rn   r   r4   r)   Úlabels        r   rœ   zTenantTypingView.post*  sg   € Ø�‰�W˜gÔ&Ø�L‰LˆØ—<‘<�.  !§+¡+ Ð/×5Ñ5Ó7ÒP¸1¿:¹:ÒPÈˆÜ�G˜QŸT™T 5Ô)Ü˜˜t˜Ó%Ð%r!   c                 ó€   — | j                  ||«       t        ||j                  j                  «       t	        ddi«      S )Nr´   T)r¸   r   r   r&   r   )rn   r   r4   s      r   r¯   zTenantTypingView.delete1  s1   € Ø�‰�W˜gÔ&Ü�g˜wŸ|™|Ÿ™Ô/Ü˜˜t˜Ó%Ð%r!   N)ru   rv   rw   rx   r   ry   r—   r¸   r]   rœ   r¯   rz   r!   r   r¶   r¶     sB   „ ñð *Ð*Ðð¨ó ð, Có ,ð
& Só &ð& sô &r!   r¶   )N),rx   ÚtimeÚdjango.db.modelsr   r   r   r   Úrest_framework.viewsr   Úrest_framework.permissionsr   Úrest_framework.parsersr	   r
   r   Úrest_framework.responser   Úrest_frameworkr   rl   Úrest_framework.exceptionsr   r   r   Úaccounts.tenant_contextr   Úcases.modelsr   r   r   r   Ú$cases.views_customer_portal_messagesr   r   r   r   r    r*   rE   rG   r|   rŸ   r²   r¶   rz   r!   r   ú<module>rÌ      s�   ðñó ç 5Ó 5Ý (Ý 6ß JÑ JÝ ,Ý /ß QÑ Qå >ß RÓ R÷ó òò	ñ˜[ó ô:6@˜wô 6@ôrQd˜Wô Qdôh,? 'ô ,?ô^E ô Eô &�wõ &r!   