o
    	Fh?)                     @   s\  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mZ dd	lmZ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mZmZ G dd deZG dd deZG dd deZG dd deZ G dd de Z!G dd de Z"G dd de Z#G dd de Z$G d d! d!e Z%G d"d# d#e Z&d$S )%    )APIViewResponsestatus)JWTAuthentication)IsAdminUser)authenticate   )VehicleVehicleType)VehicleSerializerVehicleTypeSerializer)TokenAuthentication)IsAuthenticated)r   VehicleAssignment)Device)timezone)NotFoundPermissionDeniedc                   @       e Zd ZegZegZdd ZdS )ListInactiveVehiclesViewc                 C   s2   t jjdd}dd |D }tdd|dtjdS )NFr   c                 S   s    g | ]}|j |jj|jd qS )idvehicle_typeplate_numberr   ).0vehicle r   &/var/www/html/loop/vehiclehub/views.py
<listcomp>   s    z0ListInactiveVehiclesView.get.<locals>.<listcomp>r
   z)Inactive vehicles retrieved successfully.)r   messagedata)r   objectsfilterr   r   HTTP_200_OK)selfrequestinactive_vehiclesvehicle_datar   r   r   get   s   	zListInactiveVehiclesView.getN)__name__
__module____qualname__r   authentication_classesr   permission_classesr*   r   r   r   r   r          r   c                   @   r   )AssignVehicleViewc                 C   s   |j }|jd}|stdddtjdS z	tjj|d}W n tjy/   tddd Y S w |jr=tdddtj	dS |
| tjj|d|id	 td
ddtj	dS )Ndevice_tokenr   zDevice token is required.r   r!   r   )r   zVehicle not found.z!This vehicle is already assigned.)userdefaultsr
   z(Vehicle assigned to driver successfully.)r4   r"   r*   r   r   HTTP_400_BAD_REQUESTr   r#   DoesNotExistr%   
set_activer   update_or_create)r&   r'   
vehicle_iddriverr2   r   r   r   r   post.   s4   
zAssignVehicleView.postNr+   r,   r-   r   r.   r   r/   r<   r   r   r   r   r1   *   r0   r1   c                   @   r   )ReleaseVehicleViewc                 C   sp   |j }ztjj||dd}W n tjy   tddd Y S w |j  tjj	|d
  tdddtjd	S )
NT)r:   r;   activer   z!Vehicle not assigned to this userr3   )r4   r
   zVehicle released successfully.r   )r4   r   r#   r*   r7   r   r   set_inactiver   r$   deleter   r%   )r&   r'   r:   r;   vehicle_assignmentr   r   r   r<   U   s    

zReleaseVehicleView.postNr=   r   r   r   r   r>   Q   r0   r>   c                   @   s4   e Zd ZdZegZegZdddZe	j
fddZdS )BaseVehicleViewz.
    Base view for vehicle-related views.
    Nc                 C   s&   d|d}|r| | t|tjdS )Nr
   r3   r   )updater   r   r%   )r&   r!   r"   response_datar   r   r   success_responses   s   

z BaseVehicleView.success_responsec                 C   s   t d|d|dS )Nr   r3   r   r   )r&   r!   status_coder   r   r   error_responsey   s   zBaseVehicleView.error_response)N)r+   r,   r-   __doc__r   r.   r   r/   rF   r   r6   rH   r   r   r   r   rC   k   s    
rC   c                   @      e Zd ZdZdd ZdS )ListVehiclesViewz:
    View to list all vehicles with optional filters.
    c              
   C   sx   z"t j }|j}|r|jdi |}t|dd}| dd|jiW S  ty; } z| t	|W  Y d }~S d }~ww )NTmanyzVehicles retrieved successfullyvehiclesr   )
r   r#   allr"   r$   r   rF   	ExceptionrH   str)r&   r'   rN   filters
serializerer   r   r   r*      s   

zListVehiclesView.getNr+   r,   r-   rI   r*   r   r   r   r   rK   }       rK   c                   @   rJ   )AddVehicleViewz$
    View to add a new vehicle.
    c              
   C   s   z1|j d}tjj|d}tjj||j d|j d|j dd}t|}| dd|j iW S  tjyB   | 	d	t
j Y S  tyZ } z| 	t|W  Y d }~S d }~ww )
Nr   pkr   r   vehicle_pic)r   r   r   rZ   zVehicle added successfullyr   z Invalid vehicle type ID provided)r"   r*   r   r#   r   creater   rF   r7   rH   r   HTTP_404_NOT_FOUNDrP   rQ   )r&   r'   vehicle_type_idr   r   rS   rT   r   r   r   r<      s*   



zAddVehicleView.postNr+   r,   r-   rI   r<   r   r   r   r   rW      rV   rW   c                   @   (   e Zd ZdZdd Zdd Zdd ZdS )	VehicleDetailViewz8
    View to retrieve, update, or delete a vehicle.
    c              
   C   s~   zt jj|d}t|}| dd|jiW S  t jy&   | dtj	 Y S  t
y> } z| t|W  Y d }~S d }~ww )NrX   zVehicle retrieved successfullyr   Vehicle not found)r   r#   r*   r   rF   r"   r7   rH   r   r\   rP   rQ   )r&   r'   rY   r   rS   rT   r   r   r   r*      s   
zVehicleDetailView.getc              
   C   s   zAt jj|d}|jd}tjj|d}|jd|j|_|jd|j|_|jd|j|_|  t	|}| 
dd|jiW S  t jtjfyU   | dtj Y S  tym } z| t|W  Y d }~S d }~ww )	NrX   r   r   r   rZ   zVehicle updated successfullyr   z!Vehicle or Vehicle Type not found)r   r#   r*   r"   r   r   r   rZ   saver   rF   r7   rH   r\   rP   rQ   )r&   r'   rY   r   r]   r   rS   rT   r   r   r   patch   s,   
zVehicleDetailView.patchc              
   C   sv   zt jj|d}|  | dW S  t jy"   | dtj Y S  t	y: } z| t
|W  Y d }~S d }~ww )NrX   zVehicle successfully removedra   )r   r#   r*   rA   rF   r7   rH   r   r\   rP   rQ   )r&   r'   rY   r   rT   r   r   r   rA      s   zVehicleDetailView.deleteNr+   r,   r-   rI   r*   rc   rA   r   r   r   r   r`      s
    r`   c                   @   rJ   )VehicleTypeListViewz)
    View to list all vehicle types.
    c              
   C   s\   zt j }t|dd}t|jtjdW S  ty- } z| 	t
|W  Y d }~S d }~ww )NTrL   r   )r   r#   rO   r   r   r"   r   r%   rP   rH   rQ   )r&   r'   vehicle_typesrS   rT   r   r   r   r*      s   
zVehicleTypeListView.getNrU   r   r   r   r   re      rV   re   c                   @   r_   )	VehicleTypeDetailViewz=
    View to retrieve, update, or delete a vehicle type.
    c              
   C   s|   zt jj|d}t|}t|jtjdW S  t jy%   | 	dtj
 Y S  ty= } z| 	t|W  Y d }~S d }~ww )NrX   r   Vehicle type not found)r   r#   r*   r   r   r"   r   r%   r7   rH   r\   rP   rQ   r&   r'   rY   r   rS   rT   r   r   r   r*      s   zVehicleTypeDetailView.getc              
   C   s   z)t jj|d}t||jdd}| r!|  t|jtj	dW S t|j
tjdW S  t jy:   | dtj Y S  tyR } z| t|W  Y d }~S d }~ww )NrX   T)r"   partialr   rh   )r   r#   r*   r   r"   is_validrb   r   r   r%   errorsr6   r7   rH   r\   rP   rQ   ri   r   r   r   rc      s"   zVehicleTypeDetailView.patchc              
   C   s~   zt jj|d}|  tdditjdW S  t jy&   | dtj	 Y S  t
y> } z| t|W  Y d }~S d }~ww )NrX   r!   z!Vehicle type deleted successfullyr   rh   )r   r#   r*   rA   r   r   r%   r7   rH   r\   rP   rQ   )r&   r'   rY   r   rT   r   r   r   rA     s   zVehicleTypeDetailView.deleteNrd   r   r   r   r   rg      s
    rg   c                   @   rJ   )AddVehicleTypeViewz)
    View to add a new vehicle type.
    c              
   C   st   z t |jd}| r|  t|jtjdW S t|jtjdW S  t	y9 } z| 
t|W  Y d }~S d }~ww )N)r"   r   )r   r"   rk   rb   r   r   HTTP_201_CREATEDrl   r6   rP   rH   rQ   )r&   r'   rS   rT   r   r   r   r<   %  s   zAddVehicleTypeView.postNr^   r   r   r   r   rm      rV   rm   N)'rest_framework.viewsr   rest_framework.responser   rest_frameworkr   'rest_framework_simplejwt.authenticationr   rest_framework.permissionsr   django.contrib.authr	   modelsr   r   serializersr   r   rest_framework.authenticationr   r   r   accounts.modelsr   django.utilsr   rest_framework.exceptionsr   r   r   r1   r>   rC   rK   rW   r`   re   rg   rm   r   r   r   r   <module>   s0    '42