o
    gij                     @  s   d dl mZ d dlZd dlZd dlmZmZmZmZm	Z	 ddl
mZmZ ddlmZmZ dZd	Zd
ZdZdZdZdZd=ddZd>ddZd?ddZd@ddZd@d d!ZdAd%d&ZdBd(d)ZdCd+d,ZdDd.d/ZdEd2d3Z dFd7d8Z!dGd;d<Z"dS )H    )annotationsN)AnyDictListTupleOptional   )ZoneOperation	ParamSpec   )requestraw_wrapcreate_userupdate_userupdate_user_customfieldsupdate_user_permissiongroupsupdate_user_featureaccessui_upload_user_documentsuserssOptional[str]returnstrc                 C  s   | d u rdS d|  dS )N z	<![CDATA[z]]> )r   r   r   M/var/www/html/flask_server/apps/aroflo_connector_app/zones/users/mutations.py_cdata   s   r   pDict[str, Any]keyc                 C  s8   |  |}|d u st| st| dt| S )Nu&    es requerido y no puede estar vacío.)getr   strip
ValueError)r   r   vr   r   r   _require_non_empty_str"   s   
r$   r#   r   c                 C  s   t | rdS dS )Ntruefalse)bool)r#   r   r   r   
_bool_text)   s   r(   c                 C  s*  t | d}t | d}t | d}t | d}| dpi }t|ts$td|d}|r1t| s5tdd	g}|d
t| d |dt| d |dt| d |dt| d |d| d dD ]}| |d ur|d| dtt| | d| d qo| d}	t|	tr|	rdg}
dD ]}|	|d ur|
d| dtt|	| d| d q|
d |d	|
 | d}t|t
r|rdg}|D ]'}t|tstd|d }|d u st| std!|d"| d# q|d$ |d	| | d%}t|t
r|rd&g}|D ]o}t|ts4td'|d( |d)d urL|d*|d)  d+ |d,d urc|d-tt|d,  d. |d/d urz|d0tt|d/  d1 |d2d ur|d3tt|d2  d4 |d5 q(|d6 |d	| | d7}t|t
r|rd8g}|D ]E}t|tstd9|d:}|d;}|d u s|d u rtd<|d= |d>| d? |d@tt| dA |dB q|dC |d	| |dD d	|S )EN
givennamessurnameusernamepasswordorgz$org debe ser un objeto: {orgid: ...}orgidz(org.orgid es requerido para create_user.<users><user>z<givennames>z</givennames>z	<surname>z
</surname>z
<username>z</username>z
<password>z</password><org><orgid></orgid></org>)emailemail2phonefaxmobileposition
accesstype<></address	<address>addressline1addressline2suburbstatepostcodecountry
</address>r   permissiongroups<permissiongroups>:permissiongroups debe ser lista de objetos {groupid: ...}.groupid&Cada permissiongroup requiere groupid.<permissiongroup><groupid></groupid></permissiongroup></permissiongroups>customfields<customfields>'customfields debe ser lista de objetos.<customfield>fieldid	<fieldid>
</fieldid>name<name></name>type<type></type>value<value></value></customfield></customfields>featureaccess<featureaccess>Bfeatureaccess debe ser lista de objetos {featureid, featurevalue}.	featureidfeaturevalue5Cada featureaccess requiere featureid y featurevalue.	<feature><featureid></featureid><featurevalue></featurevalue>
</feature></featureaccess></user></users>)r$   r    
isinstancedictr"   r   r!   appendr   joinlist)r   r)   r*   r+   r,   r-   r.   partskr<   
addr_partsrF   pg_partsggidrN   cf_partscfr`   fa_partsffidfvalr   r   r   _build_postxml_create-   s   





,
,














r   c                   sT  t  d}h d}t fdd|D }|stddg}|d| d d	D ]} |d urG|d
| dtt | d| d q(d v ra dd ura|dt d d  d}t|t	r{|dr{|d|d  d  d}t|t	r|rdg}dD ]}||d ur|d
| dtt|| d| d q|d |d
| d v r dd ur d}	t|	tstddg}
|	D ]'}t|t	std|d}|d u st| std|
d| d  q|
d! |d
|
 d" v r d"d ur d"}t|ts*td#d$g}|D ]o}t|t	s;td#|d% |d&d urS|d'|d&  d( |d)d urj|d*tt|d)  d+ |d,d ur|d-tt|d,  d. |d/d ur|d0tt|d/  d1 |d2 q/|d3 |d
| d4 v r  d4d ur  d4}t|tstd5d6g}|D ]E}t|t	std7|d8}|d9}|d u s|d u rtd:|d; |d<| d= |d>tt| d? |d@ q|dA |d
| |dB d
|S )CNuserid>   r5   r-   r2   r4   r3   r6   r<   r*   archivedr7   r+   r8   r)   rN   r`   rF   c                 3  s&    | ]}| v o  |d uV  qd S N)r    ).0rt   r   r   r   	<genexpr>   s   $ z(_build_postxml_update.<locals>.<genexpr>uF   update_user requiere al menos un campo a actualizar además de userid.r/   <userid>	</userid>)
r)   r*   r+   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r   z
<archived>z</archived>r-   r.   r0   r1   r<   r=   r>   rE   r   rF   rH   rG   z+permissiongroups debe ser lista de objetos.rI   rJ   rK   rL   rM   rN   rP   rO   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   rb   ra   z(featureaccess debe ser lista de objetos.rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   )r$   anyr"   rp   r    r   r   r(   rn   ro   rq   rr   r!   )r   r   allowed_keyshas_anyrs   rt   r-   r<   ru   rF   rv   rw   rx   rN   ry   rz   r`   r{   r|   r}   r~   r   r   r   _build_postxml_update   s   
,

,















r   r   rN   List[Dict[str, Any]]c                 C  s
  |st ddd|  ddg}|D ]i}t|tst d|d |dd ur3|d	|d  d
 |dd urI|dtt|d  d |dd ur_|dtt|d  d |dd uru|dtt|d  d |d q|d d|S )Nu#   customfields no puede estar vacío.r/   r   r   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   z</customfields></user></users>r   )r"   rn   ro   rp   r    r   r   rq   )r   rN   rs   rz   r   r   r   "_build_postxml_update_customfields   s$   



r   rF   c                 C  s   |st ddd|  ddg}|D ]'}t|tst d|d}|d u s+t| s/t d|d	| d
 q|d d|S )Nu'   permissiongroups no puede estar vacío.r/   r   r   rG   rH   rI   rJ   rK   rL   z"</permissiongroups></user></users>r   )r"   rn   ro   r    r   r!   rp   rq   )r   rF   rs   rw   rx   r   r   r   &_build_postxml_update_permissiongroups  s   



r   r`   c                 C  s   |st ddd|  ddg}|D ]A}t|tst d|d}|d}|d u s.|d u r2t d	|d
 |d| d |dtt| d |d q|d d|S )Nu$   featureaccess no puede estar vacío.r/   r   r   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   z</featureaccess></user></users>r   )r"   rn   ro   r    rp   r   r   rq   )r   r`   rs   r|   r}   r~   r   r   r   #_build_postxml_update_featureaccess  s    





r   List[ZoneOperation]c                    C  s@  t tdddddi dddddd d	d d
d dd dd dd dd dd dd dd dd dd dd dd dd dd itddddtd	dddtd
dddtddddtddddd d!diid"tdddd#tdddd$tdddd%tdddd&tdddd'tdddd(tdddd)tdddd*tdd+dd,d!did-tdd+dd.d!did-tdd+dd/d!did-tdd0dd1tdd0dd2gd3d4d5gd6dd7t td8d9dddddd:td;ddd<tddddtd	dddtd
ddd=tdddd#tdddd$tdddd%tdddd&tdddd'tdddd(tdddd)td>d0dd?tddddd d!diid"tdddd*tdd+dd@d!did-tdd+dd.d!did-tdd+dd/d!did-tdd0ddAtdd0ddBgd3g dCd6dd7t tdDdEdddddd:td;dddFtdd+dd.d!did-tdd0ddGtdd0ddBgd3dHddIt tdJdKdddddd:td;dddFtdd+ddLd!did-tdd0ddGtdd0ddBgd3d6ddIt tdMdNdddddd:td;dddFtdd+ddOd!did-tdd0ddGtdd0ddBgd3dHddIt tdPdQdRddd d d dddStdTdddUtdVdddWtdXd+ddYd!did-tdd0ddZtdd0dd[gd3d\d]gd6dd7gS )^NzCreate Userz4Crea un nuevo user (POST zone=users) usando postxml.POSTwriteFrawdry_runr)   r*   r+   r,   r-   r2   r3   r4   r5   r6   r7   r8   r<   rF   rN   r`   stringTzNombres.z
Apellidos.zUsername/login.zPassword (solo CREATE).objectzObjeto org: {orgid}.r.   rX   )properties_schemazEmail.zEmail alterno.u
   Teléfono.zFax.u   Móvil.u   Cargo/posición.zTipo de acceso (si aplica).u   Dirección (objeto).arrayzLista [{groupid}].)items_schemazLista customfields.zLista feature access.booleanz<Si true, no ejecuta POST; devuelve preview (postxml/params).z/Si true, devuelve respuesta cruda + meta debug.r   zCrear usuario de pruebau)   Provisionar usuario desde automatizaciónhigh)codelabeldescriptionhttp_methodside_effect
idempotentdefault_paramsparamscategory	use_cases
risk_levelrequires_confirmationzUpdate Useru   Actualiza un user existente por userid (POST zone=users) usando postxml. ATENCIÓN: si envías permissiongroups, AroFlo REEMPLAZA los grupos existentes.)r   r   r   zUserID a actualizar.z	Username.r   zArchivar/desarchivar usuario.zLista [{groupid}] - REEMPLAZA.z+Si true, no ejecuta POST; devuelve preview.z
Debug raw.)zActualizar datos de usuariozArchivar usuariozCambiar grupos (reemplaza)zUpdate User CustomfieldszLActualiza customfields de un usuario (userid + customfields) usando postxml.zUserID destino.zDry run.medium)r   r   r   r   r   r   r   r   r   r   r   z(Update User Permission Groups (REPLACES)u   Actualiza permissiongroups de un usuario (userid + permissiongroups) usando postxml. ATENCIÓN: REEMPLAZA (borra los existentes y deja los enviados).zLista [{groupid}] (REEMPLAZA).zUpdate User Feature AccesszNActualiza featureaccess de un usuario (userid + featureaccess) usando postxml.z"Lista [{featureid, featurevalue}].zUI Upload User DocumentszDAbre usuario por email en UI y sube N documentos con comment/filter.UI)
user_emailtimesheet_budocsr   r   r   zEmail del usuario en AroFlo.r   u-   Business Unit (si aplica para tu sesión/UI).r   z0Lista de documentos: [{file, comment?, filter?}]z1Si true, no ejecuta UI; solo preview del comando.z4Si true, incluye stdout/stderr completos del runner.u   Adjuntar certificados médicosz%Automatizar documentos del Leave Form)r	   	OP_CREATEr
   	OP_UPDATEOP_UPDATE_CUSTOMFIELDSOP_UPDATE_PERMISSIONGROUPSOP_UPDATE_FEATUREACCESSOP_UI_UPLOAD_DOCSr   r   r   r   get_operations*  sl  	
4% r   operation_coder'   c                 C  s   | t ttttthv S r   )r   r   r   r   r   r   )r   r   r   r   supports  s   r   argv	List[str]r   c                C  sz   t j| dddd}|r|j|j|j| dS |jpd  dd  }|jp&d  dd  }|jd|d|| dS )	NTF)capture_outputtextcheck)
returncodestdoutstderrr   r   i
)r   stdout_tailstderr_tailr   )
subprocessrunr   r   r   r!   
splitlinesrq   )r   r   procout_tailerr_tailr   r   r   _run_ui  s   r   clientr   c                 C  sZ  t |dd}t |dd}d*d
d}| tkr;t|}dtfd|fg}|r,|||S t|d|}|r9t||S |S | tkrat|}dtfd|fg}|rR|||S t|d|}|r_t||S |S | t	krt
|d}	|d}
t|
tsxtdt|	|
}dtfd|fg}|r|||S t|d|}|rt||S |S | tkrt
|d}	|d}t|tstdt|	|}dtfd|fg}|r|||S t|d|}|rt||S |S | tkrt
|d}	|d}t|tstdt|	|}dtfd|fg}|r|||S t|d|}|rt||S |S | tkrt|dp%|dp%d }|s0td|dp7g }t|trA|sEtdt|dpS|dpSd }tjddg}|rg|d|g |d |g |D ]!}t| }|s}qpd!|vrtd"| |d#|g qp|d$ |rd%d&|d'S t||d(S td)|  )+Nr   Fr   params_listList[Tuple[str, str]]postxmlr   r   r   c                 S  s   dd| |dS )NTr   )r   r   r   r   r   )r   r   r   r   r   _preview  s   zexecute.<locals>._previewzoner   r   rN   z customfields debe ser una lista.rF   z$permissiongroups debe ser una lista.r`   z!featureaccess debe ser una lista.r   z
user-emailr   z2user_email es requerido (ej: cpenuela@usg.com.au).r   uB   docs es requerido y debe ser una lista no vacía de strings --doc.r   ztimesheet-buz-mz.apps.aroflo_connector_app.ui_automation.runnerz--timesheet-buz--user-emailzfile=z,Cada doc debe incluir 'file=...'. Recibido: z--doczusers-upload-docsTr   )r   
invocationr   )r   u+   [Users.mutations] Operación no soportada: )r   r   r   r   r   r   )r'   r    r   r   AF_ZONE_USERSr   r   r   r   r   r$   rn   rr   r"   r   r   r   r   r   r   r   r!   sys
executableextendrp   r   )r   r   r   r   r   r   r   r   respr   rN   rF   r`   r   r   r   r   dr   r   r   r   execute  s   



















$$

r   )r   r   r   r   )r   r   r   r   r   r   )r#   r   r   r   )r   r   r   r   )r   r   rN   r   r   r   )r   r   rF   r   r   r   )r   r   r`   r   r   r   )r   r   )r   r   r   r'   )r   r   r   r'   r   r   )r   r   r   r   r   r   r   r   )#
__future__r   r   r   typingr   r   r   r   r   baser	   r
   _join_utilsr   r   r   r   r   r   r   r   r   r   r$   r(   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s2   




]
f


 
9


