
    h~#                     p   d dl Z d dlZd dlmZ d dlmZ d dlZd dlZe j                  j                  d       d dl	m
Z
 d dlmZ ej                  j                  ej                  j                  e            Zej                  j                  e      Zej                  j                  e      Zej                  j'                  ed      Ze j                  j                  e       d dlmZ ej                  j                  ej                  j                  e            Zej                  j                  e      Zej                  j'                  ed	d
      Zej                  j5                  e      r ee        ej6                  de        n ej8                  de        ddedefdZddedefdZ y)    N)Path)datetimez/var/www/html/config)get_connection)load_dotenvlanding)StorageFactoryconfiguracionesz.envu)   ✅ Variables de entorno cargadas desde: u(   ⚠ No se encontró el archivo .env en: page	page_sizec                   K   d}d}	 t               }|*ddd|r|j                          |r|j                          S S |j                  d      }| dz
  |z  }d}|j                  |       |j	                         d	   }d
}|j                  |||f       |j                         }t        j                         fdt        j                  d      fd}	|D 
cg c]  }
 |	|
d          }}
t        j                  |ddi d{   }i }|D ]W  }t        |t              r|j                  d      r|d   ||d   <   0t        |t              r|j                  d      nd}g ||<   Y g }|D ]  }
|
d   |
d   |
d   |
d   |
d   |
d   |
d   |
d   |
d   |
d   |
d   r|
d   j                  d      ndg d}|j                  |
d   g       }|D ]  }|d    j                  |d!   |d"   d#       ! |j                  |        ||z   dz
  |z  }dd$|||| d%|r|j                          |r|j                          S S c c}
w 7 :# t         $ r~}t#        d&t%        |              |r$t'        |d'      rt#        d(|j(                          dd)t%        |       g d*cY d}~|r|j                          |r|j                          S S d}~ww xY w# |r|j                          |r|j                          w w xY ww)+u  
    Obtiene las propuestas con sus archivos adjuntos de S3, paginadas.
    
    Args:
        page: Número de página (por defecto 1)
        page_size: Tamaño de página (por defecto 10)
    
    Returns:
        Dict con información paginada de propuestas y sus archivos
    NFu   Error de conexión)successmessageT)
dictionary   z1SELECT COUNT(*) as total FROM propuesta_ciudadanototala  
            SELECT 
                id,
                nombre_completo,
                correo,
                tipo_documento,
                documento,
                telefono,
                ciudad,
                titulo,
                ambito,
                descripcion,
                fecha_hora
            FROM propuesta_ciudadano 
            ORDER BY fecha_hora DESC 
            LIMIT %s OFFSET %s
        c                 L  K   	 d|  }t        j                  j                  |d      d       d {   }|j                  dd      r|j                  d      r	| |d   d	d
S | g d	d
S 7 6# t         j                  $ r	 | g dd
cY S t
        $ r}| g dd
cY d }~S d }~ww xY ww)Nzpropuestas/   )	max_filesg      @)timeoutr   FfilesT)propuesta_idarchivosr   )asynciowait_forlist_files_with_metadatagetTimeoutError	Exception)r   folder_patharchivos_resultestorages       R/var/www/dev.api.imparables.com.co/api_imparables/crm/procesos/admin_propuestas.pyobtener_archivos_propuestazCobtener_propuestas_con_archivos.<locals>.obtener_archivos_propuestac   s      +L>:(/(8(844[A4N) #
 #&&y%8_=P=PQX=Y(4$3G$<#'  )5$&#' #$ '' $0 "$ 
  $0 "$ s\   B$0A. A,/A. %B$&A. +B$,A. .B!B$	B!BB!B$B!!B$r   c                    K   4 d {     |        d {   cd d d       d {    S 7 %7 7 	# 1 d {  7  sw Y   y xY ww)N )r   r$   	semaphores    r#   obtener_archivos_con_semaphorezGobtener_propuestas_con_archivos.<locals>.obtener_archivos_con_semaphore   sQ       F F7EEF F FEF F F FsE   A0A626A4A6AA?AAidreturn_exceptionsr   r   r   unknownnombre_completocorreotipo_documento	documentotelefonociudadtituloambitodescripcion
fecha_horaz%Y-%m-%d %H:%M:%S)r)   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   archivos_adjuntosr6   filenames3_key)nombrer8   zPropuestas encontradas)r   r   datatotalRecords
totalPagescurrentPagez*Error al obtener propuestas con archivos: 	statementu   Última consulta ejecutada: zError al obtener propuestas: r   r   r:   )r   closecursorexecutefetchonefetchallr   get_storager   	Semaphoregather
isinstancedictr   strftimeappendr   printstrhasattrr>   )r
   r   
conexionBDrA   offsetcount_querytotal_recordsquery
propuestasr(   	propuestatasksarchivos_resultsarchivos_por_propuestaresultr   propuestas_con_archivospropuesta_datar   archivototal_pagesr!   r$   r'   r"   s                         @@@r#   obtener_propuestas_con_archivosr^   )   s     JFZ#%
 /f LLN a ""d"3 (i' J{#)'2$ 	uy&12__&
 !,,. 	F %%a(		F
 S]]Y/	$@]]!(!O$!OO "$& 	:F&$'FJJy,AAG
AS&vn'=>=GPT=Uvzz.9[d79&|4	: #%# 	;I  o#,->#?#H-"+,<"=&{3%j1#H-#H-#H-(7W`amWni5>>?RStx%'N  .11)D/2FH# 23::%j1%h/<  $**>:3	;8 %y014B /+)%
* LLN G ^Oh  
:3q6(CDgfk201A1A0BCD6s1vh?
 	
 LLN 
 LLN sr   K<I &K<BI I 1I IDI &K< I 	KAK
K K $&K<
KK 'K99K<r8   
expirationc                 F  K   	 t        j                         }|j                  | |       d{   }|j                  dd      sd|j                  dd      i dS dd| |d	   ||j                  d
      ddS 7 I# t        $ r}ddt        |       i dcY d}~S d}~ww xY ww)u  
    Obtiene una URL firmada para un archivo específico en S3.
    
    Args:
        s3_key: Clave del archivo en S3
        expiration: Tiempo de expiración en segundos (por defecto 1 hora)
    
    Returns:
        Dict con la URL firmada y metadatos del archivo
    Nr   Fr   zError al generar URL firmadar?   Tz!URL firmada generada exitosamente
signed_url
expires_at)r8   ra   
expires_inrb   zError al obtener URL firmada: )r   rE   get_signed_urlr   r   rM   )r8   r_   r"   signed_url_resultr!   s        r#   obtener_url_firmadarf      s     
 ,,. #*"8"8"LL $$Y6 ,00<Z[  : /=(/33LA		
 		
 M(  
7Ax@
 	

sP   B!)A9 A7+A9 B!A9 6B!7A9 9	BBBB!BB!)r   
   )i  )!sysospathlibr   r   loggingr   pathrK   cnxpdor   dotenvr   dirnameabspath__file__current_dir
parent_dirroot_dirjoinlanding_dirstorage.storage_factoryr   
script_dircrm_direnv_pathexistsinfowarningintr^   rM   rf   r&       r#   <module>r      sZ   
 	     & ' !  ggoobggooh78WW__[)
77??:&ggll8Y/   3
 WW__RWW__X67
 ''//*
% 77<<!2F; 77>>(GLL<XJGHGOO>xjIJh hC hV)
c )
s )
r   