
    iC                     n   d dl mZ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 d dlZd dlZd dlmZmZmZ d	d
lmZmZmZmZ d Zd Z edg          ej        d                         Z edg          ej        d                         Z edg          ej        d                         ZdS )    )renderredirect)JsonResponseHttpResponse)settings)Prefetch)require_http_methods)IntegrityErrortransactionN)UsuarioAreaGerencia   )PermisoArea
PermisoUrl	SolicitudUrlc                     d| j         vs<| j                             d          dk    s| j                             d          dk    rt          d          S t          | d          S )Nuser_id	user_tipo      /zusuarios.html)sessiongetr   r   )requests    -/var/www/html/Desarrollo/bi/usuarios/views.pyusuarios_viewr      sc    ''7?+>+>{+K+Kq+P+PT[TcTgTghsTtTtxyTyTy}}'?+++    c           	         	 t          dt          j                            d                              d          d          }t          dt
          j                            d                              d          d	          }t          d
t          j                            dd          d          }t          j                            dd                              |||          	                                
                    d          }t          j                            d                              d                                          
                    d          }d |D             }t          j                            dd          	                                
                    d          }d |D             }g }	|D ](}
d |
j        D             }d |
j        D             }d |
j        D             }|	                    i d|
j        d|
j        d|
j        d|
j        d|
j        d|
j        d|
j        d|
j        d|
j        d|
j        r|
j        j        nd d!|
j        r|
j        j        r|
j        j        nd"d|
j        r|
j        j        r|
j        j        j        nd#d$|
j        rt>          j          d%|
j         nt>          j          d&d|d|d
|           *tC          |	||d'          S # tD          $ r?}tG          d(|            tC          g g g tI          |          d)d*+          cY d"}~S d"}~ww xY w),u   
    Retorna una lista de usuarios con sus permisos, MÁS las listas maestras de 
    Áreas (incluyendo Gerencia) y URLs. Optimizada con Prefetch(to_attr) y list comprehensions.
    permisos_arear   estadoarea_permisos_area)querysetto_attrpermisos_urlurl_permisos_urlsolicitudessolicitud_urlsolicitud_area_solicitudesarea__gerencianombregerenciaF)urls__isnullc                 `    g | ]+}|j         |j        |j        |j        r|j        j        nd d,S )zSin Gerencia)idr0   gerencia_idgerencia_nombre)r4   r0   r5   r1   ).0as     r   
<listcomp>z get_usuarios.<locals>.<listcomp>?   sT     # # #
 	 $h=45JRqz00N	
 
 # # #r   c           
          g | ]v}|j         |j        |j        |j        |j        r|j        j        nd |j        r|j        j        r|j        j        nd|j        r|j        j        r|j        j        j        nddwS )	   Sin áreaNSin gerencia)r4   r0   r)   area_idarea_nombrer5   r6   )r4   r0   r)   r=   r$   r1   r5   )r7   us     r   r9   z get_usuarios.<locals>.<listcomp>H   s     " " "  $h5y,-FC16==12UAFOU16--QU9:gAFOgqv55Yg
 
 " " "r   c                 L    g | ]!}|j         j        |j         j        |j        d "S ))r>   r=   r#   )r$   r0   r4   r#   )r7   pas     r   r9   z get_usuarios.<locals>.<listcomp>W   sD     "* "* "*   "w~7:)# # "* "* "*r   c                 b    g | ],}|j         j        |j         j        |j         j         |j        d -S ))
url_nombreurl_idr)   r#   )r)   r0   r4   r#   )r7   pus     r   r9   z get_usuarios.<locals>.<listcomp>^   sK     !) !) !)
 	 !fm&)vz)	" " !) !) !)r   c           	          g | ]R}|j         |j        r|j        j        nd |j        r|j        j        nd |j        |j        |                                dSS )zN/A)r4   rC   r>   justificacionestado_codigoestado_display)r4   r,   r0   r-   rG   r#   get_estado_display)r7   ss     r   r9   z get_usuarios.<locals>.<listcomp>f   sz      '  '  '  d89Rao44U:;:JUq/66PU!"!""#"6"6"8"8! !  '  '  'r   r4   correoccr#   tipopaisciudadr=   r;   r5   Nr<   imgzprofile/zprofile/default.png)usuariosmaestro_areasmaestro_urlszError al obtener usuarios: )rR   rS   rT   error  status)%r   r   objectsfilterselect_relatedr   r   r   prefetch_relatedallorder_byr   distinctr   r%   r*   r.   appendr4   r0   rL   rM   r#   rN   rO   rP   r=   r$   r1   r5   rQ   r   	MEDIA_URLr   	Exceptionprintstr)r   permiso_area_prefetchpermiso_url_prefetchsolicitudes_prefetchrR   areas_maestrasmaestro_areas_dataurls_maestrasmaestro_urls_datausuarios_datar?   permisos_area_datapermisos_url_datasolicitudes_dataes                  r   get_usuariosrq      sM   
rt !) (//q/99HHPP$!
 !
 !
  ('..a.88GGNN# 
  
  
  (&55oGWXX" 
  
  
 ?11&:JKK\\!  
 
 #%%""	 	 44Z@@GGUZG[[ddffoopxyy# #
 "# # # 226;KLLPPRR[[\dee" " !" " "  .	 .	A"* "* (	"* "* "*!) !)
 !) !) !) '  ' ~ '  '  '    "ad"!(" !(" ad	"
 !(" " " !(" 19" @[" QVYYqv11UY" afddAFO22Vd" v(,==ae===xOaLvLvLv"   !3!""  1#"$ /%"    , %/-
 
   	  t t t/A//000bRT_bcd_e_efforsssssssssts   LL 
M4MMMPOSTc                 ,   	 t          j        | j                  }n(# t           j        $ r t	          ddid          cY S w xY w|                    d          }|st	          ddid          S 	 t          j                            |          }n,# t          j        $ r t	          dd| d	id
          cY S w xY w	 |                    d|j	                  |_	        |                    d|j
                  |_
        t          |                    d|j                            |_        t          |                    d|j                            }|dvrt          d          ||_        |                    d          }d}|rt          j                            |                                          }|r|j        }n\	 t          |          }t          j                            |                                          }|r|j        }n# t          $ r Y nw xY wnU# t          $ r }	t	          dd|	 id          cY d}	~	S d}	~	wt&          $ r }	t	          dd|	 id          cY d}	~	S d}	~	ww xY w|                    d          }
d}|
:|
dk    r4	 t          |
          }n## t          $ r t	          ddid          cY S w xY w|r	 t(          j                            |                              d                                          }|st	          dd| did          S |r*|j        |k    rt	          dd|j	         d| did          S ||_        n4# t&          $ r }	t	          dd |	 id          cY d}	~	S d}	~	ww xY wd|_        	 |                                 nZ# t4          $ r t	          dd!id          cY S t&          $ r/}	t7          d"|	            t	          dd#id          cY d}	~	S d}	~	ww xY wt	          d$|j        d%          S )&u   
    Actualiza la información básica y el área de un usuario.
    El campo 'gerencia' solo se usa para validación cruzada del área.
    rU      Formato JSON inválido.  rW   rM   u&   CC (cédula) del usuario es requerido.rM   Usuario con CC  no encontrado.  r0   rL   rN   r#   )r   r   zEl campo estado debe ser 0 o 1.r1   N)nombre__iexactr4   u   Error de validación: u%   Error al actualizar campos básicos: rV   r$    u*   El campo área debe ser un número entero.u   El ID de área z no existe.u	   El área z* no pertenece a la gerencia seleccionada (z).u   Error al asignar el área: u>   El correo electrónico o CC ya están en uso por otro usuario.z#Error al guardar el usuario en DB: z2Error interno del servidor al guardar los cambios.z!Usuario actualizado exitosamente.)messagerM   )jsonloadsbodyJSONDecodeErrorr   r   r   rY   DoesNotExistr0   rL   intrN   r#   
ValueErrorr   rZ   firstr4   rb   r   r[   r5   r=   r$   saver
   rc   rM   )r   datauser_ccusuarioestado_nuevogerencia_key_rawgerencia_id_nuevagerencia_objgerencia_id_testrp   area_id_rawr=   area_objs                r   update_usuarior      s   Nz','' N N NW&?@MMMMMMN hhtnnG ]W&NOX[\\\\_/%%%11 _ _ _W&P&P&P&PQZ]^^^^^^_%a(GN;;(GN;;488FGL99::488Hgn==>>v%%>???%  88J//  	 $+22BR2SSYY[[L %1_""(+,<(=(=%$,$4$;$;?O$;$P$P$V$V$X$X\$ =-9_*"   T  Q Q QW&Bq&B&BCCPPPPPPPPP a a ag'Rq'R'RS\_```	`	`	`	`	`	`a ((6""KG ;"#4#4	f+&&GG 	f 	f 	f '+W!Xadeeeeee	f  	Z|**g*66EEjQQWWYYH c#W.T.T.T.T$U^abbbb ! ZX%9=N%N%N$g  0L8?  0L  0L  wH  0L  0L  0L  &M  VY  Z  Z  Z  Z%GOO 	Z 	Z 	Z*K*K*K LUXYYYYYYYYY	Z i u u uW&fgpstttttt i i i7A77888W&Z[dghhhhhhhhhi
 $GwzZZ[[[s    "A A/ B &B98B9=DH A
H H 
HH HH 
I0(I=I0I0I+%I0+I0J# #KK	AM '+M M 
N%N :N NN% %O<	O<$O71O<7O<c           
      2   	 t          j        | j                  }n(# t           j        $ r t	          ddid          cY S w xY w|                    d          }|                    d          }|r|t	          ddid          S 	 t          j                            |	          }n,# t          j        $ r t	          dd
| did          cY S w xY wg }g }t          j
                    5  t          j                            |          }d |D             }|D ]}		 t          |	                    d                    }
t          |	                    d                    }|rdnd}n,# t          $ r}t!          d|	 d|            Y d}~sd}~ww xY w	 t"          j                            |
          }n'# t"          j        $ r t!          d|
            Y w xY w|
|v rH||
         }|j        |k    r4||_        |                                 |                    |
d|d           n;t          j                            |||          }|                    |
d|d           |dk    r}t,          j                            ||
d          }t/          |                    dd                    }|r5|                    d           |D ]}|                    ||
ddd            	 ddd           n# 1 swxY w Y   t	          d!|||||d"d#          S )$u   
    Recibe JSON para actualizar Permisos de Área y utiliza update_or_create 
    dentro de una transacción atómica para garantizar la consistencia.
    rU   rt   ru   rW   rM   areasNu/   Parámetros missing: cc y areas son requeridos.rv   rw   rx   ry   r   c                     i | ]
}|j         |S  )r=   r7   ps     r   
<dictcomp>z%update_area_perms.<locals>.<dictcomp>  s    AAA!AAAAr   r4   checkedr   r   u   Error procesando área: 	, error: r{   u   Área no encontrada: updated)r=   actionr#   )r   r$   r#   created)r   url__area_idr#   rD   T)flatr"   )rD   r=   r   r#   u   Permisos de área actualizados.)areas_recibidascambios_realizadosurls_actualizadas)r}   changesurl_changes
debug_info)r~   r   r   r   r   r   r   rY   r   r   atomicr   rZ   r   boolrb   rc   r   r#   r   r`   creater   listvalues_listupdate)r   r   r   r   r   r   r   permisos_actualespermisos_dictr8   r=   r   estado_deseadorp   r   permisopermisos_url_actualizadosurls_afectadasrD   s                      r   update_area_permsr      sD   Nz','' N N NW&?@MMMMMMN hhtnnGHHWE femW&WXadeeee_/%%%11 _ _ _W&P&P&P&PQZ]^^^^^^_ GK				 8 8'/66w6GG BA/@AAA  0	 0	AaeeDkk**quuY//00&-!41   @@@Q@@AAA<++w+77$   7g77888
 -'''0>^33%3GNLLNNNNNw)We#f#fggg &-44#!) 5  
 7iSabbccc "",6,>,E,E#!( -F - -) "&&?&K&KH[_&K&`&`!a!a! -44A4>>>"0  #**&,'.&/&'	, ,    W0	8 8 8 8 8 8 8 8 8 8 8 8 8 8 8x 4"$")!,
 
		 	 	 	 	s    "A A B' '&CC*2K6A
E('K6(
F2FK6FK6 F65K66!GK6GDK66K:=K:c           	      ^   	 t          j        | j                  }n(# t           j        $ r t	          ddid          cY S w xY w|                    d          }|                    d          }|r|t	          ddid          S 	 t          j                            |	          }n,# t          j        $ r t	          dd
| did          cY S w xY wg }t          j
                    5  t          j                            |          }d |D             }|D ]h}	 t          |                    d                    }	t          |                    d                    }
|
rdnd}n,# t          $ r}t!          d| d|            Y d}~sd}~ww xY w	 t"          j                            |	          }n'# t"          j        $ r t!          d|	            Y w xY wt%          |	          |v rV|t%          |	                   }|j        |k    r4||_        |                                 |                    |	d|d           +|
r;t          j                            |||          }|                    |	d|d           j	 ddd           n# 1 swxY w Y   t	          d|||dd          S )u   
    Recibe JSON para actualizar Permisos de URL y utiliza update_or_create
    dentro de una transacción atómica para garantizar la consistencia.
    rU   rt   ru   rW   rM   urlsNu.   Parámetros missing: cc y urls son requeridos.rv   rw   rx   ry   r   c                 8    i | ]}t          |j                  |S r   )rd   rD   r   s     r   r   z$update_url_perms.<locals>.<dictcomp>v  s"    GGGaQXGGGr   r4   r   r   r   zError procesando URL: r   r{   zURL no encontrada: r   )rD   r   r#   )r   r)   r#   r   zPermisos de URL actualizados.)urls_recibidasr   )r}   r   r   )r~   r   r   r   r   r   r   rY   r   r   r   r   rZ   r   r   rb   rc   r   rd   r#   r   r`   r   )r   r   r   r   r   r   permisos_existentesr   r?   rD   r   r   rp   url_objr   s                  r   update_url_permsr   \  s   Nz','' N N NW&?@MMMMMMN hhtnnG88FD edlW&VW`cdddd_/%%%11 _ _ _W&P&P&P&PQZ]^^^^^^_ G				 %f %f(0777HHGG3FGGG  	f 	fAQUU4[[))quuY//00&-!41   >q>>1>>???+//V/44#   4F44555
 6{{m++'F4>^33%3GNLLNNNNNf	Uc#d#deee  f(077 '#- 8  G
 NNf	Uc#d#deee?	f%f %f %f %f %f %f %f %f %f %f %f %f %f %f %fP 2"")
 
    s    "A A B' '&CC(2JA
E&%J&
F0F
J
FJ F43J4!GJGB)JJJ) django.shortcutsr   r   django.httpr   r   django.confr   django.db.modelsr   django.views.decorators.httpr	   	django.dbr
   r   r~   oslogin.modelsr   r   r   modelsr   r   r   r   r   rq   r   r   r   r   r   r   r   <module>r      s   - - - - - - - - 2 2 2 2 2 2 2 2             % % % % % % = = = = = = 1 1 1 1 1 1 1 1  				 0 0 0 0 0 0 0 0 0 0 ; ; ; ; ; ; ; ; ; ; ; ;, , ,wt wt wtv vhe\ e\   e\P vh[ [   [| vhD D   D D Dr   