
    i1                         S SK r S SKJr  S SKrS SKrS SKrS SKJrJrJ	r	  S SK
r
S SKJr  S SKJr  \" 5         SrS rS rSS\SS4S	 jrg)
    N)secure_filename)	send_fileabortredirect)Config)load_dotenvzhttps://file.sycelephant.comc                     U (       d  SSS.$ U R                   R                  5       R                  S5      (       d  SSS.$ [        UR	                  SS5       S35      n[
        R                  " 5       n[        R                  R                  XT5      nU R                  U5        [        R                  " S5      n[        R                  " S	5      n[        R                  " S
5      n	[        R                  " U5      n
U
R                  X5        U
R                  U5        [!        US5       nU
R#                  SU 3U5        S S S 5        U
R%                  5         [&         U U 3n[        R(                  " U5        SSU SU SU 3UUS.$ ! , (       d  f       NP= f! [*         ac  nS[-        5       ;   a:  [        R                  R/                  W5      (       a  [        R(                  " U5        SS[1        U5       3S.s S nA$ S nAff = f)NFu"   No se proporcionó ningún archivoexitomensaje.pdfzSolo se permiten archivos PDF _FTP_HOSTFTP_USERFTP_PASSrbzSTOR Tz	Archivo 'z' subido exitosamente a /)r   r   nombre_archivourl_webruta_archivo_tempzError al subir el archivo: )filenamelowerendswithr   replacetempfile
gettempdirospathjoinsavegetenvftplibFTPlogincwdopen
storbinaryquitBASE_URLremove	Exceptionlocalsexistsstr)technicalSheetitemcarpeta_destinocarpetar   temp_dirr   host_ftpusuario_ftp   contraseña_ftpconexion_ftparchivourl_archivoes                 PC:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\src\App\Subir_Archivo.pysubir_archivo_ftp_desde_requestr=      s   6S"/STT &&,,.77??"/NOO )DLLc,B+C4)HI &&(GGLLB-. 99Z(ii
+))J/zz(+;8 	) #T*g##eN+;$<gF +
 	 "
7)N+;< 			#$ ">"22J8*TUVeUfg,"	
 	
 +*(  S&(*rww~~>O/P/PII'(-HQ+QRRSsC   F 2F C)F *F
 A	F 

FF 
H%AH=HHc                     U R                  S5      (       a  U nUR                  S5      S   nOU n[         SU 3n[        R                  R                  [        R                  " 5       U5      n[        R                  " USS9nUR                  S:X  aH  [        US5       nUR                  S	S
9 H  nUR                  U5        M     SSS5        [        USSUS9$ [        U5      $ ! , (       d  f       N%= f! [          aL  n[#        SU  SU 35        U R                  S5      (       a  [        U 5      s SnA$ [%        S5         SnAgSnAff = f)u   
Visualiza un archivo PDF específico desde el servidor remoto.

Args:
    filename_or_url: Nombre del archivo PDF o URL completa
    
Returns:
    Flask response: Envía el archivo para visualización o redirecciona a su URL
httpr   z//static/pdf/Ventas/EUA/DMITEMS/BREAKER_CATALOG/T)stream   wbi    )
chunk_sizeNzapplication/pdfF)mimetypeas_attachmentdownload_namezError al visualizar el PDF z: i  )
startswithsplitr*   r   r   r    r   r   requestsgetstatus_coder'   iter_contentwriter   r   r,   printr   )filename_or_urlurlr   temp_file_pathresponsefchunkr;   s           r<   view_pdf_filerV   V   s:   ( %%f--!Cyy~b)H 'HJMhZXC h&9&9&;XF <<D13&nd+q%22d2CEGGEN D ,
 *#&	  C=  ,+  +O+<BqcBC%%f--O,,#JJsB   BC8  (C'C8 
C8 '
C51C8 8
E1E	3E9E		Ec                 P    UcY  Uc  Sn SSK n[        SU 35        UR                  U5      n[        X5      n[        SUR                   SUR                   35        [        S
U  35        [        SU 35        U" 5       n[        S[        U5       35        U(       d	  SSU  S3S	.$ [        S[        U5      S:  a  USS OU 35        U	(       a0  [        R                  R                  XI5      R                  SS5      nOUn[        SU 35        [        R                  " S5      n[        R                  " S5      n[        R                  " S5      n [        SU 35        [        R                  " U5      nUR!                  UU5         UR#                  U5        UR%                  5       n[        S[        U5       35        [        S[        U5      S:  a  USS OU 35        SnSnU H  nUR)                  US5      nUR)                  U5      nU(       d  [        SU 35        M=  UR                  S S!5       S"3n[        S#U 35        UU;   a^  [        S$U 35        U
nU U SU 3n[        S%U 35        [        S&U 35        UU:w  a!  [        S'U S(U 35        U" UU5        US)-  nM  M  [        S*U 35        Uc  M  US:w  d  M  [        S+U 35        U" US5        US)-  nM     UR+                  5         S,S-U S.U 3UUS/.$ ! [
        [        4 a2  n[        S[        U5       35        SS[        U5       3S	.s SnA$ SnAff = f! [        R&                   a*  n[        S[        U5       35        SSU S3S	.s SnA$ SnAff = f! [,         a2  n[        S0[        U5       35        SS0[        U5       3S	.s SnA$ SnAff = f! [,         aO  n[        S1[        U5       35        SSKn [        U R1                  5       5        SS2[        U5       3S	.s SnA$ SnAff = f)3u  
Verifica la existencia de archivos en el servidor FTP y actualiza una tabla con las URLs.

Args:
    tabla: Nombre de la tabla en la base de datos a consultar
    campo_id: Nombre del campo que contiene el identificador del registro
    campo_url: Nombre del campo que contiene la URL del archivo
    update_function: Función para actualizar el registro en la base de datos
    ruta_remota: Ruta en el servidor donde se buscarán los archivos
    search_function: Función para obtener los items (si es None, se importará dinámicamente)
    module_path: Ruta al módulo donde se encuentra la función de búsqueda
    search_function_name: Nombre de la función a importar del módulo (por defecto "searchitems")
    base_url: URL base para construir las URLs web (por defecto usa BASE_URL global)
    subfolder: Subcarpeta específica dentro de ruta_remota (opcional)
    
Returns:
    dict: Diccionario con resultado de la operación
NzDConsultas_SQL.Ventas.VentasEUA.DataMaster.DMBreakerProtectionTypeSQLr   u!   Importando dinámicamente desde: u   Función importada: z desde u(   Error importando función de búsqueda: Fr
   u-   Iniciando verificación de archivos en tabla zRuta remota: zItems encontrados: z$No se encontraron datos en la tabla .zMuestra de items:    \r   zRuta completa: r   r   r   zConectando a z"Archivos encontrados en servidor: zPrimeros 5 archivos:    z(Error de permisos al listar directorio: zEl directorio z, no existe en el servidor o no hay permisos. u   Item sin ID válido: r   r   r   zVerificando archivo: z Archivo encontrado en servidor: zURL construida: zURL actual: zActualizando z
 con URL:    z#Archivo NO encontrado en servidor: zLimpiando URL para Tu(   Verificación completada. Actualizados: z, No encontrados: )r   r   actualizadosno_encontradosu   Error de conexión FTP: zError general: zError: )	importlibrO   import_modulegetattr__name__ImportErrorAttributeErrorr/   lenr   r   r    r   r"   r#   r$   r%   r&   nlst
error_permrK   r)   r,   	traceback
format_exc)!tablacampo_id	campo_urlupdate_functionruta_remotasearch_function_namesearch_functionmodule_pathbase_url	subfolderr3   r`   moduleimport_erroritemsruta_completar5   r6   r7   ftparchivos_remotos
perm_errorr^   r_   r1   item_iditem_urlr   path_weburl_completa	ftp_errorr;   ri   s!                                    r<   verificar_actualizar_archivosr      s   &~?""ds 9+GH"00= #*&"G,_-E-E,FgfooM^_` 	=eWEFk]+,  !#CJ<01"1UV[U\\]/^__ 	"E
a5!9U"KLM GGLL@HHsSM'M/0 99Z(ii
+))J/I	\M(,-**X&CIIk?3A&#&88: :3?O;P:QRS-cJZF[_`F`.>r.Bfv-wxy
 LN ((8R088I.1$89 %,OOC$=#>d!C-n-=>? "%55<^<LMN
  'H&.Zz>:J#KL,\N;<L
34  </gYjOP'>$) 0
 ??OPQ  +B 3G9=>'6&!+M R HHJ El^Sefteuv ,"0	   0 s@\AR@STU!&5]^abn^o]p3qrrsX $$ A@Z@QRS!&^M?R~3  A  AAt  	\,S^,<=>"1I#i.IY/Z[[	\  ?Ax()i""$%WSVH+=>>	?s   O AL A	O (B+O 6N AM %CN N 
<N M	'M>M	?O M		O N
 N?N
 N N

N 
O	'O>O	?O O		O 
P%AP P% P%)r   werkzeug.utilsr   ior#   r   flaskr   r   r   rJ   configr   dotenvr   r*   r=   rV   r        r<   <module>r      sg    
 * 	   , ,     *7Sx2n CG  UY  dl  x|  EI Q?r   