Ë
    2ÿ|f ã                   ó6  — d dl mZmZ d dlmZmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZmZ d dlmZ d dlmZ d	d
l­ d	d
l­ d dlmZ d dlmZmZmZ d dlmZmZ d dlmZ d dlm Z  d dl!m"Z" d dl#m$Z$ d dl%m&Z& d dl%m'Z' d dl(m)Z) d dl*m+Z+ d	d
l,­ d dl-Z-d dl.Z.d dl/m0Z0  G d„ dejb                  «      Z2 G d„ dejf                  «      Z4 G d„ de	«      Z5 G d„ de	«      Z6 G d „ d!e	«      Z7 G d"„ d#e	«      Z8 G d$„ d%e	«      Z9 G d&„ d'e	«      Z: G d(„ d)e	«      Z; G d*„ d+e	«      Z< G d,„ d-e	«      Z= G d.„ d/e	«      Z> G d0„ d1e	«      Z? G d2„ d3e	«      Z@ G d4„ d5e	«      ZA G d6„ d7e	«      ZB G d8„ d9e	«      ZC G d:„ d;e	«      ZD G d<„ d=e	«      ZE G d>„ d?e	«      ZF G d@„ dAejŽ                  «      ZH G dB„ dCe	«      ZI G dD„ dEe	«      ZJ G dF„ dGe	«      ZK G dH„ dIe	«      ZL G dJ„ dKe	«      ZM G dL„ dMe	«      ZN G dN„ dOe	«      ZO G dP„ dQe	«      ZP G dR„ dSe	«      ZQ G dT„ dUe	«      ZR G dV„ dWe	«      ZSy)Xé    )ÚDecimalÚROUND_UP)ÚgenericsÚpermissions)ÚJSONWebTokenAuthentication)ÚAPIView)ÚTokenAuthentication)ÚIsAuthenticatedÚIsAdminUser)ÚResponse©Ústatusé   )Ú*)Úgeodesic)ÚVehicleTypeÚVehicleÚVehicleAssignment)ÚDriverLocationÚDevice)ÚVehicleTypeSerializer)ÚValidationError)ÚDistance)ÚD)Úfromstr)ÚPoint)Útimezone)Ú	timedeltaN)Útransactionc                   ód   — e Zd Zej                  j                  «       ZeZe	gZ
ej                  gZy)ÚLocationListCreateAPIViewN©Ú__name__Ú
__module__Ú__qualname__ÚLocationÚobjectsÚallÚquerysetÚLocationSerializerÚserializer_classr   Úauthentication_classesr   r
   Úpermission_classes© ó    ú5C:\Users\user\Documents\project_loop\booking\views.pyr!   r!      ó4   „ Ø×Ñ×#Ñ#Ó%€HØ)ÐØ8Ð9ÐØ%×5Ñ5Ð6Ñr/   r!   c                   ód   — e Zd Zej                  j                  «       ZeZe	gZ
ej                  gZy)Ú$LocationRetrieveUpdateDestroyAPIViewNr"   r.   r/   r0   r3   r3   #   r1   r/   r3   c                   ó"   — e Zd ZdZegZegZd„ Zy)ÚNearbyLocationsViewz_
    View to get a list of locations within a 30 km radius of the user's current location.
    c                 ó&  — |j                   j                  d«      }|j                   j                  d«      }|�|€t        dddœt        j                  ¬«      S t        |«      }t        |«      }||f}g }t        j                  j                  «       D ]G  }|j                  |j                  f}t        ||«      j                  }|dk  sŒ7|j                  |«       ŒI t        |d¬	«      }	t        d
d|	j                   dœt        j                  ¬«      S )NÚlatitudeÚ	longituder   ú$Latitude and longitude are required.©r   Úmessager   é   T©Úmanyr   z(Nearby locations retrieved successfully.©r   r;   Údata)r@   Úgetr   r   ÚHTTP_400_BAD_REQUESTÚfloatr&   r'   r(   r7   r8   r   Ú
kilometersÚappendr*   ÚHTTP_200_OK)
ÚselfÚrequestÚuser_latitudeÚuser_longitudeÚuser_locationÚnearby_locationsÚlocationÚlocation_coordsÚdistanceÚ
serializers
             r0   rA   zNearbyLocationsView.get2   s  € àŸ™×(Ñ(¨Ó4ˆØ Ÿ™×)Ñ)¨+Ó6ˆàÐ  NÐ$:ÜØÐ)OÑPÜ×2Ñ2ôð ô ˜mÓ,ˆÜ˜~Ó.ˆØ&¨Ð7ˆð Ðô !×(Ñ(×,Ñ,Ó.ò 	2ˆHØ'×0Ñ0°(×2DÑ2DÐEˆOÜ ¨Ó?×JÑJˆHð ˜2‹~Ø ×'Ñ'¨Õ1ð	2ô (Ð(8¸tÔDˆ
ÜàØEØ"Ÿ™ñô
 ×%Ñ%ô
ð 	
r/   N)	r#   r$   r%   Ú__doc__r	   r,   r
   r-   rA   r.   r/   r0   r5   r5   *   s    „ ñð 2Ð2ÐØ)Ð*Ðó%
r/   r5   c                   ó   — e Zd ZegZegZd„ Zy)ÚAvailableVehicleTypesViewc           
      óü  — |j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }|r|r|st        dddœt        j                  ¬«      S 	 |d   }|d	   }|d   }|d	   }	 t        j                  j                  |d«      }	 t        ||||«      }	t        d|› d|› d�d¬«      }t        j                  «       t!        d¬«      z
  }||cxk  r|t!        d¬«      z   k  r‰n n†t"        j$                  j'                  t)        d|«      ¬«      j+                  d«      d d }t,        j$                  j/                  d|D �cg c]  }|j0                  ‘Œ c}dd¬«      j3                  «       }n,t,        j$                  j5                  «       j3                  «       }g }|D ]y  }|	|j6                  z  }|j9                  t;        d«      t<        ¬«      }|j?                  |j@                  |jB                  |jD                  |j6                  tG        |«      dœ«       Œ{ t        dd |d!œt        jH                  ¬«      S # t
        t        f$ r! t        dd
dœt        j                  ¬«      cY S w xY w# t        $ r! t        dddœt        j                  ¬«      cY S w xY w# t        $ r1}
t        dt        |
«      dœt        j                  ¬«      cY d }
~
S d }
~
ww xY wc c}w )"NÚfrom_addressÚ
to_addressÚ	ride_timer   z=From address, to address, and ride time details are required.r:   r   r7   r8   ú[Invalid address format. Latitude and longitude are required for both from and to addresses.ú%Y-%m-%dT%H:%M:%S%zzDInvalid ride time format. Use ISO format: YYYY-MM-DDTHH:MM:SS+HH:MM.úPOINT(Ú ú)éæ  ©Úsridé   ©Úminutesé   Úlast_known_location)rO   rO   é   TF)Úvehicle__statusÚ vehicle__assignments__driver__inÚvehicle__assignments__activeÚvehicle__assignments__on_rideú0.01©Úrounding)ÚidÚvehicle_typeÚseating_capacityÚper_km_chargeÚestimated_farer   zDAvailable vehicle types with estimated fares retrieved successfully.r?   )%r@   rA   r   r   rB   Ú	TypeErrorÚKeyErrorr   ÚdatetimeÚstrptimeÚ
ValueErrorÚcalculate_distancer   Ústrr   Únowr   r   r'   Úannotater   Úorder_byr   ÚfilterÚdriverÚdistinctr(   rp   Úquantizer   r   rE   rm   rn   ro   rC   rF   )rG   rH   rU   rV   rW   Úfrom_latitudeÚfrom_longitudeÚto_latitudeÚto_longituderO   ÚeÚ
from_pointÚadjusted_current_timeÚnearest_driversr}   Úavailable_vehicle_typesÚvehicle_types_with_faresrn   rq   Úrounded_fares                       r0   ÚpostzAvailableVehicleTypesView.post^   s
  € Ø—|‘|×'Ñ'¨Ó7ˆØ—\‘\×%Ñ% lÓ3ˆ
Ø—L‘L×$Ñ$ [Ó1ˆ	á¡±	ÜàØ^ñô ×2Ñ2ôð ð	Ø(¨Ñ4ˆMØ)¨+Ñ6ˆNØ$ ZÑ0ˆKØ% kÑ2ˆLð		Ü ×)Ñ)×2Ñ2°9Ð>SÓTˆIð	Ü)Ø˜~¨{¸LóˆHô ˜v nÐ%5°Q°}°oÀQÐGÈdÔSˆ
Ü (§¡£´À1Ô1EÑ EÐà!Øô=à$¤y¸Ô'<Ñ<õ=ô -×4Ñ4×=Ñ=Ü!Ð"7¸ÓDð >ó ç‰h�zÓ" 2 Að'ˆOô '2×&9Ñ&9×&@Ñ&@Ø $à0?ö2Ø&,�F—M“Mò2ð .2Ø.3ð 'Aó '÷ ‰h‹jñ $ô '2×&9Ñ&9×&=Ñ&=Ó&?×&HÑ&HÓ&JÐ#Ø#%Ð Ø3ò 	ˆLØ%¨×(BÑ(BÑBˆNØ)×2Ñ2´7¸6³?ÌXÐ2ÓVˆLØ$×+Ñ+à&Ÿ/™/Ø$0×$=Ñ$=Ø(4×(EÑ(EØ%1×%?Ñ%?Ü&+¨LÓ&9ñõð	ô àØaØ0ñô
 ×%Ñ%ô
ð 	
øô} œ8Ð$ò 	ÜàØ|ñô ×2Ñ2ôò ð	ûô ò 	ÜàØeñô ×2Ñ2ôò ð	ûô ò 	ÜØ¬¨Q«Ñ0Ü×2Ñ2ôõ ûð	üò$2sH   Á7I Â J Â-J< Å%K9
É-JÊJÊ'J9Ê8J9Ê<	K6Ë&K1Ë+K6Ë1K6N©r#   r$   r%   r	   r,   r
   r-   r‹   r.   r/   r0   rS   rS   Z   s   „ Ø1Ð2ÐØ)Ð*ÐóX
r/   rS   c                   ó   — e Zd ZegZegZd„ Zy)ÚFareEstimationViewc           
      ó¢  — t        d«       |j                  j                  d«      }|j                  j                  d«      }|j                  j                  d«      }|j                  j                  d«      }|r|r|r|s)t        d«       t        ddd	œt        j
                  ¬
«      S 	 t        d«       |d   }|d   }|d   }|d   }		 t        d«       t        ||||	«      }
	 t        d«       t        j                  j                  |¬«      }t        d«       |
|j                  z  }|j!                  t#        d«      t$        ¬«      }t        d«       t        ddd|j                  |
t'        |«      dœt        j(                  ¬
«      S # t        t        f$ r, t        d«       t        ddd	œt        j
                  ¬
«      cY S w xY w# t        $ r<}t        d«       t        dt        |«      d	œt        j
                  ¬
«      cY d }~S d }~ww xY w# t        j                  $ r, t        d«       t        ddd	œt        j                  ¬
«      cY S w xY w)NzStep 1: Retrieving request dataÚvehicle_type_idrU   rV   rW   z0Step 2: Checking if all required data is presentr   z6Vehicle type, address details, ride time are required.r:   r   z6Step 3: Extracting latitude and longitude from addressr7   r8   z'Step 4: Handling invalid address formatrX   zStep 5: Calculating distancez!Step 6: Handling validation errorzStep 7: Retrieving vehicle type©rm   z-Step 8: Handling vehicle type not found errorúVehicle type not found.z"Step 9: Calculating estimated farerj   rk   zStep 13: Returning responser   ú'Estimated fare calculated successfully.Ú20)r   r;   Ú	base_fareÚrate_per_kmÚtotal_kmrq   )Úprintr@   rA   r   r   rB   rr   rs   rw   r   rx   r   r'   ÚDoesNotExistÚHTTP_404_NOT_FOUNDrp   r   r   r   rC   rF   )rG   rH   r�   rU   rV   rW   r€   r�   r‚   rƒ   rO   r„   rn   rq   rŠ   s                  r0   r‹   zFareEstimationView.post½   sC  € ÜÐ/Ô0Ø!Ÿ,™,×*Ñ*Ð+<Ó=ˆØ—|‘|×'Ñ'¨Ó7ˆØ—\‘\×%Ñ% lÓ3ˆ
Ø—L‘L×$Ñ$ [Ó1ˆ	Ù¡L±ZÁIÜÐDÔEÜàØWñô ×2Ñ2ôð ð	ÜÐJÔKØ(¨Ñ4ˆMØ)¨+Ñ6ˆNØ$ ZÑ0ˆKØ% kÑ2ˆLð
	ÜÐ0Ô1Ü)Ø˜~¨{¸LóˆHð	ÜÐ3Ô4Ü&×.Ñ.×2Ñ2°oÐ2ÓFˆLô 	Ð2Ô3Ø! L×$>Ñ$>Ñ>ˆØ%×.Ñ.¬w°v«ÌÐ.ÓRˆäÐ+Ô,ÜàØDØ!Ø+×9Ñ9Ø$Ü"'¨Ó"5ñô ×%Ñ%ô

ð 
	
øôK œ8Ð$ò 	ÜÐ;Ô<ÜàØ|ñô ×2Ñ2ôò ð	ûô ò 	ÜÐ5Ô6ÜØ¬¨Q«Ñ0Ü×2Ñ2ôõ ûð	ûô ×'Ñ'ò 	ÜÐAÔBÜØÐ)BÑCÜ×0Ñ0ôò ð	úsB   Â*F	 Ã
G Ã$+H Æ	8GÇGÇ	HÇ1HÈHÈHÈ<IÉINrŒ   r.   r/   r0   rŽ   rŽ   ¹   s   „ Ø1Ð2ÐØ)Ð*ÐóE
r/   rŽ   c                   ó   — e Zd ZegZegZd„ Zy)ÚConfirmRideViewc                 óª  — |j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }t        |||||g«      st        dd	d
œt        j
                  ¬«      S t        j                  j                  |j                  d|i¬«      \  }	}
t        j                  j                  |j                  |	|t        d|d   › d|d   › d�d¬«      t        d|d   › d|d   › d�d¬«      ||t        j                  j                  |d«      d¬«	      }t!        t"        |«       t        dd|j$                  dœt        j&                  ¬«      S )Nr�   Úpickup_nameÚdropoff_nameÚpickup_locationÚdropoff_locationrW   Údevice_tokenr   zeAll fields  vehicle_type_id, pickup_location, dropoff_location, ride_time, device_token are required.r:   r   ©ÚuserÚdefaultsrZ   r8   r[   r7   r\   r]   r^   rY   Úpending)	r¤   Úuser_devicer�   r    r¡   rž   rŸ   rW   r   r   zRide confirmed successfully.)r   r;   Úride_id)r@   rA   r(   r   r   rB   r   r'   Úget_or_creater¤   ÚRideÚcreater   r   rt   ru   Úsetup_async_tasksÚprocess_new_riderm   rF   )rG   rH   r�   rž   rŸ   r    r¡   rW   r¢   r§   Ú_Únew_rides               r0   r‹   zConfirmRideView.post	  sÜ  € Ø!Ÿ,™,×*Ñ*Ð+<Ó=ˆØ—l‘l×&Ñ& }Ó5ˆØ—|‘|×'Ñ'¨Ó7ˆØ!Ÿ,™,×*Ñ*Ð+<Ó=ˆØ"Ÿ<™<×+Ñ+Ð,>Ó?ÐØ—L‘L×$Ñ$ [Ó1ˆ	Ø—|‘|×'Ñ'¨Ó7ˆäàØØ ØØðô
ô àð  Gñô ×2Ñ2ôð ô  Ÿ™×5Ñ5Ø—‘¨¸Ð(Fð 6ó 
‰ˆ�Qô
 —<‘<×&Ñ&Ø—‘Ø#Ø+Ü#Ø˜¨Ñ5Ð6°a¸È
Ñ8SÐ7TÐTUÐVØôô %ØÐ)¨+Ñ6Ð7°qÐ9IÈ*Ñ9UÐ8VÐVWÐXØôð $Ø%Ü×'Ñ'×0Ñ0°Ð<QÓRØð 'ó 
ˆô$ 	Ô*¨HÔ5äàØ9Ø#Ÿ;™;ñô
 ×%Ñ%ô
ð 	
r/   NrŒ   r.   r/   r0   rœ   rœ     s   „ Ø1Ð2ÐØ)Ð*Ðó:
r/   rœ   c                   ó   — e Zd ZegZegZd„ Zy)ÚDriverRideDetailViewc                 ó²  — 	 t         j                  j                  |¬«      }t	        dd|j                  j                  › d|j                  j                  › �|j                  |j                  |j                  j                  |j                  j                  d	œ|j                  j                  |j                  j                  d	œ|j                   rt#        |j                   «      nd |j$                  rt#        |j$                  «      nd d
œdœt
        j&                  ¬«      S # t         j                  $ r! t	        dddœt
        j                  ¬«      cY S w xY w)Nr‘   r   úRide not found.r:   r   r   ú$Ride details retrieved successfully.r[   ©r7   r8   )Ú	user_namerž   rŸ   Úpickup_coordinatesÚdropoff_coordinatesrO   rq   ©r   r;   Úride_details)rª   r'   rA   r™   r   r   rš   r¤   Ú
first_nameÚ	last_namerž   rŸ   r    ÚyÚxr¡   rO   rC   rq   rF   )rG   rH   r¨   Úrides       r0   rA   zDriverRideDetailView.getJ  s*  € ð	Ü—<‘<×#Ñ# wÐ#Ó/ˆDô àØAà$(§I¡I×$8Ñ$8Ð#9¸¸4¿9¹9×;NÑ;NÐ:OÐ!PØ#'×#3Ñ#3Ø$(×$5Ñ$5à$(×$8Ñ$8×$:Ñ$:Ø%)×%9Ñ%9×%;Ñ%;ñ+ð
 %)×$9Ñ$9×$;Ñ$;Ø%)×%:Ñ%:×%<Ñ%<ñ,ð 9=¿º¤ d§m¡mÔ 4È4à6:×6IÒ6Iœ˜d×1Ñ1Ô2Ètñ!ñô* ×%Ñ%ô-
ð 	
øô × Ñ ò 	ÜØÐ):Ñ;Ü×0Ñ0ôò ð	ús   ‚ D" Ä"1EÅEN©r#   r$   r%   r	   r,   r
   r-   rA   r.   r/   r0   r±   r±   F  s   „ Ø1Ð2ÐØ)Ð*Ðó 
r/   r±   c                   ó   — e Zd ZegZegZd„ Zy)ÚUpdateDriverLocationViewc           
      óâ  — |j                   j                  d«      }|j                   j                  d«      }|�|€t        dddœt        j                  ¬«      S 	 t
        j                  j                  |j                  dt        t        |«      t        |«      «      i¬«      \  }}t        d	d
dœt        j                  ¬«      S # t        $ r! t        dddœt        j                  ¬«      cY S w xY w)Nr7   r8   Úerrorr9   r:   r   rd   )r}   r¥   ÚsuccesszLocation updated successfully.zInvalid latitude or longitude.)r@   rA   r   r   rB   r   r'   Úupdate_or_creater¤   r   rC   rF   rv   )rG   rH   r7   r8   Údriver_locationÚcreateds         r0   r‹   zUpdateDriverLocationView.postq  sì   € Ø—<‘<×#Ñ# JÓ/ˆØ—L‘L×$Ñ$ [Ó1ˆ	àÐ˜yÐ0ÜØ"Ð/UÑVÜ×2Ñ2ôð ð
	ä'5×'=Ñ'=×'NÑ'NØ—|‘|à)¬5´°yÓ1AÄ5ÈÃ?Ó+Sðð (Oó (Ñ$ˆO˜Wô Ø$Ð1QÑRÜ×)Ñ)ôð øô ò 	ÜØ"Ð/OÑPÜ×2Ñ2ôò ð	ús   ÁA)C Ã'C.Ã-C.NrŒ   r.   r/   r0   rÂ   rÂ   m  ó   „ Ø1Ð2ÐØ)Ð*Ðór/   rÂ   c                   ó   — e Zd ZegZegZd„ Zy)ÚAcceptRideViewc                 óø  — |j                   }|j                  st        dddœt        j                  ¬«      S 	 t
        j                  j                  |¬«      }t        j                  j                  |d¬«      j                  «       }|rd|_        ||_        |j                  |_        |j                  «        d|_        |j                  «        t        j                  j!                  ||d¬	«       t#        |j                   |«       nt        dd
dœt        j$                  ¬«      S 	 t        dddœt        j*                  ¬«      S # t
        j&                  $ r! t        dddœt        j(                  ¬«      cY S w xY w)Nr   zOnly drivers can accept rides.r:   r   r‘   T)r}   ÚactiveÚaccepted)r¿   r}   Úresponsez.No active vehicle assignment found for driver.ú,Ride request not found or already processed.r   zRide accepted successfully.)r¤   Ú	is_driverr   r   ÚHTTP_403_FORBIDDENrª   r'   rA   r   r|   Úfirstr}   ÚvehicleÚsaveÚon_rideÚDriverResponseLogr«   Únotify_user_ride_acceptedrB   r™   rš   rF   ©rG   rH   r¨   r}   r¿   Úvehicle_assignments         r0   r‹   zAcceptRideView.post’  sm  € Ø—‘ˆà×ÒÜØÐ)IÑJÜ×0Ñ0ôð ð
#	Ü—<‘<×#Ñ# wÐ#Ó/ˆDÜ!2×!:Ñ!:×!AÑ!AØ dð "Bó "ç‰e‹gð ñ "Ø(�”Ø$�”Ø1×9Ñ9�”Ø—	‘	”Ø-1Ð"Ô*Ø"×'Ñ'Ô)Ü!×)Ñ)×0Ñ0ØØ!Ø'ð 1ô ô *¨$¯)©)°TÕ:äà"#Ø#Sñô "×6Ñ6ôð ð ;ô& ØÐ%BÑCÜ×%Ñ%ô
ð 	
øô × Ñ ò 	ÜàØMñô ×0Ñ0ôò ð	ús   ¸C-E Å1E9Å8E9NrŒ   r.   r/   r0   rË   rË   Ž  s   „ Ø1Ð2ÐØ)Ð*Ðó1
r/   rË   c                   ó   — e Zd ZegZegZd„ Zy)ÚRejectRideViewc                 ó  — |j                   }|j                  j                  d«      }|j                  st	        dddœt
        j                  ¬«      S 	 t        j                  j                  |¬«      }d|_        |j                  «        t        j                  j                  ||d|¬«       t	        d
ddœt
        j                  ¬«      S # t        j                  $ r! t	        dd	dœt
        j                  ¬«      cY S w xY w)NÚreasonr   zOnly drivers can reject rides.r:   r   r‘   Úrejected)r¿   r}   rÏ   rÞ   rÐ   r   zRide rejected successfully.)r¤   r@   rA   rÑ   r   r   rÒ   rª   r'   rÕ   r×   r«   r™   rš   rF   )rG   rH   r¨   r}   rÞ   r¿   s         r0   r‹   zRejectRideView.postÊ  sð   € Ø—‘ˆØ—‘×!Ñ! (Ó+ˆà×ÒÜØÐ)IÑJÜ×0Ñ0ôð ð
	Ü—<‘<×#Ñ# wÐ#Ó/ˆDØ$ˆDŒKØ�I‰IŒKÜ×%Ñ%×,Ñ,Ø &°:Àfð -ô ô ØÐ%BÑCÜ×%Ñ%ô
ð 	
øô × Ñ ò 	ÜàØMñô ×0Ñ0ôò ð	ús   ÁAC Ã1C?Ã>C?NrŒ   r.   r/   r0   rÜ   rÜ   Æ  s   „ Ø1Ð2ÐØ)Ð*Ðó
r/   rÜ   c                   ó   — e Zd ZegZegZd„ Zy)ÚDriverLocationViewc                 ó  — |j                   }	 t        j                  j                  ||dg¬«      }t        j                  j                  |j
                  ¬«      }t        dd|j                  j                  |j                  j                  dœdœt        j                  ¬«      S # t        j                  $ r! t        d	d
dœt        j                  ¬«      cY S t        j                  $ r! t        d	ddœt        j                  ¬«      cY S w xY w)NrÎ   )rm   r¤   Ú
status__in©r}   r   z'Driver location retrieved successfully.rµ   )r   r;   rÇ   r   r   zRide not found or not active.r:   zDriver location not available.)r¤   rª   r'   rA   r   r}   r   rd   r½   r¾   r   rF   r™   rš   )rG   rH   r¨   r¤   r¿   rÇ   s         r0   rA   zDriverLocationView.getï  sõ   € Ø�|‰|ˆð	Ü—<‘<×#Ñ# w°TÀzÀlÐ#ÓSˆDÜ,×4Ñ4×8Ñ8ÀÇÁÐ8ÓLˆOÜàØHà$3×$GÑ$G×$IÑ$IØ%4×%HÑ%H×%JÑ%Jñ(ñô ×)Ñ)ô
ð 
øô × Ñ ò 	ÜØÐ)HÑIÜ×0Ñ0ôò ô ×*Ñ*ò 	ÜØÐ)IÑJÜ×0Ñ0ôò ð	ús   ŽBB% Â%1DÃ0DÄ
DNrÀ   r.   r/   r0   rá   rá   ë  rÉ   r/   rá   c                   ó   — e Zd ZegZegZd„ Zy)ÚStartRideViewc                 óŠ  — |j                   j                  d«      }|j                  }|st        dddœt        j
                  ¬«      S 	 t        j                  j                  ||d¬«      }t        |j                  «      t        |«      k(  rdt        j                  «       |_        d|_        |j                  «        t        |j                  |«       t        d	d
dœt        j                  ¬«      S t        dddœt        j
                  ¬«      S # t        j                   $ r! t        dddœt        j"                  ¬«      cY S w xY w)NÚotpr   z"OTP is required to start the ride.r:   r   rÎ   ©rm   r}   r   Ústartedr   zRide started successfully.zInvalid OTP.z&Ride not found or already in progress.)r@   rA   r¤   r   r   rB   rª   r'   rx   rè   r   ry   Ú
start_timerÕ   Únotify_user_ride_startedrF   r™   rš   )rG   rH   r¨   rè   r}   r¿   s         r0   r‹   zStartRideView.post  s  € Ø�l‰l×Ñ˜uÓ%ˆØ—‘ˆáÜØÐ)MÑNÜ×2Ñ2ôð ð
	Ü—<‘<×#Ñ# w°vÀjÐ#ÓQˆDÜ�4—8‘8‹}¤ C£Ò(Ü"*§,¡,£.�”Ø'�”Ø—	‘	”Ü(¨¯©°DÔ9ÜØ Ð-IÑJÜ!×-Ñ-ôð ô
  Ø ¨^Ñ<Ü!×6Ñ6ôð øô × Ñ ò 	ÜØÐ)QÑRÜ×0Ñ0ôò ð	ús   Á	B&D Ã0D Ä1EÅENrŒ   r.   r/   r0   ræ   ræ     s   „ Ø1Ð2ÐØ)Ð*Ðór/   ræ   c                   ó   — e Zd ZegZegZd„ Zy)ÚEndRideViewc                 ó  — |j                   }	 t        j                  j                  ||d¬«      }d|_        t        j                  «       |_        |j                  «        t        |j                   |«       t        j                  j                  |¬«      }d|_        |j                  «        t        dddœt        j                  ¬	«      S # t        j                  $ r! t        d
ddœt        j                  ¬	«      cY S w xY w)NÚin_progressré   Ú	completedrä   Fr   zRide completed successfully.r:   r   r   z"Ride not found or not in progress.)r¤   rª   r'   rA   r   r   ry   Úend_timerÕ   Únotify_user_ride_finishedr   rÖ   r   rF   r™   rš   rÙ   s         r0   r‹   zEndRideView.post5  sÚ   € Ø—‘ˆð	Ü—<‘<×#Ñ# w°vÀmÐ#ÓTˆDØ%ˆDŒKÜ$ŸL™L›NˆDŒMØ�I‰IŒKÜ% d§i¡i°Ô6Ü!2×!:Ñ!:×!>Ñ!>ÀfÐ!>Ó!MÐØ).ÐÔ&Ø×#Ñ#Ô%ÜØÐ)GÑHÜ×)Ñ)ôð øô × Ñ ò 	ÜØÐ)MÑNÜ×0Ñ0ôò ð	ús   ŽB<C Ã1C?Ã>C?NrŒ   r.   r/   r0   rî   rî   1  s   „ Ø1Ð2ÐØ)Ð*Ðór/   rî   c                   ó   — e Zd ZegZegZd„ Zy)ÚRideDetailViewc           
      ó¶  — |j                   }	 t        j                  j                  ||¬«      }t	        dd|j
                  j
                  |j                  j                  |j                  j                  |j                  |j                  dœdœt        j                  ¬«      S # t        j                  $ r! t	        ddd	œt        j                  ¬«      cY S w xY w)
N)rm   r¤   r   r´   )rn   rÔ   Údriver_namerè   r   r¹   r   r   r³   r:   )r¤   rª   r'   rA   r   rn   rÔ   Úplate_numberr}   r»   rè   r   rF   r™   rš   )rG   rH   r¨   r¤   r¿   s        r0   rA   zRideDetailView.getP  s¾   € Ø�|‰|ˆð	Ü—<‘<×#Ñ# w°TÐ#Ó:ˆDÜàØEà(,×(9Ñ(9×(FÑ(FØ#'§<¡<×#<Ñ#<Ø'+§{¡{×'=Ñ'=Ø#Ÿx™xØ"&§+¡+ñ%ñ
ô ×)Ñ)ôð øô × Ñ ò 	ÜØÐ):Ñ;Ü×0Ñ0ôò ð	ús   ŽBB$ Â$1CÃCNrÀ   r.   r/   r0   rõ   rõ   L  s   „ Ø1Ð2ÐØ)Ð*Ðór/   rõ   c                   ó   — e Zd ZegZegZd„ Zy)ÚDriverApproachingViewc                 óŠ  — |j                   }|j                  st        dddœt        j                  ¬«      S 	 t
        j                  j                  ||d¬«      }t        |j                   |«       t        dd	dœt        j                  ¬«      S # t
        j                  $ r! t        dddœt        j                  ¬«      cY S w xY w)
Nr   z0Only drivers can send approaching notifications.r:   r   rÎ   ré   ú+Ride not found or not in an accepted state.r   z2Driver approaching notification sent successfully.)r¤   rÑ   r   r   rÒ   rª   r'   rA   Únotify_user_driver_reachingr™   rš   rF   ©rG   rH   r¨   r}   r¿   s        r0   r‹   zDriverApproachingView.postn  sÀ   € Ø—‘ˆà×ÒÜàØQñô ×0Ñ0ôð ð	Ü—<‘<×#Ñ# w°vÀjÐ#ÓQˆDÜ'¨¯	©	°4Ô8ô àØOñô ×%Ñ%ô
ð 	
øô × Ñ ò 	ÜØÐ)VÑWÜ×0Ñ0ôò ð	úó   ¸8B Â1CÃCNrŒ   r.   r/   r0   rú   rú   j  s   „ Ø1Ð2ÐØ)Ð*Ðó
r/   rú   c                   ó   — e Zd ZegZegZd„ Zy)ÚDriverArrivedViewc                 óŠ  — |j                   }|j                  st        dddœt        j                  ¬«      S 	 t
        j                  j                  ||d¬«      }t        |j                   |«       t        dd	dœt        j                  ¬«      S # t
        j                  $ r! t        dddœt        j                  ¬«      cY S w xY w)
Nr   z,Only drivers can send arrived notifications.r:   r   rÎ   ré   rü   r   z.Driver arrived notification sent successfully.)r¤   rÑ   r   r   rÒ   rª   r'   rA   Únotify_user_driver_arrivedr™   rš   rF   rþ   s        r0   r‹   zDriverArrivedView.post�  s¼   € Ø—‘ˆà×ÒÜàØMñô ×0Ñ0ôð ð	Ü—<‘<×#Ñ# w°vÀjÐ#ÓQˆDÜ& t§y¡y°$Ô7ô ØÐ%UÑVÜ×%Ñ%ô
ð 	
øô × Ñ ò 	ÜØÐ)VÑWÜ×0Ñ0ôò ð	úrÿ   NrŒ   r.   r/   r0   r  r  Œ  s   „ Ø1Ð2ÐØ)Ð*Ðó
r/   r  c                   ó"   — e Zd ZdZegZegZd„ Zy)ÚRideListViewz5
    View to list users with optional filtering.
    c                 ó.  — 	 |j                   }t        j                  j                  d
i |¤Ž}t	        |d¬«      }t        dd|j                   dœt        j                  ¬«      S # t        $ r(}t        ddd	œt        j                  ¬«      cY d }~S d }~ww xY w)NTr=   r   zRides retrieved successfullyr?   r   r   zAn unexpected error occurredr:   r.   )
r@   rª   r'   r|   ÚRideSerializerr   r   rF   Ú	ExceptionÚHTTP_500_INTERNAL_SERVER_ERROR)rG   rH   Úfilter_paramsÚridesrP   r„   s         r0   r‹   zRideListView.post³  sŽ   € ð	Ø#ŸL™LˆMÜ—L‘L×'Ñ'Ñ8¨-Ñ8ˆEÜ'¨°DÔ9ˆJÜàØ=Ø&ŸO™Oñô
 ×)Ñ)ôð øô ò 	ÜØÐ)GÑHÜ×<Ñ<ôõ ûð	ús   ‚A A# Á#	BÁ,BÂ	BÂBN©	r#   r$   r%   rQ   r   r,   r   r-   r‹   r.   r/   r0   r  r  «  s   „ ñð 9Ð9ÐØ%˜Ðór/   r  c                   ó   — e Zd ZegZegZd„ Zy)ÚCreateSharedRideViewc                 ó  — |j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }	t        ||||||	g«      st        d	d
dœt        j
                  ¬«      S t        |	«      d	k  rt        d	ddœt        j
                  ¬«      S 	 t        j                  j                  |¬«      }
t        j                  j                  |j                  d|i¬«      \  }}t        j                  j                  |j                  |
t!        d|d   › d|d   › d�d¬«      t!        d|d   › d|d   › d�d¬«      t"        j$                  j'                  |d«      |
j(                  t        |	«      t        |	«      d|||¬«      }t        dd|j*                  dœt        j,                  ¬«      S # t        j                  $ r! t        d	ddœt        j                  ¬«      cY S w xY w)Nr�   rž   rŸ   r    r¡   rW   r¢   Úseats_requiredr   zuAll fields are required: vehicle_type_id, pickup_location, dropoff_location, ride_time, device_token, seats_required.r:   r   ú7The number of seats required must be greater than zero.r‘   zInvalid vehicle type ID.r£   rZ   r8   r[   r7   r\   r]   r^   rY   r¦   )Úprimary_userrn   Úprimary_pickup_locationÚprimary_dropoff_locationrW   Úseats_totalÚseats_occupiedr  r   r§   rž   rŸ   r   z!Shared ride created successfully.©r   r;   Úshared_ride_id)r@   rA   r(   r   r   rB   Úintr   r'   r™   rš   r   r©   r¤   Ú
SharedRider«   r   r   rt   ru   ro   rm   ÚHTTP_201_CREATED)rG   rH   r�   rž   rŸ   r    r¡   rW   r¢   r  rn   r§   r®   Úshared_rides                 r0   r‹   zCreateSharedRideView.postË  s�  € Ø!Ÿ,™,×*Ñ*Ð+<Ó=ˆØ—l‘l×&Ñ& }Ó5ˆØ—|‘|×'Ñ'¨Ó7ˆØ!Ÿ,™,×*Ñ*Ð+<Ó=ˆØ"Ÿ<™<×+Ñ+Ð,>Ó?ÐØ—L‘L×$Ñ$ [Ó1ˆ	Ø—|‘|×'Ñ'¨Ó7ˆØ Ÿ™×)Ñ)Ð*:Ó;ˆô àØØ ØØØðô	
ô àð  Wñô ×2Ñ2ôð ô ˆ~Ó !Ò#ÜàØXñô ×2Ñ2ôð ð	Ü&×.Ñ.×2Ñ2°oÐ2ÓFˆLô  Ÿ™×5Ñ5Ø—‘¨¸Ð(Fð 6ó 
‰ˆ�Qô
 !×(Ñ(×/Ñ/Ø Ÿ™Ø%Ü$+Ø˜¨Ñ5Ð6°a¸È
Ñ8SÐ7TÐTUÐVØô%ô &-ØÐ)¨+Ñ6Ð7°qÐ9IÈ*Ñ9UÐ8VÐVWÐXØô&ô ×'Ñ'×0Ñ0°Ð<QÓRØ$×5Ñ5Ü˜~Ó.Ü˜~Ó.ØØ#Ø#Ø%ð% 0ó 
ˆô* àØ>Ø"-§.¡.ñô
 ×*Ñ*ô
ð 	
øôC ×'Ñ'ò 	ÜØÐ)CÑDÜ×0Ñ0ôò ð	ús   Ä5 I É1JÊ JNrŒ   r.   r/   r0   r  r  Ç  s   „ Ø1Ð2ÐØ)Ð*ÐóQ
r/   r  c                   ó   — e Zd ZegZegZd„ Zy)ÚListAvailableSharedRidesViewc                 ó4  — |j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }t        |||g«      st        dddœt        j
                  ¬«      S t        t        |d   «      t        |d	   «      d
¬«      }t        t        |d   «      t        |d	   «      d
¬«      }t        j                  j                  |d«      }|t        j                  d¬«      z
  }|t        j                  d¬«      z   }	t        j                  j                  ||	f|t        d¬«      f|t        d¬«      fd¬«      }
g }|
D ]›  }|j!                  |j"                  |j$                  j$                  |j$                  j"                  |j&                  |j(                  |j&                  z
  |j*                  |j,                  |j.                  j1                  «       dœ«       Œ� t        dd|dœt        j2                  ¬«      S )Nr    r¡   rW   r   zFAll fields are required: pickup_location, dropoff_location, ride_time.r:   r   r8   r7   r]   r^   rY   r<   ra   g      à?)Úkmr¦   )Úride_time__rangeÚ%primary_pickup_location__distance_lteÚ&primary_dropoff_location__distance_lter   )r  rn   r�   r  Úseats_remainingrž   rŸ   rW   r   z+Available shared rides listed successfully.)r   r;   r  )r@   rA   r(   r   r   rB   r   rC   r   rt   ru   r   r  r'   r|   r   rE   rm   rn   r  r  rž   rŸ   rW   Ú	isoformatrF   )rG   rH   r    r¡   rW   Úuser_pickup_pointÚuser_dropoff_pointÚuser_ride_timeÚtime_window_startÚtime_window_endÚavailable_ridesÚ
rides_listr¿   s                r0   r‹   z!ListAvailableSharedRidesView.post#  s  € Ø!Ÿ,™,×*Ñ*Ð+<Ó=ˆØ"Ÿ<™<×+Ñ+Ð,>Ó?ÐØ—L‘L×$Ñ$ [Ó1ˆ	ô �OÐ%5°yÐAÔBÜàØgñô ×2Ñ2ôð ô "Ü�/ +Ñ.Ó/Ü�/ *Ñ-Ó.Øô
Ðô
 #ÜÐ" ;Ñ/Ó0ÜÐ" :Ñ.Ó/Øô
Ðô "×*Ñ*×3Ñ3°IÐ?TÓUˆØ*¬X×-?Ñ-?ÈÔ-KÑKÐØ(¬8×+=Ñ+=ÀbÔ+IÑIˆô %×,Ñ,×3Ñ3Ø/°ÐAØ3DÄaÈ3ÄiÐ2PØ4FÌÈSÌ	Ð3RØð	 4ó 
ˆð ˆ
Ø#ò 	ˆDØ×Ñà&*§g¡gØ$(×$5Ñ$5×$BÑ$BØ'+×'8Ñ'8×';Ñ';Ø&*×&9Ñ&9Ø'+×'7Ñ'7¸$×:MÑ:MÑ'MØ#'×#3Ñ#3Ø$(×$5Ñ$5Ø!%§¡×!9Ñ!9Ó!;ñ	õð	ô àØHØ#ñô
 ×%Ñ%ô
ð 	
r/   NrŒ   r.   r/   r0   r  r    s   „ Ø1Ð2ÐØ)Ð*Ðó?
r/   r  c                   ó   — e Zd ZegZegZd„ Zy)ÚJoinSharedRideViewc           	      ó2  — |j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }t        |||g«      st        dddœt        j
                  ¬«      S t        |«      dk  rt        dddœt        j
                  ¬«      S 	 t        j                  j                  |d	¬
«      }|j                  t        |«      z   |j                  kD  rt        dddœt        j
                  ¬«      S t        j                  j                  |j                  d|i¬«      \  }}t         j                  j#                  ||j                  |j$                  |j&                  t        |«      |¬«       |xj                  t        |«      z  c_        |j)                  «        t        dd|j*                  dœt        j,                  ¬«      S # t        j                  $ r! t        dddœt        j                  ¬«      cY S w xY w)Nr  r¢   r  r   zFAll fields are required: shared_ride_id, device_token, seats_required.r:   r   r  r¦   ©rm   r   z'Shared ride not found or not available.zNot enough seats available.r£   )r  Úparticipant_userr    r¡   r  r¢   r   z$Successfully joined the shared ride.r  )r@   rA   r(   r   r   rB   r  r  r'   r™   rš   r  r  r   r©   r¤   ÚSharedRideParticipantr«   r  r  rÕ   rm   rF   )rG   rH   r  r¢   r  r  r§   r®   s           r0   r‹   zJoinSharedRideView.posti  sù  € Ø Ÿ™×)Ñ)Ð*:Ó;ˆØ—|‘|×'Ñ'¨Ó7ˆØ Ÿ™×)Ñ)Ð*:Ó;ˆô �N L°.ÐAÔBÜàØgñô ×2Ñ2ôð ô ˆ~Ó !Ò#ÜàØXñô ×2Ñ2ôð ð	Ü$×,Ñ,×0Ñ0°NÈ9Ð0ÓUˆKð ×%Ñ%¬¨NÓ(;Ñ;¸k×>UÑ>UÒUÜØÐ)FÑGÜ×2Ñ2ôð ô  Ÿ™×5Ñ5Ø—‘¨¸Ð(Fð 6ó 
‰ˆ�Qô
 	×%Ñ%×,Ñ,Ø#Ø$Ÿ\™\Ø'×?Ñ?Ø(×AÑAÜ˜~Ó.Ø$ð 	-ô 	
ð 	×"Ò"¤c¨.Ó&9Ñ9Õ"Ø×ÑÔäàØAØ"-§.¡.ñô
 ×%Ñ%ô
ð 	
øôA ×&Ñ&ò 	ÜØÐ)RÑSÜ×0Ñ0ôò ð	ús   Â+!G" Ç"1HÈHNrŒ   r.   r/   r0   r.  r.  e  s   „ Ø1Ð2ÐØ)Ð*ÐóC
r/   r.  c                   ó.   — e Zd ZdZegZegZd„ Zd„ Z	d„ Z
y)ÚSharedRideListViewz<
    View to list shared rides with optional filtering.
    c                 ó>   — t         j                  j                  «       S ©N)r  r'   r(   ©rG   s    r0   Úget_querysetzSharedRideListView.get_queryset·  s   € Ü×!Ñ!×%Ñ%Ó'Ð'r/   c                 ó8  — g }|D ]�  }||j                   j                  «       D �cg c]S  }||j                  |j                  |j                  |j
                  |j                  |j                  |j                  dœ‘ŒU c}dœ}|j                  |«       Œ� |S c c}w )N)Úparticipantr¢   r    r¡   rž   rŸ   r  Ú	joined_at)r¿   Úparticipants)
r<  r(   r¢   r    r¡   rž   rŸ   r  r;  rE   )rG   r)   Úcombined_datar¿   r:  Ú	ride_datas         r0   Úperform_querysetz#SharedRideListView.perform_querysetº  sª   € ØˆØò 	,ˆDàð (,×'8Ñ'8×'<Ñ'<Ó'>ö!ð $ð (3Ø(3×(@Ñ(@Ø+6×+FÑ+FØ,7×,HÑ,HØ'2×'>Ñ'>Ø(3×(@Ñ(@Ø*5×*DÑ*DØ%0×%:Ñ%:ó	ò!ñˆIð  × Ñ  Õ+ð#	,ð$ Ðùò!s   ¥ABc                 ó   — t         S r6  )ÚSharedRideSerializerr7  s    r0   Úget_serializer_classz'SharedRideListView.get_serializer_classÐ  s   € Ü#Ð#r/   N)r#   r$   r%   rQ   r   r,   r   r-   r8  r?  rB  r.   r/   r0   r4  r4  ¯  s)   „ ñð 9Ð9ÐØ%˜Ðò(òó,$r/   r4  c                   ó"   — e Zd ZdZegZegZd„ Zy)ÚRouteCreateViewz4
    View to add a new route and its sequences.
    c                 óB  — 	 |j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }t        j                  j	                  |d   |d   |d   dœ¬«      \  }}t        j                  j	                  |d   |d   |d   dœ¬«      \  }}g }|D ]W  }	|	j                  d	«      }
t        j                  j	                  |	d   |	d   |	d   dœ¬«      \  }}|j                  ||
d
œ«       ŒY t        j                  j                  |j                   j                  d«      |j                   j                  d«      ||¬«      }t        |d„ ¬«      D ]*  }t        j                  j                  ||d   |d	   ¬«       Œ, t        |«      }t        |j                   t        j                  ¬«      S # t        $ rD}t        dt        |«      t!        j"                  «       dœt        j$                  ¬«      cY d }~S d }~ww xY w)NÚpickup_pointÚdropoff_pointÚintermediate_pointsÚnamer7   r8   rµ   ©rI  r¥   Úorder©ÚpointrK  Údescription)rI  rN  rF  rG  c                 ó   — | d   S ©NrK  r.   ©r¾   s    r0   ú<lambda>z&RouteCreateView.post.<locals>.<lambda>	  s
   € È1ÈWÉ:€ r/   ©ÚkeyrM  ©ÚrouterM  rK  r   r   ©r   r;   Út)r@   rA   Ú
RoutePointr'   rÆ   rE   ÚRouter«   ÚsortedÚSequenceÚRouteSerializerr   r   r  r  rx   Ú	tracebackÚ
format_excrB   )rG   rH   Úpickup_point_dataÚdropoff_point_dataÚintermediate_points_datarF  rÈ   rG  rH  Ú
point_datarK  rM  rV  Úsequence_datarP   r„   s                   r0   r‹   zRouteCreateView.postÜ  s+  € ð;	à '§¡× 0Ñ 0°Ó @ÐØ!(§¡×!1Ñ!1°/Ó!BÐØ'.§|¡|×'7Ñ'7Ð8MÓ'NÐ$ô %/×$6Ñ$6×$GÑ$GØ& vÑ.à 1°*Ñ =Ø!2°;Ñ!?ñð %Hó %Ñ!ˆL˜'ô &0×%7Ñ%7×%HÑ%HØ'¨Ñ/à 2°:Ñ >Ø!3°KÑ!@ñð &Ió &Ñ"ˆM˜7ð #%ÐØ6ò 	M�
Ø"Ÿ™ wÓ/�Ü!+×!3Ñ!3×!DÑ!DØ# FÑ+à$.¨zÑ$:Ø%/°Ñ%<ñð "Eó "‘��wð $×*Ñ*°UÀUÑ+KÕLð	Mô —M‘M×(Ñ(Ø—\‘\×%Ñ% fÓ-Ø#ŸL™L×,Ñ,¨]Ó;Ø)Ø+ð	 )ó ˆEô "(Ð(;ÑAUÔ!Vò �Ü× Ñ ×'Ñ'ØØ'¨Ñ0Ø'¨Ñ0ð (õ ðô )¨Ó/ˆJÜ˜JŸO™O´F×4KÑ4KÔLÐLøäò 	ÜØ¬¨Q«´i×6JÑ6JÓ6LÑMÜ×2Ñ2ôõ ûð	ús   ‚GG Ç	HÇ9HÈHÈHNr  r.   r/   r0   rD  rD  Ô  s   „ ñð 9Ð9ÐØ%˜Ðó<r/   rD  c                   ó"   — e Zd ZdZegZegZd„ Zy)ÚRouteUpdateViewz=
    View to update an existing route and its sequences.
    c                 ó€  — 	 t         j                  j                  |¬«      }|j                  j                  d«      }|j                  j                  d«      }|j                  j                  d«      }|r7t        j                  j                  |d   |d   |d   dœ¬	«      \  }}||_        |r7t        j                  j                  |d   |d   |d   dœ¬	«      \  }	}|	|_        |rÁg }
|D ]W  }|j                  d
«      }t        j                  j                  |d   |d   |d   dœ¬	«      \  }}|
j                  ||dœ«       ŒY |j                  j                  «       j                  «        t        |
d„ ¬«      D ]*  }t        j                  j                  ||d   |d
   ¬«       Œ, |j                  j                  d|j                  «      |_        |j                  j                  d|j                   «      |_        |j#                  «        t%        |«      }t'        |j                  t(        j*                  ¬«      S # t         j,                  $ r! t'        dddœt(        j.                  ¬«      cY S t0        $ rD}t'        dt3        |«      t5        j6                  «       dœt(        j8                  ¬«      cY d }~S d }~ww xY w)Nr‘   rF  rG  rH  rI  r7   r8   rµ   rJ  rK  rL  c                 ó   — | d   S rP  r.   rQ  s    r0   rR  z%RouteUpdateView.put.<locals>.<lambda>V  s
   € °q¸±z€ r/   rS  rM  rU  rN  r   r   úRoute not foundr:   rW  )rZ  r'   rA   r@   rY  rÆ   rF  rG  rE   Ú	sequencesr(   Údeleter[  r\  r«   rI  rN  rÕ   r]  r   r   rF   r™   rš   r  rx   r^  r_  rB   )rG   rH   Úroute_idrV  r`  ra  rb  rF  rÈ   rG  rH  rc  rK  rM  rd  rP   r„   s                    r0   ÚputzRouteUpdateView.put#  s±  € ðM	ä—M‘M×%Ñ%¨Ð%Ó2ˆEð !(§¡× 0Ñ 0°Ó @ÐØ!(§¡×!1Ñ!1°/Ó!BÐØ'.§|¡|×'7Ñ'7Ð8MÓ'NÐ$ñ !Ü(2×(:Ñ(:×(KÑ(KØ*¨6Ñ2à$5°jÑ$AØ%6°{Ñ%Cñð )Ló )Ñ%�˜gð &2�Ô"ñ "Ü)3×);Ñ);×)LÑ)LØ+¨FÑ3à$6°zÑ$BØ%7¸Ñ%Dñð *Mó *Ñ&�˜wð '4�Ô#ñ (Ø&(Ð#Ø":ò 	Q�JØ&ŸN™N¨7Ó3�EÜ%/×%7Ñ%7×%HÑ%HØ'¨Ñ/à(2°:Ñ(>Ø)3°KÑ)@ñ"ð &Ió &‘N�E˜7ð (×.Ñ.¸ÈÑ/OÕPð	Qð —‘×#Ñ#Ó%×,Ñ,Ô.ô &,Ø'Ñ-Aô&ò �Mô ×$Ñ$×+Ñ+Ø#Ø+¨GÑ4Ø+¨GÑ4ð ,õ ðð !Ÿ™×)Ñ)¨&°%·*±*Ó=ˆEŒJØ '§¡× 0Ñ 0°À×@QÑ@QÓ RˆEÔØ�J‰JŒLô )¨Ó/ˆJÜ˜JŸO™O´F×4FÑ4FÔGÐGøä×!Ñ!ò 	ÜØÐ):Ñ;Ü×0Ñ0ôò ô
 ò 	ÜØ¬¨Q«´i×6JÑ6JÓ6LÑMÜ×2Ñ2ôõ ûð	ús$   ‚H;H> È>1J=É1J=É99J8Ê2J=Ê8J=N)	r#   r$   r%   rQ   r   r,   r   r-   rm  r.   r/   r0   rf  rf    s    „ ñð 9Ð9ÐØ%˜ÐóNr/   rf  c                   ó"   — e Zd ZdZegZegZd„ Zy)ÚRouteListViewz"
    View to list all routes.
    c                 ó  — 	 t         j                  j                  «       }t        |d¬«      }t	        |j
                  t        j                  ¬«      S # t        $ r1}t	        dt        |«      dœt        j                  ¬«      cY d }~S d }~ww xY w©NTr=   r   r   r:   )rZ  r'   r(   r]  r   r@   r   rF   r  rx   rB   )rG   rH   ÚroutesrP   r„   s        r0   rA   zRouteListView.get|  sq   € ð	ä—]‘]×&Ñ&Ó(ˆFô )¨°dÔ;ˆJô ˜JŸO™O´F×4FÑ4FÔGÐGøäò 	ÜØ¬¨Q«Ñ0¼×9TÑ9Tôõ ûð	úó   ‚AA Á	BÁ&BÂBÂBN)	r#   r$   r%   rQ   r   r,   r   r-   rA   r.   r/   r0   ro  ro  t  s   „ ñð 9Ð9ÐØ%˜Ðór/   ro  c                   ó"   — e Zd ZdZegZegZd„ Zy)ÚRouteDeleteViewz!
    View to delete a route.
    c                 óz  — 	 t         j                  j                  |«      }|j                  «        t	        ddit
        j                  ¬«      S # t         j                  $ r! t	        dddœt
        j                  ¬«      cY S t        $ r1}t	        dt        |«      dœt
        j                  ¬«      cY d }~S d }~ww xY w)Nr   zRoute deleted successfullyr   r   ri  r:   )rZ  r'   rA   rk  r   r   ÚHTTP_204_NO_CONTENTr™   rš   r  rx   rB   )rG   rH   rl  rV  r„   s        r0   rk  zRouteDeleteView.delete•  s§   € ð	ä—M‘M×%Ñ% hÓ/ˆEð �L‰LŒNäØÐ7Ð8Ü×1Ñ1ôð øô
 ×!Ñ!ò 	ÜØÐ):Ñ;Ü×0Ñ0ôò ô
 ò 	ÜØ¬¨Q«Ñ0¼×9TÑ9Tôõ ûð	ús$   ‚AA Á1B:ÂB:Â	&B5Â/B:Â5B:N)	r#   r$   r%   rQ   r   r,   r   r-   rk  r.   r/   r0   ru  ru  �  s   „ ñð 9Ð9ÐØ%˜Ðór/   ru  c                   ó   — e Zd ZegZegZd„ Zy)ÚScheduledRideMasterCreateViewc           	      ód  — 	 |j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }t        ||||||g«      st        ddd	œt        j
                  ¬
«      S t        j                  j                  |¬«      }t        j                  j                  |¬«      }	t        j                  «       5  t        j                  j                  |||||	|¬«      }
d d d «       t        
«      }t        |j                   t        j                  ¬
«      S # 1 sw Y   Œ9xY w# t        j                  $ r! t        ddd	œt        j                   ¬
«      cY S t        j                  $ r! t        ddd	œt        j                   ¬
«      cY S t"        $ r1}t        dt%        |«      d	œt        j
                  ¬
«      cY d }~S d }~ww xY w)NrI  Ústarting_timeÚending_timerV  rÔ   r   r   úAll fields are required.r:   r   r‘   )rI  r{  r|  rV  rÔ   r   úRoute not found.úVehicle not found.)r@   rA   r(   r   r   rB   rZ  r'   r   r   ÚatomicÚScheduledRideMasterr«   ÚScheduledRideMasterSerializerr  r™   rš   r  rx   )rG   rH   rI  r{  r|  rl  Ú
vehicle_idÚmaster_statusrV  rÔ   Úscheduled_ride_masterrP   r„   s                r0   r‹   z"ScheduledRideMasterCreateView.postp  sì  € ð-	Ø—<‘<×#Ñ# FÓ+ˆDØ#ŸL™L×,Ñ,¨_Ó=ˆMØ!Ÿ,™,×*Ñ*¨=Ó9ˆKØ—|‘|×'Ñ'¨Ó0ˆHØ Ÿ™×)Ñ)¨)Ó4ˆJØ#ŸL™L×,Ñ,¨XÓ6ˆMäØ�} k°8¸ZÈÐWôô  Ø Ð-GÑHÜ!×6Ñ6ôð ô
 —M‘M×%Ñ%¨Ð%Ó2ˆEÜ—o‘o×)Ñ)¨ZÐ)Ó8ˆGä×#Ñ#Ó%ñ Ü(;×(CÑ(C×(JÑ(JØØ"/Ø +ØØ#Ø(ð )Kó )Ð%÷ô 7Ð7LÓMˆJÜ˜JŸO™O´F×4KÑ4KÔLÐL÷ð ûô ×!Ñ!ò 	ÜØÐ);Ñ<Ü×0Ñ0ôò ô ×#Ñ#ò 	ÜØÐ)=Ñ>Ü×0Ñ0ôò ô ò 	ÜØ¬¨Q«Ñ0¼×9TÑ9Tôõ ûð	úsI   ‚CF ÃAF Ä'&FÅ7F ÆFÆ
F Æ1H/Ç0H/Ç6H/Ç>&H*È$H/È*H/N)r#   r$   r%   r   r,   r   r-   r‹   r.   r/   r0   ry  ry  l  s   „ Ø8Ð9ÐØ%˜Ðó.r/   ry  c                   ó   — e Zd ZegZegZd„ Zy)ÚScheduledRideMasterUpdateViewc                 óà  — 	 |j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }t        ||||||g«      st        ddd	œt        j
                  ¬
«      S t        j                  j                  |¬«      }	t        j                  j                  |¬«      }
t        j                  j                  |¬«      }||_
        ||_        ||_        |	|_        |
|_        ||_        |j                  «        t!        |«      }t        |j                   t        j"                  ¬
«      S # t        j$                  $ r! t        ddd	œt        j&                  ¬
«      cY S t        j$                  $ r! t        ddd	œt        j&                  ¬
«      cY S t        j$                  $ r! t        ddd	œt        j&                  ¬
«      cY S t(        $ r1}t        dt+        |«      d	œt        j
                  ¬
«      cY d }~S d }~ww xY w)NrI  r{  r|  rV  rÔ   r   r   r}  r:   r   r‘   r~  r  ú Scheduled Ride Master not found.)r@   rA   r(   r   r   rB   rZ  r'   r   r�  rI  r{  r|  rV  rÔ   rÕ   r‚  rF   r™   rš   r  rx   )rG   rH   rm   rI  r{  r|  rl  rƒ  r„  rV  rÔ   r…  rP   r„   s                 r0   rm  z!ScheduledRideMasterUpdateView.put¥  s$  € ð1	Ø—<‘<×#Ñ# FÓ+ˆDØ#ŸL™L×,Ñ,¨_Ó=ˆMØ!Ÿ,™,×*Ñ*¨=Ó9ˆKØ—|‘|×'Ñ'¨Ó0ˆHØ Ÿ™×)Ñ)¨)Ó4ˆJØ#ŸL™L×,Ñ,¨XÓ6ˆMäØ�} k°8¸ZÈÐWôô  Ø Ð-GÑHÜ!×6Ñ6ôð ô
 —M‘M×%Ñ%¨Ð%Ó2ˆEÜ—o‘o×)Ñ)¨ZÐ)Ó8ˆGÜ$7×$?Ñ$?×$CÑ$CÀrÐ$CÓ$JÐ!à)-Ð!Ô&Ø2?Ð!Ô/Ø0;Ð!Ô-Ø*/Ð!Ô'Ø,3Ð!Ô)Ø+8Ð!Ô(Ø!×&Ñ&Ô(ä6Ð7LÓMˆJÜ˜JŸO™O´F×4FÑ4FÔGÐGøä×!Ñ!ò 	ÜØÐ);Ñ<Ü×0Ñ0ôò ô ×#Ñ#ò 	ÜØÐ)=Ñ>Ü×0Ñ0ôò ô #×/Ñ/ò 	ÜØÐ)KÑLÜ×0Ñ0ôò ô ò 	ÜØ¬¨Q«Ñ0¼×9TÑ9Tôõ ûð	ús7   ‚CF ÃC	F Æ1I-Ç0I-È0I-È4I-È<&I(É"I-É(I-N)r#   r$   r%   r   r,   r   r-   rm  r.   r/   r0   r‡  r‡  ¡  s   „ Ø8Ð9ÐØ%˜Ðó2r/   r‡  c                   ó   — e Zd ZegZegZd„ Zy)ÚScheduledRideMasterDeleteViewc                 ó~  — 	 t         j                  j                  |¬«      }|j                  «        t	        dddœt
        j                  ¬«      S # t         j                  $ r! t	        dddœt
        j                  ¬«      cY S t        $ r1}t	        dt        |«      dœt
        j                  ¬«      cY d }~S d }~ww xY w)Nr‘   r   z+Scheduled Ride Master deleted successfully.r:   r   r   r‰  )r�  r'   rA   rk  r   r   rw  r™   rš   r  rx   rB   )rG   rH   rm   r…  r„   s        r0   rk  z$ScheduledRideMasterDeleteView.deleteÞ  s®   € ð	Ü$7×$?Ñ$?×$CÑ$CÀrÐ$CÓ$JÐ!Ø!×(Ñ(Ô*ÜØÐ)VÑWÜ×1Ñ1ôð øô #×/Ñ/ò 	ÜØÐ)KÑLÜ×0Ñ0ôò ô ò 	ÜØ¬¨Q«Ñ0¼×9TÑ9Tôõ ûð	ús$   ‚AA Á1B<ÂB<Â&B7Â1B<Â7B<N)r#   r$   r%   r   r,   r   r-   rk  r.   r/   r0   r‹  r‹  Ú  s   „ Ø8Ð9ÐØ%˜Ðór/   r‹  c                   ó   — e Zd ZegZegZd„ Zy)ÚScheduledRideMasterListViewc                 ó  — 	 t         j                  j                  «       }t        |d¬«      }t	        |j
                  t        j                  ¬«      S # t        $ r1}t	        dt        |«      dœt        j                  ¬«      cY d }~S d }~ww xY wrq  )r�  r'   r(   r‚  r   r@   r   rF   r  rx   rB   )rG   rH   Úscheduled_ridesrP   r„   s        r0   rA   zScheduledRideMasterListView.getõ  so   € ð	Ü1×9Ñ9×=Ñ=Ó?ˆOÜ6°ÈTÔRˆJÜ˜JŸO™O´F×4FÑ4FÔGÐGøÜò 	ÜØ¬¨Q«Ñ0¼×9TÑ9Tôõ ûð	úrs  N)r#   r$   r%   r   r,   r   r-   rA   r.   r/   r0   rŽ  rŽ  ñ  s   „ Ø8Ð9ÐØ%˜Ðór/   rŽ  c                   ó   — e Zd ZegZegZd„ Zy)ÚScheduledRideMobileListViewc                 óî  — 	 t        |j                  j                  d«      «      }t        |j                  j                  d«      «      }||f}t        j                  «       j                  «       }	 t        j                  j                  d¬«      }|j                  «       st        dd	dœt        j                  ¬«      S g }|D ]‡  }	 t         j                  j                  |t        j                  «       j#                  «       ¬
«      }	|	j                  dk(  r4|	j$                  |	j&                  z
  }
|
dkD  r||
dœ}|j)                  |«       Œ‰ |st        dd	dœt        j                  ¬«      S g }|D ]Ö  }|d   }|j2                  }|j4                  gt7        |j8                  j;                  «       «      z   }|D ]�  }|j<                  |j>                  f}tA        ||«      jB                  }|dk  sŒ7tA        ||j4                  j<                  |j4                  j>                  f«      jB                  |_"        |j)                  |«        ŒÖ ŒØ |jG                  d„ ¬«       g }|D ]5  }tI        |d   «      }|j                  }|d   |d<   |j)                  |«       Œ7 t        dd|dœt        j                  ¬«      S # t        t        f$ r! t        dddœt        j                  ¬«      cY S w xY w# t         j*                  $ r8 ||j,                  j.                  j0                  dœ}|j)                  |«       Y �Œrw xY w# tJ        $ r2}t        ddtM        |«      dœt        jN                  ¬«      cY d }~S d }~ww xY w)Nr7   r8   r   z'Invalid latitude or longitude provided.r:   r   rÍ   r   zNo rides available.©Úscheduled_rideÚdater¦   )r¿   Úavailable_seatsr¿   é   c                 ó    — | d   j                   S )Nr¿   )Údistance_to_start)Úentrys    r0   rR  z1ScheduledRideMobileListView.get.<locals>.<lambda>¢  s   € ¨u°V©}×/NÑ/N€ r/   rS  r—  z%Scheduled Rides Fetched successfully.)r   r;   ÚRideszUnexpected error)r   r;   Ú	exception)(rC   r@   rA   rr   rv   r   r   rB   r   ry   Útimer�  r'   r|   ÚexistsrF   ÚScheduledRideDayr–  Útotal_seatsÚbooked_seatsrE   r™   rÔ   rn   ro   rV  rF  ÚlistrH  r(   r7   r8   r   r   rš  ÚsortÚScheduledRideMobileSerializerr  rx   r	  )rG   rH   rI   rJ   rK   Úcurrent_timer�  Úfiltered_ridesr¿   Úscheduled_ride_dayr—  Ú
ride_entryÚfinal_ridesr›  rV  ÚpointsrM  Úpoint_locationrO   Úresponse_dataÚride_serializerr>  r„   s                          r0   rA   zScheduledRideMobileListView.getb  sn  € ð	Ü! '§,¡,×"2Ñ"2°:Ó">Ó?ˆMÜ" 7§<¡<×#3Ñ#3°KÓ#@ÓAˆNð '¨Ð7ˆÜ—|‘|“~×*Ñ*Ó,ˆðH	Ü1×9Ñ9×@Ñ@ÈÐ@ÓQˆOà"×)Ñ)Ô+ÜØ Ð-BÑCÜ!×-Ñ-ôð ð
  ˆNØ'ò 6�ð6Ü)9×)AÑ)A×)EÑ)EØ'+´(·,±,³.×2EÑ2EÓ2Gð *Fó *Ð&ð *×0Ñ0°IÒ=à.×:Ñ:Ð=O×=\Ñ=\Ñ\ð (ð +¨QÒ.Ø26È?Ñ)[˜JØ*×1Ñ1°*Ô=øð6ñ& "ÜØ Ð-BÑCÜ!×-Ñ-ôð ð
 ˆKØ'ò �Ø˜V‘}�ØŸ
™
�Ø×,Ñ,Ð-´°U×5NÑ5N×5RÑ5RÓ5TÓ0UÑU�Ø#ò 	�EØ&+§n¡n°e·o±oÐ%F�NÜ'¨°~ÓF×IÑI�HØ 2“~Ü19Ø)Ø"×/Ñ/×8Ñ8¸%×:LÑ:L×:VÑ:VÐWó2÷ ™"ð Ô.ð $×*Ñ*¨5Ô1Ùñ	ð	ð ×ÑÑ!NÐÔOàˆMØ$ò 0�Ü"?ÀÀfÁÓ"N�Ø+×0Ñ0�	Ø/4Ð5FÑ/G�	Ð+Ñ,Ø×$Ñ$ YÕ/ð	0ô àØFØ*ñô
 ×)Ñ)ôð øôK œ:Ð&ò 	ÜØÐ)RÑSÜ×2Ñ2ôò ð	ûô> (×4Ñ4ò 6à $Ø+/¯<©<×+DÑ+D×+UÑ+Uñ"�Jð #×)Ñ)¨*×5ð6ûô\ ò 	ÜØÐ);Ì#ÈaË&ÑQÜ×<Ñ<ôõ ûð	úsk   ‚AJ8 Á1AL9 Â?L9 ÃBK+Å!L9 Å-BL9 Ç/CL9 Ê8-K(Ë'K(Ë+AL6Ì2L9 Ì5L6Ì6L9 Ì9	M4Í'M/Í)M4Í/M4NrÀ   r.   r/   r0   r’  r’  ^  s   „ Ø1Ð2ÐØ)Ð*ÐóUr/   r’  c                   ó   — e Zd ZegZegZd„ Zy)ÚScheduledFareEstimationViewc                 ó  — |j                   j                  d«      }|j                   j                  d«      }|j                   j                  d«      }|j                   j                  dd«      }|j                   j                  d«      }|r|r|r|st        ddd	œt        j                  ¬
«      S 	 |d   }|d   }|d   }	|d   }
	 t        |||	|
«      }	 t        j                  j                  |¬«      }||j                  z  |z  }|j                  t!        d«      t"        ¬«      }t        dd|j$                  |j                  ||t'        |«      dœt        j(                  ¬
«      S # t
        t        f$ r! t        ddd	œt        j                  ¬
«      cY S w xY w# t        $ r1}t        dt        |«      d	œt        j                  ¬
«      cY d }~S d }~ww xY w# t        j                  $ r! t        ddd	œt        j                  ¬
«      cY S w xY w)Nr�   rU   rV   r  r   rW   r   zKVehicle type, address details, ride time, and seats required are mandatory.r:   r   r7   r8   rX   r‘   r’   rj   rk   r“   )r   r;   r•   Úrate_per_km_per_seatr—   r  rq   )r@   rA   r   r   rB   rr   rs   rw   r   rx   r   r'   r™   rš   Úfare_per_km_per_seatr   r   r   r•   rC   rF   )rG   rH   r�   rU   rV   r  rW   r€   r�   r‚   rƒ   rO   r„   rn   rq   rŠ   s                   r0   r‹   z ScheduledFareEstimationView.post½  s  € Ø!Ÿ,™,×*Ñ*Ð+<Ó=ˆØ—|‘|×'Ñ'¨Ó7ˆØ—\‘\×%Ñ% lÓ3ˆ
Ø Ÿ™×)Ñ)Ð*:¸AÓ>ˆØ—L‘L×$Ñ$ [Ó1ˆ	á¡L±ZÁIÜàØlñô ×2Ñ2ôð ð	Ø(¨Ñ4ˆMØ)¨+Ñ6ˆNØ$ ZÑ0ˆKØ% kÑ2ˆLð	Ü)¨-¸ÈÐVbÓcˆHð	Ü&×.Ñ.×2Ñ2°oÐ2ÓFˆLð " L×$EÑ$EÑEÈÑVˆØ%×.Ñ.¬w°v«ÌÐ.ÓRˆäàØDØ)×3Ñ3Ø(4×(IÑ(IØ$Ø"0Ü"'¨Ó"5ñô ×%Ñ%ô
ð 	
øô9 œ8Ð$ò 	ÜàØ|ñô ×2Ñ2ôò ð	ûô ò 	ÜØ¬¨Q«Ñ0Ü×2Ñ2ôõ ûð	ûô ×'Ñ'ò 	ÜØÐ)BÑCÜ×0Ñ0ôò ð	úsB   Â0E& ÃF Ã G Å&-FÆFÆ	GÆ"&GÇGÇGÇ1H
È	H
NrŒ   r.   r/   r0   r°  r°  ¹  s   „ Ø1Ð2ÐØ)Ð*Ðó<
r/   r°  c                   ó   — e Zd ZegZegZd„ Zy)ÚJoinScheduledRideViewc           	      ó†  — |j                   j                  d«      }|j                   j                  dd«      }|j                   j                  d«      }|j                   j                  d«      }|r|r|st        dddœt        j                  ¬	«      S 	 |d
   }|d   }|d
   }|d   }	|j                  }
	 t        j                  j                  |d¬«      }t        j                  «       j                  «       }	 t        j                  j                  ||¬«      }|j                  dk7  rt        dddœt        j                  ¬	«      S 	 |j(                  |j*                  z
  }||kD  rt        dddœt        j                  ¬	«      S |xj*                  |z  c_        |j-                  «        t.        j                  j!                  ||
t1        ||«      t1        ||	«      |¬«       t        dddœt        j2                  ¬	«      S # t
        t        f$ r! t        dddœt        j                  ¬	«      cY S w xY w# t        j                  $ r! t        dddœt        j                  ¬	«      cY S w xY w# t        j                  $ rE t        j                  j!                  |||j"                  j$                  j&                  d¬«      }Y �Œxw xY w)Nr¨   r  r   Ú
join_pointÚ	end_pointr   z0Ride ID, join point, and end point are required.r:   r   r7   r8   zWInvalid point format. Latitude and longitude are required for both join and end points.rÍ   r0  zRide not found or inactive.r”  r¦   z"Ride is not available for joining.)r•  r–  r¡  r¢  zNot enough available seats.)r¨  r¤   r·  r¸  r  zSuccessfully joined the ride.)r@   rA   r   r   rB   rr   rs   r¤   r�  r'   r™   rš   r   ry   r–  r   r«   rÔ   rn   ro   r¡  r¢  rÕ   ÚScheduledRideParticipantr   rF   )rG   rH   r¨   r  r·  r¸  Újoin_latitudeÚjoin_longitudeÚend_latitudeÚend_longituder¤   r¿   Útodayr¨  r—  s                  r0   r‹   zJoinScheduledRideView.postÿ  s³  € Ø—,‘,×"Ñ" 9Ó-ˆØ Ÿ™×)Ñ)Ð*:¸AÓ>ˆØ—\‘\×%Ñ% lÓ3ˆ
Ø—L‘L×$Ñ$ [Ó1ˆ	á™J©9ÜØÐ)[Ñ\Ü×2Ñ2ôð ð
		Ø& zÑ2ˆMØ'¨Ñ4ˆNØ$ ZÑ0ˆLØ% kÑ2ˆMð �|‰|ˆð	Ü&×.Ñ.×2Ñ2°gÀhÐ2ÓOˆDô —‘“×#Ñ#Ó%ˆð	Ü!1×!9Ñ!9×!=Ñ!=ÈTÐX]Ð!=Ó!^ÐØ!×(Ñ(¨IÒ5ÜØ Ð-QÑRÜ!×6Ñ6ôð ð 6ð -×8Ñ8Ð;M×;ZÑ;ZÑZˆØ˜OÒ+ÜØÐ)FÑGÜ×2Ñ2ôð ð
 	×'Ò'¨>Ñ9Õ'Ø×ÑÔ!ä ×(Ñ(×/Ñ/Ø1ØÜ˜]¨NÓ;Ü˜L¨-Ó8Ø)ð 	0ô 	
ô ØÐ%DÑEÜ×%Ñ%ô
ð 	
øôe œ8Ð$ò 	ÜØð  *Cñ  DÜ×2Ñ2ôò ð	ûô #×/Ñ/ò 	ÜØÐ)FÑGÜ×0Ñ0ôò ð	ûô  ×,Ñ,ò 	Ü!1×!9Ñ!9×!@Ñ!@Ø#ØØ ŸL™L×5Ñ5×FÑFØð	 "Aó "Óð	ús8   ÂG> Â4!H1 Ã8AI( Ç>-H.È-H.È11I%É$I%É(AK Ê?K NrŒ   r.   r/   r0   rµ  rµ  û  s   „ Ø1Ð2ÐØ)Ð*ÐóF
r/   rµ  )TÚdecimalr   r   Úrest_frameworkr   r   Ú!rest_framework_jwt.authenticationr   Úrest_framework.viewsr   Úrest_framework.authenticationr	   Úrest_framework.permissionsr
   r   Úrest_framework.responser   r   ÚmodelsÚserializersÚgeopy.distancer   Úvehiclehub.modelsr   r   r   Úaccounts.modelsr   r   Úvehiclehub.serializersr   Úrest_framework.exceptionsr   Ú&django.contrib.gis.db.models.functionsr   Údjango.contrib.gis.measurer   Údjango.contrib.gis.geosr   r   Údjango.utilsr   rt   r   ÚprocessÚasyncior^  Ú	django.dbr   ÚListCreateAPIViewr!   ÚRetrieveUpdateDestroyAPIViewr3   r5   rS   rŽ   rœ   r±   rÂ   rË   rÜ   rá   ræ   rî   rõ   rú   r  r  r  r  r.  ÚListAPIViewr4  rD  rf  ro  ru  ry  r‡  r‹  rŽ  r’  r°  rµ  r.   r/   r0   ú<module>r×     s  ðß %ß 0Ý HÝ (Ý =ß CÝ ,Ý !Ü Ü Ý #ß EÑ Eß 2Ý 8Ý 5Ý ;Ý (Ý +Ý )Ý !Ý Ü Û Û Ý !ô7 × :Ñ :ô 7ô7¨8×+PÑ+Pô 7ô-
˜'ô -
ô`\
 ô \
ô~I
˜ô I
ôX>
�gô >
ôB$
˜7ô $
ôN˜wô ôB5
�Wô 5
ôp"
�Wô "
ôJ˜ô ôB"�Gô "ôJ�'ô ô6�Wô ô<
˜Gô 
ôD
˜ô 
ô>�7ô ô8U
˜7ô U
ôpC
 7ô C
ôLG
˜ô G
ôT"$˜×-Ñ-ô "$ôJD�gô DôNV�gô Vôr�Gô ô2�gô ô~2 Gô 2ôj6 Gô 6ôr Gô ô. 'ô ôZY 'ô Yôv@
 'ô @
ôDJ
˜Gõ J
r/   