U
    —âñjT  ã                   @   s`   d dl m Z mZmZ d dlmZ ddlmZ dZdZdd„ Z	d	d
„ Z
dd„ Zdd„ Zdd„ ZdS )é    )ÚdatetimeÚ	timedeltaÚtimezone)ÚCollectionInvalidé   )Ú_to_utc_datetimeÚgenerador_comap_timeseriesé   c                 C   s   |   d¡\}}}|› dt› �S )u>   Construye el nombre de la colecciÃ³n COMAP dedicada al centro.Ú-Ú_)ÚsplitÚCOMAP_COLLECTION_SUFFIX)Ú	centro_idr   Úcentro© r   ú3/var/www/itgmanager/itgmanager/nanoox/comap_data.pyÚget_comap_collection_name   s    r   c              
   C   sœ   ||   ¡ kr”zr| j|ddddœd�}z|jddgdd	� W n@ tk
rz } z"td
|› d|jj› d|› �ƒ W 5 d}~X Y nX W n tk
r’   Y nX | | S )u0   Crea la time-series COMAP si todavÃ­a no existe.Ú	timestampÚcomap_idÚminutes)Ú	timeFieldÚ	metaFieldÚgranularity)Ú
timeseries)r   r   )r   éÿÿÿÿZidx_comap_latest)Únameu&   No fue posible crear Ã­ndice COMAP en ú linea ú: N)Úlist_collection_namesÚcreate_collectionÚcreate_indexÚ	ExceptionÚprintÚ__traceback__Ú	tb_linenor   )ÚdbÚcollection_nameÚ
collectionÚer   r   r   Ú_ensure_comap_collection   s*    ýþþ
ÿr)   c                 C   sö  �z¬|rt |tƒs&td|› �ƒ W dS | d¡}t |tƒr>|sRtd|› �ƒ W dS t|ƒ}g }| ¡ D ]ü\}}|r|t |tƒs’td|› d|› �ƒ qf| d¡}|s¶td|› d	|› �ƒ qfzt|ƒ}	W nP tk
�r }
 z0td
|› d|› d|
jj	› d|
› �ƒ W Y ¢qfW 5 d}
~
X Y nX t
|dƒ�r(| ¡ nt|ƒ}t|ƒ}| |	||||› d|› �dœ¡ | |¡ qf|�spW dS t| |ƒ}|j|dd� tdt|ƒ› d|› d|› �ƒ t|ƒW S  tk
�rð }
 z"td|
jj	› d|
› �ƒ W Y ¢dS d}
~
X Y nX dS )u-  
    Guarda un documento por generador y recepciÃ³n en la time-series del centro.

    No deduplica: si el centro reenvÃ­a una mediciÃ³n, se conserva nuevamente.
    La fecha visible se mantiene en ``timestamp_str`` y ``timestamp`` contiene
    el BSON Date UTC requerido por MongoDB time-series.
    u   Sin bloque COMAP vÃ¡lido para r   Ú
generatorszSin generadores COMAP para u#   Generador COMAP vacÃ­o o invÃ¡lido z para r   zGenerador COMAP z sin timestamp para u   Timestamp COMAP invÃ¡lido para ú/r   r   NÚ	isoformatr
   )r   Útimestamp_strr   Úgenerador_namer   F)Úorderedz
Guardados z documentos COMAP en zError en save_comap_data linea )Ú
isinstanceÚdictr"   Úgetr   Úitemsr   r!   r#   r$   Úhasattrr,   ÚstrÚupdateÚappendr)   Úinsert_manyÚlen)r%   r   Úgenerators_comapr*   r&   Ú	documentsÚgenerator_nameÚgenerator_dataÚreceived_timestampZtimestamp_utcr(   r-   Údocumentr'   r   r   r   Úsave_comap_data4   sl    
ÿ
ÿÿÿýûÿ	
ÿ
r@   c                 C   sH   t | tƒsdS |  d¡}t |tƒs&dS dd„ | ¡ D ƒ}|rDt|ƒS dS )zÚDevuelve el timestamp mas reciente del bloque COMAP, o None.

    Un centro COMAP puro no tiene modulos ni bombas, asi que la hora del
    endpoint no puede salir de ahi: se toma del ultimo snapshot del generador.
    Nr*   c                 S   s0   g | ](}t |tƒrt | d ¡tƒr| d ¡‘qS )r   )r0   r1   r2   r5   )Ú.0Údatar   r   r   Ú
<listcomp>�   s   
 þz.get_latest_comap_timestamp.<locals>.<listcomp>)r0   r1   r2   ÚvaluesÚmax)r:   r*   Z
timestampsr   r   r   Úget_latest_comap_timestampƒ   s    


þrF   c              
   C   sX  di i}�zt |ƒ}||  ¡ kr&|W S t tj¡ttd� }ddd|iiidddd	œid
dddidœig}| | j|dd�D ]–}| 	d¡}| 	d¡}|r|t
|tƒs¤q|t|ƒ}	|	 dd¡}
|	 dd¡ |	 dd¡ |	 dd¡ |	 dd¡ |	 dd¡ |
dk	�r|
|	d< |	|d |< q|W n< tk
�rR } ztd|jj› d|› �ƒ W 5 d}~X Y nX |S )uJ   Devuelve el Ãºltimo snapshot de cada generador con el contrato del emisor.r*   )Údaysz$matchr   z$gtez$sortr   r   )r   r   z$groupz$generador_namez$firstz$$ROOT)Ú_idÚsnapshotT)ÚallowDiskUserH   rI   r-   Nr   r.   r   z%Error en get_latest_comap_data linea r   )r   r   r   Únowr   Úutcr   ÚCOMAP_LATEST_WINDOW_DAYSÚ	aggregater2   r0   r1   Úpopr!   r"   r#   r$   )r%   r   Úresponser&   Zfecha_limiteÚpipelineÚresultr<   rI   r=   Zoriginal_timestampr(   r   r   r   Úget_latest_comap_data™   sD    ÿþÿý


*rS   N)r   r   r   Úpymongo.errorsr   Ú	save_datar   r   rM   r   r)   r@   rF   rS   r   r   r   r   Ú<module>   s   O