Ë
    ¾îi¦6  ã                   ó  — d dl 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mZmZmZ  e j&                  d	«      Z e«       Zd
„ Zdedefd„Zdefd„Zdededz  fd„Z eddg«       ee	g«      d„ «       «       Z edg«       ee	g«      defd„«       «       Z edg«       ee	g«      defd„«       «       Z edg«       ee	g«      defd„«       «       Z edg«       ee	g«      defd„«       «       Z y)é    N)Úget_user_model)Útransaction)Úapi_viewÚpermission_classes)ÚIsAuthenticated)ÚResponse©Ústatus)Ú
MembershipÚRoleÚAuditLogÚUserCountryAssignmentz^[\w.@+\-]+$c                 ó  — t         j                  j                  | t         j                  j                  ¬«      j                  d«      j                  d«      }|j                  d¬«      j                  «       xs |j                  «       S )N)Úuserr
   ÚtenantÚrolesT)Úis_owner)r   ÚobjectsÚfilterÚStatusÚACTIVEÚselect_relatedÚprefetch_relatedÚfirst)r   Úqss     ú0/var/www/html/acx/accounts/views_tenant_users.pyÚ_get_active_membershipr      sh   € ä×Ñ×!Ñ! t´J×4EÑ4E×4LÑ4LÐ!ÓMß	‰˜Ó	!ß	Ñ	˜'Ó	"ð ð
 �9‰9˜dˆ9Ó#×)Ñ)Ó+Ò9¨r¯x©x«zÐ9ó    Ú
membershipÚreturnc                 óº   — | sy| j                   ryt        | j                  j                  dd¬«      «      }t        j
                  |v xs t        j                  |v S )NFTÚid©Úflat)r   Úsetr   Úvalues_listr   ÚADMINÚAPPROVER)r   Úrole_idss     r   Ú_is_tenant_adminr*      sQ   € ÙØØ×ÒØÜ�:×#Ñ#×/Ñ/°¸4Ð/Ó@ÓA€HÜ�J‰J˜(Ð"ÒB¬¯©¸Ð(AÐBr   Úuser_idc                 óž   — t         j                  j                  dd«      j                  d«      j	                  | |¬«      j                  «       S )Nr   r   r   ©r   r+   )r   r   r   r   r   r   r-   s     r   Ú_get_target_membershipr.   #   s=   € ä×Ñ×)Ñ)¨(°FÓ;ß	Ñ	˜'Ó	"ß	‰�v wˆÓ	/ß	‰‹ð	r   ÚuÚmc                 óX  — | j                   | j                  | j                  | j                  | j                  t        | dd «      t        | dd «      | j                  |sd dœ	S |j                   |j                  |j                  t        |j                  j                  dd¬«      «      dœdœ	S )NÚ	telephoneÚdepartementr"   Tr#   )r"   r
   r   r)   )	r"   ÚusernameÚemailÚ
first_nameÚ	last_namer2   r3   Ú	is_activer   )r"   r4   r5   r6   r7   Úgetattrr8   r
   r   Úlistr   r&   )r/   r0   s     r   Ú_user_payloadr;   ,   s•   € à�d‰dØ—J‘JØ—‘Ø—l‘lØ—[‘[Ü˜Q ¨TÓ2Ü˜q -°Ó6Ø—[‘[á"#�dñð ð —$‘$Ø—h‘hØŸ
™
Ü˜QŸW™W×0Ñ0°¸DÐ0ÓAÓBñ	*
ñð r   ÚGETÚPOSTc                 ó~  — t        | j                  «      }|r|j                  st        ddit        j
                  ¬«      S |j                  }| j                  dk(  røt        j                  j                  |¬«      j                  d«      j                  d«      j                  d«      }| j                  j                  d	d
«      j                  «       j!                  «       }|rDt"        j                  j                  ||¬«      j%                  dd¬«      }|j                  |¬«      }t        |D �cg c]  }t'        |j                  |«      ‘Œ c}«      S t)        |«      st        ddit        j
                  ¬«      S | j*                  xs i }|j                  d«      xs d
j                  «       }|j                  d«      xs d
j                  «       }	|j                  d«      xs d
j                  «       }
|j                  d«      xs d
j                  «       }|j                  d«      xs d
j                  «       xs d}|j                  d«      xs d
j                  «       xs d}|j                  d«      xs d
j                  «       }|j                  d«      xs g }|r|	st        ddit        j,                  ¬«      S t.        j                  j                  |¬«      j1                  «       }|rLt        j                  j                  ||¬«      j3                  «       rht        ddit        j,                  ¬«      S t.        j                  j                  |	¬«      j3                  «       rt        ddit        j,                  ¬«      S t5        j6                  «       5  |rÓ|}|
|_        ||_        |�||_        |�||_        |	r„|	|j@                  k7  rut.        j                  jC                  |jD                  ¬ «      j                  |	¬«      j3                  «       r&t        ddit        j,                  ¬«      cddd«       S |	|_         |r|jG                  |«       d|_$        |jK                  «        nFt/        ||	|
|||d¬!«      }|r|jG                  |«       n|jM                  «        |jK                  «        t        j                  jO                  ||t        jP                  jR                  d"¬#«      }|r;tT        j                  j                  |¬$«      }|jV                  jY                  |«       tZ        j                  jO                  |rd%nd&| j                  |d'|j\                  t_        |«      |ta        |«      d(œ¬)«       ddd«       t        t'        «      t        jb                  ¬«      S c c}w # 1 sw Y   Œ3xY w)*už   
    GET  /tenant/users/  : liste users du tenant actif (tous memberships)
    POST /tenant/users/  : crÃ©e user + membership ACTIVE dans le tenant actif
    ÚdetailúNo active tenant for this user.r	   r<   )r   r   r   Úuser__usernameÚcountryÚ )r   Úcountry__country_code__iexactr+   Tr#   )Úuser_id__inúNot allowed.r4   r5   r6   r7   r2   Nr3   Úpasswordr)   z username and email are required.)r4   )r   r   zUsername already exists.©r5   úEmail already exists.©Úpk)r4   r5   r6   r7   r2   r3   r8   F)r   r   r
   r   ©Úid__inÚTENANT_USER_READDÚTENANT_USER_CREATEÚUser)r)   Úreadded©ÚactionÚactorr   Úentity_typeÚ	entity_idÚentity_labelÚmetadata)2r   r   r   r   r
   ÚHTTP_403_FORBIDDENÚmethodr   r   r   r   r   Úorder_byÚquery_paramsÚgetÚstripÚupperr   r&   r;   r*   ÚdataÚHTTP_400_BAD_REQUESTrP   r   Úexistsr   Úatomicr6   r7   r2   r3   r5   ÚexcluderK   Úset_passwordr8   ÚsaveÚset_unusable_passwordÚcreater   r   r   r   r%   r   r"   ÚstrÚboolÚHTTP_201_CREATED)ÚrequestÚactor_mr   ÚmembershipsÚcountry_codeÚassigned_user_idsr0   Úpayloadr4   r5   r6   r7   r2   r3   rG   r)   Úexisting_userr/   r   s                      r   Útenant_usersrs   @   sÓ  € ô % W§\¡\Ó2€GÙ˜'Ÿ.š.Ü˜Ð#DÐEÌf×NgÑNgÔhÐhà�^‰^€Fà‡~�~˜Òä×Ñ×%Ñ%¨VÐ%Ó4ß‰^˜FÓ#ßÑ˜gÓ&ß‰XÐ&Ó'ð	 	ð ×+Ñ+×/Ñ/°	¸2Ó>×DÑDÓF×LÑLÓNˆÙÜ 5× =Ñ =× DÑ DØØ.:ð !Eó !÷ ‰k˜)¨$ˆkÓ/ð ð &×,Ñ,Ð9JÐ,ÓKˆKÜ¸;ÖG°aœ q§v¡v¨qÕ1ÒGÓHÐHô ˜GÔ$Ü˜ >Ð2¼6×;TÑ;TÔUÐUà�l‰lÒ ˜b€GØ—‘˜JÓ'Ò-¨2×4Ñ4Ó6€HØ�[‰[˜Ó!Ò' R×.Ñ.Ó0€EØ—+‘+˜lÓ+Ò1¨r×8Ñ8Ó:€JØ—‘˜[Ó)Ò/¨R×6Ñ6Ó8€IØ—‘˜[Ó)Ò/¨R×6Ñ6Ó8Ò@¸D€IØ—;‘;˜}Ó-Ò3°×:Ñ:Ó<ÒDÀ€KØ—‘˜JÓ'Ò-¨2×4Ñ4Ó6€HØ�{‰{˜:Ó&Ò,¨"€Há™5Ü˜Ð#EÐFÌv×OjÑOjÔkÐkô —L‘L×'Ñ'°Ð'Ó:×@Ñ@ÓB€MÙÜ×Ñ×$Ñ$¨F¸Ð$ÓG×NÑNÔPÜ˜XÐ'AÐBÌ6×KfÑKfÔgÐgô �<‰<×Ñ UÐÓ+×2Ñ2Ô4Ü˜XÐ'>Ð?Ì×HcÑHcÔdÐdä	×	Ñ	Ó	ñ 5
ÙØˆAØ%ˆAŒLØ#ˆAŒKØÐ$Ø'�”ØÐ&Ø +�”á˜ !§'¡'Ò)Ü—<‘<×'Ñ'¨1¯4©4Ð'Ó0×7Ñ7¸eÐ7ÓD×KÑKÔMÜ# XÐ/FÐ$GÔPV×PkÑPkÔl÷5
ñ 5
ð  �”ÙØ—‘˜xÔ(ØˆAŒKØ�F‰F�HäØ!ØØ%Ø#Ø#Ø'ØôˆAñ Ø—‘˜xÕ(à×'Ñ'Ô)Ø�F‰FŒHä×Ñ×%Ñ%ØØÜ×$Ñ$×+Ñ+Øð	 &ó 
ˆñ Ü—L‘L×'Ñ'¨xÐ'Ó8ˆEØ�G‰G�K‰K˜Ôä×Ñ×ÑÙ*7Ñ&Ð=QØ—,‘,ØØØ—d‘dÜ˜Q›Ø"*´t¸MÓ7JÑKð 	 ô 	
÷[5
ôn ”M ! QÓ'´×0GÑ0GÔHÐHùòk H÷<5
ð 5
ús   Ä0V.ÎBV3Ð>EV3Ö3V<ÚPATCHc                 ó¢  — t        | j                  «      }|r|j                  st        ddit        j
                  ¬«      S t        |«      st        ddit        j
                  ¬«      S |j                  }t        ||«      }|st        ddit        j                  ¬«      S |j                  }| j                  xs i }|j                  d«      xs dj                  «       }|rÛ||j                  k7  rÌt        j                  |«      st        ddd	œt        j                  ¬«      S t!        |«      d
kD  rt        ddd	œt        j                  ¬«      S t"        j$                  j'                  |j(                  ¬«      j+                  |¬«      j-                  «       rt        ddd	œt        j                  ¬«      S ||_        dD ]'  }||v sŒt/        |||j                  |«      xs d«       Œ) d|v r®|j                  d«      xs dj                  «       }	|	st        ddit        j                  ¬«      S t"        j$                  j'                  |j0                  ¬«      j+                  |	¬«      j-                  «       rt        ddit        j                  ¬«      S |	|_        |j                  d«      xs dj                  «       }
|
r|j5                  |
«       |j7                  «        t8        j$                  j;                  d| j                  |d|j0                  t=        |«      dt?        |jA                  «       «      i¬«       t        tC        ||«      «      S )zP
    PATCH /tenant/users/<id>/ : update profil user (nom, email, tel, dept)
    r?   r@   r	   rF   úUser not found in tenant.r4   rC   u9   CaractÃ¨res autorisÃ©s : lettres, chiffres, @, ., +, -, _)Úfieldr?   é–   u   150 caractÃ¨res maximum.rJ   )Úusername__iexactu=   Ce nom d'utilisateur est dÃ©jÃ  utilisÃ© par un autre compte.)r6   r7   r2   r3   r5   zEmail cannot be empty.)r"   rH   rI   rG   ÚTENANT_USER_UPDATErP   ÚfieldsrR   )"r   r   r   r   r
   rY   r*   r.   ÚHTTP_404_NOT_FOUNDr`   r]   r^   r4   Ú_USERNAME_REÚmatchra   ÚlenrP   r   rd   rK   r   rb   Úsetattrr"   r5   re   rf   r   rh   ri   r:   Úkeysr;   )rl   r+   rm   r   Útarget_mr/   rq   Únew_usernamerw   r5   Únew_passwords              r   Útenant_user_updater…   ³   s×  € ô % W§\¡\Ó2€GÙ˜'Ÿ.š.Ü˜Ð#DÐEÌf×NgÑNgÔhÐhÜ˜GÔ$Ü˜ >Ð2¼6×;TÑ;TÔUÐUà�^‰^€FÜ% f¨gÓ6€HÙÜ˜Ð#>Ð?Ì×HaÑHaÔbÐbà�‰€AØ�l‰lÒ ˜b€Gð —K‘K 
Ó+Ò1¨r×8Ñ8Ó:€LÙ˜¨¯
©
Ò2Ü×!Ñ! ,Ô/ÜØ$Ð0kÑlÜ×2Ñ2ôð ô ˆ|Ó˜sÒ"ÜØ$Ð0JÑKÜ×2Ñ2ôð ô �<‰<×Ñ 1§4¡4ÐÓ(×/Ñ/ÀÐ/ÓN×UÑUÔWÜØ$Ð0oÑpÜ×2Ñ2ôð ð "ˆŒ
ð Iò 8ˆØ�GÒÜ�A�u˜gŸk™k¨%Ó0Ò6°BÕ7ð8ð �'ÑØ—‘˜WÓ%Ò+¨×2Ñ2Ó4ˆÙÜ˜XÐ'?Ð@Ì×IdÑIdÔeÐeÜ�<‰<×Ñ 1§4¡4ÐÓ(×/Ñ/°eÐ/Ó<×CÑCÔEÜ˜XÐ'>Ð?Ì×HcÑHcÔdÐdØˆŒð —K‘K 
Ó+Ò1¨r×8Ñ8Ó:€LÙØ	�‰�|Ô$à‡F�F„Hä×Ñ×ÑØ#Ø�l‰lØØØ—$‘$Ü˜“VØœD §¡£Ó0Ð1ð ô ô ”M ! XÓ.Ó/Ð/r   c           
      óü  — t        | j                  «      }|r|j                  st        ddit        j
                  ¬«      S t        |«      st        ddit        j
                  ¬«      S |j                  }t        ||«      }|st        ddit        j                  ¬«      S |j                  }|j                  | j                  j                  k(  r)|j                  rt        ddit        j                  ¬«      S |j                   |_        |j                  «        t        j                  j!                  d| j                  |d|j                  t#        |«      d	|j                  i¬
«       t        t%        ||«      «      S )zN
    POST /tenant/users/<id>/toggle-active/ : active/inactive (is_active)
    r?   r@   r	   rF   rv   z#Cannot deactivate the tenant owner.ÚTENANT_USER_TOGGLE_ACTIVErP   r8   rR   )r   r   r   r   r
   rY   r*   r.   r|   r"   r   ra   r8   rf   r   r   rh   ri   r;   )rl   r+   rm   r   r‚   r/   s         r   Útenant_user_toggle_activerˆ   ü   s3  € ô % W§\¡\Ó2€GÙ˜'Ÿ.š.Ü˜Ð#DÐEÌf×NgÑNgÔhÐhÜ˜GÔ$Ü˜ >Ð2¼6×;TÑ;TÔUÐUà�^‰^€FÜ% f¨gÓ6€HÙÜ˜Ð#>Ð?Ì×HaÑHaÔbÐbà�‰€Að 	‡t�tˆw�|‰|�‰Ò 8×#4Ò#4Ü˜Ð#HÐIÔRX×RmÑRmÔnÐnà—k‘k�/€A„KØ‡F�F„Hä×Ñ×ÑØ*Ø�l‰lØØØ—$‘$Ü˜“VØ˜qŸ{™{Ð+ð ô ô ”M ! XÓ.Ó/Ð/r   c           
      ó�  — t        | j                  «      }|r|j                  st        ddit        j
                  ¬«      S t        |«      st        ddit        j
                  ¬«      S |j                  }t        ||«      }|st        ddit        j                  ¬«      S | j                  xs i }d|v rP|j                  d«      xs g }t        j                  j                  |¬«      }|j                  j                  |«       d|v rÜ|j                  d«      }t         j"                  j$                  t         j"                  j&                  t         j"                  j(                  h}	||	vrt        dd	it        j*                  ¬«      S |j,                  r:|t         j"                  j&                  k7  rt        dd
it        j*                  ¬«      S ||_        |j/                  «        t0        j                  j3                  d| j                  |d|j4                  t7        |«      d|i¬«       t        t9        |j                  |«      «      S )z£
    PATCH /tenant/users/<id>/membership/ : update roles + status (optionnel)
    payload:
      - role_ids: number[]
      - status: invited|active|suspended
    r?   r@   r	   rF   rv   r)   rL   r
   zInvalid status.z%Cannot change status of tenant owner.ÚTENANT_MEMBERSHIP_UPDATEr   rq   rR   )r   r   r   r   r
   rY   r*   r.   r|   r`   r]   r   r   r   r   r%   r   r   ÚINVITEDr   Ú	SUSPENDEDra   r   rf   r   rh   r"   ri   r;   )
rl   r+   rm   r   r‚   rq   r)   r   ÚstÚvalids
             r   Útenant_user_membership_updater�   #  sÚ  € ô % W§\¡\Ó2€GÙ˜'Ÿ.š.Ü˜Ð#DÐEÌf×NgÑNgÔhÐhÜ˜GÔ$Ü˜ >Ð2¼6×;TÑ;TÔUÐUà�^‰^€FÜ% f¨gÓ6€HÙÜ˜Ð#>Ð?Ì×HaÑHaÔbÐbà�l‰lÒ ˜b€Gà�WÑØ—;‘;˜zÓ*Ò0¨bˆÜ—‘×#Ñ#¨8Ð#Ó4ˆØ�‰×Ñ˜5Ô!à�7ÑØ�[‰[˜Ó"ˆÜ×"Ñ"×*Ñ*¬J×,=Ñ,=×,DÑ,DÄj×FWÑFW×FaÑFaÐbˆØ�U‰?Ü˜XÐ'8Ð9Ä&×B]ÑB]Ô^Ð^à×Ò ¤z×'8Ñ'8×'?Ñ'?Ò!?Ü˜XÐ'NÐOÔX^×XsÑXsÔtÐtØˆŒØ�‰Œä×Ñ×ÑØ)Ø�l‰lØØ Ø—+‘+Ü˜“]Ø˜WÐ%ð ô ô ”M (§-¡-°Ó:Ó;Ð;r   ÚDELETEc           
      óp  — t        | j                  «      }|r|j                  st        ddit        j
                  ¬«      S t        |«      st        ddit        j
                  ¬«      S |j                  }t        ||«      }|st        ddit        j                  ¬«      S |j                  rt        ddit        j                  ¬«      S t        j                  j                  d| j                  |d|j                  t        |«      d	|i¬
«       |j!                  «        t        t        j"                  ¬«      S )z`
    DELETE /tenant/users/<id>/remove/ : retire l'utilisateur du tenant (delete membership)
    r?   r@   r	   rF   rv   zCannot remove tenant owner.ÚTENANT_MEMBERSHIP_REMOVEr   Úremoved_user_idrR   )r   r   r   r   r
   rY   r*   r.   r|   r   ra   r   r   rh   r"   ri   ÚdeleteÚHTTP_204_NO_CONTENT)rl   r+   rm   r   r‚   s        r   Útenant_user_remover–   V  s  € ô % W§\¡\Ó2€GÙ˜'Ÿ.š.Ü˜Ð#DÐEÌf×NgÑNgÔhÐhÜ˜GÔ$Ü˜ >Ð2¼6×;TÑ;TÔUÐUà�^‰^€FÜ% f¨gÓ6€HÙÜ˜Ð#>Ð?Ì×HaÑHaÔbÐbà×ÒÜ˜Ð#@ÐAÌ&×JeÑJeÔfÐfä×Ñ×ÑØ)Ø�l‰lØØ Ø—+‘+Ü˜“]Ø# WÐ-ð ô ð ‡O�OÔÜœ6×5Ñ5Ô6Ð6r   )!ÚreÚdjango.contrib.authr   Ú	django.dbr   Úrest_framework.decoratorsr   r   Úrest_framework.permissionsr   Úrest_framework.responser   Úrest_frameworkr
   Úaccounts.modelsr   r   r   r   Úcompiler}   rP   r   rj   r*   Úintr.   r;   rs   r…   rˆ   r�   r–   © r   r   ú<module>r¢      sw  ðÛ 	å .Ý !ß BÝ 6Ý ,Ý !ç MÓ Màˆr�z‰z˜/Ó*€áÓ€ò:ðC ð C°ó Cð¨Có ð�Tð ˜j¨4Ñ/ó ñ( 
ˆ5�&ˆ/ÓÙ�_Ð%Ó&ñnIó 'ó ðnIñb 
ˆ7ˆ)ÓÙ�_Ð%Ó&ðD0¨ò D0ó 'ó ðD0ñN 
ˆ6ˆ(ÓÙ�_Ð%Ó&ð"0°ò "0ó 'ó ð"0ñJ 
ˆ7ˆ)ÓÙ�_Ð%Ó&ð.<°Cò .<ó 'ó ð.<ñb 
ˆ8ˆ*ÓÙ�_Ð%Ó&ð7¨ò 7ó 'ó ñ7r   