o
    ;i+                     @  sr   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d	ZdddZd ddZd!ddZd"ddZdS )#    )annotations)AnyDictList)	urlencode   ZoneOperation	ParamSpecreturnList[ZoneOperation]c                   C  s   t ddddddddd	td
ddddtdddddgdddgdddt ddddddtdddddtdddddtd ddd!dtd"ddd#dgdd$d%gd&dd't d(d)d*dddtd+d,dd-dtd"ddd.dgdd/d0gd&dd'gS )1uD   
    Operaciones de la sección 'JOIN customfields' bajo Users.
    get_users_with_customfieldszGet Users and customfieldszQDevuelve usuarios activos y sus customfields usando zone=users&join=customfields.GETreadTand|archived|=|false   )wherepager   stringFuB   Cláusula WHERE estilo AroFlo. Por defecto 'and|archived|=|false'.)nametyperequireddescriptionr   integeru   Número de página (1..N).usersz;Listar usuarios activos junto con sus campos personalizadosuE   Buscar usuarios filtrando por información almacenada en customfieldslow)codelabelr   http_methodside_effect
idempotentdefault_paramsparamscategory	use_cases
risk_levelrequires_confirmationupdate_user_customfieldzUpdate Users customfieldua   Actualiza el valor de un customfield específico de un usuario usando POSTXML en la zona 'users'.POSTwriteuseridz$ID codificado del usuario en AroFlo.fieldidz ID del customfield a actualizar.valuezPNuevo valor del customfield. Depende del tipo (checkbox, datefield, text, etc.).postxmlu   XML completo a enviar en el campo 'postxml'. Si se envía, se usará directamente en lugar de construirlo a partir de userid/fieldid/value.u;   Actualizar un campo personalizado específico de un usuariou6   Sincronizar información de perfil avanzada con AroFlohigh)r   r   r   r   r   r    r"   r#   r$   r%   r&   create_user_with_customfieldszCreate User with Custom FieldszXCrea un usuario (o varios) junto con sus customfields usando POSTXML en la zona 'users'.userobjectu   Diccionario con los datos del usuario (givennames, surname, username, orgid, customfields, permissiongroups, etc.). Si no se envía, se espera que se pase 'postxml' ya construido.u~   XML completo con uno o varios <user> a crear. Si se envía, se usará directamente en lugar de construirlo a partir de 'user'.uC   Proponer la creación de un usuario nuevo con campos personalizadosuD   Migrar usuarios desde otro sistema conservando información avanzadar    r2   r2   U/var/www/html/flask_server/apps/aroflo_connector_app/zones/users/join_customfields.pyget_operations	   s   	(	"4r4   operation_codestrboolc                   s   t  fddt D S )Nc                 3  s    | ]}|j  kV  qd S )N)r   ).0opr5   r2   r3   	<genexpr>   s    zsupports.<locals>.<genexpr>)anyr4   r:   r2   r:   r3   supports   s   r=   r*   r+   r,   c                 C  s   d|  d| d| d S )Nz<users><user><userid>z-</userid><customfields><customfield><fieldid>z</fieldid><value><![CDATA[ z8 ]]></value></customfield></customfields></user></users>r2   )r*   r+   r,   r2   r2   r3   !_build_update_customfield_postxml   s   r>   r0   Dict[str, Any]c              
   C  s  ddl m} g d}g }|d |D ]}| |}|dvr-|d| d| d| d q| d	}|rH|d
 |d| d |d | dpNg }|r{|d |D ]}|d}	|	sbqX|d |d|	 d |d qX|d | dpg }
|
r|d |
D ]M}|d}|d}|d}|dd}|d |r|d| d |r|d | d! |r|d"| d# |d$t| d%  |d& q|d' |d( d|S ))Nr   )r   )

givennamessurnameusernamepasswordemailemail2phonefaxmobile
accesstypez<users><user>)N <>z</orgidz<org>z<orgid>z</orgid>z</org>permissiongroupsz<permissiongroups>groupidz<permissiongroup>z	<groupid>z
</groupid>z</permissiongroup>z</permissiongroups>customfieldsz<customfields>r+   r   r   r,   rJ   z<customfield>z	<fieldid>z
</fieldid>z<name>z</name>z<type>z</type>z<value><![CDATA[ z ]]></value>z</customfield>z</customfields>z</user></users>)typingr   appendgetr6   join)r0   _Listsimple_fields	xml_partskeyr,   rM   perm_groupspgrO   rP   cfr+   r   ctyper2   r2   r3   $_build_create_user_postxml_from_dict   sZ   
















r]   clientr   r"   c                 C  s   | dkr-| dd}| dd}dd|fddt|fg}t|}t|}|jdd	||d
S | dkr5td| dkr=tdtd|  )u   
    Implementa las llamadas reales a AroFlo para JOIN customfields.

    Por ahora solo está implementado el GET (Get Users and customfields),
    que ya probamos con la CLI. Los POST se pueden activar en una fase
    siguiente.
    r   r   r   r   r   )zoner   )rT   rP   rJ   r   )methodr"   
var_stringr'   uI   [Users.join_customfields] 'update_user_customfield' aún no implementado.r/   uO   [Users.join_customfields] 'create_user_with_customfields' aún no implementado.u3   [Users.join_customfields] Operación no soportada: )rS   r6   r   dictrequestNotImplementedError
ValueError)r5   r^   r"   r   r   params_listra   query_paramsr2   r2   r3   execute   s2   	
rh   N)r   r   )r5   r6   r   r7   )r*   r6   r+   r6   r,   r6   r   r6   )r0   r?   r   r6   )r5   r6   r^   r   r"   r?   r   r   )
__future__r   rQ   r   r   r   urllib.parser   baser	   r
   r4   r=   r>   r]   rh   r2   r2   r2   r3   <module>   s    
 

	
K