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