Ë
    a%9j9  ã                   ó„   — d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
 d dlmZmZ d dlmZ dd„Zdd„Zd	„ Zd
„ Zy)é    N)Ú	b64encode)Ú	HTTPErrorÚURLError)Úurljoin)ÚRequestÚurlopen)ÚTransporterProfilec                 ó*  — t         j                  t         j                  z   }t        d«      D ]Z  }dj	                  t        j                  || ¬«      «      }t        j                  j                  |¬«      j                  «       rŒX|c S  t        d«      ‚)Né   Ú )Úk)Útc_u_idz,Unable to generate unique Traccar unique ID.)ÚstringÚascii_uppercaseÚdigitsÚrangeÚjoinÚrandomÚchoicesr	   ÚobjectsÚfilterÚexistsÚ
ValueError)ÚlengthÚalphabetÚ_Ú	candidates       ú%/var/www/html/truck-me/api/traccar.pyÚgenerate_unique_tc_uidr      sv   € Ü×%Ñ%¬¯©Ñ5€HÜ�2‹Yò ˆØ—G‘GœFŸN™N¨8°vÔ>Ó?ˆ	Ü!×)Ñ)×0Ñ0¸Ð0ÓC×JÑJÕLØÒðô ÐCÓ
DÐDó    c                 óä  — t        j                  dd«      j                  «       }t        j                  dd«      j                  «       }t        j                  dd«      j                  «       }|r|r|st        d«      ‚t	        |j                  d«      r|n|› d�d«      }|xs dj                  «       xs | }t        j                  || dœ«      j                  d	«      }t        |› d
|› �j                  d	«      «      j                  d«      }t        ||d¬«      }	|	j                  dd«       |	j                  dd«       |	j                  dd|› �«       	 t        |	d¬«      5 }
|
j                  «       j                  d	«      xs d}t        j                  |«      }d d d «       t/        t0        «      rd|vrt        d«      ‚|S # 1 sw Y   Œ*xY w# t         $ rY}t#        |d«      r!|j                  «       j                  d	d¬«      n
t%        |«      }t        d|xs |j&                  › �«      ‚d }~wt(        t*        f$ r}t        d|› �«      ‚d }~wt        j,                  $ r t        d«      ‚w xY w)NÚTRACCAR_URLr   ÚTRACCAR_USERNAMEÚTRACCAR_PASSWORDú'Traccar credentials are not configured.ú/zapi/devices)ÚnameÚuniqueIdúutf-8ú:ÚasciiÚPOST)ÚdataÚmethodzContent-Typeúapplication/jsonÚAcceptÚAuthorizationúBasic é   ©Útimeoutz{}ÚreadÚignore©Úerrorsz Traccar device creation failed: úTraccar connection failed: zTraccar returned invalid JSON.Úidz,Traccar device creation response missing id.)ÚosÚgetenvÚstripr   r   ÚendswithÚjsonÚdumpsÚencoder   Údecoder   Ú
add_headerr   r6   Úloadsr   ÚhasattrÚstrÚreasonr   ÚTimeoutErrorÚJSONDecodeErrorÚ
isinstanceÚdict)Ú	unique_idÚdevice_nameÚbase_urlÚusernameÚpasswordÚendpointÚresolved_nameÚpayloadÚauthÚreqÚresÚbodyr-   ÚexcÚdetails                  r   Úcreate_traccar_devicer[      s/  € Ü�y‰y˜¨Ó+×1Ñ1Ó3€HÜ�y‰yÐ+¨RÓ0×6Ñ6Ó8€HÜ�y‰yÐ+¨RÓ0×6Ñ6Ó8€Há™8©8ÜÐBÓCÐCä 8×#4Ñ#4°SÔ#9‘xÀ(ÀÈ1¸~È}Ó]€HØ Ò& B×-Ñ-Ó/Ò<°9€MÜ�j‰j -¸YÑGÓH×OÑOÐPWÓX€GÜ˜�z  8 *Ð-×4Ñ4°WÓ=Ó>×EÑEÀgÓN€Dä
�( °Ô
8€CØ‡N�N�>Ð#5Ô6Ø‡N�N�8Ð/Ô0Ø‡N�N�? f¨T¨F OÔ4ð
;Ü�S "Ô%ð 	$¨Ø—8‘8“:×$Ñ$ WÓ-Ò5°ˆDÜ—:‘:˜dÓ#ˆD÷	$ô �dœDÔ! T°Ñ%5ÜÐGÓHÐHØ€K÷	$ð 	$ûô ò TÜ@GÈÈVÔ@T�—‘“×"Ñ" 7°8Ð"Ô<ÔZ]Ð^aÓZbˆÜÐ;¸FÒ<PÀcÇjÁjÐ;QÐRÓSÐSûÜ”lÐ#ò >ÜÐ6°s°eÐ<Ó=Ð=ûÜ×Ñò ;ÜÐ9Ó:Ð:ð;ús=   ÅG Å"9GÆG ÇGÇ	G Ç	I/ÇAH-È-I/È?IÉ"I/c                 ó�  — t        j                  dd«      j                  «       }t        j                  dd«      j                  «       }t        j                  dd«      j                  «       }|r|r|st        d«      ‚t	        |j                  d«      r|n|› d�d| › �«      }t        |› d|› �j                  d	«      «      j                  d
«      }t        |d¬«      }|j                  dd«       |j                  dd|› �«       	 t        |d¬«      5 }|j                  «       j                  d	«      xs d}t        j                  |«      }	d d d «       t-        	t.        «      r|	st        d«      ‚|	d   }|j1                  d«      |j1                  d«      |dœS # 1 sw Y   ŒOxY w# t        $ rY}
t!        |
d«      r!|
j                  «       j                  d	d¬«      n
t#        |
«      }t        d|xs |
j$                  › �«      ‚d }
~
wt&        t(        f$ r}
t        d|
› �«      ‚d }
~
wt        j*                  $ r t        d«      ‚w xY w)Nr"   r   r#   r$   r%   r&   zapi/positions?deviceId=r*   r)   r+   ÚGET©r.   r0   r/   r1   r2   r3   r4   ú[]r6   r7   r8   ú Traccar positions fetch failed: r:   ú,Traccar returned invalid JSON for positions.z"No position found for this device.r   ÚlatitudeÚ	longitude©rb   rc   Úraw)r<   r=   r>   r   r   r?   r   rB   rC   r   rD   r   r6   r@   rE   r   rF   rG   rH   r   rI   rJ   rK   ÚlistÚget)Ú	device_idrO   rP   rQ   rR   rU   rV   rW   rX   r-   rY   rZ   Úlatests                r   Úget_latest_device_positionrj   9   s  € Ü�y‰y˜¨Ó+×1Ñ1Ó3€HÜ�y‰yÐ+¨RÓ0×6Ñ6Ó8€HÜ�y‰yÐ+¨RÓ0×6Ñ6Ó8€Há™8©8ÜÐBÓCÐCä 8×#4Ñ#4°SÔ#9‘xÀ(ÀÈ1¸~ÐQhÐirÐhsÐOtÓu€HÜ˜�z  8 *Ð-×4Ñ4°WÓ=Ó>×EÑEÀgÓN€Dä
�( 5Ô
)€CØ‡N�N�8Ð/Ô0Ø‡N�N�? f¨T¨F OÔ4ð
IÜ�S "Ô%ð 	$¨Ø—8‘8“:×$Ñ$ WÓ-Ò5°ˆDÜ—:‘:˜dÓ#ˆD÷	$ô �dœDÔ!©ÜÐ=Ó>Ð>à�!‰W€Fà—J‘J˜zÓ*Ø—Z‘Z Ó,Øñð ÷	$ð 	$ûô ò TÜ@GÈÈVÔ@T�—‘“×"Ñ" 7°8Ð"Ô<ÔZ]Ð^aÓZbˆÜÐ;¸FÒ<PÀcÇjÁjÐ;QÐRÓSÐSûÜ”lÐ#ò >ÜÐ6°s°eÐ<Ó=Ð=ûÜ×Ñò IÜÐGÓHÐHðIús=   ÄF& Ä9FÅF& ÆF#ÆF& Æ&	IÆ/AHÈIÈH#È#"Ic                  óŽ  — t        j                  dd«      j                  «       } t        j                  dd«      j                  «       }t        j                  dd«      j                  «       }| r|r|st        d«      ‚t	        | j                  d«      r| n| › d�d«      }t        |› d|› �j                  d	«      «      j                  d
«      }t        |d¬«      }|j                  dd«       |j                  dd|› �«       	 t        |d¬«      5 }|j                  «       j                  d	«      xs d}t        j                  |«      }ddd«       t-        t.        «      st        d«      ‚i }|D ]¤  }|j1                  d«      }|j1                  d«      }|j1                  d«      }|�|�|€Œ=t#        |«      }|j1                  |«      }|rAt3        |j1                  d«      xs d «      t3        |d!   j1                  d«      xs d «      k\  sŒœ|||d"œ||<   Œ¦ |S # 1 sw Y   ŒÑxY w# t        $ rY}	t!        |	d«      r!|	j                  «       j                  d	d¬«      n
t#        |	«      }
t        d|
xs |	j$                  › �«      ‚d}	~	wt&        t(        f$ r}	t        d|	› �«      ‚d}	~	wt        j*                  $ r t        d«      ‚w xY w)#z—
    Return latest position per device id from Traccar /api/positions.
    Output: {device_id(str): {'latitude': x, 'longitude': y, 'raw': {...}}}
    r"   r   r#   r$   r%   r&   zapi/positionsr*   r)   r+   r]   r^   r0   r/   r1   r2   r   r4   r_   Nr6   r7   r8   r`   r:   ra   z&Traccar positions response is invalid.ÚdeviceIdrb   rc   r;   r   re   rd   )r<   r=   r>   r   r   r?   r   rB   rC   r   rD   r   r6   r@   rE   r   rF   rG   rH   r   rI   rJ   rK   rf   rg   Úint)rO   rP   rQ   rR   rU   rV   rW   rX   r-   rY   rZ   ri   ÚitemÚdidÚlatÚlonÚkeyÚprevs                     r   Úget_latest_positions_maprt   _   s‘  € ô
 �y‰y˜¨Ó+×1Ñ1Ó3€HÜ�y‰yÐ+¨RÓ0×6Ñ6Ó8€HÜ�y‰yÐ+¨RÓ0×6Ñ6Ó8€Há™8©8ÜÐBÓCÐCä 8×#4Ñ#4°SÔ#9‘xÀ(ÀÈ1¸~ÈÓ_€HÜ˜�z  8 *Ð-×4Ñ4°WÓ=Ó>×EÑEÀgÓN€Dä
�( 5Ô
)€CØ‡N�N�8Ð/Ô0Ø‡N�N�? f¨T¨F OÔ4ð
IÜ�S "Ô%ð 	$¨Ø—8‘8“:×$Ñ$ WÓ-Ò5°ˆDÜ—:‘:˜dÓ#ˆD÷	$ô �dœDÔ!ÜÐAÓBÐBà€FØò 
KˆØ�h‰h�zÓ"ˆØ�h‰h�zÓ"ˆØ�h‰h�{Ó#ˆØˆ;˜#˜+¨¨ØÜ�#‹hˆØ�z‰z˜#‹ˆá”s˜4Ÿ8™8 D›>Ò.¨QÓ/´3°t¸E±{·±ÀtÓ7LÒ7QÐPQÓ3RÓRØ'*¸ÀTÑJˆF�3ŠKð
Kð €M÷5	$ð 	$ûô ò TÜ@GÈÈVÔ@T�—‘“×"Ñ" 7°8Ð"Ô<ÔZ]Ð^aÓZbˆÜÐ;¸FÒ<PÀcÇjÁjÐ;QÐRÓSÐSûÜ”lÐ#ò >ÜÐ6°s°eÐ<Ó=Ð=ûÜ×Ñò IÜÐGÓHÐHðIús=   ÄH% Ä9HÅ	H% ÈH"ÈH% È%	KÈ.AJÊKÊJ"Ê""K)é
   )N)r@   r<   r   r   Úbase64r   Úurllib.errorr   r   Úurllib.parser   Úurllib.requestr   r   Úaccounts.modelsr	   r   r[   rj   rt   © r    r   ú<module>r|      s7   ðÛ Û 	Û Û Ý ß ,Ý  ß +å .óEó òF#óL.r    