U
    iq                     @   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ddddddddd	h	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k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 )$FTPUtilsz.pdfz.docz.docxz.jpgz.jpegz.pngz.xlsxz.xlsz.txt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   \C:\Users\victor.barrera\Documents\proyectos\elepV3\Elep\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 ]}zz||rV| d| n| z|	| |
  W W  W dS  tjk
r   | }||kr|
  Y W  W dS Y nX W q: tjk
r   Y q:Y q:X q:|
  W dS  tk
 r   Y dS X 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  zF|  |}t|j }|r<|| jkr<dd| dW S t|j}tt|jdd}t	j
|}|rzt	j|dd |  }d}	| jD ]J}
z*||r|
 d| n|
 d}	W  qW q tjk
r   Y qY qX q|	s|  dddW S t|d	}|d
| |j W 5 Q R X |  | j d| }dd| |||dW S  tk
r } zdd| d W Y S d}~X Y nX 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 zArchivo descargado en )rA   rB   r@   remote_relative
public_urlzError al descargar: N)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    



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
   