a
    0iq                     @   s@   d dl Z d dlZd dlmZ d dlmZ e  G dd dZdS )    N)Path)load_dotenvc                   @   s   e Zd Zh dZedddZedZedZ	edZ
eedd	Zeed
d dv Zedd Zg Zed erede d eeedddZedd ZeeedddZeeeedddZdS )FTPUtils>	   z.jpgz.jpegz.xlsxz.pdfz.txtz.docxz.xlsz.pngz.docBASE_URLzhttps://file.sycelephant.com/FTP_HOSTFTP_USERFTP_PASSFTP_PORTZ21ZUSE_TLStrue)1r   yesZ
FTP_DOMAIN z/public_html/filez	/domains/)rutareturnc                 C   sz   |st d| dd}|| jr@|t| jd dS | jD ](}||rF|t|d d  S qF|dS )z@Devuelve la ruta relativa bajo 'file', p. ej. 'Formatos/mi.pdf'.u   Ruta vacía\r   N)
ValueErrorstripreplace
startswith	_URL_BASElenlstrip_BASES)clsr   sbase r   2/var/www/html/src/App/Utilities_module/FTPUtils.py_rel_from_input   s    

zFTPUtils._rel_from_inputc                 C   sv   | j r| jr| jstd| jr(t nt }|j| j | j	dd |
| j| j t|tjrh|  |d |S )Nz5Faltan credenciales FTP (FTP_HOST/FTP_USER/FTP_PASS).   )timeoutT)	_FTP_HOST	_FTP_USER	_FTP_PASSRuntimeError_USE_TLSftplibFTP_TLSFTPconnect	_FTP_PORTlogin
isinstanceprot_pset_pasv)r   connr   r   r   _connect-   s    
zFTPUtils._connectc              	   C   s   |  |}t|j}tt|jdd}z|  }| jD ]}zx||rV| d| n| z|	| |
  W W  W dS  tjy   | }||v r|
  Y W  W dS Y n0 W q: tjy   Y q:Y q:0 q:|
  W dS  ty   Y dS 0 dS )u!  
        Verifica si existe el archivo. Acepta:
          - URL pública: https://file.sycelephant.com/Formatos/mi.pdf
          - FTP absoluto: /public_html/file/Formatos/mi.pdf  (o /domains/.../public_html/file/...)
          - Relativa:     Formatos/mi.pdf  o  /Formatos/mi.pdf
        r   r   TFN)r   r   namestrparentr   r1   r   cwdsizequitr'   
error_permnlst	Exception)r   r   relr2   dir_relr0   r   filesr   r   r   file_exists:   s.    



zFTPUtils.file_exists)remote_path
local_pathr   c              
   C   s  zZ|  |}t|j }|r<|| jvr<dd| dW S t|j}tt|jdd}t	j
|}|rzt	j|dd |  }d}	| jD ]H}
z*||r|
 d| n|
 d}	W  qW q tjy   Y qY q0 q|	s|  dddW S t|d	$}|d
| |j W d   n1 s$0    Y  |  | j d| }dd| |||dW S  ty } zdd| dW  Y d}~S d}~0 0 dS )ue   
        Descarga un archivo. 'remote_path' puede ser URL pública, FTP absoluto o relativo.
        Fu   Extensión no permitida: )successmessager   r   T)exist_okz0Directorio remoto no encontrado en ninguna base.wbzRETR NzArchivo descargado en )rA   rB   r@   remote_relative
public_urlzError al descargar: )r   r   suffixlower_EXTENSIONS_ALLOWEDr2   r3   r4   r   ospathdirnamemakedirsr1   r   r5   r'   r8   r7   open
retrbinarywriter   r:   )r   r?   r@   r;   extr2   r<   Zdest_dirr0   okr   frF   er   r   r   download_file_   sD    



4zFTPUtils.download_fileN)__name__
__module____qualname__rI   rJ   getenvrstripr   r"   r#   r$   intr+   r3   rH   r&   r   Z_FTP_DOMAINr   appendclassmethodr   r1   boolr>   dictrU   r   r   r   r   r      s(   




$r   )rJ   r'   pathlibr   dotenvr   r   r   r   r   r   <module>   s
   