Ë
    ö–j•  ã                  ó�   — d Z ddlmZ ddlZddlZddlmZ ddlmZm	Z	m
Z
mZ ddlmZ  ej                  e«      Zd
d„Zdd„Zdd	„Zy)zAValidation helpers when a shipment moves from draft to published.é    )ÚannotationsN)Útransaction)Úis_valid_country_codeÚnormalize_country_codeÚ$operational_region_error_for_countryÚ$return_trip_error_for_pickup_country)Ú#maybe_fill_country_code_from_coordsc                ó¼  — ddl m} ddlm} ddlm} 	 |j                  j                  | ¬«      }|j                  |j                  j                  k7  rdd	iS d}d}	 t         ||«      «      }	  ||«      }||dœS # |j                  $ r ddicY S w xY w# t        $ r t        j                  d
| «       Y ŒHw xY w# t        $ r t        j                  d| «       Y Œdw xY w)zNDispatch rate requests and nearby-load notifications for a published shipment.r   )ÚShipment)Ú#dispatch_rate_requests_for_shipment)Ú'notify_nearby_transporters_new_shipment)ÚpkÚerrorÚ	not_foundÚskippedÚnot_publishedz,Rate request dispatch failed for shipment %sz)NEARBY_LOAD notify failed for shipment %s)Úrate_requestsÚnearby_notified)Úcore.modelsr   Úcore.rate_distributionr   Ú
api.notifyr   ÚobjectsÚgetÚDoesNotExistÚstatusÚStatusÚ	PUBLISHEDÚlenÚ	ExceptionÚloggerÚ	exception)Úshipment_idr   r   r   ÚshipmentÚ
rate_countÚnearby_counts          ú//var/www/html/truck-me/core/shipment_publish.pyÚ!run_shipment_publish_side_effectsr'      sñ   € å$ÝJÝBð&Ø×#Ñ#×'Ñ'¨;Ð'Ó7ˆð ‡�˜(Ÿ/™/×3Ñ3Ò3Ø˜?Ð+Ð+à€JØ€LðVÜÑ<¸XÓFÓGˆ
ðSÙ>¸xÓHˆð (¸LÑIÐIøð! × Ñ ò &Ø˜Ð%Ò%ð&ûô ò VÜ×ÑÐGÈÖUðVûô ò SÜ×ÑÐDÀkÖRðSús5   ”A; ÁB Á.B9 Á;BÂBÂB6Â5B6Â9CÃCc                óH   ‡ ‡— ˆ fd„Šˆˆ fd„}t        j                  |«       y)zWRun publish side effects after commit; prefer Celery, fall back to a background thread.c                 óh   •— 	 t        ‰ «       y # t        $ r t        j                  d‰ «       Y y w xY w)Nz2Inline publish side effects failed for shipment %s)r'   r   r    r!   )r"   s   €r&   Ú_run_inlinez:enqueue_shipment_publish_side_effects.<locals>._run_inline3   s4   ø€ ð	`Ü-¨kÕ:øÜò 	`Ü×ÑÐQÐS^Ö_ð	`ús   ƒ �1°1c                 óÚ   •— 	 ddl m}  | j                  ‰«       y # t        $ rF}t        j                  d‰|«       t        j                  ‰d¬«      j                  «        Y d }~y d }~ww xY w)Nr   )Ú&run_shipment_publish_side_effects_taskzXCelery enqueue failed for shipment %s publish side effects (%s); using background threadT)ÚtargetÚdaemon)	Ú
core.tasksr,   Údelayr   r    ÚwarningÚ	threadingÚThreadÚstart)r,   Úexcr*   r"   s     €€r&   Ú	_dispatchz8enqueue_shipment_publish_side_effects.<locals>._dispatch9   s_   ø€ ð
	FÝIà2×8Ñ8¸ÕEøÜò 	FÜ�N‰NØjØØôô
 ×Ñ K¸Ô=×CÑC×EÑEûð	Fús   ƒ ›	A*¤<A%Á%A*N)r   Ú	on_commit)r"   r6   r*   s   ` @r&   Ú%enqueue_shipment_publish_side_effectsr8   0   s   ù€ ô`õFô ×Ñ˜)Õ$ó    c                óþ  — g }t        | ddd¬«      r|j                  d«       t        | ddd¬«      r|j                  d«       |r| j                  g |¢d‘¬	«       i }t        | j                  «      }t        | j
                  «      }|sd
|d<   n"t        |«      sd|d<   nt        |«      }|rd|fS |sd|d<   n"t        |«      sd|d<   nt        |«      }|rd|fS | j                  rt        |«      }|rd|fS |rd|fS y)z„
    Ensure pickup/delivery country codes exist before publishing.
    Attempts reverse geocoding when coordinates are present.
    Úpickup_country_codeÚ
pickup_latÚ
pickup_lon)ÚfieldÚ	lat_fieldÚ	lon_fieldÚdelivery_country_codeÚdelivery_latÚdelivery_lonÚ
updated_at)Úupdate_fieldszIRequired when publishing. Provide a valid ISO code or pickup coordinates.z(Invalid ISO 3166-1 alpha-2 country code.FzKRequired when publishing. Provide a valid ISO code or delivery coordinates.)TN)
r	   ÚappendÚsaver   r;   rA   r   r   Ú	is_returnr   )r#   Úupdated_fieldsÚerrorsÚpickupÚdeliveryÚregion_errorÚreturn_errors          r&   Úprepare_shipment_for_publishrO   I   sA  € ð
 !#€Nä*ØØ#ØØõ	ð 	×ÑÐ3Ô4ä*ØØ%Ø Ø õ	ð 	×ÑÐ5Ô6áØ�‰Ð$C nÐ$C°lÐ$CˆÔDà€FÜ# H×$@Ñ$@ÓA€FÜ% h×&DÑ&DÓE€HáàWð 	Ð$Ò%ô # 6Ô*Ø(RˆÐ$Ò%ä;¸FÓCˆÙØ˜,Ð&Ð&áàYð 	Ð&Ò'ô # 8Ô,Ø*TˆÐ&Ò'ä;¸HÓEˆÙØ˜,Ð&Ð&à×ÒÜ;¸FÓCˆÙØ˜,Ð&Ð&áØ�fˆ}ÐØr9   )r"   ÚintÚreturnÚdict)r"   rP   rQ   ÚNone)rQ   z(tuple[bool, str | dict[str, str] | None])Ú__doc__Ú
__future__r   Úloggingr2   Ú	django.dbr   Úcore.countriesr   r   r   r   Úcore.geocodingr	   Ú	getLoggerÚ__name__r    r'   r8   rO   © r9   r&   ú<module>r]      sE   ðÙ Gå "ã Û å !÷ó õ ?à	ˆ×	Ñ	˜8Ó	$€óJó6%ô2;r9   