U
    —âñj[  ã                   @   s¢   d dl Z d dlZd dlmZmZ d dlmZmZ d dlmZ dZ	dZ
dZdZd	ZdZd
ZdZddœdd„Ze	fdd„Zdd„ Zdd„ Zdd„ Zdddœdd„ZdS )é    N)ÚdatetimeÚtimezone)Ú	ASCENDINGÚ
IndexModel)ÚCollectionInvalidZscapp_notasé2   iˆ  i'  i   éd   i  € F©Úlocal_naivec             
   C   s´   t | tƒr| }nrt | tƒrz|  ¡ }| d¡r<|d d… d }zt |¡}W q‚ tk
rv } ztdƒ|‚W 5 d }~X Y q‚X ntdƒ‚|jd kr�|S |r |jd d�S | 	t
j¡jd d�S )NÚZéÿÿÿÿz+00:00zdatetime invalido©Útzinfo)Ú
isinstancer   ÚstrÚstripÚendswithÚfromisoformatÚ
ValueErrorr   ÚreplaceÚ
astimezoner   Úutc)Úvaluer
   ÚparsedÚ	raw_valueÚexc© r   ú6/var/www/itgmanager/itgmanager/Analytic/Scapp_notes.pyÚ_coerce_datetime   s     



r   c              	   C   s�   ||   ¡ kr0z|  |¡ W n tk
r.   Y nX | | }| tdtfdtfgdddd�tdtfdtfgddd�tdtfd	tfgd
dd�g¡ |S )NÚ	centro_idÚnote_idTZidx_scapp_notas_centro_note)ÚuniqueÚnameÚ
backgroundÚ	timestampZ idx_scapp_notas_centro_timestamp)r"   r#   Ú
updated_atZidx_scapp_notas_centro_updated)Úlist_collection_namesÚcreate_collectionr   Úcreate_indexesr   r   )Úscapp_dbÚcollection_nameÚ
collectionr   r   r   Úensure_notes_collection(   s2    üýýôr,   c                 C   sB  t | tƒr| gn| }t |tƒr"|s*tdƒ‚t|ƒtkrFtdt› d�ƒ‚g }|D �]ì}t |tƒsltd|›�ƒ‚t| d¡pzdƒ ¡ }|sŽtdƒ‚| d¡}t |tƒsªtd	ƒ‚tt 	d
d„ |D ƒ¡ƒ}|sÎtdƒ‚| d¡}t |tƒrê| ¡ sòtdƒ‚t|ƒt
k�rtdt
› d�ƒ‚| dg ¡}| di ¡}	| dd¡}
t |tƒ�sHtdƒ‚t|ƒtk�rftdt› d�ƒ‚tdd„ |D ƒƒ�rŠtdt› d�ƒ‚t |	tƒ�sžtdƒ‚ttj|	ddd� d¡ƒ}|tk�rÒtdt› d�ƒ‚t |
tƒ�sætd ƒ‚| d!¡}| ||t| d"¡d#d$�| ¡ ||	|
|d k	�r&t|ƒnd t| d%¡ƒd&œ	¡ qN|S )'Nz-Payload debe ser un dict o una lista no vaciazPayload excede el maximo de z notaszDocumento invalido: r    Ú z+Falta 'note_id' en alguno de los documentosÚcam_idsz'cam_ids' debe ser una listac                 s   s&   | ]}t |ƒ ¡ rt |ƒ ¡ V  qd S ©N)r   r   )Ú.0Ú	camera_idr   r   r   Ú	<genexpr>Z   s   þz7validate_and_normalize_notes_payload.<locals>.<genexpr>z+Falta 'cam_ids' en alguno de los documentosÚtextz(Falta 'text' en alguno de los documentosz'text' excede el maximo de z caracteresÚtagsÚmetadataÚdeletedFz'tags' debe ser una listaz'tags' excede el maximo de z
 elementosc                 s   s0   | ](}t |tƒ p&| ¡  p&t|ƒtkV  qd S r/   )r   r   r   ÚlenÚMAX_NOTE_TAG_LENGTH)r0   Útagr   r   r   r2   o   s   ÿz*cada tag debe ser texto no vacio de hasta z'metadata' debe ser un objeto)Ú,ú:)Úensure_asciiÚ
separatorszutf-8z'metadata' excede el maximo de z bytesz'deleted' debe ser booleanoÚ
created_atr$   Tr	   r%   )	r    r.   r$   r3   r4   r5   r6   r>   r%   )r   ÚdictÚlistr   r7   ÚMAX_BATCH_SIZEr   Úgetr   ÚfromkeysÚMAX_NOTE_TEXT_LENGTHÚMAX_NOTE_TAGSÚanyr8   ÚjsonÚdumpsÚencodeÚMAX_NOTE_METADATA_BYTESÚboolÚappendr   )ÚpayloadÚdocsÚ
normalizedÚdocr    Zraw_cam_idsr.   r3   r4   r5   r6   Zmetadata_sizer>   r   r   r   Ú$validate_and_normalize_notes_payloadG   sx    



þ

þ

ÿÿ

ö
rQ   c                 C   sŠ   t | ƒ}t tj¡jd d�}|D ]`}|||dœ–}|j||d dœddddd	d
idgidd
|d gigid|idgiigdd� q t|ƒS )Nr   )r   Úreceived_atr    )r   r    z$replaceWithz$condz$orz$eqz$typez$updated_atÚmissingz$lter%   z$literalz$$ROOTT)Úupsert)r,   r   Únowr   r   r   Ú
update_oner7   )r)   rN   r   r+   rR   rP   Úreplacementr   r   r   Úsave_notes_payload�   s0    ýþÿøÿÿðrX   c                 C   s$   dd„ |   ¡ D ƒ}| d¡|d< |S )Nc                 S   s0   i | ](\}}|d kr|t |tƒr(| ¡ n|“qS )Ú_id)r   r   Ú	isoformat)r0   Úkeyr   r   r   r   Ú
<dictcomp>²   s   þ z"serialize_note.<locals>.<dictcomp>r    rY   )ÚitemsrB   )ÚnoteÚ
serializedr   r   r   Úserialize_note±   s
    þr`   )r   Úscope_prefixc                C   sˆ   |s|st dƒ‚||dœddidœ}|r2||d< nddt |¡› d	�i|d< |  |d
di¡ dtfdtfdtfg¡ t¡}dd„ |D ƒS )Nz$Se requiere centro_id o scope_prefix)z$gtez$ltz$neT)r$   r6   r   z$regexú^Ú-rY   r   r$   r    c                 S   s   g | ]}t |ƒ‘qS r   )r`   )r0   r^   r   r   r   Ú
<listcomp>Ò   s     z)fetch_notes_for_range.<locals>.<listcomp>)r   ÚreÚescapeÚfindÚsortr   ÚlimitÚMAX_QUERY_NOTES)r+   Ú	start_dayÚend_dayr   ra   ÚqueryÚcursorr   r   r   Úfetch_notes_for_range¼   s$    þ
ýÿúÿ	ro   )rG   re   r   r   Úpymongor   r   Úpymongo.errorsr   ÚNOTES_COLLECTION_NAMErA   rj   rD   rJ   rE   r8   ÚMAX_NOTES_REQUEST_BYTESr   r,   rQ   rX   r`   ro   r   r   r   r   Ú<module>   s$   I!