Ë
    …Ôìi©t  ã                   ój  — 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 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 d dlmZmZmZm Z  d dl!m"Z"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l0m1Z1m2Z2 ddl3m4Z4  e«       Z5 G d„ de«      Z6 G d„ dejn                  «      Z8 G d„ dejr                  «      Z: G d„ dejv                  «      Z< G d„ de«      Z6 G d „ d!ejn                  «      Z= G d"„ d#ejr                  «      Z> G d$„ d%ejv                  «      Z? G d&„ d'e«      Z@d d(lAmBZB d d(lAmBZB d d)l mZ d dlmZ d dlmZ d d*lCmDZD 	 	 	 	 dKd,„ZE G d-„ d.e«      ZF G d/„ d0e«      ZG G d1„ d2e«      ZH G d3„ d4e«      ZI G d5„ d6ejn                  «      ZJ G d7„ d8e«      ZKd d9lLmMZMmNZN d d:lOmPZPmQZQmRZR d d;lSmTZT  G d<„ de«      Z6 G d=„ d>e«      ZUd d?lmVZVmWZW d d(lAmBZX d d@l mZ  G dA„ dBe«      ZY G dC„ dDe«      ZZ G dE„ dFe«      Z[ G dG„ dHe«      Z\ G dI„ dJe«      Z]y+)Lé    )Ú	send_mailÚEmailMultiAlternatives©Úcontext)Úrender_to_string)Ú
strip_tags)ÚValidationError)ÚIsAuthenticated)Úget_user_model)ÚviewsetsÚstatus)Úaction)ÚResponse)ÚAPIView)ÚRefreshToken)Úget_object_or_404)Ú
MembershipÚRoleÚDocumentTemplateÚAdminTenantMessage)ÚIsPlatformSuperAdminÚIsTenantAdminOrSuperAdmin)ÚUserSerializerÚUserCreateSerializerÚMembershipSerializerÚRoleSerializerÚMembershipWriteSerializerÚDocumentTemplateSerializerÚAdminTenantMessageSerializer©ÚTenant)ÚAuditLogr   r   )ÚAuditLogSerializer)ÚOutstandingTokenÚBlacklistedTokené   )ÚSessionSerializerc                   ó   ‡ — e Zd Zˆ fd„Zˆ xZS )ÚSuperAdminOnlyc                 ó†   •— t         ‰| �  ||«      }|xr- t        |j                  xr |j                  j                  «      S ©N©ÚsuperÚhas_permissionÚboolÚuserÚis_superuser©ÚselfÚrequestÚviewÚokÚ	__class__s       €ú#/var/www/html/acx/accounts/views.pyr.   zSuperAdminOnly.has_permission#   ó7   ø€ Ü‰WÑ# G¨TÓ2ˆØÒF”d˜7Ÿ<™<ÒE¨G¯L©L×,EÑ,EÓFÐFó    ©Ú__name__Ú
__module__Ú__qualname__r.   Ú__classcell__©r7   s   @r8   r)   r)   "   ó   ø„ ÷Gð Gr:   r)   c                   óÚ   — e Zd ZdZej
                  j                  d«      j                  «       j                  d«      Z	e
gZd„ Z eddgd¬«      dd
„«       Z eddgdeg¬«      d„ «       Zy	)ÚUserViewSetzA
    Gestion des utilisateurs plateforme (super admin only).
    Úmemberships__tenantz-idc                 ó8   — | j                   dk(  rt        S t        S )NÚcreate)r   r   r   ©r3   s    r8   Úget_serializer_classz UserViewSet.get_serializer_class.   s   € Ø�;‰;˜(Ò"Ü'Ð'ÜÐr:   TÚpostzreset-password©ÚdetailÚmethodsÚurl_pathNc           	      ó  — | j                  «       }|j                  j                  d«      xs dj                  «       }t	        |«      dk  rt        ddit        j                  ¬«      S |j                  |«       d|_	        |j                  ddg¬	«       	 d|_        |j                  d
g¬	«       t        j                  j                  d|j                   d|j"                  t%        |«      ¬«       t        ddi«      S # t        $ r Y ŒYw xY w)zÐ
        POST /api/users/{id}/reset-password/
        Body: { "password": "Good123" }
        Mot de passe souple (min 6 cars, pas de validateur Django).
        Positionne must_change_password=True.
        ÚpasswordÚ é   rK   u5   Le mot de passe doit contenir au moins 6 caractÃ¨res.©r   TÚ	is_active©Úupdate_fieldsÚmust_change_passwordÚUSER_PASSWORD_RESETÚUser©r   ÚactorÚentity_typeÚ	entity_idÚentity_labeluV   Mot de passe rÃ©initialisÃ©. L'utilisateur devra le changer Ã  la prochaine connexion.)Ú
get_objectÚdataÚgetÚstripÚlenr   r   ÚHTTP_400_BAD_REQUESTÚset_passwordrS   ÚsaverV   Ú	Exceptionr"   ÚobjectsrF   r0   ÚidÚstr)r3   r4   Úpkr0   rO   s        r8   Úreset_passwordzUserViewSet.reset_password3   s  € ð �‰Ó ˆØ—L‘L×$Ñ$ ZÓ0Ò6°B×=Ñ=Ó?ˆäˆx‹=˜1ÒÜØÐRÐSÜ×2Ñ2ôð ð
 	×Ñ˜(Ô#ØˆŒØ�	‰	 ¨[Ð 9ˆ	Ô:ð	Ø(,ˆDÔ%Ø�I‰IÐ%;Ð$<ˆIÔ=ô 	×Ñ×ÑØ(Ø—,‘,ØØ—g‘gÜ˜T›ð 	 ô 	
ô ˜Ð#{Ð|Ó}Ð}øô ò 	Ùð	ús   ÂC> Ã>	D
Ä	D
Fzchange-password)rK   rL   rM   Úpermission_classesc           	      óH  — |j                   }|j                  j                  d«      xs dj                  «       }|j                  j                  d«      xs dj                  «       }t	        |«      dk  rt        ddit        j                  ¬«      S ||k7  rt        ddit        j                  ¬«      S |j                  |«       d	|_	        |j                  d
dg¬«       t        j                  j                  d|d|j                  t        |«      ¬«       t        ddi«      S )ué   
        POST /api/users/change-password/
        Body: { "new_password": "...", "confirm_password": "..." }
        Accessible par n'importe quel utilisateur authentifiÃ©.
        Efface must_change_password aprÃ¨s succÃ¨s.
        Únew_passwordrP   Úconfirm_passwordé   rK   u=   Le nouveau mot de passe doit contenir au moins 8 caractÃ¨res.rR   z'Les mots de passe ne correspondent pas.FrO   rV   rT   ÚUSER_PASSWORD_CHANGEDrX   rY   u&   Mot de passe mis Ã  jour avec succÃ¨s.)r0   r_   r`   ra   rb   r   r   rc   rd   rV   re   r"   rg   rF   rh   ri   )r3   r4   r0   Únew_pwdÚconfirm_pwds        r8   Úchange_passwordzUserViewSet.change_passwordY   s  € ð �|‰|ˆØ—|‘|×'Ñ'¨Ó7ÒA¸r×HÑHÓJˆØ—|‘|×'Ñ'Ð(:Ó;ÒA¸r×HÑHÓJˆäˆw‹<˜!ÒÜØÐZÐ[Ü×2Ñ2ôð ð
 �kÒ!ÜØÐDÐEÜ×2Ñ2ôð ð
 	×Ñ˜'Ô"Ø$)ˆÔ!Ø�	‰	 Ð-CÐ Dˆ	ÔEä×Ñ×ÑØ*ØØØ—g‘gÜ˜T›ð 	 ô 	
ô ˜Ð#KÐLÓMÐMr:   r+   )r<   r=   r>   Ú__doc__rX   rg   Úprefetch_relatedÚallÚorder_byÚquerysetr   rl   rH   r   rk   r
   rt   © r:   r8   rC   rC   '   s�   „ ñð �|‰|×,Ñ,Ð-BÓC×GÑGÓI×RÑRÐSXÓY€HØ.Ð/Ðòñ
 �4 & Ð4DÔEò#~ó Fð#~ñJ �5 6 (Ð5FØ /Ð0ô2ñ#Nó2ñ#Nr:   rC   c                   óh   — e Zd Zej                  j                  «       j                  d«      ZeZ	e
gZy)ÚRoleViewSetrh   N)r<   r=   r>   r   rg   rw   rx   ry   r   Úserializer_classr   rl   rz   r:   r8   r|   r|   �   s.   „ Ø�|‰|×ÑÓ!×*Ñ*¨4Ó0€HØ%ÐØ.Ð/Ñr:   r|   c                   óx   — e Zd ZdZegZd„ Zdd„Zdd„Z e	ddgd¬	«      dd
„«       Z
 e	ddgd¬	«      dd„«       Zy)ÚTenantMembershipViewSetzh
    Endpoints:
      GET  /api/tenants/{pk}/memberships/
      POST /api/tenants/{pk}/memberships/
    c                 óB   — t         j                  j                  |¬«      S )N©rj   )r!   rg   r`   )r3   rj   s     r8   Ú
get_tenantz"TenantMembershipViewSet.get_tenant�   s   € Ü�~‰~×!Ñ! RÐ!Ó(Ð(r:   Nc                 óä   — | j                  |«      }t        j                  j                  |¬«      j	                  d«      j                  d«      }t        |d¬«      j                  }t        |«      S )N©Útenantr0   ÚrolesT©Úmany)	r‚   r   rg   ÚfilterÚselect_relatedrv   r   r_   r   )r3   r4   rj   r…   Úqsr_   s         r8   ÚlistzTenantMembershipViewSet.list’   s\   € Ø—‘ Ó$ˆÜ×Ñ×&Ñ&¨fÐ&Ó5×DÑDÀVÓL×]Ñ]Ð^eÓfˆÜ# B¨TÔ2×7Ñ7ˆÜ˜‹~Ðr:   c                 óö   — | j                  |«      }t        |j                  d|i¬«      }|j                  d¬«       |j	                  «       }t        t        |«      j                  t        j                  ¬«      S )Nr…   )r_   r   T©Úraise_exceptionrR   )r‚   r   r_   Úis_validre   r   r   ÚHTTP_201_CREATED)r3   r4   rj   r…   Ú
serializerÚ
memberships         r8   rF   zTenantMembershipViewSet.create˜   sb   € Ø—‘ Ó$ˆÜ)¨w¯|©|ÀhÐPVÐEWÔXˆ
Ø×Ñ¨DÐÔ1Ø—_‘_Ó&ˆ
ÜÔ,¨ZÓ8×=Ñ=Äf×F]ÑF]Ô^Ð^r:   FÚpatchz(?P<membership_id>\d+)rJ   c                 óÐ  — | j                  |«      }t        j                  j                  ||¬«      }|j                  j                  dd «      }dD ]+  }||j                  v sŒt        |||j                  |   «       Œ- |j                  «        |�9|j                  j                  t        j                  j                  |¬«      «       t        t        |«      j                  «      S )N©rh   r…   r†   )r   Úis_owner©Úid__in)r‚   r   rg   r`   r_   Úsetattrre   r†   Úsetr   r‰   r   r   )r3   r4   rj   Úmembership_idr…   Úmr†   Úfields           r8   Ú
update_onez"TenantMembershipViewSet.update_oneŸ   s½   € à—‘ Ó$ˆÜ×Ñ×"Ñ" m¸FÐ"ÓCˆØ—‘× Ñ  ¨$Ó/ˆð ,ò 	7ˆEØ˜Ÿ™Ò$Ü˜˜5 '§,¡,¨uÑ"5Õ6ð	7ð 	
�‰ŒàÐØ�G‰G�K‰KœŸ™×+Ñ+°5Ð+Ó9Ô:äÔ,¨QÓ/×4Ñ4Ó5Ð5r:   Údeletec                 ó¶   — | j                  |«      }t        j                  j                  ||¬«      j	                  «        t        t        j                  ¬«      S )Nr–   rR   )r‚   r   rg   r‰   r    r   r   ÚHTTP_204_NO_CONTENT)r3   r4   rj   rœ   r…   s        r8   Ú
delete_onez"TenantMembershipViewSet.delete_one±   sC   € à—‘ Ó$ˆÜ×Ñ×!Ñ! ]¸6Ð!ÓB×IÑIÔKÜœv×9Ñ9Ô:Ð:r:   r+   )NN)r<   r=   r>   ru   r   rl   r‚   rŒ   rF   r   rŸ   r£   rz   r:   r8   r   r   ‡   sd   „ ñð
 4Ð4Ðò)óó_ñ �5 7 )Ð6OÔPò6ó Qð6ñ" �5 8 *Ð7PÔQò;ó Rñ;r:   r   c                   ó   ‡ — e Zd Zˆ fd„Zˆ xZS )r)   c                 ó†   •— t         ‰| �  ||«      }|xr- t        |j                  xr |j                  j                  «      S r+   r,   r2   s       €r8   r.   zSuperAdminOnly.has_permission¸   r9   r:   r;   r@   s   @r8   r)   r)   ·   rA   r:   c                   ó˜   — e Zd Zej                  j                  dd«      j                  d«      j                  «       Ze	gZ
g d¢Zd„ Zd„ Zy)ÚMembershipViewSetr…   r0   r†   )r…   r0   r   c                 óJ   — | j                   j                  dv rt        S t        S )N)ÚPOSTÚPUTÚPATCH)r4   Úmethodr   r   rG   s    r8   rH   z&MembershipViewSet.get_serializer_classÂ   s!   € Ø�<‰<×ÑÐ":Ñ:Ü,Ð,Ü#Ð#r:   c                 óŠ  — |j                   j                  «       }d|vrd|v r|d   |d<   d|vrd|v r|d   |d<   |j                  d«      st        ddi«      ‚|j                  d«      st        ddi«      ‚t	        |¬«      }|j                  d¬	«       |j                  «       }t        t        |«      j                   d
¬«      S )Nr…   Ú	tenant_idr0   Úuser_idz8Champ requis. Envoyez tenant (id) ou utilisez tenant_id.z4Champ requis. Envoyez user (id) ou utilisez user_id.)r_   TrŽ   éÉ   rR   )	r_   Úcopyr`   r	   r   r�   re   r   r   )r3   r4   ÚargsÚkwargsr_   r’   r“   s          r8   rF   zMembershipViewSet.createÇ   sÉ   € Ø�|‰|× Ñ Ó"ˆð ˜4Ñ K°4Ñ$7Ø! +Ñ.ˆD�‰NØ˜Ñ )¨tÑ"3Ø 	™?ˆD�‰Là�x‰x˜Ô!Ü! 8Ð-gÐ"hÓiÐiØ�x‰x˜ÔÜ! 6Ð+aÐ"bÓcÐcä.°DÔ9ˆ
Ø×Ñ¨DÐÔ1Ø—_‘_Ó&ˆ
ÜÔ,¨ZÓ8×=Ñ=ÀcÔJÐJr:   N)r<   r=   r>   r   rg   rŠ   rv   rw   ry   r
   rl   Úfilterset_fieldsrH   rF   rz   r:   r8   r§   r§   ½   sI   „ Ø×!Ñ!×0Ñ0°¸6ÓB×SÑSÐT[Ó\×`Ñ`Ób€HØ)Ð*ÐÚ3Ðò$ó
Kr:   r§   c                   óN   — e Zd Zej                  j                  dd«      ZeZe	gZ
y)ÚAuditLogViewSetrZ   r…   N)r<   r=   r>   r"   rg   rŠ   ry   r#   r}   r)   rl   rz   r:   r8   r¶   r¶   Ü   s)   „ Ø×Ñ×.Ñ.¨w¸ÓA€HØ)ÐØ(Ð)Ñr:   r¶   c                   óH   — e Zd ZdZegZd„ Zd
d„Z eddgd¬«      d	„ «       Z	y)ÚSessionViewSetzy
    Endpoints:
      GET    /api/sessions/
      DELETE /api/sessions/{jti}/
      POST   /api/sessions/revoke-all/
    c                 óH  — t         j                  j                  dd¬«      }t        j                  j	                  |¬«      j                  d«      }g }|D ],  }|j                  |j                  d d |j                  dœ«       Œ. t        t        |d¬«      j                  «      S )NÚtoken_idT©Úflatr˜   ú-created_at)rh   ÚipÚ
user_agentÚ	last_seenr‡   )r%   rg   Úvalues_listr$   Úexcluderx   ÚappendÚjtiÚ
created_atr   r'   r_   )r3   r4   Úblacklisted_idsr‹   r_   Útoks         r8   rŒ   zSessionViewSet.listì   s˜   € ä*×2Ñ2×>Ñ>¸zÐPTÐ>ÓUˆÜ×%Ñ%×-Ñ-°_Ð-ÓE×NÑNÈ}Ó]ˆð ˆØò 	ˆCØ�K‰KàŸ'™'ØØ"&Ø!$§¡ñ	õð	ô Ô)¨$°TÔ:×?Ñ?Ó@Ð@r:   Nc           
      óÄ  — 	 t         j                  j                  |¬«      }t        j                  j                  |¬«       t        j                  j                  d|j                  d d|j                  |j                  d|j                  i¬	«       t	        t
        j                  ¬«      S # t         j                  $ r  t	        ddit
        j                  ¬«      cY S w xY w)
N)rÄ   rK   zSession not found.rR   ©ÚtokenÚSESSION_REVOKEr$   r¯   ©r   rZ   r…   r[   r\   r]   Úmetadata)r$   rg   r`   ÚDoesNotExistr   r   ÚHTTP_404_NOT_FOUNDr%   Úget_or_creater"   rF   r0   rh   rÄ   r¯   r¢   )r3   r4   rj   rÇ   s       r8   ÚdestroyzSessionViewSet.destroyþ   sÄ   € ð	`Ü"×*Ñ*×.Ñ.°2Ð.Ó6ˆCô 	× Ñ ×.Ñ.°SÐ.Ô9ô 	×Ñ×ÑØ#Ø—,‘,ØØ*Ø—f‘fØŸ™Ø §¡Ð-ð 	 ô 	
ô œv×9Ñ9Ô:Ð:øô!  ×,Ñ,ò 	`Ü˜XÐ';Ð<ÄV×E^ÑE^Ô_Ò_ð	`ús   ‚ B, Â,0CÃCFrI   z
revoke-allrJ   c           
      óp  — t        t        j                  j                  dd¬«      «      }t        j                  j                  |¬«      }d}|D ]'  }t        j                  j                  |¬«       |dz  }Œ) t        j                  j                  d|j                  d d	d d d
|i¬«       t        d|i«      S )Nrº   Tr»   r˜   r   rÉ   r&   ÚSESSION_REVOKE_ALLr$   ÚcountrÌ   Úrevoked)r›   r%   rg   rÁ   r$   rÂ   rÐ   r"   rF   r0   r   )r3   r4   rÆ   r‹   rÔ   rÇ   s         r8   Ú
revoke_allzSessionViewSet.revoke_all  s¼   € äÔ.×6Ñ6×BÑBÀ:ÐTXÐBÓYÓZˆÜ×%Ñ%×-Ñ-°_Ð-ÓEˆàˆØò 	ˆCÜ×$Ñ$×2Ñ2¸Ð2Ô=Ø�Q‰J‰Eð	ô 	×Ñ×ÑØ'Ø—,‘,ØØ*ØØØ˜uÐ%ð 	 ô 	
ô ˜ EÐ*Ó+Ð+r:   r+   )
r<   r=   r>   ru   r)   rl   rŒ   rÑ   r   rÖ   rz   r:   r8   r¸   r¸   ã   s=   „ ñð )Ð)ÐòAó$;ñ, �5 6 (°\ÔBñ,ó Cñ,r:   r¸   c                   ó   — e Zd ZegZd„ Zy)Ú
LogoutViewc                 óÂ   — 	 |j                   j                  d«      }t        |«      }|j                  «        t        t        j                  ¬«      S # t        $ r Y Œ%w xY w)NÚrefreshrR   )r_   r`   r   Ú	blacklistrf   r   r   r¢   )r3   r4   Úrefresh_tokenrÊ   s       r8   rI   zLogoutView.post.  sV   € ð	Ø#ŸL™L×,Ñ,¨YÓ7ˆMÜ  Ó/ˆEØ�O‰OÔô œv×9Ñ9Ô:Ð:øô ò 	Ùð	ús   ‚6A Á	AÁAN)r<   r=   r>   r
   rl   rI   rz   r:   r8   rØ   rØ   +  s   „ Ø)Ð*Ðó;r:   rØ   )Úsettings)r   )ÚnowNc                 ó(  — t        | t        «      st        | «      } |€ddt        «       j                  dœ}|€dg}t	        ||«      }t        |«      }t        | |t        j                  |¬«      }|j                  |d«       |j                  d¬«       y )	Nz
Issa PEROUzhttp://localhost:3000/login)Ú	full_nameÚ	login_urlÚyearzngssalapel@gmail.com)ÚsubjectÚbodyÚ
from_emailÚtoz	text/htmlF)Úfail_silently)Ú
isinstanceri   rÞ   râ   r   r   r   rÝ   ÚDEFAULT_FROM_EMAILÚattach_alternativeÚsend)rã   Útemplate_namer   Úrecipient_listÚhtml_contentÚtext_contentÚemails          r8   Útestmailrñ   C  s”   € ô �gœsÔ#Ü�g“,ˆà€à%Ø6Ü“E—J‘Jñ
ˆð ÐØ0Ð1ˆä# M°7Ó;€LÜ˜lÓ+€Lä"ØØÜ×.Ñ.Øô	€Eð 
×Ñ˜\¨;Ô7Ø	‡J�J˜U€JÕ#r:   c                   ó   — e Zd ZdZegZd„ Zy)ÚPlatformInboxViewuR   GET /api/platform-messages/inbox/ â€” super admin : liste tous les threads tenantsc                 ó  — t         j                  j                  «       j                  d«      }g }|D ]·  }t        j                  j                  |¬«      }|j                  «       }|j                  dd¬«      j                  «       }|j                  |j                  |j                  |j                  |r|j                  d d nd |r|j                  nd |r|j                  nd |dœ«       Œ¹ |j                  d„ ¬	«       t!        |«      S )
NÚnamer„   r…   F)Úsender_sideÚis_readéx   )r®   Útenant_nameÚtenant_slugÚlast_messageÚlast_message_atÚlast_sender_sideÚunreadc                 óT   — | d   dkD  rdnd| d   r| d   j                  «        fS d fS )Nrþ   r   r&   rü   )Ú	timestamp)Úxs    r8   ú<lambda>z'PlatformInboxView.get.<locals>.<lambda>w  sB   € Ø�8‘˜q’‰A aØ23Ð4EÒ2FˆaÐ!Ñ"×,Ñ,Ó.ÐNð#
€ àLMÐNð#
€ r:   )Úkey)r!   rg   rw   rx   r   r‰   ÚlastrÔ   rÃ   rh   rõ   ÚslugÚcontentrÅ   rö   Úsortr   )r3   r4   ÚtenantsÚresultr…   r‹   r  rþ   s           r8   r`   zPlatformInboxView.getg  sç   € Ü—.‘.×$Ñ$Ó&×/Ñ/°Ó7ˆØˆØò 	ˆFÜ'×/Ñ/×6Ñ6¸fÐ6ÓEˆBØ—W‘W“YˆDØ—Y‘Y¨8¸U�YÓC×IÑIÓKˆFØ�M‰MØ$*§I¡IØ$*§K¡KØ$*§K¡KÙ:> D§L¡L°°#Ñ$6ÀDÙ7; D§O¢OÀÙ8< D×$4Ò$4À$Ø$*ñõ ð		ð 	�‰ñ 
ˆô 	ô ˜ÓÐr:   N©r<   r=   r>   ru   r)   rl   r`   rz   r:   r8   ró   ró   c  s   „ Ù\Ø(Ð)Ðó r:   ró   c                   ó(   — e Zd ZdZegZd„ Zd„ Zd„ Zy)ÚPlatformThreadViewu�   
    GET  /api/platform-messages/{tenant_id}/ â€” messages du thread
    POST /api/platform-messages/{tenant_id}/ â€” envoyer un message
    c                 óì   — ddl m} t        t        |¬«      }|j                  j
                  r|dfS t        j                  j                  ||j                  ¬«      j                  «       r|dfS  |«       ‚)Nr   ©ÚPermissionDeniedr�   Úadmin)r…   r0   r…   )
Úrest_framework.exceptionsr  r   r!   r0   r1   r   rg   r‰   Úexists)r3   r4   r®   r  r…   s        r8   Ú_get_tenant_and_sidez'PlatformThreadView._get_tenant_and_side…  sb   € Ý>Ü"¤6¨iÔ8ˆØ�<‰<×$Ò$Ø˜7�?Ð"Ü×Ñ×$Ñ$¨F¸¿¹Ð$ÓF×MÑMÔOØ˜8Ð#Ð#ÙÓ Ð r:   c                 óŠ  — | j                  ||«      \  }}|dk(  rdnd}t        j                  j                  ||d¬«      j	                  d¬«       t        j                  j                  |¬«      j                  d«      }t        |j                  |j                  |j                  d	œt        |d¬
«      j                  dœ«      S )Nr  r…   F©r…   rö   r÷   T)r÷   r„   Úsender)rh   rõ   r  r‡   )r…   Úmessages)r  r   rg   r‰   ÚupdaterŠ   r   rh   rõ   r  r   r_   )r3   r4   r®   r…   ÚsideÚoppositeÚmsgss          r8   r`   zPlatformThreadView.getŽ  s­   € Ø×0Ñ0°¸)ÓD‰ˆ�Ø# wš‘8°GˆÜ×"Ñ"×)Ñ)Ø x¸ð 	*ó 	
ç
‰&˜ˆ&Ô
Ü!×)Ñ)×0Ñ0¸Ð0Ó?×NÑNÈxÓXˆÜØ#ŸY™Y°·±ÀVÇ[Á[ÑQÜ4°TÀÔE×JÑJñ
ó ð 	r:   c                 óŽ  — | j                  ||«      \  }}|j                  j                  d«      xs dj                  «       }|j                  j                  d«      }|s|st        ddid¬«      S t        j                  j                  ||j                  |||xs d ¬«      }t        t        |d	|i¬
«      j                  d¬«      S )Nr  rP   ÚfilerK   u"   Le message ne peut pas Ãªtre vide.é�  rR   )r…   r  rö   r  r  r4   r   r°   )r  r_   r`   ra   ÚFILESr   r   rg   rF   r0   r   )r3   r4   r®   r…   r  r  r  Úmsgs           r8   rI   zPlatformThreadView.postš  sÀ   € Ø×0Ñ0°¸)ÓD‰ˆ�Ø—<‘<×#Ñ# IÓ.Ò4°"×;Ñ;Ó=ˆØ—-‘-×#Ñ# FÓ+ˆÙ™tÜ˜XÐ'KÐLÐUXÔYÐYÜ ×(Ñ(×/Ñ/ØØ—<‘<ØØØ’˜ð 0ó 
ˆô Ü(¨°yÀ'Ð6JÔK×PÑPØô
ð 	
r:   N)	r<   r=   r>   ru   r
   rl   r  r`   rI   rz   r:   r8   r  r  ~  s!   „ ñð *Ð*Ðò!ò
ó
r:   r  c                   ó   — e Zd ZdZegZd„ Zy)ÚPlatformMessageDeleteViewuO   DELETE /api/platform-messages/message/{msg_id}/ â€” supprime son propre messagec                 óÄ   — ddl m} t        t        |¬«      }|j                  |j
                  k7  r |«       ‚|j                  «        t        t        j                  ¬«      S )Nr   r  r�   rR   )
r  r  r   r   r  r0   r    r   r   r¢   )r3   r4   Úmsg_idr  r   s        r8   r    z PlatformMessageDeleteView.delete±  sE   € Ý>ÜÔ 2°vÔ>ˆØ�:‰:˜Ÿ™Ò%Ù"Ó$Ð$Ø�
‰
ŒÜœv×9Ñ9Ô:Ð:r:   N)r<   r=   r>   ru   r
   rl   r    rz   r:   r8   r"  r"  ­  s   „ ÙYØ)Ð*Ðó;r:   r"  c                   ó   — e Zd ZdZegZd„ Zy)ÚPlatformUnreadViewuX   GET /api/platform-messages/unread/ â€” tenant : nb de messages non lus venant de l'adminc                 ó<  — t         j                  j                  |j                  ¬«      j	                  d«      j                  «       }|st        ddi«      S t        j                  j                  |j                  dd¬«      j                  «       }t        d|i«      S )N)r0   r…   rþ   r   r  Fr  )
r   rg   r‰   r0   rŠ   Úfirstr   r   r…   rÔ   )r3   r4   r“   rÔ   s       r8   r`   zPlatformUnreadView.get¾  sŠ   € Ü×'Ñ'×.Ñ.°G·L±LÐ.ÓA×PÑPÐQYÓZ×`Ñ`Óbˆ
ÙÜ˜X q˜MÓ*Ð*Ü"×*Ñ*×1Ñ1Ø×$Ñ$°'À5ð 2ó 
ç
‰%‹'ð 	ô ˜ 5Ð)Ó*Ð*r:   N)r<   r=   r>   ru   r
   rl   r`   rz   r:   r8   r&  r&  º  s   „ ÙbØ)Ð*Ðó+r:   r&  c                   ó€   ‡ — e Zd Zej                  j                  d«      j                  «       ZeZ	d„ Z
ˆ fd„Zd„ Zˆ xZS )ÚDocumentTemplateViewSetÚ
created_byc                 ó^   — | j                   j                  dv rt        «       gS t        «       gS )N)r©   rª   r«   ÚDELETE)r4   r¬   r)   r
   rG   s    r8   Úget_permissionsz'DocumentTemplateViewSet.get_permissionsÌ  s-   € Ø�<‰<×ÑÐ"DÑDÜ"Ó$Ð%Ð%ÜÓ!Ð"Ð"r:   c                 óB   •— t         ‰| �  «       }| j                  |d<   |S )Nr4   )r-   Úget_serializer_contextr4   )r3   Úctxr7   s     €r8   r0  z.DocumentTemplateViewSet.get_serializer_contextÑ  s"   ø€ Ü‰gÑ,Ó.ˆØŸ™ˆˆI‰Øˆ
r:   c                 óP   — |j                  | j                  j                  ¬«       y )N)r+  )re   r4   r0   )r3   r’   s     r8   Úperform_createz&DocumentTemplateViewSet.perform_createÖ  s   € Ø�‰ 4§<¡<×#4Ñ#4ˆÕ5r:   )r<   r=   r>   r   rg   rŠ   rw   ry   r   r}   r.  r0  r3  r?   r@   s   @r8   r*  r*  È  s7   ø„ Ø×'Ñ'×6Ñ6°|ÓD×HÑHÓJ€HØ1Ðò#ô
ö
6r:   r*  c                   ó   — e Zd ZdZegZd„ Zy)ÚAdminDocumentsStatsViewze
    GET /api/admin-documents/
    Statistiques globales des documents (super admin uniquement).
    c                 ó"  — ddl m} ddlm} |j                  j                  «       }t        |j                  j                  d«      j                   |d«      ¬«      j                  d«      «      }|j                  j                  dd	«      j                   |d«      ¬«      j                  d«      }|D �cg c]  }|d   |d	   xs d
|d   dœ‘Œ }}|j                  j                  ddd«      j                  d«      d d }	|	D �
cg c]ì  }
|
j                  |
j                  |
j                  |
j                  r|
j                  j                  nd
|
j                  r6|
j                  j                   r |
j                  j                   j"                  nd
|
j$                  r|
j$                  j&                  nd
|
j(                  |
j*                  r%|j-                  |
j*                  j.                  «      nd dœ‘Œî }}
t1        ||||dœ«      S c c}w c c}
w )Nr   )ÚCaseDocument)ÚCountÚdoc_typerh   ©rÔ   ú-countÚcase__tenant__idÚcase__tenant__nameõ   â€”rÔ   )r®   rù   rÔ   ÚcaseÚcase__tenantÚuploaded_byr½   é   )rh   Útitler9  Úcase_referencerù   rA  rÅ   Úfile_url)ÚtotalÚby_typeÚ	by_tenantÚrecent)Úcases.modelsr7  Údjango.db.modelsr8  rg   rÔ   rŒ   ÚvaluesÚannotaterx   rŠ   rh   rC  r9  r?  Ú	referencer…   rõ   rA  ÚusernamerÅ   r  Úbuild_absolute_uriÚurlr   )r3   r4   r7  r8  rF  rG  Úby_tenant_qsÚrrH  Ú	recent_qsÚdrI  s               r8   r`   zAdminDocumentsStatsView.getá  sÊ  € Ý-Ý*à×$Ñ$×*Ñ*Ó,ˆäØ× Ñ ß‰V�JÓß‰X™E $›KˆXÓ(ß‰X�hÓó	
ˆð × Ñ ß‰VÐ&Ð(<Ó=ß‰X™E $›KˆXÓ(ß‰X�hÓð	 	ð "ö
ð ð	  !Ð!3Ñ4Ø Ð!5Ñ6Ò?¸%Ø  ™zóð
ˆ	ð 
ð × Ñ ß‰^˜F N°MÓBß‰X�mÓ$ S bð*ð 	ð  ö
ð ð #$§$¡$Ø"#§'¡'Ø"#§*¡*Ø67·f²f !§&¡&×"2Ò"2À%Ø89¿ºÀ1Ç6Á6Ç=Â= !§&¡&§-¡-×"4Ò"4ÐV[Ø<=¿MºM !§-¡-×"8Ò"8ÈuØ"#§,¡,ØLMÏFÊF '×"<Ñ"<¸Q¿V¹V¿Z¹ZÔ"HÐX\ó	ð
ˆð 
ô  %°GÈ)Ð_eÑfÓgÐgùò9
ùò
s   Â5HÄC1HNr
  rz   r:   r8   r5  r5  Ú  s   „ ñð )Ð)Ðó/hr:   r5  )ÚdateÚ	timedelta)r8  ÚSumÚQ)Ú
TruncMonthc                   ó   ‡ — e Zd Zˆ fd„Zˆ xZS )r)   c                 ó†   •— t         ‰| �  ||«      }|xr- t        |j                  xr |j                  j                  «      S r+   r,   r2   s       €r8   r.   zSuperAdminOnly.has_permission  r9   r:   r;   r@   s   @r8   r)   r)     rA   r:   c                   ó   — e Zd ZegZd„ Zy)ÚPlatformStatsViewc                 óÒ  — ddl m} ddlm}m}m}m} |j                  j                  «       }|j                  j                  d¬«      j                  «       }|j                  j                  «       }	|	j                  t        d«      t        d«      t        d«      t        d	«      t        d
«      t        d«      t        dt        t        j                   «       d¬«      ¬«      ¬«      }
t#        |
d   xs d|
d   xs dz   |
d   xs dz   |
d   xs dz   «      }t#        |
d   xs d«      }|dkD  rt%        ||z  dz  d«      nd}|	j'                  d«      j)                  t        d«      ¬«      D �cg c]  }|d   |d   dœ‘Œ }}t+        |	j'                  d«      j)                  t        d«      t        d«      ¬«      j-                  d«      d d «      }t        j                   «       j/                  d¬ «      t1        d!¬"«      z
  }|j                  j                  «       }|j                  |¬#«      j)                  t3        d$«      ¬%«      j'                  d&«      j)                  t        d'«      t        d«      ¬(«      j-                  d&«      D �cg c]-  }|d&   j5                  d)«      t#        |d'   xs d«      |d   d*œ‘Œ/ }}|j'                  d+«      j)                  t        d«      t        d'«      ¬,«      D �cg c]  }|d+   |d   t#        |d'   xs d«      d-œ‘Œ  }}|j                  j'                  d.«      j)                  t        d«      ¬«      j-                  d«      D �cg c]  }|d.   |d   d/œ‘Œ }}t7        ||||z
  d0œ|
d1   xs d|
d2   xs d||||d3œ||d4œd5|i|D �cg c]"  }|d   xs d6|d   t#        |d   xs d«      d7œ‘Œ$ c}d8œ«      S c c}w c c}w c c}w c c}w c c}w )9Nr   r    )ÚCollectionCaseÚCollectionActionÚPaymentÚPaymentPromiseÚactiverR   rh   Útotal_paid_amountÚprincipal_amountÚinterest_amountÚpenalty_amountÚfees_amountF)Únext_action_date__ltÚnext_action_date__isnull)r‰   )rF  Ú
total_paidÚ	principalÚinterestÚpenaltyÚfeesÚoverduerm  rn  ro  rp  rl  éd   r&   g        r   r:  rÔ   )r   rÔ   Útenant__name)rÔ   rl  r;  é
   )Údayé–   )Údays)Úpaid_at__date__gteÚpaid_at)Úmonthrz  Úamount)r{  rÔ   z%Y-%m)rz  r{  rÔ   r¬   )rÔ   r{  )r¬   rÔ   r{  Úaction_type)ÚtyperÔ   )rF  rd  Ú	suspendedrF  rq  )rF  rq  Útotal_amountrl  Úrecovery_rateÚ	by_status)Ú	by_methodÚmonthly_trendrG  r>  )rõ   rÔ   rl  )r  ÚcasesÚpaymentsÚactionsÚtop_tenants)Útenancy.modelsr!   Úcollections_management.modelsr`  ra  rb  rc  rg   rÔ   r‰   rw   Ú	aggregater8  rX  rY  rV  ÚtodayÚfloatÚroundrL  rM  rŒ   rx   ÚreplacerW  rZ  Ústrftimer   )r3   r4   r!   r`  ra  rb  rc  Útenants_totalÚtenants_activer„  Útotalsr  rl  r€  Úsr�  r‡  Úsix_months_agoÚpayments_qsr�   ÚmonthlyÚpr‚  ÚaÚby_action_typeÚts                             r8   r`   zPlatformStatsView.get%  s  € Ý)ßkÓkð Ÿ™×,Ñ,Ó.ˆØŸ™×.Ñ.°hÐ.Ó?×EÑEÓGˆð ×&Ñ&×*Ñ*Ó,ˆØ—‘Ü˜“+ÜÐ.Ó/ÜÐ,Ó-ÜÐ*Ó+ÜÐ(Ó)Ü�]Ó#Ü˜$¤qÜ%)§Z¡Z£\Ø).ô(ô ð !ó 
ˆô Ø�KÑ Ò% AØ�jÑ!Ò& Qñ(à�iÑ Ò% Añ'ð �f‰~Ò" ñ$ó
ˆô ˜6 ,Ñ/Ò4°1Ó5ˆ
ØEQÐTUÒEUœ˜j¨<Ñ7¸#Ñ=¸qÔAÐ[^ˆð —\‘\ (Ó+×4Ñ4¼5À»;Ð4ÓGö
àð ˜‘{¨Q¨w©ZÓ8ð
ˆ	ð 
ô Ø�L‰L˜Ó(ß‰XœE $›K´CÐ8KÓ4LˆXÓMß‰X�hÓ  ð%ó
ˆô Ÿ™›×-Ñ-°!Ð-Ó4´yÀcÔ7JÑJˆØ—o‘o×)Ñ)Ó+ˆð ß‘¨>�Ó:ß‘¤
¨9Ó 5�Ó6ß‘˜“ß‘¤ X£´e¸D³k�ÓBß‘˜'Ó"ö
ð ð	 ˜7™×,Ñ,¨WÓ5Ü  (¡Ò 0¨qÓ1Ø˜7™óð
ˆð 
ð$ !×'Ñ'¨Ó1×:Ñ:ÄÀtÃÔUXÐYaÓUbÐ:Ócö
àð ˜‘{¨Q¨w©ZÄ5ÈÈ8ÉÒIYÐXYÓCZÓ[ð
ˆ	ð 
ð !×(Ñ(ß‘˜Ó&ß‘¤ d£�Ó,ß‘˜(Ó#ö
àð �}Ñ%°°'±
Ó;ð
ˆð 
ô à&Ø(Ø*¨^Ñ;ñð   ™Ò-¨AØ! )Ñ,Ò1°Ø ,Ø(Ø!.Ø&ñð 'Ø!(ñð
 ˜>ðð %öð ð	 ˜nÑ-Ò6°Ø˜w™ZÜ"'¨¨,©Ò(<¸1Ó"=óòñ+
ó ð 	ùò_
ùò
ùò 
ùò
ùò>s   Å.OÊ
2OË4#OÍOÎ 'O$N)r<   r=   r>   r)   rl   r`   rz   r:   r8   r^  r^  "  s   „ Ø(Ð)Ðókr:   r^  )Ú	SmsConfigÚTenantApiKey)r   c                   ó   — e Zd ZegZd„ Zd„ Zy)ÚIntegrationEmailStatusViewc                 óì   — t        t        t        dd«      t        t        dd«      t        t        dd«      t        t        dd«      t        t        dd«      t        t        t        dd«      «      d	œ«      S )
NÚ
EMAIL_HOSTrP   Ú
EMAIL_PORTiK  ÚEMAIL_HOST_USERÚEMAIL_USE_TLSTré   )ÚhostÚportr0   Úuse_tlsÚfromÚis_configured)r   ÚgetattrÚdjango_settingsr/   )r3   r4   s     r8   r`   zIntegrationEmailStatusView.getŸ  sc   € ÜÜ¤°¸rÓBÜ¤°¸sÓCÜ¤Ð1BÀBÓGÜ¤°À$ÓGÜ¤Ð1EÀrÓJÜ!¤'¬/¸<ÈÓ"LÓMñ
ó ð 	r:   c           	      óJ  — |j                   j                  d«      xs |j                  j                  }|st	        ddid¬«      S 	 t        ddt        t        dd	«      |gd
¬«       t	        dd|› d�i«      S # t        $ r"}t	        dt        |«      id¬«      cY d	}~S d	}~ww xY w)u.   Envoyer un email de test Ã  l'adresse fournie.ræ   rK   z'Adresse email de destination manquante.r  rR   z[ACX] Email de testuG   Ceci est un email de test envoyÃ© depuis la plateforme ACX Collections.ré   NF)rã   Úmessagerå   rí   rç   u   Email envoyÃ© Ã  ú.iô  )
r_   r`   r0   rð   r   r   r©  rª  rf   ri   )r3   r4   ræ   Úes       r8   rI   zIntegrationEmailStatusView.post©  s¦   € à�\‰\×Ñ˜dÓ#Ò9 w§|¡|×'9Ñ'9ˆÙÜ˜XÐ'PÐQÐZ]Ô^Ð^ð
	<ÜØ-ØaÜ"¤?Ð4HÈ$ÓOØ "˜tØ#õô ˜XÐ):¸2¸$¸aÐ'@ÐAÓBÐBøÜò 	<Ü˜X¤s¨1£vÐ.°sÔ;Õ;ûð	<ús   Á0A7 Á7	B"Â BÂB"ÂB"N©r<   r=   r>   r)   rl   r`   rI   rz   r:   r8   rž  rž  œ  s   „ Ø(Ð)Ðòó<r:   rž  c                   ó   — e Zd ZegZd„ Zd„ Zy)ÚSmsConfigViewc           	      óÖ   — t        j                  «       }t        |j                  |j                  |j
                  rdnd|j                  rdnd|j                  |j                  dœ«      S )Nu   â€¢â€¢â€¢â€¢â€¢â€¢â€¢â€¢rP   )ÚproviderÚ	sender_idÚapi_keyÚ
api_secretrS   Ú
updated_at)	r›  Úget_or_create_singletonr   r³  r´  rµ  r¶  rS   r·  )r3   r4   Úcfgs      r8   r`   zSmsConfigView.get¾  sT   € Ü×/Ñ/Ó1ˆÜØŸ,™,ØŸ-™-Ø'*§{¢{™)¸Ø'*§~¢~™)¸2ØŸ-™-ØŸ.™.ñ
ó ð 	r:   c                 ó$  — t        j                  «       }|j                  }|j                  d|j                  «      |_        |j                  d|j
                  «      |_        |j                  d«      rt        d„ |d   D «       «      s
|d   |_        |j                  d«      rt        d„ |d   D «       «      s
|d   |_        |j                  d|j                  «      |_	        |j                  |_        |j                  «        t        dd	i«      S )
Nr³  r´  rµ  c              3   ó&   K  — | ]	  }|d k(  –— Œ y­w©u   â€¢Nrz   ©Ú.0Úcs     r8   ú	<genexpr>z$SmsConfigView.put.<locals>.<genexpr>Î  s   è ø€ Ò*O¸!¨1°­:Ñ*Oùó   ‚r¶  c              3   ó&   K  — | ]	  }|d k(  –— Œ y­wr¼  rz   r½  s     r8   rÀ  z$SmsConfigView.put.<locals>.<genexpr>Ð  s   è ø€ Ò-U¸Q¨a°5­jÑ-UùrÁ  rS   rK   u   Configuration SMS mise Ã  jour.)r›  r¸  r_   r`   r³  r´  rw   rµ  r¶  rS   r0   Ú
updated_byre   r   )r3   r4   r¹  r_   s       r8   ÚputzSmsConfigView.putÉ  sÒ   € Ü×/Ñ/Ó1ˆØ�|‰|ˆØŸ™ ¨S¯\©\Ó:ˆŒØŸ™ ¨c¯m©mÓ<ˆŒØ�8‰8�IÔ¤sÑ*O¸tÀI¹Ô*OÔ'OØ˜y™/ˆCŒKØ�8‰8�LÔ!¬#Ñ-UÀ$À|ÑBTÔ-UÔ*UØ! ,Ñ/ˆCŒNØŸ™ +¨s¯}©}Ó=ˆŒØ Ÿ™ˆŒØ�‰Œ
Ü˜Ð#DÐEÓFÐFr:   N©r<   r=   r>   r)   rl   r`   rÄ  rz   r:   r8   r±  r±  »  s   „ Ø(Ð)Ðò	óGr:   r±  c                   ó   — e Zd ZegZd„ Zd„ Zy)ÚTenantApiKeyListViewc                 óè  — |j                   j                  d«      }t        j                  j	                  dd«      }|r|j                  |¬«      }t        |D �cg c]Š  }|j                  |j                  |j                  j                  |j                  |j                  |j                  |j                  r|j                  j                  nd|j                   |j"                  dœ	‘ŒŒ c}«      S c c}w )Nr®   r…   r+  )r®   r>  )	rh   r®   rù   ÚlabelÚ
key_prefixrS   r+  Úlast_used_atrÅ   )Úquery_paramsr`   rœ  rg   rŠ   r‰   r   rh   r®   r…   rõ   rÉ  rÊ  rS   r+  rO  rË  rÅ   )r3   r4   r®   r‹   Úks        r8   r`   zTenantApiKeyListView.getÛ  sÂ   € Ø×(Ñ(×,Ñ,¨[Ó9ˆ	Ü×!Ñ!×0Ñ0°¸<ÓHˆÙØ—‘ Y�Ó/ˆBÜð ö
ð ð !"§¡Ø !§¡Ø !§¡§¡Ø !§¡Ø !§¡Ø !§¡Ø9:¿º §¡× 5Ò 5È5Ø !§¡Ø !§¡ó
ò
ó ð 	ùò 
s   ÁBC/c           
      ó2  — ddl m} |j                  j                  d«      }|j                  j                  d«      xs dj	                  «       }|r|st        ddid¬	«      S 	 |j                  j                  |¬
«      }t        j                  |||j                  ¬«      \  }}t        |j                  |j                  |j                  |j                  ||j                  |j                   dœd¬	«      S # |j                  $ r t        ddid¬	«      cY S w xY w)Nr   r    r®   rÉ  rP   rK   ztenant_id et label sont requis.r  rR   r�   zTenant introuvable.é”  )r…   rÉ  r+  )rh   r®   rÉ  rÊ  Úraw_keyrS   rÅ   r°   )rˆ  r!   r_   r`   ra   r   rg   rÎ   rœ  Úgenerater0   rh   r®   rÉ  rÊ  rS   rÅ   )r3   r4   ÚTenantModelr®   rÉ  r…   Úkey_objrÐ  s           r8   rI   zTenantApiKeyListView.postï  s  € Ý8Ø—L‘L×$Ñ$ [Ó1ˆ	Ø—\‘\×%Ñ% gÓ.Ò4°"×;Ñ;Ó=ˆÙ¡Ü˜XÐ'HÐIÐRUÔVÐVð	KØ ×(Ñ(×,Ñ,°	Ð,Ó:ˆFô (×0Ñ0¸ÀeÐX_×XdÑXdÔeÑˆ�ÜØ!Ÿ*™*Ø!×+Ñ+Ø!Ÿ-™-Ø!×,Ñ,Ø!Ø!×+Ñ+Ø!×,Ñ,ñ
ð ôð 	øð	 ×'Ñ'ò 	KÜ˜XÐ'<Ð=ÀcÔJÒJð	Kús   Á#C5 Ã5DÄDNr¯  rz   r:   r8   rÇ  rÇ  Ø  s   „ Ø(Ð)Ðòó(r:   rÇ  c                   ó   — e Zd ZegZd„ Zy)ÚTenantApiKeyDetailViewc                 óâ   — 	 t         j                  j                  |¬«      }d|_        |j                  dg¬«       t	        dd	i«      S # t         j                  $ r t	        ddid¬«      cY S w xY w)
Nr�   rK   u   ClÃ© introuvable.rÏ  rR   FrS   rT   u   ClÃ© rÃ©voquÃ©e.)rœ  rg   r`   rÎ   r   rS   re   )r3   r4   rj   r  s       r8   r    zTenantApiKeyDetailView.delete	  sw   € ð	IÜ×&Ñ&×*Ñ*¨bÐ*Ó1ˆCð ˆŒØ�‰ ˜}ˆÔ-Ü˜Ð#5Ð6Ó7Ð7øô	 ×(Ñ(ò 	IÜ˜XÐ':Ð;ÀCÔHÒHð	Iús   ‚ A	 Á	"A.Á-A.N)r<   r=   r>   r)   rl   r    rz   r:   r8   rÕ  rÕ    s   „ Ø(Ð)Ðó8r:   rÕ  c                   ó   — e Zd ZegZd„ Zd„ Zy)ÚPlatformSettingsViewc           	      óÊ   — ddl m} |j                  «       }t        |j                  |j
                  |j                  |j                  |j                  |j                  dœ«      S )Nr   ©ÚPlatformSettings)Úplatform_nameÚdefault_currencyÚdefault_languageÚtimezoneÚsupport_emailr·  )
Úaccounts.modelsrÛ  r¸  r   rÜ  rÝ  rÞ  rß  rà  r·  )r3   r4   rÛ  r¹  s       r8   r`   zPlatformSettingsView.get  sW   € Ý4Ø×6Ñ6Ó8ˆÜØ #× 1Ñ 1Ø #× 4Ñ 4Ø #× 4Ñ 4Ø #§¡Ø #× 1Ñ 1Ø #§¡ñ
ó ð 	r:   c                 óì  — ddl m} |j                  «       }|j                  }|j	                  d|j
                  «      |_        |j	                  d|j                  «      |_        |j	                  d|j                  «      |_        |j	                  d|j                  «      |_        |j	                  d|j                  «      |_	        |j                  |_        |j                  «        t        dd	i«      S )
Nr   rÚ  rÜ  rÝ  rÞ  rß  rà  rK   u   ParamÃ¨tres mis Ã  jour.)rá  rÛ  r¸  r_   r`   rÜ  rÝ  rÞ  rß  rà  r0   rÃ  re   r   )r3   r4   rÛ  r¹  r_   s        r8   rÄ  zPlatformSettingsView.put&  s½   € Ý4Ø×6Ñ6Ó8ˆØ�|‰|ˆØ#Ÿx™x¨¸C×<MÑ<MÓNˆÔØ#Ÿx™xÐ(:¸C×<PÑ<PÓQˆÔØ#Ÿx™xÐ(:¸C×<PÑ<PÓQˆÔØ#Ÿx™x¨
¸C¿L¹LÓIˆŒØ#Ÿx™x¨¸C×<MÑ<MÓNˆÔØ&Ÿ|™|ˆŒØ�‰Œ
Ü˜Ð#=Ð>Ó?Ð?r:   NrÅ  rz   r:   r8   rØ  rØ    s   „ Ø(Ð)Ðò
ó@r:   rØ  )zTest email ACXzemails/account_created.htmlNN)^Údjango.core.mailr   r   Údjango.templater   Údjango.template.loaderr   Údjango.utils.htmlr   r  r	   Úrest_framework.permissionsr
   Údjango.contrib.authr   Úrest_frameworkr   r   Úrest_framework.decoratorsr   Úrest_framework.responser   Úrest_framework.viewsr   Úrest_framework_simplejwt.tokensr   Údjango.shortcutsr   rá  r   r   r   r   Úaccounts.permissionsr   r   Úaccounts.serializersr   r   r   r   r   r   r   rˆ  r!   r"   r#   Ú/rest_framework_simplejwt.token_blacklist.modelsr$   r%   Úsecurity_serializersr'   rX   r)   ÚModelViewSetrC   ÚReadOnlyModelViewSetr|   ÚViewSetr   r§   r¶   r¸   rØ   Údjango.confrÝ   Údjango.utils.timezonerÞ   rñ   ró   r  r"  r&  r*  r5  ÚdatetimerV  rW  rK  r8  rX  rY  Údjango.db.models.functionsrZ  r^  r›  rœ  rª  rž  r±  rÇ  rÕ  rØ  rz   r:   r8   ú<module>rú     sô  ðß >Ý #Ý 3å (Ý 5Ý 6å .ß +Ý ,Ý ,Ý (Ý 8å .ß RÓ Rß P÷÷ ñ õ
 "÷ 7Ñ 6Ý 3ß ^Ý 3áÓ€ôG�_ô Gô
WN�(×'Ñ'ô WNôt0�(×/Ñ/ô 0ô.;˜h×.Ñ.ô .;ô`G�_ô GôK˜×-Ñ-ô Kô>*�h×3Ñ3ô *ôE,�X×%Ñ%ô E,ôP;�ô ;õ !õ !Ý 3Ý 3Ý (Ý %ð !Ø3ØØó	$ô@ ˜ô  ô6,
˜ô ,
ô^
; ô 
;ô+˜ô +ô6˜h×3Ñ3ô 6ô$6h˜gô 6h÷z %ß *Ñ *Ý 1ôG�_ô Gôn˜ô n÷j 4Ý 3Ý &ô< ô <ô>G�Gô Gô:+˜7ô +ô\
8˜Wô 
8ô"@˜7õ @r:   