2018-03-29 18:25:20 +00:00
import os
from rest_framework import serializers
from rest_framework import status
from rest_framework . response import Response
2020-01-17 21:22:22 +00:00
from app . api . workers import GetTaskResult , TaskResultOutputError , CheckTask
from app . models import Task
2018-07-26 21:55:20 +00:00
from app . plugins . views import TaskView
2020-12-21 21:14:26 +00:00
from django . utils . translation import gettext_lazy as _
2023-11-14 21:10:16 +00:00
from app . plugins . worker import run_function_async
2018-03-29 18:25:20 +00:00
2023-11-14 21:10:16 +00:00
from . volume import calc_volume
2018-03-29 18:25:20 +00:00
2023-11-14 21:10:16 +00:00
class VolumeRequestSerializer ( serializers . Serializer ) :
area = serializers . JSONField ( help_text = " GeoJSON Polygon contour defining the volume area to compute " )
method = serializers . CharField ( help_text = " One of: [plane,triangulate,average,custom,highest,lowest] " , default = " triangulate " , allow_blank = True )
2018-03-29 18:25:20 +00:00
2018-07-26 21:55:20 +00:00
class TaskVolume ( TaskView ) :
2018-03-29 18:25:20 +00:00
def post ( self , request , pk = None ) :
task = self . get_and_check_task ( request , pk )
if task . dsm_extent is None :
2020-12-21 21:14:26 +00:00
return Response ( { ' error ' : _ ( ' No surface model available. From the Dashboard, select this task, press Edit, from the options make sure to check " dsm " , then press Restart --> From DEM. ' ) } )
2018-03-29 18:25:20 +00:00
2023-11-14 21:10:16 +00:00
serializer = VolumeRequestSerializer ( data = request . data )
2018-03-29 18:25:20 +00:00
serializer . is_valid ( raise_exception = True )
2018-03-29 21:28:15 +00:00
area = serializer [ ' area ' ] . value
2023-11-14 21:10:16 +00:00
method = serializer [ ' method ' ] . value
points = [ coord for coord in area [ ' geometry ' ] [ ' coordinates ' ] [ 0 ] ]
2018-03-29 21:28:15 +00:00
dsm = os . path . abspath ( task . get_asset_download_path ( " dsm.tif " ) )
2023-11-14 21:10:16 +00:00
try :
celery_task_id = run_function_async ( calc_volume , input_dem = dsm , pts = points , pts_epsg = 4326 , base_method = method ) . task_id
2020-01-17 21:22:22 +00:00
return Response ( { ' celery_task_id ' : celery_task_id } , status = status . HTTP_200_OK )
2023-11-14 21:10:16 +00:00
except Exception as e :
2018-03-29 21:28:15 +00:00
return Response ( { ' error ' : str ( e ) } , status = status . HTTP_200_OK )
2018-03-29 18:25:20 +00:00
2020-01-17 21:22:22 +00:00
class TaskVolumeCheck ( CheckTask ) :
2023-11-14 21:10:16 +00:00
pass
2020-01-17 21:22:22 +00:00
class TaskVolumeResult ( GetTaskResult ) :
def get ( self , request , pk = None , celery_task_id = None ) :
task = Task . objects . only ( ' dsm_extent ' ) . get ( pk = pk )
return super ( ) . get ( request , celery_task_id , task = task )
2018-03-29 18:25:20 +00:00