wiki-Fieldview
Fieldview
title: Fieldview
Apis
- swagger en testing: https://api.testing.auravant.com/api/integrations/fieldview/docs
- swagger en prod: https://api.auravant.com/api/integrations/fieldview/docs
Login
Get /fieldview/auth
resp:
{
"code": str,
"url": str
}
Tiene 2 posible respuestas
- code='ALREADY_LOGGED_IN', El usuario ya esta logueado
- code='NEW_URL', Te devuelve la url de fieldview para hacer el login una vez que el usuario complete el login, notificara por notification-center. canal para la notificacion 'ExtensionV1Channel'.
La url de fielview contiene un redirect, que es del mimso back para poder completar el login.
El usuario permanece logueado por 30 dias, esto se renueva con el uso por lo tanto debera pasar 30 dias sin usarse para pedirle las credenciales de nuevo
Que pasa si uso una api sin estar logueado
La api respondera con un 400
{
"code": "NOT_LOGGED_IN",
"msg": "The user is not logged in to FieldView.",
"data": null
}
Logout
DELETE /fieldview/auth/logout
Sync
POST /fieldview/sync
Lanza una tarea en background
- Trae todos los lotes de fieldview y lo guarda en la base de auravant, si ya estaba cargado actualiza en nombre del lote
- Matchea lotes
- Tiene que coincidir en un 60% o mas la interseccion de las geometrias en ambos sentidos
- fieldview solo da un shape por lote, en auravant tomamos el ultimo poligono (este puede ser de una campaña futura)
- Si el lote ya matcheo antes no intentara devuelta
- Trae nombre del campo en fieldview (Esto lo hace solo la primera vez que trae el campo)
- Guarda en la base de datos las capas de cosecha, siembra y aplicacion. (Fechas, lotes y tipo, no trae nada del archivo)
- Se crea un group_uuid, esto agrupa las capas de fieldview para poder importar todas juntas. Para Agrupar las capas la diferencia de end_time y start_time de la siguiente capa debe ser menor a 4hs
Regroup layers
POST /fieldview/sync/regroup-layers
Regroupar capas
POST /fieldview/layers/regroup-layers
Reagrupa todas las capas no importadas hasta el momento. Este endpoint es útil cuando se modifican las variables que definen las ventanas horarias para agrupar capas, y se desea recalcular los group_uuid.
🔒 Restricción: Solo puede ser utilizado por usuarios con permisos SUDO.
Body: No requiere parámetros.
Resp:
status code: 202
{
"code": "PROCESSING"
}
OR
status code: 401
{
"code": "UNAUTHORIZED_USER",
"msg": "User is not allowed to perform this action"
}
Get Fields
GET /fieldview/fields
resp:
{
"fields": [
{
"fieldview_id": "string",
"fieldview_name": "string",
"fieldview_farm_id": "string",
"fieldview_farm_name": "string"|null,
"field_id": 0|null
}
]
}
En caso que field_id sea null quiere decir que no hay coincidencia con un lote de auravant.
Solo trae los lotes que matcheo el usuario. Si tengo un lote de auravant que matcheo con uno de fielview de otro usuario no lo trae, ya que fieldview no nos permite ver los lotes compartidos
Importar lote
Buscar lotes no importados
GET /fieldview/fields
Lista los lotes de fieldview, Se puede pasar como parametro matched=False para que traiga solo los no importados
Buscar Wkt
GET /fieldview/fields/wkts
Importar lote
Usar la api de agregar lote
POST /api/agregarlote
Matchear lote con fieldview
POST /fieldview/fields/match
Posibles errores:
- FIELDVIEW_NOT_FOUND: fieldview_id no existe
- FIELDVIEW_ALREADY_MATCHED: El lote de fieldview ya esta matcheado con otro lote de auravant
- FIELD_ARAVANT_ALREADY_MATCHED: El lote de auravant ya esta matcheado con otro lote de fieldview
- FIELDVIEW_NOT_MATCH: Los lotes no coinciden en mas de un 60%
Capas
GET /fieldview/layers
En swagger detalle de lotdos los filtros
Status
NOT_IMPORTED = 1 PROCESSING = 2 IMPORTED = 3 ERROR = 4 DELETED = 5
PATCH /fieldview/layers
- Permite ocultar o hacer visible una capa
- restore, Solamente si el estado es eliminado. Vuelve la capa al estado de no importado
DELETE /fieldview/layers
Deja la capa en estado eliminado, y borra la capa creada en auravant
Ver capa
GET /fieldview/layers/aura
Devuelve la informacion para buscar la capa en /api/geoserver/data
Importar capa
POST /fieldview/layers/process
- Hace algunas validaciones en el momento como verificar que exista, que no haya sido importada, y devuelve las imagenes con fallos y las que se mandan a procesar
- Importa las imagenes de forma async
- Pone las unidades que viene de fieldview, no convierte esto podria dejar unidades en un sistema de unidades distinto al del usuario
- Capa cosecha: Busca la columna 'vrYieldMass'
- Capa Aplicacion:
- Capa Siembra: Busca la columna 'vrSeedRateSeedsActual'
Resetear capa
POST /fieldview/layers/retry
Vuelve una capa pendiente, importada o con error a estado "No importado".
body:
{
"layers": [
{
"group_uuid": "UUID..."
}
]
}
Backend
Login
https://dev.fieldview.com/api-details/
Acciones auth
- Generar url de login, es la url del login de fieldview donde el usuario completa el login, esta url te pide
- redirect_url: Es nuestra api que completa el login, en esta url se agrega el user_id y la ext_id para saber quien es el que se esta logueando
- scope: Son las acciones que se quiere hacer sobre fieldview ej: fields:read imagery:write . Si se llegara a agregar una accion hay que invalidar todos los token activos, sino tendremos problemas de permisos
- Login: es la api "redirect_url" esta genera el access_token y refresh_token para completar login
- access_token: tiene una duracion de 4hs, para no tener problema lo renovamos si pasan 3hs desde su generacion
- refresh_token: Dura 30 dias y es de un solo uso, por lo tanto cuando se utiliza se guarda un nuevo access_token y refresh_token, y se elimina el anterior.
- logout: Simplemente borra de la base de datos si hay un login activo
Como obtener el access_token
Utilizar la clase GetTokenFieldview, se encargara de proveer un access_token valido, si es necesario lo renueva. En caso de no tener un login activo lanzara un excepcion 'NotLoginFieldviewError'
# /fieldview/application/login/get_token_fieldview.py
class GetTokenFieldview:
...
async def get_access_token(self, user_id: int) -> str:
...
Base de datos
Tablas:
- fieldview_login:
- workspace_id: int
- user_id: int
- access_token: text
- refresh_token: text
- created_at: TIMESTAMPTZ
- deleted_at: TIMESTAMPTZ
Fields
https://dev.fieldview.com/technical-documentation/
Acciones fields
- SyncFieldsFieldview.sync:
- usando FieldFieldviewApiClient trae todos los lotes de fieldview
- con FieldFieldviewRepository guarda en la base de datos los lotes, en caso de que ya este guardado actualiza el nombre del lote
- MatchFieldsFieldview.match:
- utiliza FieldFieldviewApiClient y FieldFieldviewRepository
- recibe los lotes de auravant que el usuario tiene permisos
- Busca los boundary de fieldview de los lotes que todavia no estan matcheado
- Matchea los lotes que tienen mas de un 60% de coincidencia, (ha_intersecion/ha_field_aura)>/0.6 and (ha_intersecion/ha_field_fieldview)>0.6
- SyncFarmFielview.sync:
- utiliza FieldFieldviewApiClient y FieldFieldviewRepository
- Busca en la tabla de lotes todos los campos de fieldview que no estan en la tabla de farm
- Busca el nombre en fielview y lo guarda en la base
- GetFieldsFieldview:
- Devuelve todos los lotes del usuario, se puede filtrar por matcheados
- GetWktFieldview.get:
- Devuelve un dict con fieldview_id: wkt
- Desde la api no te deja buscar mas de 10 juntos que es el limite de fieldview asi un pegado a la api es uno solo en fieldview
- MatchFieldByIdFieldview.match:
- Recibe un field_id(aura) fieldview_id, si tiene coincidencia los matchea
Layers
Acciones layers
- DeleteLayerFieldview.delete:
- Pasa a estado eliminada
- Borra la capa de auravant
- DownloadLayerFieldview.download:
- Descarga el archivo de fieldview (dat)
- Retorna bytes
- GetLayersFieldview.get:
- Lista todas las capas disponibles en fieldview
- Filtros:
- yeargroup: obligatorio, busca el rango de fecha para ese yeargroup del usuario y filtra las capas por esas fechas
- ...
- GetLayerAura.get_layer:
- Devuelve layer_name, operation, date, field_id para poder buscar la capa
- ProcessLayersFieldview.process:
- Devuelve una lista de las imagenes que no se pueden procesar y una con las que se estan procesando
- Verifica que la capa este en estado no procesado
- Verifica que el lote de fieldview este relacionado con uno de aura
- ImportLayersFieldview.import_layers:
- descarga el archivo de fieldview
- usa las apis '/api/layers/files', '/api/layers/raster' de aurapi para generar la capa
- matchea las unidades con las de auravant, Solo string no convierte
- SyncLayerFieldview.sync:
- Busca las capas de cosecha, siembra, aplicacion
- Guarda los datos de fieldview (layer_fieldview_id, start_time, end_time, created_at, updated_at, fieldview_field_id)
- Estado por defecto no_importado=1
- hidden=False
- Busca la fecha mas alta de updated_at, para despues filtrar en fielview por esa fecha de modificacion y evitar traer todas las capas de vuelta
- UpdateLayerFieldview.update:
- hidden: ocultar o hacer visible
- restore: Solo si la capa esta eliminada, la pasa al estado no importada
base de datos

Sync
Acciones sync
- SyncFieldview
- ejecuta SyncFieldsFieldview, MatchFieldsFieldview, SyncFarmFielview, SyncLayerFieldview
- Una vez finalizado envia una notificacion a la extension ( 'data': "FIELDVIEW_SYNCHRONIZED")
- Esta se debe ejecutar en una tarea de celery
Clases de errores:
class FieldviewApiClientError(InfraError):
code = "API_FIELDVIEW_ERROR"
message = "Error en la api de fieldview"
class FieldviewNot200Error(InfraError):
code = "API_FIELDVIEW_NOT_200"
message = "Error en la api de fieldview"
class LayerFieldviewNotFound(DomainError):
code = 'LAYER_FIELDVIEW_NOT_FOUND'
message = "Layer Fieldview not found"
class LayerFieldviewNotImportedError(DomainError):
code = 'LAYER_FIELDVIEW_NOT_IMPORTED'
message = "Layer not imported"
class NotLayerAuraError(DomainError):
code = 'NOT_LAYER_AURA_ERROR'
message = "It has no layer created."
class LayerNotBeRestoredError(DomainError):
code = 'LAYER_CAN_NOT_BE_RESTORED'
message = "Layer can not be restored, it must be deleted."
class LayerNotMatchFieldError(DomainError):
code = 'LAYER_NOT_MATCH_FIELD'
message = "Layer does not match field shape."
class NotLoginFieldviewError(DomainError):
code = 'NOT_LOGGED_IN'
message = "The user is not logged in to FieldView."
class FieldviewNotFoundError(DomainError):
code = 'FIELDVIEW_NOT_FOUND'
message = "Fieldview not found"
class FieldviewAlreadyMatchedError(DomainError):
code = 'FIELDVIEW_ALREADY_MATCHED'
message = "Fieldview already matched"
class FieldAravantAlreadyMatchedError(DomainError):
code = 'FIELD_ARAVANT_ALREADY_MATCHED'
message = "Field auravant already matched"
class FieldviewNotMatchError(DomainError):
code = 'FIELDVIEW_NOT_MATCH'
message = "FieldView field does not match with Auravant field."