a
    f9                    @   s\  d dl 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T 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T ddlT ddlT d dlmZmZ ddlT ddlT ddlT ddlT 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&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/d0 d0eZ-G d1d2 d2eZ.G d3d4 d4eZ/G d5d6 d6eZ0G d7d8 d8eZ1G d9d: d:eZ2G d;d< d<eZ3G d=d> d>eZ4G d?d@ d@eZ5G dAdB dBeZ6G dCdD dDeZ7dEdF Z8G dGdH dHeZ9d dIl:m;Z; d dl<Z<d dl=Z=d dJl>m?Z? d dKl@mAZA d dlBZCG dLdM dMeZDG dNdO dOeZEG dPdQ dQeZFG dRdS dSeZGG dTdU dUeZHG dVdW dWeZIG dXdY dYeZJG dZd[ d[eZKdS )\    N)render)APIView)ListAPIView)Responsestatus   )*)permissions)serializers)HttpResponseJsonResponse)get_object_or_404)Http404)get_weather_dataTreeRowGetTreesc                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )DroneBasePingApiViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS z_
        Helper method to check if drone base with the given authentication key exists
        keyNDevicesobjectsgetDoesNotExistselfdevice_auth_key r   %/var/www/html/django/DPS/api/views.pyget_dronebase   s    z"DroneBasePingApiView.get_dronebasec                 C   s4   zt jj|dddW S  t jy.   Y dS 0 dS )zc
        Helper method to identify if the specific drone has an mission associated with it
        r   block_idr   generated_dateNMissionsr   filterorder_byr   r   r"   r   r   r   get_missions$   s    z!DroneBasePingApiView.get_missionsc                 C   s4   zt jj|dddW S  t jy.   Y dS 0 dS )z
        Helper method to identify if the specific drone has a flight that has been scheduled
        (in the future //// just checks if there is a flight that been scheduled and its start_date is > than current time)
        r   
mission_idr   
start_dateN)Flightsr   r&   r'   r   r   r+   r   r   r   get_flights,   s    z DroneBasePingApiView.get_flightsc              
   C   s   t jj|d}|jd krzBdd l}tjj|jd}|jt|ddtd|_	|
  t|W S  ty } zt| W Y d }~d S d }~0 0 nd S d S )Npkr      T)indent	sort_keysdefault)Blocksr   r   private_meteostation_idjsonMeteostationsdumpsr   strlast_forecastsave	Exceptionprint)r   r"   blockr8   ZblockMeteostationer   r   r   r   5   s    

z%DroneBasePingApiView.get_weather_datac                 C   s   d S )Nr   )r   r   r   r   get_querysetF   s    z!DroneBasePingApiView.get_querysetc                 O   s   |  |}|s tdditjdS |jdkr<tdditjdS | |j}|s^tdditjdS tj }|D ]}| 	|j
}	|	rl||	O }ql|stdditjdS t|dd	}
t|
jtjdS )
J
        Retrieves flights id's that are supposed to be flown out
        res+Device with this device key does not existsr   NKDevice with this device key does not have a garden block associated with itPDevice with this device key does not have any active missions associated with itzJDevice with this device key does not have any flights planned at this timeTmany)r    r   r   HTTP_400_BAD_REQUESTr"   r)   r-   r   noner/   idZFlightSerializerdataHTTP_200_OK)r   requestr   argskwargsdevicemissionsZscheduledFlightsmissionflights
serializerr   r   r   r   H   s:    



zDroneBasePingApiView.getN)	__name__
__module____qualname__r    r)   r/   r   rB   r   r   r   r   r   r      s   	r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )FlightInfosApiViewc                 C   s>   z"t jj|dd}tjj|jdW S  t jy8   Y dS 0 dS )z9
        Helper method to get the object with id
        r   r1   r   r0   N)r-   r   r   FlightPlansplan_idr   )r   	flight_idflightr   r   r   
get_objectw   s
    zFlightInfosApiView.get_objectc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r       s    z FlightInfosApiView.get_dronebasec           	      O   sX   |  |}|s tdditjdS | |}|s@tdditjdS t|}t|jtjdS )J
        Retrieves flight_plan with given blocks_id, sequence_num
        rD   rE   r   >This flight either does not exist or it has been flown alreadyr    r   r   rJ   r`   ZPlanSerializerrM   rN   )	r   rO   r   r^   rP   rQ   rR   plan_instancerV   r   r   r   r      s    

zFlightInfosApiView.getNrW   rX   rY   r`   r    r   r   r   r   r   rZ   v   s   
	rZ   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )FlightInProgressApiViewc                 C   s.   zt jj|ddW S  t jy(   Y dS 0 dS )?
        Helper method to get the object with given id
        r   r[   Nr-   r   r   r   r   r^   r   r   r   r`      s    z"FlightInProgressApiView.get_objectc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r       s    z%FlightInProgressApiView.get_dronebasec           
      O   sz   |  |}|s tdditjdS | |}|s@tdditjdS ddlm} | }	d|_|	|_|  tdditj	dS )	zE
        Changes the status of the flight to 2 (in progress)
        rD   rE   r   rb   r   datetime   z<Flight start date has been updated and flight status changed)
r    r   r   rJ   r`   rk   nowr,   r=   rN   )
r   rO   r   r^   rP   rQ   rR   r_   rk   rm   r   r   r   r      s$    

zFlightInProgressApiView.getNre   r   r   r   r   rf      s   	rf   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )FlightCompletedApiViewc                 C   s.   zt jj|ddW S  t jy(   Y dS 0 dS rg   rl   r[   Nrh   ri   r   r   r   r`      s    z!FlightCompletedApiView.get_objectc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r       s    z$FlightCompletedApiView.get_dronebasec                 O   s   |  |}|s tdditjdS | |}|s@tdditjdS ddlm} | }	d|_|	|_|  t	j
j|jd tj
j|jdd	 krtj
j|jd
}
d|
_|	|
_|
  tdditjdS )ra   rD   rE   r   SThis flight either either has not been started, has been finished or does not existr   rj      r+   r*   r0   r   zFlight has been finished)r    r   r   rJ   r`   rk   rm   end_dater=   r\   r   r&   r+   countr-   r%   r   closed_daterN   )r   rO   r   r^   rP   rQ   rR   r_   rk   rm   rT   r   r   r   r      s.    

*zFlightCompletedApiView.getNre   r   r   r   r   rn      s   
rn   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )FlightFailedApiViewc                 C   s.   zt jj|ddW S  t jy(   Y dS 0 dS ro   rh   ri   r   r   r   r`      s    zFlightFailedApiView.get_objectc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r      s    z!FlightFailedApiView.get_dronebasec                 O   sZ   |  |}|s tdditjdS | |}|s@tdditjdS |  tdditjdS )ra   rD   rE   r   rp   z*Flight has been canceled therefore deleted)r    r   r   rJ   r`   deleterN   )r   rO   r   r^   rP   rQ   rR   r_   r   r   r   r     s    

zFlightFailedApiView.getNre   r   r   r   r   rv      s   	rv   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )ActiveMissionsApiViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r    $  s    z#ActiveMissionsApiView.get_dronebasec                 C   s4   zt jj|dddW S  t jy.   Y d S 0 d S )Nr   r!   r#   r$   )r   Zdevice_block_idr   r   r   rB   ,  s    z"ActiveMissionsApiView.get_querysetc                 O   sz   |  |}|s tdditjdS |jdkr<tdditjdS | |j}|s^tdditjdS t|dd}t|jtjdS )	ra   rD   rE   r   NrF   rG   TrH   )	r    r   r   rJ   r"   rB   ZMissionSerializerrM   rN   )r   rO   r   rP   rQ   rR   rS   rV   r   r   r   r   2  s&    

zActiveMissionsApiView.getNrW   rX   rY   r    rB   r   r   r   r   r   rx   #  s   rx   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
MissionFlightPlanApiViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r    M  s    z&MissionFlightPlanApiView.get_dronebasec                 C   s,   zt jj|dW S  t jy&   Y d S 0 d S )Nrr   )r\   r   r&   r   r.   r   r   r   rB   U  s    z%MissionFlightPlanApiView.get_querysetc                 C   s2   zt jj|dd W dS  t jy,   Y dS 0 d S )Nrq   )r]   r   TFrh   r   r]   r   r   r   
get_statusZ  s
    z#MissionFlightPlanApiView.get_statusc           
      O   s   |  |}|s tdditjdS | |}|s@tdditjdS | |}g }|D ]"}	||	j|	j| |	jdg7 }qRt|tjdS )zZ
        Retrieves mission and its plan with given mission_id and device_auth_key
        rD   rE   r   rG   )rL   sequence_num	completed)	r    r   r   rJ   rB   rL   r}   r|   rN   )
r   rO   r   r+   rP   rQ   rR   r\   ZplansEditedplanr   r   r   r   `  s"    


 zMissionFlightPlanApiView.getN)rW   rX   rY   r    rB   r|   r   r   r   r   r   rz   L  s   rz   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
FlightCreateApiViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r    y  s    z!FlightCreateApiView.get_dronebasec                 C   s,   zt jj|dW S  t jy&   Y d S 0 d S Nr0   r\   r   r   r   r{   r   r   r   get_flightPlan  s    z"FlightCreateApiView.get_flightPlanc                 C   s0   zt jj|d W dS  t jy*   Y dS 0 d S )N)r]   TFrh   r{   r   r   r   r|     s
    zFlightCreateApiView.get_statusc                 O   s   |  |}|s tdditjdS | |}|s@tdditjdS | |j}|dkrftdditjdS ddlm}	 |	 }
t	j
j|j|
|jd	d
 tdditjdS )ra   rD   rE   r   This plan does not existTzEThis plan has already been flown or a flight has already been createdr   rj   r   )r]   r,   r+   r   zFlight created)r    r   r   rJ   r   r|   rL   rk   rm   r-   r   creater+   rN   )r   rO   r   r]   rP   rQ   rR   r   existsrk   rm   r   r   r   r     s,    

zFlightCreateApiView.getN)rW   rX   rY   r    r   r|   r   r   r   r   r   r   x  s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )MissionFlightPlanViewerApiViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r      s    z,MissionFlightPlanViewerApiView.get_dronebasec                 C   s,   zt jj|dW S  t jy&   Y d S 0 d S r   r   r{   r   r   r   r`     s    z)MissionFlightPlanViewerApiView.get_objectc           	      O   sX   |  |}|s tdditjdS | |}|s@tdditjdS t|}t|jtjdS )ra   rD   rE   r   r   rc   )	r   rO   r   r]   rP   rQ   rR   rd   rV   r   r   r   r     s    

z"MissionFlightPlanViewerApiView.getNrW   rX   rY   r    r`   r   r   r   r   r   r     s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )'MissionFlightPlanViewerApiKMLFormatViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r      s    z5MissionFlightPlanViewerApiKMLFormatView.get_dronebasec                 C   s,   zt jj|dW S  t jy&   Y d S 0 d S r   r   r{   r   r   r   r`     s    z2MissionFlightPlanViewerApiKMLFormatView.get_objectc                 O   s   |  |}|s tdditjdS | |}|s@tdditjdS |jd d d }tjj|j	d}	g }
|	D ]}|

|j|jg qjt||
|}t|tjdS 	ra   rD   rE   r   r   geometrycoordinatesr   r"   )r    r   r   rJ   r`   flight_planTreesr   r&   r"   appendlatitude	longitudeZConvertToKMLrN   r   rO   r   r]   rP   rQ   rR   rd   r   treesZtree_coordinates_arraytreeZplanformatedr   r   r   r     s&    

z+MissionFlightPlanViewerApiKMLFormatView.getNr   r   r   r   r   r     s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )-MissionFlightPlanViewerApiArduPilotFormatViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r      s    z;MissionFlightPlanViewerApiArduPilotFormatView.get_dronebasec                 C   s,   zt jj|dW S  t jy&   Y d S 0 d S r   r   r{   r   r   r   r`      s    z8MissionFlightPlanViewerApiArduPilotFormatView.get_objectc                 O   s   |  |}|s tdditjdS | |}|s@tdditjdS |jd d d }tjj|j	d}	g }
|	D ]}|

|j|jg qjt||
|}t|tjdS r   )r    r   r   rJ   r`   r   r   r   r&   r"   r   r   r   ZConvertToArduPilotrN   r   r   r   r   r     s&    

z1MissionFlightPlanViewerApiArduPilotFormatView.getNr   r   r   r   r   r     s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )BlockTreesApiViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r    "  s    zBlockTreesApiView.get_dronebasec                 C   s,   zt jj|dW S  t jy&   Y d S 0 d S Nr   )r   r   r&   r   r(   r   r   r   rB   *  s    zBlockTreesApiView.get_querysetc                 O   sz   |  |}|s tdditjdS |jdkr<tdditjdS | |j}|s^tdditjdS t|dd}t|jtjdS )	ra   rD   rE   r   NrF   zNo trees added to blockTrH   )	r    r   r   rJ   r"   rB   ZTreeSerializerrM   rN   )r   rO   r   rP   rQ   rR   Ztrees_instancerV   r   r   r   r   /  s&    

zBlockTreesApiView.getNry   r   r   r   r   r   !  s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )DroneBaseLocationApiViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r    I  s    z&DroneBaseLocationApiView.get_dronebasec                 C   s,   zt jj|dW S  t jy&   Y d S 0 d S r   )DroneStationsr   r   r   r(   r   r   r   r`   Q  s    z#DroneBaseLocationApiView.get_objectc                 O   sv   |  |}|s tdditjdS |jdkr<tdditjdS | |j}|s^tdditjdS t|}t|jtjdS )ra   rD   rE   r   NrF   z<DroneBase location has not been added for this devices block)	r    r   r   rJ   r"   r`   ZDroneStationSerializerrM   rN   )r   rO   r   rP   rQ   rR   Zstation_instancerV   r   r   r   r   V  s&    

zDroneBaseLocationApiView.getNr   r   r   r   r   r   H  s   r   c                   @   s   e Zd Zdd Zdd ZdS )DroneBasePlanReceiverApiViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r    p  s    z*DroneBasePlanReceiverApiView.get_dronebasec                 O   s  |j }z|d }t|d d  W n   tdditjd Y S 0 d}g }| |j}	g d}
tdt|D ]P}|| d d |d d krlt||| |  |||| |g g7 }|}qlt|dkrp|	d krpdd l	}|j	
 }tjj|
|jd   d|j |	dd	}tdt|D ]>}dd l}d
d|| gdd}tjj||d |j|	d qtdditjdS tdditjdS )Nr   rl   rD   Bad requestr   u	   Janvārisu
   FebruārisMartsu   AprīlisMaijsu   Jūnijsu   JūlijsAugusts
SeptembrisOktobris	Decembrisr    namer"   stage_idFeaturePolygontyper   r   r   r   r}   r+   r"   ?New Mission and Flight_plans for that mission have been created)rM   r?   r   r   rJ   r    r"   rangelenrk   rm   r%   r   r   monthyearr8   r\   rL   HTTP_201_CREATED)r   rO   r   rP   rQ   Z	plan_datastart_coordinates	lastpointplansr"   monthsLVxrk   currentTimerT   r8   geoJSONr   r   r   postx  sN    


z!DroneBasePlanReceiverApiView.postNrW   rX   rY   r    r   r   r   r   r   r   o  s   r   c                   @   s   e Zd Zdd Zdd ZdS )DroneBaseTreeReceiverApiViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r      s    z*DroneBaseTreeReceiverApiView.get_dronebasec                 O   s   |j }z| |j}|d krz6tjj|d |d ||d |d |d |d d W nZ   tjj|dd|dd||dd|dd|dd |ddd Y n0 td	d
it	j
dW S W n   td	dit	jd Y S 0 d S )Nr   r   widthheightbreedcultivares_id)r   r   r"   r   r   r   r   0rD   zNew Tree Createdr   r   )rM   r    r"   r   r   r   r   stripr   r   r   rJ   )r   rO   r   rP   rQ   	tree_datar"   r   r   r   r     s6    
	




	z!DroneBaseTreeReceiverApiView.postNr   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd Zdd ZdS )DroneLocationPingApiViewc                 O   sF   t jj|d}|jdkr0t|}t|jtjdS tdditj	dS dS );
        Retrieves last location of Drone location
        r0   Nr   rD   diagnostic field is empty)
r-   r   r   diagnosticsFlightDiagnosticsSerializerr   rM   r   rN   rJ   )r   rO   r^   rP   rQ   currentFlightrV   r   r   r   r     s
    
zDroneLocationPingApiView.getc                 O   s   |j }ztjj|d}|jdkrz tjj|d}||_|  W n0   tjj|d}|dd|_|  Y n0 tdditjdW S W n   tdditj	d Y S 0 d S )	Nr0   rl   rM   r   rD   zdiagnostics field updatedr   r   )
rM   r-   r   r   r   r   r=   r   rN   rJ   )r   rO   r^   rP   rQ   Z
drone_datar   r   r   r   r     s    
zDroneLocationPingApiView.postN)rW   rX   rY   r   r   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd ZdS )DroneLocationMissionPingApiViewc                 O   s   zt jj|dd}W nP   tjj|d}|jdkrJtdditjd Y S tdditjd Y S Y n0 |jd	krt|}t|j	tj
dS tdd
itjdS d	S )r   rl   r*   r0   TrD   zMission Completedr   zNNo flight is currently in progress on this mission or the mission doesnt existNr   )r-   r   r   r%   r   r   rJ   r   r   rM   rN   )r   rO   r+   rP   rQ   ZcurrentFlightBeingFlowncurrentMissionrV   r   r   r   r     s    

z#DroneLocationMissionPingApiView.getNrW   rX   rY   r   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd Zdd ZdS )MissionPhotosRecieveApiViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r      s    z)MissionPhotosRecieveApiView.get_dronebasec           	   
   O   s   |j }z| |j}ztjj|d|d}W n    tdditjd Y W S 0 t	| t
jj|dd|dd|d	d|d
d||ddd tdditjdW S    tdditjd Y S 0 d S )NT)r1   r   r"   rD   z8Mission does not exist or mission has not been completedr   	image_urir   Zgpsaltitudephoto_location_numtree_id)r   GPSr   r   r+   r   zPhoto receivedzYeither the data is invalid or the device it being sent from is not connected to any block)rM   r    r"   r%   r   r   r   r   rJ   r?   Photosr   rN   )	r   rO   r   r+   rP   rQ   Z
photo_datar"   ZCompletedMissionr   r   r   r     s&    




z MissionPhotosRecieveApiView.postNr   r   r   r   r   r     s   	r   c                   @   s   e Zd ZegZdd ZdS )MissionPhotoSendApiViewc                 O   sJ   zt jj|dj}W n   tdditjd Y S 0 |}|}t|tjdS )Nr0   rD   zNo photo foundr   )r   r   r   r   r   r   rJ   rN   )r   rO   Zphoto_idrP   rQ   photo_instancequerysetrM   r   r   r   r     s    zMissionPhotoSendApiView.getN)rW   rX   rY   ZJPEGRendererrenderer_classesr   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd ZdS )MissionPhotosSendApiViewc                 O   s*   t jj|d}t|dd}t|jtjdS )Nrr   TrH   r   )r   r   r&   ZPhotoSerializerr   rM   r   rN   )r   rO   r+   rP   rQ   r   rV   r   r   r   r   (  s    zMissionPhotosSendApiView.getNr   r   r   r   r   r   '  s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )MissionsScabDetectionViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS z:
        Helper method to check if mission exists
        r0   Nr%   r   r   r   r.   r   r   r   get_mission.  s    z%MissionsScabDetectionView.get_missionc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS zQ
        Helper method to check if mission has photos associated with it
        rr   Nr   r   r&   r   r.   r   r   r   
get_photos6  s    z$MissionsScabDetectionView.get_photosc                 O   sp   |  |}|d kr$tdditjdS | |}| rZ|D ]}t| q:tdditjdS tdditjdS d S )NrD   %No Mission found with this mission idr   zScab Checkedz?No Mission Photos found or it has already been checked for scab)r   r   r   rJ   r   r   scabDetectionModelrN   r   rO   r+   rP   rQ   rT   photosphotor   r   r   r   >  s    


zMissionsScabDetectionView.getNrW   rX   rY   r   r   r   r   r   r   r   r   -  s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )MissionsPearDetectionViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r.   r   r   r   r   L  s    z%MissionsPearDetectionView.get_missionc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r.   r   r   r   r   T  s    z$MissionsPearDetectionView.get_photosc                 O   sp   |  |}|d kr$tdditjdS | |}| rZ|D ]}t| q:tdditjdS tdditjdS d S )NrD   r   r   zPear yield changedz@No Mission Photos found or it has already been checked for yield)r   r   r   rJ   r   r   pearDetectionModelrN   r   r   r   r   r   \  s    


zMissionsPearDetectionView.getNr   r   r   r   r   r   K  s   r   c                   @   s   e Zd Zdd Zdd ZdS )!EnterpriseRecieveTreeBreedApiViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r    k  s    z/EnterpriseRecieveTreeBreedApiView.get_dronebasec              
   O   s  |  |}|s"tdddtjdS tjj|jjd}|j	}t
|dkrZtdddtjdS |d	}|d
}	|d}
|d}|d}|dkrtddd	dtjdS |	dkrtddd
dtjdS |
dkrtddddtjdS |dkrtddddtjdS |dkr&tddddtjdS |d}|d}z4tjj||
||	||||jd tdddtjdW S    tdddtjd Y S 0 dS )rC   rE   r   rD   resCoder   r0   r   !Request does not contain any datarl   titleplanting_distancer   r   cultivarNz&Request does not contain a breed titlerq   rD   r   missingz,Request does not contain a planting distancez.Request does not contain the tree breeds widthz/Request does not contain the tree breeds heightz1Request does not contain the tree breeds cultivar	injectionyields)r   r   r   r   cultivar_idr   r   enterprise_idz Tree Breed was succesfully added   CRequest that has been sent has incorrect data types or blank valuesr2   )r    r   r   rJ   Enterprisesr   r   
enterpriserL   rM   r   EnterpriseSpecificBreedsr   r   )r   rO   r   rP   rQ   rR   r   ZtreeBreedSentZbreedsTitleZbreedsPlantingDistanceZbreedsWidthZbreedsHeightZbreedsCultivarZbreedsInjectionZbreedsYieldsr   r   r   r   s  s    









z&EnterpriseRecieveTreeBreedApiView.postNr   r   r   r   r   r   j  s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )EntepriseTreeBreedsApiViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r      s    z(EntepriseTreeBreedsApiView.get_dronebasec                 C   s,   zt jj|dW S  t jy&   Y d S 0 d S )N)r   r   r   r&   r   )r   r   r   r   r   rB     s    z'EntepriseTreeBreedsApiView.get_querysetc                 O   s   |  |}|s"tdddtjdS |jd kr@tdddtjdS | |j}|sdtdddtjdS t|d	d
}t|jtj	dS )NrE   r   r   r   rF   rl   z&No Specific to Enterprise breeds foundrq   TrH   )
r    r   r   rJ   r"   rB   r   ZEnterpriseTreeBreedSerializerrM   rN   )r   rO   r   rP   rQ   rR   
TreeBreedsrV   r   r   r   r     s2    

zEntepriseTreeBreedsApiView.getNry   r   r   r   r   r     s   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )EnterpriseRecieveTreeRowApiViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS )zg
            Helper method to check if drone base with the given authentication key exists
            r   Nr   r   r   r   r   r      s    z-EnterpriseRecieveTreeRowApiView.get_dronebasec                 C   s,   zt jj|dW S  t jy&   Y d S 0 d S r   r   r(   r   r   r   rB     s    z,EnterpriseRecieveTreeRowApiView.get_querysetc                 O   s  |  |}|s"tdddtjdS |jd kr@tdddtjdS |j}t|dkrftdd	dtjdS |d
}|d}|d}	|d krtdd	d
dtjdS |d krtdd	ddtjdS |	d krtdd	ddtjdS ztj	j|	d}
W n    tdddtjd Y S 0 z\dd l
}di d||||gdd}tj	j||	|jd}t| tdddtjdW S    tdddtjd Y S 0 d S )NrE   r   r   r   rF   rl   r   r   rq   
startPointendPointbreed_idz&Request does not contain a start pointr   z$Request does not contain a end pointz#Request does not contain a breed_idr0   zTree Breed does not existr2   r   
LineStringr   )r   
propertiesr   )r   tree_breed_idr"   zTreeRow was Succesfully added   r   r   )r    r   r   rJ   r"   rM   r   r   r   r   r8   loadsTreeRowr   r   r   )r   rO   r   rP   rQ   rR   ZtreeRowSentr   r   breedIDr   r8   rowr   r   r   r   
  s    




z$EnterpriseRecieveTreeRowApiView.postN)rW   rX   rY   r    rB   r   r   r   r   r   r     s   r   c                   @   s   e Zd Zdd Zdd ZdS )DroneBaseGeneratePlanApiViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r    d  s    z*DroneBaseGeneratePlanApiView.get_dronebasec                 O   s  |  |}|s"tdddtjdS tjj|jd sJtdddtjdS t	jj|jd srtdd	dtjdS t
jd
dgd}t	jj|jd}dd l}|D ]^}	|	jd d }
|
d d |
d d d}|
d d |
d d d}||d}|j|dd}qtjj|jd}|j|jg}t||dd}t| |j|jg}dd }g }|D ]}||| qLd}g }|  |j}g d}tdt|D ]T}|| d d |d d krt||| |  |||| |g g7 }|}qt|dkr|d krdd l}|j }tjj||jd   d|j |dd}tdt|D ]>}dd l}dd|| gdd}tjj||d |j|d qBtdd itjdS tdd!itjdS )"NrE   r   r   r   r   z6The current block does not have a Drone Station placedrl   z)The current block has no Tree Rows placedrq   r   r   )columnsr   r   r   )r   r   )r   r   T)ignore_index   c                 S   s   | d d d }|S )Nr   )tuplesZnew_tupr   r   r   Reverse  s    z1DroneBaseGeneratePlanApiView.get.<locals>.Reverser   r   r   r   r   r   r   r   rD   r   r   )r    r   r   rJ   r   r   r&   r"   r   r  pd	DataFramer8   r   r   r   r   r   path_calculationsr?   r   r   rk   rm   r%   r   r   r   r\   rL   r   )r   rO   r   rP   rQ   rR   Z
linePointsZTreeRowsBlockr8   r	  ZrowCoordinatesZrow_start_CoordinatesZrow_end_CoordinateslineZDronestationZdrone_station_coordinatespathr   r  Zpath_correctedr   r   r   r"   r   rk   r   rT   r   r   r   r   r   l  s    




z DroneBaseGeneratePlanApiView.getNrW   rX   rY   r    r   r   r   r   r   r
  c  s   r
  c                   @   s   e Zd Zdd Zdd ZdS ) DroneBaseCheckIfAutomatedApiViewc                 C   s,   zt jj|dW S  t jy&   Y dS 0 dS r   r   r   r   r   r   r      s    z.DroneBaseCheckIfAutomatedApiView.get_dronebasec                 O   s   |  |}|s"tdddtjdS |jd krhtjj|jdd rTtdditj	dS tdditj	dS ntd	d
dtjdS d S )NrE   r   r   r   T)rL   is_autonomousr  Fz#Device is not assigned to any blockrl   )
r    r   r   rJ   r"   r6   r   r&   r   rN   )r   rO   r   rP   rQ   rR   r   r   r   r     s0    

z$DroneBaseCheckIfAutomatedApiView.getNr  r   r   r   r   r    s   r  c                 C   s  zt jj|d}W n   tddidd Y S 0 tjj|d}| sVtddiddS g }|D ]0}tjj|jd}| r^|D ]}|	| q~q^g }|D ]>}t
jj|jdd	d d
 }	|	 r|	D ]}
|	|
 qqg }|D ]}
|
jdkr|	|
 qg }|D ] }
tjj|
jd}|	| qd}d}d}d}d}d}d}d}d}d}|D ]6}|D ](}tjj|jd}tjj|jd}t
jj|jd}
|
j}|jdkr|dkr||j7 }|dkr||j7 }|dkr||j7 }|jdkr&|dkr||j7 }|dkr||j7 }|dkr&||j7 }|jdkrn|dkrF||j7 }|dkrZ||j7 }|dkrn||j7 }|jdkrZ|d7 }qZqPg }|dkr|dkr|	ddd |dkr|	| ddd td|iddS )Nr0   rD   #No Garden found with this garden id  r   	garden_idzNo Blocks found in this gardenr   ru   r   Trr   r   r   rl   rq   u   Plānot ražas novākšanas stratēģiju: uzglabāšanai (šķirošana pēc uzglabāšanas, daļēji uzglabāšanas šķirošana ražas novākšanas laikā, tikai sulai) un pārdošanai.success)messagealertu^    kokiem ir kraupis. Izlemt un veikt augu aizsardzības pasākumus pret kraupi. (skatīt mapē)danger   )Gardensr   r   r   r6   r&   r   r   rL   r   r%   r'   r   	TreeStater   
Cultivaresr   r+   r   r   has_scab)rO   r  gardenblocksr   r@   Ztrees_blockr   rS   Zmissions_blockrT   Zdone_missionsZtree_states2DZtree_state_missionZapple_tree_yields_floweringZpear_tree_yields_floweringZcherry_tree_yields_floweringZapple_tree_yields_fruitZpear_tree_yields_fruitZcherry_tree_yields_fruitZapple_tree_yieldsZpear_tree_yieldsZcherry_tree_yieldsZtrees_with_scabZtree_state1D
tree_stater   stageZrecommendationsr   r   r   reccomendationsGarden  s    





















r*  c                   @   s   e Zd Zdd ZdS )GenerateFakeDataGardenc              	   C   s  t jj|d}|d kr&tddiddS dd l}tjj|d}||}tjj|j	d}t
jjd	|j	d
dd}|D ]:}	tjj|	j	|j	|dd|ddgtjjd
dd}
qpt
jjd|j	ddd}tjj|j	d}|D ]<}
tjj|
j|j	||
jd|ddgtjjddd}qt
jjd|j	ddd}tjj|j	d}|D ]>}
tjj|
j|j	||
jd|ddgtjjddd}q>t
jjd|j	ddd}tjj|j	d}|D ]>}
tjj|
j|j	||
jd|ddgtjjddd}qtddiddS )Nr0   rD   r  r  r   r   r  r   zFake Mission - flowering stager   T)r   r"   r   r      F)r   r+   r   r%  yield_stagezFake Mission - fruiting stagerl   rr      2   zFake Mission - fruit stagerq   d   zFake data generated for gardenr!  )r"  r   r   r   randomr6   r&   choicer   rL   r%   r   r#  randintYieldStagesr   r   )r   rO   r  r&  r1  r'  Zrandom_blockr   rT   r   r(  Zmission2tree_statesZtree_state2Zmission3Zmission4Ztree_states2Ztree_state3r   r   r   r   n  s    

	



zGenerateFakeDataGarden.getNr   r   r   r   r   r+  k  s   r+  )timezone)default_storage)YOLOc                   @   s   e Zd Zdd ZdS )ProcessImagesAPIViewc                 C   s   t jj|d}| std|D ]}t|jj}|j}|j	}|
 D ]\}}	tt|	 }
|dvrjdn|dv rvdnd}tt|d}tjj||||
d	d
t dd\}}|sF| j|
7  _t |_|  qF|  q"tddiS )Nrr   z"No Photos found for given mission.)ZPFruitlets640ZCherriesBBCH72ZApplesBBCH76rl   )ZPear640ZCherriesBBCH81ZApplesBBCH81rq   r   rL   r   F)r   probability_scabr%  last_updated)r   rT   r-  defaultsr  z"Processing completed successfully.)r   r   r&   r   r   ZobjectDetectionr   r  r   rT   itemsnextitervaluesr   r4  r#  get_or_creater6  rm   r   r<  r=   rw   r   )r   rO   r+   r   r   resultr   rT   Z
fruit_typecountsrt   r   Zyield_stage_instancer(  createdr   r   r   r     s:    



zProcessImagesAPIView.postNrW   rX   rY   r   r   r   r   r   r9    s   r9  c                   @   s   e Zd Zdd ZdS )ScabInfoMapViewc           	      C   s   t jj|d}| s&tddiddS tjj|ddd }|sTtdd	iddS tjj|d
}| sztddiddS |jdd}g }|D ].}|j	|j
d}||j|j|j|jd qtd|iddS )Nr   rD   No Trees found for given block.r  r   Tr!   -closed_date"No Missions found for given block.rT   %No Tree States found for given block.)r%  r:  )r   r   r   r   
scab_treesr!  )r   r   r&   r   r   r%   r'   firstr#  r   r   r   r   r   r   r   )	r   rO   r"   r   newest_mission_endedr5  rM  Zscab_trees_infor   r   r   r   r     s(    
zScabInfoMapView.getNr   r   r   r   r   rG    s   rG  c                   @   s   e Zd Zdd ZdS )YieldInfoMapViewc              
   C   s   t jj|d}| s&tddiddS tjj|ddd }|sTtdd	iddS tjj|d
}| sztddiddS g }|D ]<}|j	|j
d}||j|j|j|j|j	|jdjd qtd|iddS )Nr   rD   rH  r  r   Tr!   rI  rJ  rK  rL  r:  )r   )r   r   r   r   r   Zyield_treesr!  )r   r   r&   r   r   r%   r'   rN  r#  r   r   r   r   r   r   r   rL   r   )r   rO   r"   r   rO  r5  Zyield_trees_infor   r   r   r   r     s(    
zYieldInfoMapView.getNr   r   r   r   r   rP    s   rP  c                   @   s   e Zd Zdd ZdS )CheckMLFilec           
      O   s  |j d}|s"tdditjdS t|j|}d|j }|jdd }g }|dkrz8t	|}|j
rx|j
}t| ntdd	itjdW S W nR ty   tjjd
d|d}|j
r|j
}t| ntdd	itjd Y S Y n0 n|dkr^zNt|d,}	dd |	d D }t| W d    n1 s00    Y  W n   tdditjd Y S 0 n0|dkr|dd tdD }ntdditjdS td|itjdS )N	modelFileerrorNo file provided.r   zmedia/.r  ptz!No classes found in the .pt file.zultralytics/yolov5custom)r  h5rc                 S   s   g | ]}t |qS r   r;   ).0cr   r   r   
<listcomp>U      z$CheckMLFile.post.<locals>.<listcomp>classesz!No classes found in the .h5 file.pthc                 S   s   g | ]}t |qS r   rZ  )r[  ir   r   r   r]  \  r^  
   Unsupported file type.)FILESr   r   r   rJ   r7  r=   r   splitr8  namesrw   	TypeErrortorchhubloadh5pyFiler   rN   )
r   rO   rP   rQ   file	file_pathfile_extensionr_  modelfr   r   r   r   6  s>    

.
zCheckMLFile.postNrF  r   r   r   r   rQ  5  s   rQ  c                   @   s   e Zd Zdd ZdS )CurrentMLModelsc                 O   s&   t j }t|dd}t|jtjdS )NTrH   r   )MLModelsr   allZMLModelsSerializerr   rM   r   rN   )r   rO   rP   rQ   modelsrV   r   r   r   r   b  s    
zCurrentMLModels.getNr   r   r   r   r   rr  a  s   rr  c                   @   s   e Zd Zdd ZdS )SaveMLModelc           	      O   s   |j d}|jd}|jdd }|dkr6d}n |dkrDd}ntd	d
itjdS |sltd	ditjdS |std	ditjdS |std	ditjdS tj	j
|j|||d}tdditjdS )NrR  ZmodelClassesrU  r  rV  r8  r`  	MobileNetrS  rc  r   rT  zNo classes provided.zNo model type provided.)r   file_uri
model_typer_  r  zNew ML model file uploaded.)rd  r   rM   r   re  r   r   rJ   rs  r   r   rN   )	r   rO   rP   rQ   rm  r_  ro  ry  	new_modelr   r   r   r   l  s*    zSaveMLModel.postNrF  r   r   r   r   rv  g  s   rv  c                   @   s   e Zd Zdd ZdS )ActiveClassesc                 O   s  |j d}t|}|D ]}t| |d}|d}|d}	|rN|sdtdditjd  S tj	
 }
|	dkr|
D ]L}|j}|r|D ]*}|d	|kr|d
|kr|| q||_|  qzq|d}tj	j|d}|stdditjd  S |	|jvrtdditjd  S |j}|s:|||	dg}nZd}|D ]8}|d	|krB|d
|krB|	|d< d} q|qB|s||||	d ||_|  qtdditjdS )NrM   Z
cultivarIdZstageIdclassrS  zInvalid data provided.r    r   r   modelIdr0   Model not found.zClass not found in the model.)r   r   r|  FTr  zNew active classes saved.)rM   r   r8   r  r?   r   r   rJ   rs  r   rt  active_classesremover=   r_  r   rN   )r   rO   rP   rQ   r{  ZActiveClasses_pyZactive_classr   r   
class_nameru  rp  r  r~  foundr   r   r   r     s\    





	

 

zActiveClasses.postNrF  r   r   r   r   r{    s   r{  c                   @   s   e Zd Zdd ZdS )DeleteMLModelc                 O   s`   |j d}|s"tdditjdS tjj|d}|sFtdditjdS |  tdditjdS )	Nr~  rS  zNo model id provided.r   r0   r  r  zModel deleted.)	rM   r   r   r   rJ   rs  r   rw   rN   )r   rO   rP   rQ   model_idrp  r   r   r   r     s    zDeleteMLModel.postNrF  r   r   r   r   r    s   r  )Lr8   django.shortcutsr   rest_framework.viewsr   Zrest_framework.genericsr   rest_framework.responser   rest_frameworkr   r   r
   django.coredjango.httpr   r   r   r   Zgardens.modelsZcustom_renderersflight_plan_algorithmZgardens.functionsr   r   Z*functionsNeuralNetworks.scabDetectionModelZ*functionsNeuralNetworks.pearDetectionModelZ,functionsNeuralNetworks.objectDetectionModelZ
planformatr   rZ   rf   rn   rv   rx   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
  r  r*  r+  django.utilsr6  rh  rk  django.core.files.storager7  Zultralyticsr8  
tensorflowtfr9  rG  rP  rQ  rr  rv  r{  r  r   r   r   r   <module>   s~   [(+3'),3#)*''3&#g+g_$ a), E