# coding=utf-8
# --------------------------------------------------------------------------
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
# Code generated by Microsoft (R) AutoRest Code Generator.
# Changes may cause incorrect behavior and will be lost if the code is regenerated.
# --------------------------------------------------------------------------

import datetime
from typing import Any, Dict, IO, List, Optional, Union

from azure.core.exceptions import HttpResponseError
import msrest.serialization

from ._farm_beats_client_enums import *


class ApplicationData(msrest.serialization.Model):
    """Schema of application data resource.

    Variables are only populated by the server, and will be ignored when sending a request.

    :param application_product_details: Application product details.
    :type application_product_details:
     list[~azure.agrifood.farming.models.ApplicationProductDetail]
    :param avg_material: Schema for storing measurement reading and unit.
    :type avg_material: ~azure.agrifood.farming.models.Measure
    :param total_material: Schema for storing measurement reading and unit.
    :type total_material: ~azure.agrifood.farming.models.Measure
    :param area: Schema for storing measurement reading and unit.
    :type area: ~azure.agrifood.farming.models.Measure
    :param source: Source of the operation data.
    :type source: str
    :param operation_modified_date_time: Modified date-time of the operation data, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
     Note: this will be specified by the source provider itself.
    :type operation_modified_date_time: ~datetime.datetime
    :param operation_start_date_time: Start date-time of the operation data, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :type operation_start_date_time: ~datetime.datetime
    :param operation_end_date_time: End date-time of the operation data, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :type operation_end_date_time: ~datetime.datetime
    :ivar attachments_link: Link for attachments.
    :vartype attachments_link: str
    :param associated_boundary_id: Optional boundary ID of the field for which operation was
     applied.
    :type associated_boundary_id: str
    :param operation_boundary_id: Optional boundary ID of the actual area for which operation was
     applied inside the specified field.
    :type operation_boundary_id: str
    :ivar farmer_id: Farmer ID which belongs to the operation data.
    :vartype farmer_id: str
    :ivar id: Unique resource ID.
    :vartype id: str
    :ivar e_tag: The ETag value to implement optimistic concurrency.
    :vartype e_tag: str
    :param status: Status of the resource.
    :type status: str
    :ivar created_date_time: Date-time when resource was created, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar modified_date_time: Date-time when resource was last modified, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype modified_date_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'source': {'max_length': 100, 'min_length': 2},
        'attachments_link': {'readonly': True},
        'farmer_id': {'readonly': True},
        'id': {'readonly': True},
        'e_tag': {'readonly': True},
        'status': {'max_length': 100, 'min_length': 0},
        'created_date_time': {'readonly': True},
        'modified_date_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'application_product_details': {'key': 'applicationProductDetails', 'type': '[ApplicationProductDetail]'},
        'avg_material': {'key': 'avgMaterial', 'type': 'Measure'},
        'total_material': {'key': 'totalMaterial', 'type': 'Measure'},
        'area': {'key': 'area', 'type': 'Measure'},
        'source': {'key': 'source', 'type': 'str'},
        'operation_modified_date_time': {'key': 'operationModifiedDateTime', 'type': 'iso-8601'},
        'operation_start_date_time': {'key': 'operationStartDateTime', 'type': 'iso-8601'},
        'operation_end_date_time': {'key': 'operationEndDateTime', 'type': 'iso-8601'},
        'attachments_link': {'key': 'attachmentsLink', 'type': 'str'},
        'associated_boundary_id': {'key': 'associatedBoundaryId', 'type': 'str'},
        'operation_boundary_id': {'key': 'operationBoundaryId', 'type': 'str'},
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'id': {'key': 'id', 'type': 'str'},
        'e_tag': {'key': 'eTag', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'modified_date_time': {'key': 'modifiedDateTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        application_product_details: Optional[List["ApplicationProductDetail"]] = None,
        avg_material: Optional["Measure"] = None,
        total_material: Optional["Measure"] = None,
        area: Optional["Measure"] = None,
        source: Optional[str] = None,
        operation_modified_date_time: Optional[datetime.datetime] = None,
        operation_start_date_time: Optional[datetime.datetime] = None,
        operation_end_date_time: Optional[datetime.datetime] = None,
        associated_boundary_id: Optional[str] = None,
        operation_boundary_id: Optional[str] = None,
        status: Optional[str] = None,
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(ApplicationData, self).__init__(**kwargs)
        self.application_product_details = application_product_details
        self.avg_material = avg_material
        self.total_material = total_material
        self.area = area
        self.source = source
        self.operation_modified_date_time = operation_modified_date_time
        self.operation_start_date_time = operation_start_date_time
        self.operation_end_date_time = operation_end_date_time
        self.attachments_link = None
        self.associated_boundary_id = associated_boundary_id
        self.operation_boundary_id = operation_boundary_id
        self.farmer_id = None
        self.id = None
        self.e_tag = None
        self.status = status
        self.created_date_time = None
        self.modified_date_time = None
        self.name = name
        self.description = description
        self.properties = properties


class ApplicationDataListResponse(msrest.serialization.Model):
    """Paged response contains list of requested objects and a URL link to get the next set of results.

    :param value: List of requested objects.
    :type value: list[~azure.agrifood.farming.models.ApplicationData]
    :param skip_token: Token used in retrieving the next page. If null, there are no additional
     pages.
    :type skip_token: str
    :param next_link: Continuation link (absolute URI) to the next page of results in the list.
    :type next_link: str
    """

    _attribute_map = {
        'value': {'key': 'value', 'type': '[ApplicationData]'},
        'skip_token': {'key': '$skipToken', 'type': 'str'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        value: Optional[List["ApplicationData"]] = None,
        skip_token: Optional[str] = None,
        next_link: Optional[str] = None,
        **kwargs
    ):
        super(ApplicationDataListResponse, self).__init__(**kwargs)
        self.value = value
        self.skip_token = skip_token
        self.next_link = next_link


class ApplicationProductDetail(msrest.serialization.Model):
    """Schema of product used during application.

    :param product_name: Name of the product applied.
    :type product_name: str
    :param is_carrier: A flag indicating whether product is a carrier for a tank mix.
    :type is_carrier: bool
    :param avg_material: Schema for storing measurement reading and unit.
    :type avg_material: ~azure.agrifood.farming.models.Measure
    :param total_material: Schema for storing measurement reading and unit.
    :type total_material: ~azure.agrifood.farming.models.Measure
    """

    _validation = {
        'product_name': {'max_length': 100, 'min_length': 1},
    }

    _attribute_map = {
        'product_name': {'key': 'productName', 'type': 'str'},
        'is_carrier': {'key': 'isCarrier', 'type': 'bool'},
        'avg_material': {'key': 'avgMaterial', 'type': 'Measure'},
        'total_material': {'key': 'totalMaterial', 'type': 'Measure'},
    }

    def __init__(
        self,
        *,
        product_name: Optional[str] = None,
        is_carrier: Optional[bool] = False,
        avg_material: Optional["Measure"] = None,
        total_material: Optional["Measure"] = None,
        **kwargs
    ):
        super(ApplicationProductDetail, self).__init__(**kwargs)
        self.product_name = product_name
        self.is_carrier = is_carrier
        self.avg_material = avg_material
        self.total_material = total_material


class Attachment(msrest.serialization.Model):
    """Schema of attachment resource.

    Variables are only populated by the server, and will be ignored when sending a request.

    :ivar farmer_id: Farmer id for this attachment.
    :vartype farmer_id: str
    :param resource_id: Associated Resource id for this attachment.
    :type resource_id: str
    :param resource_type: Associated Resource type for this attachment
     i.e. Farmer, Farm, Field, SeasonalField, Boundary, FarmOperationApplicationData, HarvestData,
     TillageData, PlantingData.
    :type resource_type: str
    :ivar original_file_name: Original File Name for this attachment.
    :vartype original_file_name: str
    :ivar id: Unique id.
    :vartype id: str
    :param status: Status of the resource.
    :type status: str
    :ivar created_date_time: Date when resource was created.
    :vartype created_date_time: ~datetime.datetime
    :ivar modified_date_time: Date when resource was last modified.
    :vartype modified_date_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of resource.
    :type description: str
    :ivar e_tag: The ETag value to implement optimistic concurrency.
    :vartype e_tag: str
    """

    _validation = {
        'farmer_id': {'readonly': True},
        'original_file_name': {'readonly': True},
        'id': {'readonly': True},
        'status': {'max_length': 100, 'min_length': 0},
        'created_date_time': {'readonly': True},
        'modified_date_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
        'e_tag': {'readonly': True},
    }

    _attribute_map = {
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'resource_id': {'key': 'resourceId', 'type': 'str'},
        'resource_type': {'key': 'resourceType', 'type': 'str'},
        'original_file_name': {'key': 'originalFileName', 'type': 'str'},
        'id': {'key': 'id', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'modified_date_time': {'key': 'modifiedDateTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'e_tag': {'key': 'eTag', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        resource_id: Optional[str] = None,
        resource_type: Optional[str] = None,
        status: Optional[str] = None,
        name: Optional[str] = None,
        description: Optional[str] = None,
        **kwargs
    ):
        super(Attachment, self).__init__(**kwargs)
        self.farmer_id = None
        self.resource_id = resource_id
        self.resource_type = resource_type
        self.original_file_name = None
        self.id = None
        self.status = status
        self.created_date_time = None
        self.modified_date_time = None
        self.name = name
        self.description = description
        self.e_tag = None


class AttachmentListResponse(msrest.serialization.Model):
    """Paged response contains list of requested objects and a URL link to get the next set of results.

    :param value: List of requested objects.
    :type value: list[~azure.agrifood.farming.models.Attachment]
    :param skip_token: Token used in retrieving the next page. If null, there are no additional
     pages.
    :type skip_token: str
    :param next_link: Continuation link (absolute URI) to the next page of results in the list.
    :type next_link: str
    """

    _attribute_map = {
        'value': {'key': 'value', 'type': '[Attachment]'},
        'skip_token': {'key': '$skipToken', 'type': 'str'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        value: Optional[List["Attachment"]] = None,
        skip_token: Optional[str] = None,
        next_link: Optional[str] = None,
        **kwargs
    ):
        super(AttachmentListResponse, self).__init__(**kwargs)
        self.value = value
        self.skip_token = skip_token
        self.next_link = next_link


class Boundary(msrest.serialization.Model):
    """Schema of boundary resource.

    Variables are only populated by the server, and will be ignored when sending a request.

    :ivar farmer_id: Farmer ID.
    :vartype farmer_id: str
    :param parent_id: ID of the parent(field or seasonalField) it belongs to.
    :type parent_id: str
    :param geometry: GeoJSON abstract class.
    :type geometry: ~azure.agrifood.farming.models.GeoJsonObject
    :param is_primary: Is the boundary primary.
    :type is_primary: bool
    :ivar acreage: Boundary area in acres.
    :vartype acreage: float
    :ivar parent_type: Type of the parent it belongs to.
    :vartype parent_type: str
    :ivar id: Unique resource ID.
    :vartype id: str
    :ivar e_tag: The ETag value to implement optimistic concurrency.
    :vartype e_tag: str
    :param status: Status of the resource.
    :type status: str
    :ivar created_date_time: Date-time when resource was created, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar modified_date_time: Date-time when resource was last modified, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype modified_date_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'farmer_id': {'readonly': True},
        'acreage': {'readonly': True},
        'parent_type': {'readonly': True},
        'id': {'readonly': True},
        'e_tag': {'readonly': True},
        'status': {'max_length': 100, 'min_length': 0},
        'created_date_time': {'readonly': True},
        'modified_date_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'parent_id': {'key': 'parentId', 'type': 'str'},
        'geometry': {'key': 'geometry', 'type': 'GeoJsonObject'},
        'is_primary': {'key': 'isPrimary', 'type': 'bool'},
        'acreage': {'key': 'acreage', 'type': 'float'},
        'parent_type': {'key': 'parentType', 'type': 'str'},
        'id': {'key': 'id', 'type': 'str'},
        'e_tag': {'key': 'eTag', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'modified_date_time': {'key': 'modifiedDateTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        parent_id: Optional[str] = None,
        geometry: Optional["GeoJsonObject"] = None,
        is_primary: Optional[bool] = None,
        status: Optional[str] = None,
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(Boundary, self).__init__(**kwargs)
        self.farmer_id = None
        self.parent_id = parent_id
        self.geometry = geometry
        self.is_primary = is_primary
        self.acreage = None
        self.parent_type = None
        self.id = None
        self.e_tag = None
        self.status = status
        self.created_date_time = None
        self.modified_date_time = None
        self.name = name
        self.description = description
        self.properties = properties


class BoundaryListResponse(msrest.serialization.Model):
    """Paged response contains list of requested objects and a URL link to get the next set of results.

    :param value: List of requested objects.
    :type value: list[~azure.agrifood.farming.models.Boundary]
    :param skip_token: Token used in retrieving the next page. If null, there are no additional
     pages.
    :type skip_token: str
    :param next_link: Continuation link (absolute URI) to the next page of results in the list.
    :type next_link: str
    """

    _attribute_map = {
        'value': {'key': 'value', 'type': '[Boundary]'},
        'skip_token': {'key': '$skipToken', 'type': 'str'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        value: Optional[List["Boundary"]] = None,
        skip_token: Optional[str] = None,
        next_link: Optional[str] = None,
        **kwargs
    ):
        super(BoundaryListResponse, self).__init__(**kwargs)
        self.value = value
        self.skip_token = skip_token
        self.next_link = next_link


class BoundaryOverlapResponse(msrest.serialization.Model):
    """Schema of boundary overlap response.

    :param boundary_acreage: Acreage of Main boundary.
    :type boundary_acreage: float
    :param other_boundary_acreage: Acreage of other boundary.
    :type other_boundary_acreage: float
    :param intersecting_acreage: Acreage of intersecting boundary.
    :type intersecting_acreage: float
    """

    _attribute_map = {
        'boundary_acreage': {'key': 'boundaryAcreage', 'type': 'float'},
        'other_boundary_acreage': {'key': 'otherBoundaryAcreage', 'type': 'float'},
        'intersecting_acreage': {'key': 'intersectingAcreage', 'type': 'float'},
    }

    def __init__(
        self,
        *,
        boundary_acreage: Optional[float] = None,
        other_boundary_acreage: Optional[float] = None,
        intersecting_acreage: Optional[float] = None,
        **kwargs
    ):
        super(BoundaryOverlapResponse, self).__init__(**kwargs)
        self.boundary_acreage = boundary_acreage
        self.other_boundary_acreage = other_boundary_acreage
        self.intersecting_acreage = intersecting_acreage


class CascadeDeleteJob(msrest.serialization.Model):
    """Schema of cascade delete job.

    Variables are only populated by the server, and will be ignored when sending a request.

    All required parameters must be populated in order to send to Azure.

    :param farmer_id: Required. Farmer ID.
    :type farmer_id: str
    :param resource_id: Required. The id of the resource.
    :type resource_id: str
    :param resource_type: Required. The type of the resource.
    :type resource_type: str
    :ivar id: Unique job id.
    :vartype id: str
    :ivar status: Status of the job.
     Possible values: 'Waiting', 'Running', 'Succeeded', 'Failed', 'Cancelled'.
    :vartype status: str
    :ivar duration_in_seconds: Duration of the job in seconds.
    :vartype duration_in_seconds: float
    :ivar message: Status message to capture more details of the job.
    :vartype message: str
    :ivar created_date_time: Job created at dateTime. Sample format: yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar last_action_date_time: Job was last acted upon at dateTime. Sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype last_action_date_time: ~datetime.datetime
    :ivar start_time: Job start time when available. Sample format: yyyy-MM-ddTHH:mm:ssZ.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: Job end time when available. Sample format: yyyy-MM-ddTHH:mm:ssZ.
    :vartype end_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'farmer_id': {'required': True},
        'resource_id': {'required': True},
        'resource_type': {'required': True},
        'id': {'readonly': True},
        'status': {'readonly': True},
        'duration_in_seconds': {'readonly': True},
        'message': {'readonly': True},
        'created_date_time': {'readonly': True},
        'last_action_date_time': {'readonly': True},
        'start_time': {'readonly': True},
        'end_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'resource_id': {'key': 'resourceId', 'type': 'str'},
        'resource_type': {'key': 'resourceType', 'type': 'str'},
        'id': {'key': 'id', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'duration_in_seconds': {'key': 'durationInSeconds', 'type': 'float'},
        'message': {'key': 'message', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'last_action_date_time': {'key': 'lastActionDateTime', 'type': 'iso-8601'},
        'start_time': {'key': 'startTime', 'type': 'iso-8601'},
        'end_time': {'key': 'endTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        farmer_id: str,
        resource_id: str,
        resource_type: str,
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(CascadeDeleteJob, self).__init__(**kwargs)
        self.farmer_id = farmer_id
        self.resource_id = resource_id
        self.resource_type = resource_type
        self.id = None
        self.status = None
        self.duration_in_seconds = None
        self.message = None
        self.created_date_time = None
        self.last_action_date_time = None
        self.start_time = None
        self.end_time = None
        self.name = name
        self.description = description
        self.properties = properties


class Crop(msrest.serialization.Model):
    """Schema of crop resource.

    Variables are only populated by the server, and will be ignored when sending a request.

    :param phenotype: Crop phenotype.
    :type phenotype: str
    :ivar id: Unique resource ID.
    :vartype id: str
    :ivar e_tag: The ETag value to implement optimistic concurrency.
    :vartype e_tag: str
    :param status: Status of the resource.
    :type status: str
    :ivar created_date_time: Date-time when resource was created, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar modified_date_time: Date-time when resource was last modified, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype modified_date_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'phenotype': {'max_length': 100, 'min_length': 0},
        'id': {'readonly': True},
        'e_tag': {'readonly': True},
        'status': {'max_length': 100, 'min_length': 0},
        'created_date_time': {'readonly': True},
        'modified_date_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'phenotype': {'key': 'phenotype', 'type': 'str'},
        'id': {'key': 'id', 'type': 'str'},
        'e_tag': {'key': 'eTag', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'modified_date_time': {'key': 'modifiedDateTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        phenotype: Optional[str] = None,
        status: Optional[str] = None,
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(Crop, self).__init__(**kwargs)
        self.phenotype = phenotype
        self.id = None
        self.e_tag = None
        self.status = status
        self.created_date_time = None
        self.modified_date_time = None
        self.name = name
        self.description = description
        self.properties = properties


class CropListResponse(msrest.serialization.Model):
    """Paged response contains list of requested objects and a URL link to get the next set of results.

    :param value: List of requested objects.
    :type value: list[~azure.agrifood.farming.models.Crop]
    :param skip_token: Token used in retrieving the next page. If null, there are no additional
     pages.
    :type skip_token: str
    :param next_link: Continuation link (absolute URI) to the next page of results in the list.
    :type next_link: str
    """

    _attribute_map = {
        'value': {'key': 'value', 'type': '[Crop]'},
        'skip_token': {'key': '$skipToken', 'type': 'str'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        value: Optional[List["Crop"]] = None,
        skip_token: Optional[str] = None,
        next_link: Optional[str] = None,
        **kwargs
    ):
        super(CropListResponse, self).__init__(**kwargs)
        self.value = value
        self.skip_token = skip_token
        self.next_link = next_link


class CropVariety(msrest.serialization.Model):
    """Schema of crop variety resource.

    Variables are only populated by the server, and will be ignored when sending a request.

    :ivar crop_id: ID of the crop it belongs to.
    :vartype crop_id: str
    :param brand: CropVariety Brand.
    :type brand: str
    :param product: CropVariety product.
    :type product: str
    :ivar id: Unique resource ID.
    :vartype id: str
    :ivar e_tag: The ETag value to implement optimistic concurrency.
    :vartype e_tag: str
    :param status: Status of the resource.
    :type status: str
    :ivar created_date_time: Date-time when resource was created, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar modified_date_time: Date-time when resource was last modified, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype modified_date_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'crop_id': {'readonly': True},
        'brand': {'max_length': 100, 'min_length': 0},
        'product': {'max_length': 100, 'min_length': 0},
        'id': {'readonly': True},
        'e_tag': {'readonly': True},
        'status': {'max_length': 100, 'min_length': 0},
        'created_date_time': {'readonly': True},
        'modified_date_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'crop_id': {'key': 'cropId', 'type': 'str'},
        'brand': {'key': 'brand', 'type': 'str'},
        'product': {'key': 'product', 'type': 'str'},
        'id': {'key': 'id', 'type': 'str'},
        'e_tag': {'key': 'eTag', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'modified_date_time': {'key': 'modifiedDateTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        brand: Optional[str] = None,
        product: Optional[str] = None,
        status: Optional[str] = None,
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(CropVariety, self).__init__(**kwargs)
        self.crop_id = None
        self.brand = brand
        self.product = product
        self.id = None
        self.e_tag = None
        self.status = status
        self.created_date_time = None
        self.modified_date_time = None
        self.name = name
        self.description = description
        self.properties = properties


class CropVarietyListResponse(msrest.serialization.Model):
    """Paged response contains list of requested objects and a URL link to get the next set of results.

    :param value: List of requested objects.
    :type value: list[~azure.agrifood.farming.models.CropVariety]
    :param skip_token: Token used in retrieving the next page. If null, there are no additional
     pages.
    :type skip_token: str
    :param next_link: Continuation link (absolute URI) to the next page of results in the list.
    :type next_link: str
    """

    _attribute_map = {
        'value': {'key': 'value', 'type': '[CropVariety]'},
        'skip_token': {'key': '$skipToken', 'type': 'str'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        value: Optional[List["CropVariety"]] = None,
        skip_token: Optional[str] = None,
        next_link: Optional[str] = None,
        **kwargs
    ):
        super(CropVarietyListResponse, self).__init__(**kwargs)
        self.value = value
        self.skip_token = skip_token
        self.next_link = next_link


class Error(msrest.serialization.Model):
    """An error from the Azure AgPlatform service.

    :param code: Server-defined set of error codes.
    :type code: str
    :param message: Human-readable representation of the error.
    :type message: str
    :param target: Target of the error.
    :type target: str
    :param details: Array of details about specific errors that led to this reported error.
    :type details: list[~azure.agrifood.farming.models.Error]
    :param innererror: Inner error containing list of errors.
    
     :code:`<see
     href="https://github.com/Microsoft/api-guidelines/blob/vNext/Guidelines.md#innererror--object">InnerError
     reference document</see>`.
    :type innererror: ~azure.agrifood.farming.models.InnerError
    """

    _attribute_map = {
        'code': {'key': 'code', 'type': 'str'},
        'message': {'key': 'message', 'type': 'str'},
        'target': {'key': 'target', 'type': 'str'},
        'details': {'key': 'details', 'type': '[Error]'},
        'innererror': {'key': 'innererror', 'type': 'InnerError'},
    }

    def __init__(
        self,
        *,
        code: Optional[str] = None,
        message: Optional[str] = None,
        target: Optional[str] = None,
        details: Optional[List["Error"]] = None,
        innererror: Optional["InnerError"] = None,
        **kwargs
    ):
        super(Error, self).__init__(**kwargs)
        self.code = code
        self.message = message
        self.target = target
        self.details = details
        self.innererror = innererror


class ErrorResponse(msrest.serialization.Model):
    """An error response from the Azure AgPlatform service.

:code:`<see href="https://github.com/Microsoft/api-guidelines/blob/vNext/Guidelines.md#7102-error-condition-responses">ErrorResponse reference document.</see>`.

    :param error: An error from the Azure AgPlatform service.
    :type error: ~azure.agrifood.farming.models.Error
    :param trace_id: Unique trace ID.
    :type trace_id: str
    """

    _attribute_map = {
        'error': {'key': 'error', 'type': 'Error'},
        'trace_id': {'key': 'traceId', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        error: Optional["Error"] = None,
        trace_id: Optional[str] = None,
        **kwargs
    ):
        super(ErrorResponse, self).__init__(**kwargs)
        self.error = error
        self.trace_id = trace_id


class Farm(msrest.serialization.Model):
    """Schema of farm resource.

    Variables are only populated by the server, and will be ignored when sending a request.

    :ivar farmer_id: Farmer ID.
    :vartype farmer_id: str
    :ivar id: Unique resource ID.
    :vartype id: str
    :ivar e_tag: The ETag value to implement optimistic concurrency.
    :vartype e_tag: str
    :param status: Status of the resource.
    :type status: str
    :ivar created_date_time: Date-time when resource was created, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar modified_date_time: Date-time when resource was last modified, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype modified_date_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'farmer_id': {'readonly': True},
        'id': {'readonly': True},
        'e_tag': {'readonly': True},
        'status': {'max_length': 100, 'min_length': 0},
        'created_date_time': {'readonly': True},
        'modified_date_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'id': {'key': 'id', 'type': 'str'},
        'e_tag': {'key': 'eTag', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'modified_date_time': {'key': 'modifiedDateTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        status: Optional[str] = None,
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(Farm, self).__init__(**kwargs)
        self.farmer_id = None
        self.id = None
        self.e_tag = None
        self.status = status
        self.created_date_time = None
        self.modified_date_time = None
        self.name = name
        self.description = description
        self.properties = properties


class Farmer(msrest.serialization.Model):
    """Schema of farmer resource.

    Variables are only populated by the server, and will be ignored when sending a request.

    :ivar id: Unique resource ID.
    :vartype id: str
    :ivar e_tag: The ETag value to implement optimistic concurrency.
    :vartype e_tag: str
    :param status: Status of the resource.
    :type status: str
    :ivar created_date_time: Date-time when resource was created, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar modified_date_time: Date-time when resource was last modified, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype modified_date_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'id': {'readonly': True},
        'e_tag': {'readonly': True},
        'status': {'max_length': 100, 'min_length': 0},
        'created_date_time': {'readonly': True},
        'modified_date_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'id': {'key': 'id', 'type': 'str'},
        'e_tag': {'key': 'eTag', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'modified_date_time': {'key': 'modifiedDateTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        status: Optional[str] = None,
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(Farmer, self).__init__(**kwargs)
        self.id = None
        self.e_tag = None
        self.status = status
        self.created_date_time = None
        self.modified_date_time = None
        self.name = name
        self.description = description
        self.properties = properties


class FarmerListResponse(msrest.serialization.Model):
    """Paged response contains list of requested objects and a URL link to get the next set of results.

    :param value: List of requested objects.
    :type value: list[~azure.agrifood.farming.models.Farmer]
    :param skip_token: Token used in retrieving the next page. If null, there are no additional
     pages.
    :type skip_token: str
    :param next_link: Continuation link (absolute URI) to the next page of results in the list.
    :type next_link: str
    """

    _attribute_map = {
        'value': {'key': 'value', 'type': '[Farmer]'},
        'skip_token': {'key': '$skipToken', 'type': 'str'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        value: Optional[List["Farmer"]] = None,
        skip_token: Optional[str] = None,
        next_link: Optional[str] = None,
        **kwargs
    ):
        super(FarmerListResponse, self).__init__(**kwargs)
        self.value = value
        self.skip_token = skip_token
        self.next_link = next_link


class FarmListResponse(msrest.serialization.Model):
    """Paged response contains list of requested objects and a URL link to get the next set of results.

    :param value: List of requested objects.
    :type value: list[~azure.agrifood.farming.models.Farm]
    :param skip_token: Token used in retrieving the next page. If null, there are no additional
     pages.
    :type skip_token: str
    :param next_link: Continuation link (absolute URI) to the next page of results in the list.
    :type next_link: str
    """

    _attribute_map = {
        'value': {'key': 'value', 'type': '[Farm]'},
        'skip_token': {'key': '$skipToken', 'type': 'str'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        value: Optional[List["Farm"]] = None,
        skip_token: Optional[str] = None,
        next_link: Optional[str] = None,
        **kwargs
    ):
        super(FarmListResponse, self).__init__(**kwargs)
        self.value = value
        self.skip_token = skip_token
        self.next_link = next_link


class FarmOperationDataIngestionJob(msrest.serialization.Model):
    """Schema of farm operation data ingestion job.

    Variables are only populated by the server, and will be ignored when sending a request.

    All required parameters must be populated in order to send to Azure.

    :param farmer_id: Required. Farmer ID.
    :type farmer_id: str
    :param auth_provider_id: Required. Authentication provider ID.
    :type auth_provider_id: str
    :param operations: List of operation types for which data needs to be downloaded. Available
     values: AllOperations, Application, Planting, Harvest, Tillage.
    :type operations: list[str]
    :param start_year: Required. Start Year (Minimum = 2000, Maximum = CurrentYear).
    :type start_year: int
    :ivar id: Unique job id.
    :vartype id: str
    :ivar status: Status of the job.
     Possible values: 'Waiting', 'Running', 'Succeeded', 'Failed', 'Cancelled'.
    :vartype status: str
    :ivar duration_in_seconds: Duration of the job in seconds.
    :vartype duration_in_seconds: float
    :ivar message: Status message to capture more details of the job.
    :vartype message: str
    :ivar created_date_time: Job created at dateTime. Sample format: yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar last_action_date_time: Job was last acted upon at dateTime. Sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype last_action_date_time: ~datetime.datetime
    :ivar start_time: Job start time when available. Sample format: yyyy-MM-ddTHH:mm:ssZ.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: Job end time when available. Sample format: yyyy-MM-ddTHH:mm:ssZ.
    :vartype end_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'farmer_id': {'required': True},
        'auth_provider_id': {'required': True},
        'start_year': {'required': True},
        'id': {'readonly': True},
        'status': {'readonly': True},
        'duration_in_seconds': {'readonly': True},
        'message': {'readonly': True},
        'created_date_time': {'readonly': True},
        'last_action_date_time': {'readonly': True},
        'start_time': {'readonly': True},
        'end_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'auth_provider_id': {'key': 'authProviderId', 'type': 'str'},
        'operations': {'key': 'operations', 'type': '[str]'},
        'start_year': {'key': 'startYear', 'type': 'int'},
        'id': {'key': 'id', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'duration_in_seconds': {'key': 'durationInSeconds', 'type': 'float'},
        'message': {'key': 'message', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'last_action_date_time': {'key': 'lastActionDateTime', 'type': 'iso-8601'},
        'start_time': {'key': 'startTime', 'type': 'iso-8601'},
        'end_time': {'key': 'endTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        farmer_id: str,
        auth_provider_id: str,
        start_year: int,
        operations: Optional[List[str]] = None,
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(FarmOperationDataIngestionJob, self).__init__(**kwargs)
        self.farmer_id = farmer_id
        self.auth_provider_id = auth_provider_id
        self.operations = operations
        self.start_year = start_year
        self.id = None
        self.status = None
        self.duration_in_seconds = None
        self.message = None
        self.created_date_time = None
        self.last_action_date_time = None
        self.start_time = None
        self.end_time = None
        self.name = name
        self.description = description
        self.properties = properties


class Field(msrest.serialization.Model):
    """Schema of field resource.

    Variables are only populated by the server, and will be ignored when sending a request.

    :param farm_id: ID of the associated Farm.
    :type farm_id: str
    :ivar farmer_id: Farmer ID.
    :vartype farmer_id: str
    :ivar primary_boundary_id: Primary boundary id.
    :vartype primary_boundary_id: str
    :ivar boundary_ids: Boundary Ids.
    :vartype boundary_ids: list[str]
    :ivar id: Unique resource ID.
    :vartype id: str
    :ivar e_tag: The ETag value to implement optimistic concurrency.
    :vartype e_tag: str
    :param status: Status of the resource.
    :type status: str
    :ivar created_date_time: Date-time when resource was created, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar modified_date_time: Date-time when resource was last modified, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype modified_date_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'farmer_id': {'readonly': True},
        'primary_boundary_id': {'readonly': True},
        'boundary_ids': {'readonly': True, 'unique': True},
        'id': {'readonly': True},
        'e_tag': {'readonly': True},
        'status': {'max_length': 100, 'min_length': 0},
        'created_date_time': {'readonly': True},
        'modified_date_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'farm_id': {'key': 'farmId', 'type': 'str'},
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'primary_boundary_id': {'key': 'primaryBoundaryId', 'type': 'str'},
        'boundary_ids': {'key': 'boundaryIds', 'type': '[str]'},
        'id': {'key': 'id', 'type': 'str'},
        'e_tag': {'key': 'eTag', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'modified_date_time': {'key': 'modifiedDateTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        farm_id: Optional[str] = None,
        status: Optional[str] = None,
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(Field, self).__init__(**kwargs)
        self.farm_id = farm_id
        self.farmer_id = None
        self.primary_boundary_id = None
        self.boundary_ids = None
        self.id = None
        self.e_tag = None
        self.status = status
        self.created_date_time = None
        self.modified_date_time = None
        self.name = name
        self.description = description
        self.properties = properties


class FieldListResponse(msrest.serialization.Model):
    """Paged response contains list of requested objects and a URL link to get the next set of results.

    :param value: List of requested objects.
    :type value: list[~azure.agrifood.farming.models.Field]
    :param skip_token: Token used in retrieving the next page. If null, there are no additional
     pages.
    :type skip_token: str
    :param next_link: Continuation link (absolute URI) to the next page of results in the list.
    :type next_link: str
    """

    _attribute_map = {
        'value': {'key': 'value', 'type': '[Field]'},
        'skip_token': {'key': '$skipToken', 'type': 'str'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        value: Optional[List["Field"]] = None,
        skip_token: Optional[str] = None,
        next_link: Optional[str] = None,
        **kwargs
    ):
        super(FieldListResponse, self).__init__(**kwargs)
        self.value = value
        self.skip_token = skip_token
        self.next_link = next_link


class GeoJsonObject(msrest.serialization.Model):
    """GeoJSON abstract class.

    You probably want to use the sub-classes and not this class directly. Known
    sub-classes are: MultiPolygon, Point, Polygon.

    All required parameters must be populated in order to send to Azure.

    :param type: Required. GeoJSON object type.Constant filled by server.  Possible values include:
     "Point", "Polygon", "MultiPolygon".
    :type type: str or ~azure.agrifood.farming.models.GeoJsonObjectType
    """

    _validation = {
        'type': {'required': True},
    }

    _attribute_map = {
        'type': {'key': 'type', 'type': 'str'},
    }

    _subtype_map = {
        'type': {'MultiPolygon': 'MultiPolygon', 'Point': 'Point', 'Polygon': 'Polygon'}
    }

    def __init__(
        self,
        **kwargs
    ):
        super(GeoJsonObject, self).__init__(**kwargs)
        self.type = None  # type: Optional[str]


class HarvestData(msrest.serialization.Model):
    """Schema of harvest data resource.

    Variables are only populated by the server, and will be ignored when sending a request.

    :param total_yield: Schema for storing measurement reading and unit.
    :type total_yield: ~azure.agrifood.farming.models.Measure
    :param avg_yield: Schema for storing measurement reading and unit.
    :type avg_yield: ~azure.agrifood.farming.models.Measure
    :param total_wet_mass: Schema for storing measurement reading and unit.
    :type total_wet_mass: ~azure.agrifood.farming.models.Measure
    :param avg_wet_mass: Schema for storing measurement reading and unit.
    :type avg_wet_mass: ~azure.agrifood.farming.models.Measure
    :param avg_moisture: Schema for storing measurement reading and unit.
    :type avg_moisture: ~azure.agrifood.farming.models.Measure
    :param avg_speed: Schema for storing measurement reading and unit.
    :type avg_speed: ~azure.agrifood.farming.models.Measure
    :param harvest_product_details: Harvest product details.
    :type harvest_product_details: list[~azure.agrifood.farming.models.HarvestProductDetail]
    :param area: Schema for storing measurement reading and unit.
    :type area: ~azure.agrifood.farming.models.Measure
    :param source: Source of the operation data.
    :type source: str
    :param operation_modified_date_time: Modified date-time of the operation data, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
     Note: this will be specified by the source provider itself.
    :type operation_modified_date_time: ~datetime.datetime
    :param operation_start_date_time: Start date-time of the operation data, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :type operation_start_date_time: ~datetime.datetime
    :param operation_end_date_time: End date-time of the operation data, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :type operation_end_date_time: ~datetime.datetime
    :ivar attachments_link: Link for attachments.
    :vartype attachments_link: str
    :param associated_boundary_id: Optional boundary ID of the field for which operation was
     applied.
    :type associated_boundary_id: str
    :param operation_boundary_id: Optional boundary ID of the actual area for which operation was
     applied inside the specified field.
    :type operation_boundary_id: str
    :ivar farmer_id: Farmer ID which belongs to the operation data.
    :vartype farmer_id: str
    :ivar id: Unique resource ID.
    :vartype id: str
    :ivar e_tag: The ETag value to implement optimistic concurrency.
    :vartype e_tag: str
    :param status: Status of the resource.
    :type status: str
    :ivar created_date_time: Date-time when resource was created, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar modified_date_time: Date-time when resource was last modified, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype modified_date_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'source': {'max_length': 100, 'min_length': 2},
        'attachments_link': {'readonly': True},
        'farmer_id': {'readonly': True},
        'id': {'readonly': True},
        'e_tag': {'readonly': True},
        'status': {'max_length': 100, 'min_length': 0},
        'created_date_time': {'readonly': True},
        'modified_date_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'total_yield': {'key': 'totalYield', 'type': 'Measure'},
        'avg_yield': {'key': 'avgYield', 'type': 'Measure'},
        'total_wet_mass': {'key': 'totalWetMass', 'type': 'Measure'},
        'avg_wet_mass': {'key': 'avgWetMass', 'type': 'Measure'},
        'avg_moisture': {'key': 'avgMoisture', 'type': 'Measure'},
        'avg_speed': {'key': 'avgSpeed', 'type': 'Measure'},
        'harvest_product_details': {'key': 'harvestProductDetails', 'type': '[HarvestProductDetail]'},
        'area': {'key': 'area', 'type': 'Measure'},
        'source': {'key': 'source', 'type': 'str'},
        'operation_modified_date_time': {'key': 'operationModifiedDateTime', 'type': 'iso-8601'},
        'operation_start_date_time': {'key': 'operationStartDateTime', 'type': 'iso-8601'},
        'operation_end_date_time': {'key': 'operationEndDateTime', 'type': 'iso-8601'},
        'attachments_link': {'key': 'attachmentsLink', 'type': 'str'},
        'associated_boundary_id': {'key': 'associatedBoundaryId', 'type': 'str'},
        'operation_boundary_id': {'key': 'operationBoundaryId', 'type': 'str'},
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'id': {'key': 'id', 'type': 'str'},
        'e_tag': {'key': 'eTag', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'modified_date_time': {'key': 'modifiedDateTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        total_yield: Optional["Measure"] = None,
        avg_yield: Optional["Measure"] = None,
        total_wet_mass: Optional["Measure"] = None,
        avg_wet_mass: Optional["Measure"] = None,
        avg_moisture: Optional["Measure"] = None,
        avg_speed: Optional["Measure"] = None,
        harvest_product_details: Optional[List["HarvestProductDetail"]] = None,
        area: Optional["Measure"] = None,
        source: Optional[str] = None,
        operation_modified_date_time: Optional[datetime.datetime] = None,
        operation_start_date_time: Optional[datetime.datetime] = None,
        operation_end_date_time: Optional[datetime.datetime] = None,
        associated_boundary_id: Optional[str] = None,
        operation_boundary_id: Optional[str] = None,
        status: Optional[str] = None,
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(HarvestData, self).__init__(**kwargs)
        self.total_yield = total_yield
        self.avg_yield = avg_yield
        self.total_wet_mass = total_wet_mass
        self.avg_wet_mass = avg_wet_mass
        self.avg_moisture = avg_moisture
        self.avg_speed = avg_speed
        self.harvest_product_details = harvest_product_details
        self.area = area
        self.source = source
        self.operation_modified_date_time = operation_modified_date_time
        self.operation_start_date_time = operation_start_date_time
        self.operation_end_date_time = operation_end_date_time
        self.attachments_link = None
        self.associated_boundary_id = associated_boundary_id
        self.operation_boundary_id = operation_boundary_id
        self.farmer_id = None
        self.id = None
        self.e_tag = None
        self.status = status
        self.created_date_time = None
        self.modified_date_time = None
        self.name = name
        self.description = description
        self.properties = properties


class HarvestDataListResponse(msrest.serialization.Model):
    """Paged response contains list of requested objects and a URL link to get the next set of results.

    :param value: List of requested objects.
    :type value: list[~azure.agrifood.farming.models.HarvestData]
    :param skip_token: Token used in retrieving the next page. If null, there are no additional
     pages.
    :type skip_token: str
    :param next_link: Continuation link (absolute URI) to the next page of results in the list.
    :type next_link: str
    """

    _attribute_map = {
        'value': {'key': 'value', 'type': '[HarvestData]'},
        'skip_token': {'key': '$skipToken', 'type': 'str'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        value: Optional[List["HarvestData"]] = None,
        skip_token: Optional[str] = None,
        next_link: Optional[str] = None,
        **kwargs
    ):
        super(HarvestDataListResponse, self).__init__(**kwargs)
        self.value = value
        self.skip_token = skip_token
        self.next_link = next_link


class HarvestProductDetail(msrest.serialization.Model):
    """Schema of product used during harvesting.

    :param product_name: Name of the product.
    :type product_name: str
    :param area: Schema for storing measurement reading and unit.
    :type area: ~azure.agrifood.farming.models.Measure
    :param total_yield: Schema for storing measurement reading and unit.
    :type total_yield: ~azure.agrifood.farming.models.Measure
    :param avg_yield: Schema for storing measurement reading and unit.
    :type avg_yield: ~azure.agrifood.farming.models.Measure
    :param avg_moisture: Schema for storing measurement reading and unit.
    :type avg_moisture: ~azure.agrifood.farming.models.Measure
    :param total_wet_mass: Schema for storing measurement reading and unit.
    :type total_wet_mass: ~azure.agrifood.farming.models.Measure
    :param avg_wet_mass: Schema for storing measurement reading and unit.
    :type avg_wet_mass: ~azure.agrifood.farming.models.Measure
    """

    _validation = {
        'product_name': {'max_length': 100, 'min_length': 1},
    }

    _attribute_map = {
        'product_name': {'key': 'productName', 'type': 'str'},
        'area': {'key': 'area', 'type': 'Measure'},
        'total_yield': {'key': 'totalYield', 'type': 'Measure'},
        'avg_yield': {'key': 'avgYield', 'type': 'Measure'},
        'avg_moisture': {'key': 'avgMoisture', 'type': 'Measure'},
        'total_wet_mass': {'key': 'totalWetMass', 'type': 'Measure'},
        'avg_wet_mass': {'key': 'avgWetMass', 'type': 'Measure'},
    }

    def __init__(
        self,
        *,
        product_name: Optional[str] = None,
        area: Optional["Measure"] = None,
        total_yield: Optional["Measure"] = None,
        avg_yield: Optional["Measure"] = None,
        avg_moisture: Optional["Measure"] = None,
        total_wet_mass: Optional["Measure"] = None,
        avg_wet_mass: Optional["Measure"] = None,
        **kwargs
    ):
        super(HarvestProductDetail, self).__init__(**kwargs)
        self.product_name = product_name
        self.area = area
        self.total_yield = total_yield
        self.avg_yield = avg_yield
        self.avg_moisture = avg_moisture
        self.total_wet_mass = total_wet_mass
        self.avg_wet_mass = avg_wet_mass


class ImageFile(msrest.serialization.Model):
    """Schema of image file resource.

    All required parameters must be populated in order to send to Azure.

    :param file_link: Link of the image file.
    :type file_link: str
    :param name: Required. Name of the image file.
    :type name: str
    :param image_format: Supported image formats for scene resource. Possible values include:
     "TIF".
    :type image_format: str or ~azure.agrifood.farming.models.ImageFormat
    :param resolution: Resolution of image file in meters.
    :type resolution: float
    """

    _validation = {
        'name': {'required': True},
    }

    _attribute_map = {
        'file_link': {'key': 'fileLink', 'type': 'str'},
        'name': {'key': 'name', 'type': 'str'},
        'image_format': {'key': 'imageFormat', 'type': 'str'},
        'resolution': {'key': 'resolution', 'type': 'float'},
    }

    def __init__(
        self,
        *,
        name: str,
        file_link: Optional[str] = None,
        image_format: Optional[Union[str, "ImageFormat"]] = None,
        resolution: Optional[float] = None,
        **kwargs
    ):
        super(ImageFile, self).__init__(**kwargs)
        self.file_link = file_link
        self.name = name
        self.image_format = image_format
        self.resolution = resolution


class ImageProcessingRasterizeJob(msrest.serialization.Model):
    """ImageProcessingRasterizeJob.

    Variables are only populated by the server, and will be ignored when sending a request.

    All required parameters must be populated in order to send to Azure.

    :param farmer_id: Required. Farmer ID.
    :type farmer_id: str
    :param shapefile_attachment_id: Required. Shapefile attachment ID.
    :type shapefile_attachment_id: str
    :param shapefile_column_names: Required. List of shapefile column names to create raster
     attachments.
    :type shapefile_column_names: list[str]
    :ivar id: Unique job id.
    :vartype id: str
    :ivar status: Status of the job.
     Possible values: 'Waiting', 'Running', 'Succeeded', 'Failed', 'Cancelled'.
    :vartype status: str
    :ivar duration_in_seconds: Duration of the job in seconds.
    :vartype duration_in_seconds: float
    :ivar message: Status message to capture more details of the job.
    :vartype message: str
    :ivar created_date_time: Job created at dateTime. Sample format: yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar last_action_date_time: Job was last acted upon at dateTime. Sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype last_action_date_time: ~datetime.datetime
    :ivar start_time: Job start time when available. Sample format: yyyy-MM-ddTHH:mm:ssZ.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: Job end time when available. Sample format: yyyy-MM-ddTHH:mm:ssZ.
    :vartype end_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'farmer_id': {'required': True},
        'shapefile_attachment_id': {'required': True},
        'shapefile_column_names': {'required': True},
        'id': {'readonly': True},
        'status': {'readonly': True},
        'duration_in_seconds': {'readonly': True},
        'message': {'readonly': True},
        'created_date_time': {'readonly': True},
        'last_action_date_time': {'readonly': True},
        'start_time': {'readonly': True},
        'end_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'shapefile_attachment_id': {'key': 'shapefileAttachmentId', 'type': 'str'},
        'shapefile_column_names': {'key': 'shapefileColumnNames', 'type': '[str]'},
        'id': {'key': 'id', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'duration_in_seconds': {'key': 'durationInSeconds', 'type': 'float'},
        'message': {'key': 'message', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'last_action_date_time': {'key': 'lastActionDateTime', 'type': 'iso-8601'},
        'start_time': {'key': 'startTime', 'type': 'iso-8601'},
        'end_time': {'key': 'endTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        farmer_id: str,
        shapefile_attachment_id: str,
        shapefile_column_names: List[str],
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(ImageProcessingRasterizeJob, self).__init__(**kwargs)
        self.farmer_id = farmer_id
        self.shapefile_attachment_id = shapefile_attachment_id
        self.shapefile_column_names = shapefile_column_names
        self.id = None
        self.status = None
        self.duration_in_seconds = None
        self.message = None
        self.created_date_time = None
        self.last_action_date_time = None
        self.start_time = None
        self.end_time = None
        self.name = name
        self.description = description
        self.properties = properties


class InnerError(msrest.serialization.Model):
    """Inner error containing list of errors.

:code:`<see href="https://github.com/Microsoft/api-guidelines/blob/vNext/Guidelines.md#innererror--object">InnerError reference document</see>`.

    :param additional_properties: Unmatched properties from the message are deserialized to this
     collection.
    :type additional_properties: dict[str, any]
    :param code: Specific error code than was provided by the
     containing error.
    :type code: str
    :param innererror: Inner error containing list of errors.
    
     :code:`<see
     href="https://github.com/Microsoft/api-guidelines/blob/vNext/Guidelines.md#innererror--object">InnerError
     reference document</see>`.
    :type innererror: ~azure.agrifood.farming.models.InnerError
    """

    _attribute_map = {
        'additional_properties': {'key': '', 'type': '{object}'},
        'code': {'key': 'code', 'type': 'str'},
        'innererror': {'key': 'innererror', 'type': 'InnerError'},
    }

    def __init__(
        self,
        *,
        additional_properties: Optional[Dict[str, Any]] = None,
        code: Optional[str] = None,
        innererror: Optional["InnerError"] = None,
        **kwargs
    ):
        super(InnerError, self).__init__(**kwargs)
        self.additional_properties = additional_properties
        self.code = code
        self.innererror = innererror


class Location(msrest.serialization.Model):
    """Location model class.

    All required parameters must be populated in order to send to Azure.

    :param latitude: Required. Latitude of the location.
    :type latitude: float
    :param longitude: Required. Longitude of the location.
    :type longitude: float
    """

    _validation = {
        'latitude': {'required': True, 'maximum': 90, 'minimum': -90},
        'longitude': {'required': True, 'maximum': 180, 'minimum': -180},
    }

    _attribute_map = {
        'latitude': {'key': 'latitude', 'type': 'float'},
        'longitude': {'key': 'longitude', 'type': 'float'},
    }

    def __init__(
        self,
        *,
        latitude: float,
        longitude: float,
        **kwargs
    ):
        super(Location, self).__init__(**kwargs)
        self.latitude = latitude
        self.longitude = longitude


class Measure(msrest.serialization.Model):
    """Schema for storing measurement reading and unit.

    :param unit: Data unit.
    :type unit: str
    :param value: Data value.
    :type value: float
    """

    _validation = {
        'unit': {'max_length': 50, 'min_length': 1},
    }

    _attribute_map = {
        'unit': {'key': 'unit', 'type': 'str'},
        'value': {'key': 'value', 'type': 'float'},
    }

    def __init__(
        self,
        *,
        unit: Optional[str] = None,
        value: Optional[float] = None,
        **kwargs
    ):
        super(Measure, self).__init__(**kwargs)
        self.unit = unit
        self.value = value


class MultiPolygonCoordinates(msrest.serialization.Model):
    """Schema of multi polygon coordinates.

    All required parameters must be populated in order to send to Azure.

    :param coordinates: Required. Gets or sets Coordinates of GeoJSON Object.
     It must be an array of polygons, each polygon contains list of linear rings.
     For Polygons with more than one of these rings, the first MUST be the exterior ring,
     and any others MUST be interior rings.
    :type coordinates: list[list[list[list[float]]]]
    """

    _validation = {
        'coordinates': {'required': True},
    }

    _attribute_map = {
        'coordinates': {'key': 'coordinates', 'type': '[[[[float]]]]'},
    }

    def __init__(
        self,
        *,
        coordinates: List[List[List[List[float]]]],
        **kwargs
    ):
        super(MultiPolygonCoordinates, self).__init__(**kwargs)
        self.coordinates = coordinates


class MultiPolygon(GeoJsonObject, MultiPolygonCoordinates):
    """MultiPolygon geometry.

    All required parameters must be populated in order to send to Azure.

    :param coordinates: Required. Gets or sets Coordinates of GeoJSON Object.
     It must be an array of polygons, each polygon contains list of linear rings.
     For Polygons with more than one of these rings, the first MUST be the exterior ring,
     and any others MUST be interior rings.
    :type coordinates: list[list[list[list[float]]]]
    :param type: Required. GeoJSON object type.Constant filled by server.  Possible values include:
     "Point", "Polygon", "MultiPolygon".
    :type type: str or ~azure.agrifood.farming.models.GeoJsonObjectType
    """

    _validation = {
        'coordinates': {'required': True},
        'type': {'required': True},
    }

    _attribute_map = {
        'coordinates': {'key': 'coordinates', 'type': '[[[[float]]]]'},
        'type': {'key': 'type', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        coordinates: List[List[List[List[float]]]],
        **kwargs
    ):
        super(MultiPolygon, self).__init__(coordinates=coordinates, **kwargs)
        self.coordinates = coordinates
        self.type = 'MultiPolygon'  # type: str
        self.type = 'MultiPolygon'  # type: str


class OAuthConnectRequest(msrest.serialization.Model):
    """Get OAuth config query parameters.

    All required parameters must be populated in order to send to Azure.

    :param farmer_id: Required. ID of the farmer.
    :type farmer_id: str
    :param o_auth_provider_id: Required. ID of the OAuthProvider.
    :type o_auth_provider_id: str
    :param user_redirect_link: Required. Link to redirect the user to, at the end of the oauth
     flow.
    :type user_redirect_link: str
    :param user_redirect_state: State to provide back when redirecting the user, at the end of the
     oauth flow.
    :type user_redirect_state: str
    """

    _validation = {
        'farmer_id': {'required': True},
        'o_auth_provider_id': {'required': True},
        'user_redirect_link': {'required': True, 'max_length': 1000, 'min_length': 0},
        'user_redirect_state': {'max_length': 200, 'min_length': 0},
    }

    _attribute_map = {
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'o_auth_provider_id': {'key': 'oAuthProviderId', 'type': 'str'},
        'user_redirect_link': {'key': 'userRedirectLink', 'type': 'str'},
        'user_redirect_state': {'key': 'userRedirectState', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        farmer_id: str,
        o_auth_provider_id: str,
        user_redirect_link: str,
        user_redirect_state: Optional[str] = None,
        **kwargs
    ):
        super(OAuthConnectRequest, self).__init__(**kwargs)
        self.farmer_id = farmer_id
        self.o_auth_provider_id = o_auth_provider_id
        self.user_redirect_link = user_redirect_link
        self.user_redirect_state = user_redirect_state


class OAuthProvider(msrest.serialization.Model):
    """Schema of OAuth provider resource.

    Variables are only populated by the server, and will be ignored when sending a request.

    :param app_id: OAuth App ID for given OAuth Provider.
    :type app_id: str
    :param app_secret: OAuth App secret for given Provider.
     Note: Won't be sent in response.
    :type app_secret: str
    :param api_key: OAuth Api key for given Provider.
     Note: currently Applicable to Climate provider. Won't be sent in response.
    :type api_key: str
    :param is_production_app: An optional flag to determine if the App is ready to be used for
     Production scenarios in the provider side or not. (Default value: false)
     Note: Currently applicable for JohnDeere.
    :type is_production_app: bool
    :ivar id: Unique OAuth provider ID.
    :vartype id: str
    :ivar e_tag: The ETag value to implement optimistic concurrency.
    :vartype e_tag: str
    :ivar created_date_time: Date-time when resource was created, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar modified_date_time: Date-time when resource was last modified, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype modified_date_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'app_id': {'max_length': 200, 'min_length': 2},
        'app_secret': {'max_length': 200, 'min_length': 2},
        'api_key': {'max_length': 200, 'min_length': 2},
        'id': {'readonly': True},
        'e_tag': {'readonly': True},
        'created_date_time': {'readonly': True},
        'modified_date_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'app_id': {'key': 'appId', 'type': 'str'},
        'app_secret': {'key': 'appSecret', 'type': 'str'},
        'api_key': {'key': 'apiKey', 'type': 'str'},
        'is_production_app': {'key': 'isProductionApp', 'type': 'bool'},
        'id': {'key': 'id', 'type': 'str'},
        'e_tag': {'key': 'eTag', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'modified_date_time': {'key': 'modifiedDateTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        app_id: Optional[str] = None,
        app_secret: Optional[str] = None,
        api_key: Optional[str] = None,
        is_production_app: Optional[bool] = False,
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(OAuthProvider, self).__init__(**kwargs)
        self.app_id = app_id
        self.app_secret = app_secret
        self.api_key = api_key
        self.is_production_app = is_production_app
        self.id = None
        self.e_tag = None
        self.created_date_time = None
        self.modified_date_time = None
        self.name = name
        self.description = description
        self.properties = properties


class OAuthProviderListResponse(msrest.serialization.Model):
    """Paged response contains list of requested objects and a URL link to get the next set of results.

    :param value: List of requested objects.
    :type value: list[~azure.agrifood.farming.models.OAuthProvider]
    :param skip_token: Token used in retrieving the next page. If null, there are no additional
     pages.
    :type skip_token: str
    :param next_link: Continuation link (absolute URI) to the next page of results in the list.
    :type next_link: str
    """

    _attribute_map = {
        'value': {'key': 'value', 'type': '[OAuthProvider]'},
        'skip_token': {'key': '$skipToken', 'type': 'str'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        value: Optional[List["OAuthProvider"]] = None,
        skip_token: Optional[str] = None,
        next_link: Optional[str] = None,
        **kwargs
    ):
        super(OAuthProviderListResponse, self).__init__(**kwargs)
        self.value = value
        self.skip_token = skip_token
        self.next_link = next_link


class OAuthToken(msrest.serialization.Model):
    """Schema of OAuth token resource.

    Variables are only populated by the server, and will be ignored when sending a request.

    All required parameters must be populated in order to send to Azure.

    :param farmer_id: Required. Farmer ID for this OAuth config.
    :type farmer_id: str
    :param auth_provider_id: Required. ID of the OAuth provider resource containing app
     information.
    :type auth_provider_id: str
    :param is_valid: An optional flag indicating whether the token is a valid or expired (Default
     value: true).
    :type is_valid: bool
    :ivar e_tag: The ETag value to implement optimistic concurrency.
    :vartype e_tag: str
    :ivar created_date_time: Date-time when resource was created, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar modified_date_time: Date-time when resource was last modified, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype modified_date_time: ~datetime.datetime
    """

    _validation = {
        'farmer_id': {'required': True},
        'auth_provider_id': {'required': True},
        'e_tag': {'readonly': True},
        'created_date_time': {'readonly': True},
        'modified_date_time': {'readonly': True},
    }

    _attribute_map = {
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'auth_provider_id': {'key': 'authProviderId', 'type': 'str'},
        'is_valid': {'key': 'isValid', 'type': 'bool'},
        'e_tag': {'key': 'eTag', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'modified_date_time': {'key': 'modifiedDateTime', 'type': 'iso-8601'},
    }

    def __init__(
        self,
        *,
        farmer_id: str,
        auth_provider_id: str,
        is_valid: Optional[bool] = True,
        **kwargs
    ):
        super(OAuthToken, self).__init__(**kwargs)
        self.farmer_id = farmer_id
        self.auth_provider_id = auth_provider_id
        self.is_valid = is_valid
        self.e_tag = None
        self.created_date_time = None
        self.modified_date_time = None


class OAuthTokenListResponse(msrest.serialization.Model):
    """Paged response contains list of requested objects and a URL link to get the next set of results.

    :param value: List of requested objects.
    :type value: list[~azure.agrifood.farming.models.OAuthToken]
    :param skip_token: Token used in retrieving the next page. If null, there are no additional
     pages.
    :type skip_token: str
    :param next_link: Continuation link (absolute URI) to the next page of results in the list.
    :type next_link: str
    """

    _attribute_map = {
        'value': {'key': 'value', 'type': '[OAuthToken]'},
        'skip_token': {'key': '$skipToken', 'type': 'str'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        value: Optional[List["OAuthToken"]] = None,
        skip_token: Optional[str] = None,
        next_link: Optional[str] = None,
        **kwargs
    ):
        super(OAuthTokenListResponse, self).__init__(**kwargs)
        self.value = value
        self.skip_token = skip_token
        self.next_link = next_link


class Paths1LxjoxzFarmersFarmeridAttachmentsAttachmentidPatchRequestbodyContentMultipartFormDataSchema(msrest.serialization.Model):
    """Paths1LxjoxzFarmersFarmeridAttachmentsAttachmentidPatchRequestbodyContentMultipartFormDataSchema.

    :param file: File to be uploaded.
    :type file: IO
    :param farmer_id: Farmer id for this attachment.
    :type farmer_id: str
    :param resource_id: Associated Resource id for this attachment.
    :type resource_id: str
    :param resource_type: Associated Resource type for this attachment
     i.e. Farmer, Farm, Field, SeasonalField, Boundary, FarmOperationApplicationData, HarvestData,
     TillageData, PlantingData.
    :type resource_type: str
    :param original_file_name: Original File Name for this attachment.
    :type original_file_name: str
    :param id: Unique id.
    :type id: str
    :param status: Status of the resource.
    :type status: str
    :param created_date_time: Date when resource was created.
    :type created_date_time: str
    :param modified_date_time: Date when resource was last modified.
    :type modified_date_time: str
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of resource.
    :type description: str
    :param e_tag: The ETag value to implement optimistic concurrency.
    :type e_tag: str
    """

    _attribute_map = {
        'file': {'key': 'file', 'type': 'IO'},
        'farmer_id': {'key': 'FarmerId', 'type': 'str'},
        'resource_id': {'key': 'ResourceId', 'type': 'str'},
        'resource_type': {'key': 'ResourceType', 'type': 'str'},
        'original_file_name': {'key': 'OriginalFileName', 'type': 'str'},
        'id': {'key': 'Id', 'type': 'str'},
        'status': {'key': 'Status', 'type': 'str'},
        'created_date_time': {'key': 'CreatedDateTime', 'type': 'str'},
        'modified_date_time': {'key': 'ModifiedDateTime', 'type': 'str'},
        'name': {'key': 'Name', 'type': 'str'},
        'description': {'key': 'Description', 'type': 'str'},
        'e_tag': {'key': 'ETag', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        file: Optional[IO] = None,
        farmer_id: Optional[str] = None,
        resource_id: Optional[str] = None,
        resource_type: Optional[str] = None,
        original_file_name: Optional[str] = None,
        id: Optional[str] = None,
        status: Optional[str] = None,
        created_date_time: Optional[str] = None,
        modified_date_time: Optional[str] = None,
        name: Optional[str] = None,
        description: Optional[str] = None,
        e_tag: Optional[str] = None,
        **kwargs
    ):
        super(Paths1LxjoxzFarmersFarmeridAttachmentsAttachmentidPatchRequestbodyContentMultipartFormDataSchema, self).__init__(**kwargs)
        self.file = file
        self.farmer_id = farmer_id
        self.resource_id = resource_id
        self.resource_type = resource_type
        self.original_file_name = original_file_name
        self.id = id
        self.status = status
        self.created_date_time = created_date_time
        self.modified_date_time = modified_date_time
        self.name = name
        self.description = description
        self.e_tag = e_tag


class PlantingData(msrest.serialization.Model):
    """Schema of planting data resource.

    Variables are only populated by the server, and will be ignored when sending a request.

    :param avg_planting_rate: Schema for storing measurement reading and unit.
    :type avg_planting_rate: ~azure.agrifood.farming.models.Measure
    :param total_material: Schema for storing measurement reading and unit.
    :type total_material: ~azure.agrifood.farming.models.Measure
    :param avg_material: Schema for storing measurement reading and unit.
    :type avg_material: ~azure.agrifood.farming.models.Measure
    :param planting_product_details: Planting product details.
    :type planting_product_details: list[~azure.agrifood.farming.models.PlantingProductDetail]
    :param area: Schema for storing measurement reading and unit.
    :type area: ~azure.agrifood.farming.models.Measure
    :param source: Source of the operation data.
    :type source: str
    :param operation_modified_date_time: Modified date-time of the operation data, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
     Note: this will be specified by the source provider itself.
    :type operation_modified_date_time: ~datetime.datetime
    :param operation_start_date_time: Start date-time of the operation data, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :type operation_start_date_time: ~datetime.datetime
    :param operation_end_date_time: End date-time of the operation data, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :type operation_end_date_time: ~datetime.datetime
    :ivar attachments_link: Link for attachments.
    :vartype attachments_link: str
    :param associated_boundary_id: Optional boundary ID of the field for which operation was
     applied.
    :type associated_boundary_id: str
    :param operation_boundary_id: Optional boundary ID of the actual area for which operation was
     applied inside the specified field.
    :type operation_boundary_id: str
    :ivar farmer_id: Farmer ID which belongs to the operation data.
    :vartype farmer_id: str
    :ivar id: Unique resource ID.
    :vartype id: str
    :ivar e_tag: The ETag value to implement optimistic concurrency.
    :vartype e_tag: str
    :param status: Status of the resource.
    :type status: str
    :ivar created_date_time: Date-time when resource was created, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar modified_date_time: Date-time when resource was last modified, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype modified_date_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'source': {'max_length': 100, 'min_length': 2},
        'attachments_link': {'readonly': True},
        'farmer_id': {'readonly': True},
        'id': {'readonly': True},
        'e_tag': {'readonly': True},
        'status': {'max_length': 100, 'min_length': 0},
        'created_date_time': {'readonly': True},
        'modified_date_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'avg_planting_rate': {'key': 'avgPlantingRate', 'type': 'Measure'},
        'total_material': {'key': 'totalMaterial', 'type': 'Measure'},
        'avg_material': {'key': 'avgMaterial', 'type': 'Measure'},
        'planting_product_details': {'key': 'plantingProductDetails', 'type': '[PlantingProductDetail]'},
        'area': {'key': 'area', 'type': 'Measure'},
        'source': {'key': 'source', 'type': 'str'},
        'operation_modified_date_time': {'key': 'operationModifiedDateTime', 'type': 'iso-8601'},
        'operation_start_date_time': {'key': 'operationStartDateTime', 'type': 'iso-8601'},
        'operation_end_date_time': {'key': 'operationEndDateTime', 'type': 'iso-8601'},
        'attachments_link': {'key': 'attachmentsLink', 'type': 'str'},
        'associated_boundary_id': {'key': 'associatedBoundaryId', 'type': 'str'},
        'operation_boundary_id': {'key': 'operationBoundaryId', 'type': 'str'},
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'id': {'key': 'id', 'type': 'str'},
        'e_tag': {'key': 'eTag', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'modified_date_time': {'key': 'modifiedDateTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        avg_planting_rate: Optional["Measure"] = None,
        total_material: Optional["Measure"] = None,
        avg_material: Optional["Measure"] = None,
        planting_product_details: Optional[List["PlantingProductDetail"]] = None,
        area: Optional["Measure"] = None,
        source: Optional[str] = None,
        operation_modified_date_time: Optional[datetime.datetime] = None,
        operation_start_date_time: Optional[datetime.datetime] = None,
        operation_end_date_time: Optional[datetime.datetime] = None,
        associated_boundary_id: Optional[str] = None,
        operation_boundary_id: Optional[str] = None,
        status: Optional[str] = None,
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(PlantingData, self).__init__(**kwargs)
        self.avg_planting_rate = avg_planting_rate
        self.total_material = total_material
        self.avg_material = avg_material
        self.planting_product_details = planting_product_details
        self.area = area
        self.source = source
        self.operation_modified_date_time = operation_modified_date_time
        self.operation_start_date_time = operation_start_date_time
        self.operation_end_date_time = operation_end_date_time
        self.attachments_link = None
        self.associated_boundary_id = associated_boundary_id
        self.operation_boundary_id = operation_boundary_id
        self.farmer_id = None
        self.id = None
        self.e_tag = None
        self.status = status
        self.created_date_time = None
        self.modified_date_time = None
        self.name = name
        self.description = description
        self.properties = properties


class PlantingDataListResponse(msrest.serialization.Model):
    """Paged response contains list of requested objects and a URL link to get the next set of results.

    :param value: List of requested objects.
    :type value: list[~azure.agrifood.farming.models.PlantingData]
    :param skip_token: Token used in retrieving the next page. If null, there are no additional
     pages.
    :type skip_token: str
    :param next_link: Continuation link (absolute URI) to the next page of results in the list.
    :type next_link: str
    """

    _attribute_map = {
        'value': {'key': 'value', 'type': '[PlantingData]'},
        'skip_token': {'key': '$skipToken', 'type': 'str'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        value: Optional[List["PlantingData"]] = None,
        skip_token: Optional[str] = None,
        next_link: Optional[str] = None,
        **kwargs
    ):
        super(PlantingDataListResponse, self).__init__(**kwargs)
        self.value = value
        self.skip_token = skip_token
        self.next_link = next_link


class PlantingProductDetail(msrest.serialization.Model):
    """Schema for Planting product detail.

    :param product_name: Name of the product.
    :type product_name: str
    :param area: Schema for storing measurement reading and unit.
    :type area: ~azure.agrifood.farming.models.Measure
    :param total_material: Schema for storing measurement reading and unit.
    :type total_material: ~azure.agrifood.farming.models.Measure
    :param avg_material: Schema for storing measurement reading and unit.
    :type avg_material: ~azure.agrifood.farming.models.Measure
    """

    _attribute_map = {
        'product_name': {'key': 'productName', 'type': 'str'},
        'area': {'key': 'area', 'type': 'Measure'},
        'total_material': {'key': 'totalMaterial', 'type': 'Measure'},
        'avg_material': {'key': 'avgMaterial', 'type': 'Measure'},
    }

    def __init__(
        self,
        *,
        product_name: Optional[str] = None,
        area: Optional["Measure"] = None,
        total_material: Optional["Measure"] = None,
        avg_material: Optional["Measure"] = None,
        **kwargs
    ):
        super(PlantingProductDetail, self).__init__(**kwargs)
        self.product_name = product_name
        self.area = area
        self.total_material = total_material
        self.avg_material = avg_material


class PointCoordinates(msrest.serialization.Model):
    """Schema of the coordinates of a point.

    All required parameters must be populated in order to send to Azure.

    :param coordinates: Required. Gets or sets the coordinate of this point.
     It must be an array of 2 or 3 elements for a 2D or 3D system.
    :type coordinates: list[float]
    """

    _validation = {
        'coordinates': {'required': True},
    }

    _attribute_map = {
        'coordinates': {'key': 'coordinates', 'type': '[float]'},
    }

    def __init__(
        self,
        *,
        coordinates: List[float],
        **kwargs
    ):
        super(PointCoordinates, self).__init__(**kwargs)
        self.coordinates = coordinates


class Point(GeoJsonObject, PointCoordinates):
    """Point geometry.

    All required parameters must be populated in order to send to Azure.

    :param coordinates: Required. Gets or sets the coordinate of this point.
     It must be an array of 2 or 3 elements for a 2D or 3D system.
    :type coordinates: list[float]
    :param type: Required. GeoJSON object type.Constant filled by server.  Possible values include:
     "Point", "Polygon", "MultiPolygon".
    :type type: str or ~azure.agrifood.farming.models.GeoJsonObjectType
    """

    _validation = {
        'coordinates': {'required': True},
        'type': {'required': True},
    }

    _attribute_map = {
        'coordinates': {'key': 'coordinates', 'type': '[float]'},
        'type': {'key': 'type', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        coordinates: List[float],
        **kwargs
    ):
        super(Point, self).__init__(coordinates=coordinates, **kwargs)
        self.coordinates = coordinates
        self.type = 'Point'  # type: str
        self.type = 'Point'  # type: str


class PolygonCoordinates(msrest.serialization.Model):
    """Schema of polygon coordinates.

    All required parameters must be populated in order to send to Azure.

    :param coordinates: Required. Gets or sets type of the GeoJSON Object.
     It must be an array of linear ring coordinate arrays.
     For Polygons with more than one of these rings, the first MUST be the exterior ring,
     and any others MUST be interior rings.
    :type coordinates: list[list[list[float]]]
    """

    _validation = {
        'coordinates': {'required': True},
    }

    _attribute_map = {
        'coordinates': {'key': 'coordinates', 'type': '[[[float]]]'},
    }

    def __init__(
        self,
        *,
        coordinates: List[List[List[float]]],
        **kwargs
    ):
        super(PolygonCoordinates, self).__init__(**kwargs)
        self.coordinates = coordinates


class Polygon(GeoJsonObject, PolygonCoordinates):
    """Polygon geometry.

    All required parameters must be populated in order to send to Azure.

    :param coordinates: Required. Gets or sets type of the GeoJSON Object.
     It must be an array of linear ring coordinate arrays.
     For Polygons with more than one of these rings, the first MUST be the exterior ring,
     and any others MUST be interior rings.
    :type coordinates: list[list[list[float]]]
    :param type: Required. GeoJSON object type.Constant filled by server.  Possible values include:
     "Point", "Polygon", "MultiPolygon".
    :type type: str or ~azure.agrifood.farming.models.GeoJsonObjectType
    """

    _validation = {
        'coordinates': {'required': True},
        'type': {'required': True},
    }

    _attribute_map = {
        'coordinates': {'key': 'coordinates', 'type': '[[[float]]]'},
        'type': {'key': 'type', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        coordinates: List[List[List[float]]],
        **kwargs
    ):
        super(Polygon, self).__init__(coordinates=coordinates, **kwargs)
        self.coordinates = coordinates
        self.type = 'Polygon'  # type: str
        self.type = 'Polygon'  # type: str


class SatelliteData(msrest.serialization.Model):
    """Data Model for SatelliteIngestionJobRequest.

    :param image_names: List of ImageNames.
    :type image_names: list[str]
    :param image_formats: List of ImageFormats. Available value: TIF.
    :type image_formats: list[str]
    :param image_resolutions: List of ImageResolutions in meters. Available values: 10, 20, 60.
    :type image_resolutions: list[float]
    """

    _attribute_map = {
        'image_names': {'key': 'imageNames', 'type': '[str]'},
        'image_formats': {'key': 'imageFormats', 'type': '[str]'},
        'image_resolutions': {'key': 'imageResolutions', 'type': '[float]'},
    }

    def __init__(
        self,
        *,
        image_names: Optional[List[str]] = None,
        image_formats: Optional[List[str]] = None,
        image_resolutions: Optional[List[float]] = None,
        **kwargs
    ):
        super(SatelliteData, self).__init__(**kwargs)
        self.image_names = image_names
        self.image_formats = image_formats
        self.image_resolutions = image_resolutions


class SatelliteDataIngestionJob(msrest.serialization.Model):
    """Schema of satellite data ingestion job.

    Variables are only populated by the server, and will be ignored when sending a request.

    All required parameters must be populated in order to send to Azure.

    :param farmer_id: Required. Farmer ID.
    :type farmer_id: str
    :param boundary_id: Required. The id of the boundary object for which satellite data is being
     fetched.
    :type boundary_id: str
    :param start_date_time: Required. Start Date.
    :type start_date_time: ~datetime.datetime
    :param end_date_time: Required. End Date.
    :type end_date_time: ~datetime.datetime
    :param provider: Provider of satellite data. Possible values include: "Microsoft".
    :type provider: str or ~azure.agrifood.farming.models.DataProvider
    :param source: Source of satellite data. Possible values include: "Sentinel_2_L2A".
    :type source: str or ~azure.agrifood.farming.models.Source
    :param data: Data Model for SatelliteIngestionJobRequest.
    :type data: ~azure.agrifood.farming.models.SatelliteData
    :ivar id: Unique job id.
    :vartype id: str
    :ivar status: Status of the job.
     Possible values: 'Waiting', 'Running', 'Succeeded', 'Failed', 'Cancelled'.
    :vartype status: str
    :ivar duration_in_seconds: Duration of the job in seconds.
    :vartype duration_in_seconds: float
    :ivar message: Status message to capture more details of the job.
    :vartype message: str
    :ivar created_date_time: Job created at dateTime. Sample format: yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar last_action_date_time: Job was last acted upon at dateTime. Sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype last_action_date_time: ~datetime.datetime
    :ivar start_time: Job start time when available. Sample format: yyyy-MM-ddTHH:mm:ssZ.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: Job end time when available. Sample format: yyyy-MM-ddTHH:mm:ssZ.
    :vartype end_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'farmer_id': {'required': True},
        'boundary_id': {'required': True},
        'start_date_time': {'required': True},
        'end_date_time': {'required': True},
        'id': {'readonly': True},
        'status': {'readonly': True},
        'duration_in_seconds': {'readonly': True},
        'message': {'readonly': True},
        'created_date_time': {'readonly': True},
        'last_action_date_time': {'readonly': True},
        'start_time': {'readonly': True},
        'end_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'boundary_id': {'key': 'boundaryId', 'type': 'str'},
        'start_date_time': {'key': 'startDateTime', 'type': 'iso-8601'},
        'end_date_time': {'key': 'endDateTime', 'type': 'iso-8601'},
        'provider': {'key': 'provider', 'type': 'str'},
        'source': {'key': 'source', 'type': 'str'},
        'data': {'key': 'data', 'type': 'SatelliteData'},
        'id': {'key': 'id', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'duration_in_seconds': {'key': 'durationInSeconds', 'type': 'float'},
        'message': {'key': 'message', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'last_action_date_time': {'key': 'lastActionDateTime', 'type': 'iso-8601'},
        'start_time': {'key': 'startTime', 'type': 'iso-8601'},
        'end_time': {'key': 'endTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        farmer_id: str,
        boundary_id: str,
        start_date_time: datetime.datetime,
        end_date_time: datetime.datetime,
        provider: Optional[Union[str, "DataProvider"]] = None,
        source: Optional[Union[str, "Source"]] = None,
        data: Optional["SatelliteData"] = None,
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(SatelliteDataIngestionJob, self).__init__(**kwargs)
        self.farmer_id = farmer_id
        self.boundary_id = boundary_id
        self.start_date_time = start_date_time
        self.end_date_time = end_date_time
        self.provider = provider
        self.source = source
        self.data = data
        self.id = None
        self.status = None
        self.duration_in_seconds = None
        self.message = None
        self.created_date_time = None
        self.last_action_date_time = None
        self.start_time = None
        self.end_time = None
        self.name = name
        self.description = description
        self.properties = properties


class Scene(msrest.serialization.Model):
    """Schema of scene resource.

    Variables are only populated by the server, and will be ignored when sending a request.

    :param scene_date_time: Date-time of the scene, sample format: yyyy-MM-ddTHH:mm:ssZ.
    :type scene_date_time: ~datetime.datetime
    :param provider: Data provider of the scene.
    :type provider: str
    :param source: Data source of the scene.
    :type source: str
    :param image_files: Collection of image files.
    :type image_files: list[~azure.agrifood.farming.models.ImageFile]
    :param image_format: Supported image formats for scene resource. Possible values include:
     "TIF".
    :type image_format: str or ~azure.agrifood.farming.models.ImageFormat
    :param cloud_cover_percentage: Cloud cover percentage of the scene.
    :type cloud_cover_percentage: float
    :param dark_pixel_percentage: Dark pixel percentage of the scene.
    :type dark_pixel_percentage: float
    :param ndvi_median_value: Median of NDVI of the scene.
    :type ndvi_median_value: float
    :param boundary_id: Boundary ID which belongs to the scene.
    :type boundary_id: str
    :param farmer_id: Farmer ID which belongs to the scene.
    :type farmer_id: str
    :param id: Unique scene resource ID.
    :type id: str
    :ivar e_tag: The ETag value to implement optimistic concurrency.
    :vartype e_tag: str
    """

    _validation = {
        'provider': {'max_length': 100, 'min_length': 2},
        'source': {'max_length': 100, 'min_length': 2},
        'cloud_cover_percentage': {'maximum': 100, 'minimum': 0},
        'dark_pixel_percentage': {'maximum': 100, 'minimum': 0},
        'ndvi_median_value': {'maximum': 1, 'minimum': 0},
        'boundary_id': {'max_length': 100, 'min_length': 2},
        'e_tag': {'readonly': True},
    }

    _attribute_map = {
        'scene_date_time': {'key': 'sceneDateTime', 'type': 'iso-8601'},
        'provider': {'key': 'provider', 'type': 'str'},
        'source': {'key': 'source', 'type': 'str'},
        'image_files': {'key': 'imageFiles', 'type': '[ImageFile]'},
        'image_format': {'key': 'imageFormat', 'type': 'str'},
        'cloud_cover_percentage': {'key': 'cloudCoverPercentage', 'type': 'float'},
        'dark_pixel_percentage': {'key': 'darkPixelPercentage', 'type': 'float'},
        'ndvi_median_value': {'key': 'ndviMedianValue', 'type': 'float'},
        'boundary_id': {'key': 'boundaryId', 'type': 'str'},
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'id': {'key': 'id', 'type': 'str'},
        'e_tag': {'key': 'eTag', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        scene_date_time: Optional[datetime.datetime] = None,
        provider: Optional[str] = None,
        source: Optional[str] = None,
        image_files: Optional[List["ImageFile"]] = None,
        image_format: Optional[Union[str, "ImageFormat"]] = None,
        cloud_cover_percentage: Optional[float] = None,
        dark_pixel_percentage: Optional[float] = None,
        ndvi_median_value: Optional[float] = None,
        boundary_id: Optional[str] = None,
        farmer_id: Optional[str] = None,
        id: Optional[str] = None,
        **kwargs
    ):
        super(Scene, self).__init__(**kwargs)
        self.scene_date_time = scene_date_time
        self.provider = provider
        self.source = source
        self.image_files = image_files
        self.image_format = image_format
        self.cloud_cover_percentage = cloud_cover_percentage
        self.dark_pixel_percentage = dark_pixel_percentage
        self.ndvi_median_value = ndvi_median_value
        self.boundary_id = boundary_id
        self.farmer_id = farmer_id
        self.id = id
        self.e_tag = None


class SceneListResponse(msrest.serialization.Model):
    """Paged response contains list of requested objects and a URL link to get the next set of results.

    :param value: List of requested objects.
    :type value: list[~azure.agrifood.farming.models.Scene]
    :param skip_token: Token used in retrieving the next page. If null, there are no additional
     pages.
    :type skip_token: str
    :param next_link: Continuation link (absolute URI) to the next page of results in the list.
    :type next_link: str
    """

    _attribute_map = {
        'value': {'key': 'value', 'type': '[Scene]'},
        'skip_token': {'key': '$skipToken', 'type': 'str'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        value: Optional[List["Scene"]] = None,
        skip_token: Optional[str] = None,
        next_link: Optional[str] = None,
        **kwargs
    ):
        super(SceneListResponse, self).__init__(**kwargs)
        self.value = value
        self.skip_token = skip_token
        self.next_link = next_link


class SearchBoundaryQuery(msrest.serialization.Model):
    """SearchAllBoundaries and SearchBoundaries parameters.

    :param ids: Ids of the resource.
    :type ids: list[str]
    :param names: Names of the resource.
    :type names: list[str]
    :param property_filters: Filters on key-value pairs within the Properties object.
     eg. "{testKey} eq {testValue}".
    :type property_filters: list[str]
    :param statuses: Statuses of the resource.
    :type statuses: list[str]
    :param min_created_date_time: Minimum creation date of resource (inclusive).
    :type min_created_date_time: ~datetime.datetime
    :param max_created_date_time: Maximum creation date of resource (inclusive).
    :type max_created_date_time: ~datetime.datetime
    :param min_last_modified_date_time: Minimum last modified date of resource (inclusive).
    :type min_last_modified_date_time: ~datetime.datetime
    :param max_last_modified_date_time: Maximum last modified date of resource (inclusive).
    :type max_last_modified_date_time: ~datetime.datetime
    :param max_page_size: Maximum number of items needed (inclusive).
     Minimum = 10, Maximum = 1000, Default value = 50.
    :type max_page_size: int
    :param skip_token: Skip token for getting next set of results.
    :type skip_token: str
    :param is_primary: Is the boundary primary.
    :type is_primary: bool
    :param parent_type: Type of the parent it belongs to.
    :type parent_type: str
    :param parent_ids: Parent Ids of the resource.
    :type parent_ids: list[str]
    :param min_acreage: Minimum acreage of the boundary (inclusive).
    :type min_acreage: float
    :param max_acreage: Maximum acreage of the boundary (inclusive).
    :type max_acreage: float
    :param intersects_with_geometry: GeoJSON abstract class.
    :type intersects_with_geometry: ~azure.agrifood.farming.models.GeoJsonObject
    """

    _validation = {
        'max_page_size': {'maximum': 1000, 'minimum': 10},
    }

    _attribute_map = {
        'ids': {'key': 'ids', 'type': '[str]'},
        'names': {'key': 'names', 'type': '[str]'},
        'property_filters': {'key': 'propertyFilters', 'type': '[str]'},
        'statuses': {'key': 'statuses', 'type': '[str]'},
        'min_created_date_time': {'key': 'minCreatedDateTime', 'type': 'iso-8601'},
        'max_created_date_time': {'key': 'maxCreatedDateTime', 'type': 'iso-8601'},
        'min_last_modified_date_time': {'key': 'minLastModifiedDateTime', 'type': 'iso-8601'},
        'max_last_modified_date_time': {'key': 'maxLastModifiedDateTime', 'type': 'iso-8601'},
        'max_page_size': {'key': '$maxPageSize', 'type': 'int'},
        'skip_token': {'key': '$skipToken', 'type': 'str'},
        'is_primary': {'key': 'isPrimary', 'type': 'bool'},
        'parent_type': {'key': 'parentType', 'type': 'str'},
        'parent_ids': {'key': 'parentIds', 'type': '[str]'},
        'min_acreage': {'key': 'minAcreage', 'type': 'float'},
        'max_acreage': {'key': 'maxAcreage', 'type': 'float'},
        'intersects_with_geometry': {'key': 'intersectsWithGeometry', 'type': 'GeoJsonObject'},
    }

    def __init__(
        self,
        *,
        ids: Optional[List[str]] = None,
        names: Optional[List[str]] = None,
        property_filters: Optional[List[str]] = None,
        statuses: Optional[List[str]] = None,
        min_created_date_time: Optional[datetime.datetime] = None,
        max_created_date_time: Optional[datetime.datetime] = None,
        min_last_modified_date_time: Optional[datetime.datetime] = None,
        max_last_modified_date_time: Optional[datetime.datetime] = None,
        max_page_size: Optional[int] = 50,
        skip_token: Optional[str] = None,
        is_primary: Optional[bool] = None,
        parent_type: Optional[str] = None,
        parent_ids: Optional[List[str]] = None,
        min_acreage: Optional[float] = None,
        max_acreage: Optional[float] = None,
        intersects_with_geometry: Optional["GeoJsonObject"] = None,
        **kwargs
    ):
        super(SearchBoundaryQuery, self).__init__(**kwargs)
        self.ids = ids
        self.names = names
        self.property_filters = property_filters
        self.statuses = statuses
        self.min_created_date_time = min_created_date_time
        self.max_created_date_time = max_created_date_time
        self.min_last_modified_date_time = min_last_modified_date_time
        self.max_last_modified_date_time = max_last_modified_date_time
        self.max_page_size = max_page_size
        self.skip_token = skip_token
        self.is_primary = is_primary
        self.parent_type = parent_type
        self.parent_ids = parent_ids
        self.min_acreage = min_acreage
        self.max_acreage = max_acreage
        self.intersects_with_geometry = intersects_with_geometry


class Season(msrest.serialization.Model):
    """Schema of season resource.

    Variables are only populated by the server, and will be ignored when sending a request.

    :param start_date_time: Season start datetime, sample format: yyyy-MM-ddTHH:mm:ssZ.
    :type start_date_time: ~datetime.datetime
    :param end_date_time: Season end datetime, sample format: yyyy-MM-ddTHH:mm:ssZ.
    :type end_date_time: ~datetime.datetime
    :param year: Season year.
    :type year: int
    :ivar id: Unique resource ID.
    :vartype id: str
    :ivar e_tag: The ETag value to implement optimistic concurrency.
    :vartype e_tag: str
    :param status: Status of the resource.
    :type status: str
    :ivar created_date_time: Date-time when resource was created, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar modified_date_time: Date-time when resource was last modified, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype modified_date_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'id': {'readonly': True},
        'e_tag': {'readonly': True},
        'status': {'max_length': 100, 'min_length': 0},
        'created_date_time': {'readonly': True},
        'modified_date_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'start_date_time': {'key': 'startDateTime', 'type': 'iso-8601'},
        'end_date_time': {'key': 'endDateTime', 'type': 'iso-8601'},
        'year': {'key': 'year', 'type': 'int'},
        'id': {'key': 'id', 'type': 'str'},
        'e_tag': {'key': 'eTag', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'modified_date_time': {'key': 'modifiedDateTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        start_date_time: Optional[datetime.datetime] = None,
        end_date_time: Optional[datetime.datetime] = None,
        year: Optional[int] = None,
        status: Optional[str] = None,
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(Season, self).__init__(**kwargs)
        self.start_date_time = start_date_time
        self.end_date_time = end_date_time
        self.year = year
        self.id = None
        self.e_tag = None
        self.status = status
        self.created_date_time = None
        self.modified_date_time = None
        self.name = name
        self.description = description
        self.properties = properties


class SeasonalField(msrest.serialization.Model):
    """Schema of seasonal field resource.

    Variables are only populated by the server, and will be ignored when sending a request.

    :ivar farmer_id: Farmer ID.
    :vartype farmer_id: str
    :ivar primary_boundary_id: Primary boundary id.
    :vartype primary_boundary_id: str
    :ivar boundary_ids: Boundary Ids.
    :vartype boundary_ids: list[str]
    :param farm_id: ID of the associated Farm.
    :type farm_id: str
    :param field_id: ID of the associated Field.
    :type field_id: str
    :param season_id: ID of the season it belongs to.
    :type season_id: str
    :param crop_variety_ids: CropVariety ids.
    :type crop_variety_ids: list[str]
    :param crop_id: ID of the crop it belongs to.
    :type crop_id: str
    :param avg_yield_value: Average yield value of the seasonal field.
    :type avg_yield_value: float
    :param avg_yield_unit: Unit of the average yield value attribute.
    :type avg_yield_unit: str
    :param avg_seed_population_value: Average seed population value of the seasonal field.
    :type avg_seed_population_value: float
    :param avg_seed_population_unit: Unit of average seed population value attribute.
    :type avg_seed_population_unit: str
    :param planting_date_time: Planting datetime, sample format: yyyy-MM-ddTHH:mm:ssZ.
    :type planting_date_time: ~datetime.datetime
    :ivar id: Unique resource ID.
    :vartype id: str
    :ivar e_tag: The ETag value to implement optimistic concurrency.
    :vartype e_tag: str
    :param status: Status of the resource.
    :type status: str
    :ivar created_date_time: Date-time when resource was created, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar modified_date_time: Date-time when resource was last modified, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype modified_date_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'farmer_id': {'readonly': True},
        'primary_boundary_id': {'readonly': True},
        'boundary_ids': {'readonly': True, 'unique': True},
        'crop_variety_ids': {'unique': True},
        'avg_yield_unit': {'max_length': 32, 'min_length': 2},
        'avg_seed_population_unit': {'max_length': 32, 'min_length': 2},
        'id': {'readonly': True},
        'e_tag': {'readonly': True},
        'status': {'max_length': 100, 'min_length': 0},
        'created_date_time': {'readonly': True},
        'modified_date_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'primary_boundary_id': {'key': 'primaryBoundaryId', 'type': 'str'},
        'boundary_ids': {'key': 'boundaryIds', 'type': '[str]'},
        'farm_id': {'key': 'farmId', 'type': 'str'},
        'field_id': {'key': 'fieldId', 'type': 'str'},
        'season_id': {'key': 'seasonId', 'type': 'str'},
        'crop_variety_ids': {'key': 'cropVarietyIds', 'type': '[str]'},
        'crop_id': {'key': 'cropId', 'type': 'str'},
        'avg_yield_value': {'key': 'avgYieldValue', 'type': 'float'},
        'avg_yield_unit': {'key': 'avgYieldUnit', 'type': 'str'},
        'avg_seed_population_value': {'key': 'avgSeedPopulationValue', 'type': 'float'},
        'avg_seed_population_unit': {'key': 'avgSeedPopulationUnit', 'type': 'str'},
        'planting_date_time': {'key': 'plantingDateTime', 'type': 'iso-8601'},
        'id': {'key': 'id', 'type': 'str'},
        'e_tag': {'key': 'eTag', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'modified_date_time': {'key': 'modifiedDateTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        farm_id: Optional[str] = None,
        field_id: Optional[str] = None,
        season_id: Optional[str] = None,
        crop_variety_ids: Optional[List[str]] = None,
        crop_id: Optional[str] = None,
        avg_yield_value: Optional[float] = None,
        avg_yield_unit: Optional[str] = None,
        avg_seed_population_value: Optional[float] = None,
        avg_seed_population_unit: Optional[str] = None,
        planting_date_time: Optional[datetime.datetime] = None,
        status: Optional[str] = None,
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(SeasonalField, self).__init__(**kwargs)
        self.farmer_id = None
        self.primary_boundary_id = None
        self.boundary_ids = None
        self.farm_id = farm_id
        self.field_id = field_id
        self.season_id = season_id
        self.crop_variety_ids = crop_variety_ids
        self.crop_id = crop_id
        self.avg_yield_value = avg_yield_value
        self.avg_yield_unit = avg_yield_unit
        self.avg_seed_population_value = avg_seed_population_value
        self.avg_seed_population_unit = avg_seed_population_unit
        self.planting_date_time = planting_date_time
        self.id = None
        self.e_tag = None
        self.status = status
        self.created_date_time = None
        self.modified_date_time = None
        self.name = name
        self.description = description
        self.properties = properties


class SeasonalFieldListResponse(msrest.serialization.Model):
    """Paged response contains list of requested objects and a URL link to get the next set of results.

    :param value: List of requested objects.
    :type value: list[~azure.agrifood.farming.models.SeasonalField]
    :param skip_token: Token used in retrieving the next page. If null, there are no additional
     pages.
    :type skip_token: str
    :param next_link: Continuation link (absolute URI) to the next page of results in the list.
    :type next_link: str
    """

    _attribute_map = {
        'value': {'key': 'value', 'type': '[SeasonalField]'},
        'skip_token': {'key': '$skipToken', 'type': 'str'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        value: Optional[List["SeasonalField"]] = None,
        skip_token: Optional[str] = None,
        next_link: Optional[str] = None,
        **kwargs
    ):
        super(SeasonalFieldListResponse, self).__init__(**kwargs)
        self.value = value
        self.skip_token = skip_token
        self.next_link = next_link


class SeasonListResponse(msrest.serialization.Model):
    """Paged response contains list of requested objects and a URL link to get the next set of results.

    :param value: List of requested objects.
    :type value: list[~azure.agrifood.farming.models.Season]
    :param skip_token: Token used in retrieving the next page. If null, there are no additional
     pages.
    :type skip_token: str
    :param next_link: Continuation link (absolute URI) to the next page of results in the list.
    :type next_link: str
    """

    _attribute_map = {
        'value': {'key': 'value', 'type': '[Season]'},
        'skip_token': {'key': '$skipToken', 'type': 'str'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        value: Optional[List["Season"]] = None,
        skip_token: Optional[str] = None,
        next_link: Optional[str] = None,
        **kwargs
    ):
        super(SeasonListResponse, self).__init__(**kwargs)
        self.value = value
        self.skip_token = skip_token
        self.next_link = next_link


class TillageData(msrest.serialization.Model):
    """Schema of tillage data resource.

    Variables are only populated by the server, and will be ignored when sending a request.

    :param tillage_depth: Schema for storing measurement reading and unit.
    :type tillage_depth: ~azure.agrifood.farming.models.Measure
    :param tillage_pressure: Schema for storing measurement reading and unit.
    :type tillage_pressure: ~azure.agrifood.farming.models.Measure
    :param area: Schema for storing measurement reading and unit.
    :type area: ~azure.agrifood.farming.models.Measure
    :param source: Source of the operation data.
    :type source: str
    :param operation_modified_date_time: Modified date-time of the operation data, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
     Note: this will be specified by the source provider itself.
    :type operation_modified_date_time: ~datetime.datetime
    :param operation_start_date_time: Start date-time of the operation data, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :type operation_start_date_time: ~datetime.datetime
    :param operation_end_date_time: End date-time of the operation data, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :type operation_end_date_time: ~datetime.datetime
    :ivar attachments_link: Link for attachments.
    :vartype attachments_link: str
    :param associated_boundary_id: Optional boundary ID of the field for which operation was
     applied.
    :type associated_boundary_id: str
    :param operation_boundary_id: Optional boundary ID of the actual area for which operation was
     applied inside the specified field.
    :type operation_boundary_id: str
    :ivar farmer_id: Farmer ID which belongs to the operation data.
    :vartype farmer_id: str
    :ivar id: Unique resource ID.
    :vartype id: str
    :ivar e_tag: The ETag value to implement optimistic concurrency.
    :vartype e_tag: str
    :param status: Status of the resource.
    :type status: str
    :ivar created_date_time: Date-time when resource was created, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar modified_date_time: Date-time when resource was last modified, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype modified_date_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'source': {'max_length': 100, 'min_length': 2},
        'attachments_link': {'readonly': True},
        'farmer_id': {'readonly': True},
        'id': {'readonly': True},
        'e_tag': {'readonly': True},
        'status': {'max_length': 100, 'min_length': 0},
        'created_date_time': {'readonly': True},
        'modified_date_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'tillage_depth': {'key': 'tillageDepth', 'type': 'Measure'},
        'tillage_pressure': {'key': 'tillagePressure', 'type': 'Measure'},
        'area': {'key': 'area', 'type': 'Measure'},
        'source': {'key': 'source', 'type': 'str'},
        'operation_modified_date_time': {'key': 'operationModifiedDateTime', 'type': 'iso-8601'},
        'operation_start_date_time': {'key': 'operationStartDateTime', 'type': 'iso-8601'},
        'operation_end_date_time': {'key': 'operationEndDateTime', 'type': 'iso-8601'},
        'attachments_link': {'key': 'attachmentsLink', 'type': 'str'},
        'associated_boundary_id': {'key': 'associatedBoundaryId', 'type': 'str'},
        'operation_boundary_id': {'key': 'operationBoundaryId', 'type': 'str'},
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'id': {'key': 'id', 'type': 'str'},
        'e_tag': {'key': 'eTag', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'modified_date_time': {'key': 'modifiedDateTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        tillage_depth: Optional["Measure"] = None,
        tillage_pressure: Optional["Measure"] = None,
        area: Optional["Measure"] = None,
        source: Optional[str] = None,
        operation_modified_date_time: Optional[datetime.datetime] = None,
        operation_start_date_time: Optional[datetime.datetime] = None,
        operation_end_date_time: Optional[datetime.datetime] = None,
        associated_boundary_id: Optional[str] = None,
        operation_boundary_id: Optional[str] = None,
        status: Optional[str] = None,
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(TillageData, self).__init__(**kwargs)
        self.tillage_depth = tillage_depth
        self.tillage_pressure = tillage_pressure
        self.area = area
        self.source = source
        self.operation_modified_date_time = operation_modified_date_time
        self.operation_start_date_time = operation_start_date_time
        self.operation_end_date_time = operation_end_date_time
        self.attachments_link = None
        self.associated_boundary_id = associated_boundary_id
        self.operation_boundary_id = operation_boundary_id
        self.farmer_id = None
        self.id = None
        self.e_tag = None
        self.status = status
        self.created_date_time = None
        self.modified_date_time = None
        self.name = name
        self.description = description
        self.properties = properties


class TillageDataListResponse(msrest.serialization.Model):
    """Paged response contains list of requested objects and a URL link to get the next set of results.

    :param value: List of requested objects.
    :type value: list[~azure.agrifood.farming.models.TillageData]
    :param skip_token: Token used in retrieving the next page. If null, there are no additional
     pages.
    :type skip_token: str
    :param next_link: Continuation link (absolute URI) to the next page of results in the list.
    :type next_link: str
    """

    _attribute_map = {
        'value': {'key': 'value', 'type': '[TillageData]'},
        'skip_token': {'key': '$skipToken', 'type': 'str'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        value: Optional[List["TillageData"]] = None,
        skip_token: Optional[str] = None,
        next_link: Optional[str] = None,
        **kwargs
    ):
        super(TillageDataListResponse, self).__init__(**kwargs)
        self.value = value
        self.skip_token = skip_token
        self.next_link = next_link


class WeatherData(msrest.serialization.Model):
    """Schema of weather data.

    Variables are only populated by the server, and will be ignored when sending a request.

    All required parameters must be populated in order to send to Azure.

    :param farmer_id: Required. Farmer ID.
    :type farmer_id: str
    :param boundary_id: Required. Boundary ID.
    :type boundary_id: str
    :param extension_id: Required. ID of the weather extension.
    :type extension_id: str
    :param location: Required. Location model class.
    :type location: ~azure.agrifood.farming.models.Location
    :param date_time: Required. Date-time of the weather data, sample format: yyyy-MM-ddTHH:mm:ssZ.
    :type date_time: ~datetime.datetime
    :param unit_system_code: Unit System like US/SI etc.
    :type unit_system_code: str
    :param extension_version: Required. Version of the weather data extension.
    :type extension_version: str
    :param weather_data_type: Required. Type of weather data (forecast/historical).
    :type weather_data_type: str
    :param granularity: Required. Granularity of weather data (daily/hourly).
    :type granularity: str
    :param cloud_cover: Schema for storing measurement reading and unit.
    :type cloud_cover: ~azure.agrifood.farming.models.Measure
    :param dew_point: Schema for storing measurement reading and unit.
    :type dew_point: ~azure.agrifood.farming.models.Measure
    :param growing_degree_day: Schema for storing measurement reading and unit.
    :type growing_degree_day: ~azure.agrifood.farming.models.Measure
    :param precipitation: Schema for storing measurement reading and unit.
    :type precipitation: ~azure.agrifood.farming.models.Measure
    :param pressure: Schema for storing measurement reading and unit.
    :type pressure: ~azure.agrifood.farming.models.Measure
    :param relative_humidity: Schema for storing measurement reading and unit.
    :type relative_humidity: ~azure.agrifood.farming.models.Measure
    :param soil_moisture: Schema for storing measurement reading and unit.
    :type soil_moisture: ~azure.agrifood.farming.models.Measure
    :param soil_temperature: Schema for storing measurement reading and unit.
    :type soil_temperature: ~azure.agrifood.farming.models.Measure
    :param temperature: Schema for storing measurement reading and unit.
    :type temperature: ~azure.agrifood.farming.models.Measure
    :param visibility: Schema for storing measurement reading and unit.
    :type visibility: ~azure.agrifood.farming.models.Measure
    :param wet_bulb_temperature: Schema for storing measurement reading and unit.
    :type wet_bulb_temperature: ~azure.agrifood.farming.models.Measure
    :param wind_chill: Schema for storing measurement reading and unit.
    :type wind_chill: ~azure.agrifood.farming.models.Measure
    :param wind_direction: Schema for storing measurement reading and unit.
    :type wind_direction: ~azure.agrifood.farming.models.Measure
    :param wind_gust: Schema for storing measurement reading and unit.
    :type wind_gust: ~azure.agrifood.farming.models.Measure
    :param wind_speed: Schema for storing measurement reading and unit.
    :type wind_speed: ~azure.agrifood.farming.models.Measure
    :param id: Weather data ID.
    :type id: str
    :ivar e_tag: The ETag value to implement optimistic concurrency.
    :vartype e_tag: str
    :ivar created_date_time: Date-time when resource was created, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar modified_date_time: Date-time when resource was last modified, sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype modified_date_time: ~datetime.datetime
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'farmer_id': {'required': True},
        'boundary_id': {'required': True},
        'extension_id': {'required': True},
        'location': {'required': True},
        'date_time': {'required': True},
        'extension_version': {'required': True},
        'weather_data_type': {'required': True},
        'granularity': {'required': True},
        'e_tag': {'readonly': True},
        'created_date_time': {'readonly': True},
        'modified_date_time': {'readonly': True},
    }

    _attribute_map = {
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'boundary_id': {'key': 'boundaryId', 'type': 'str'},
        'extension_id': {'key': 'extensionId', 'type': 'str'},
        'location': {'key': 'location', 'type': 'Location'},
        'date_time': {'key': 'dateTime', 'type': 'iso-8601'},
        'unit_system_code': {'key': 'unitSystemCode', 'type': 'str'},
        'extension_version': {'key': 'extensionVersion', 'type': 'str'},
        'weather_data_type': {'key': 'weatherDataType', 'type': 'str'},
        'granularity': {'key': 'granularity', 'type': 'str'},
        'cloud_cover': {'key': 'cloudCover', 'type': 'Measure'},
        'dew_point': {'key': 'dewPoint', 'type': 'Measure'},
        'growing_degree_day': {'key': 'growingDegreeDay', 'type': 'Measure'},
        'precipitation': {'key': 'precipitation', 'type': 'Measure'},
        'pressure': {'key': 'pressure', 'type': 'Measure'},
        'relative_humidity': {'key': 'relativeHumidity', 'type': 'Measure'},
        'soil_moisture': {'key': 'soilMoisture', 'type': 'Measure'},
        'soil_temperature': {'key': 'soilTemperature', 'type': 'Measure'},
        'temperature': {'key': 'temperature', 'type': 'Measure'},
        'visibility': {'key': 'visibility', 'type': 'Measure'},
        'wet_bulb_temperature': {'key': 'wetBulbTemperature', 'type': 'Measure'},
        'wind_chill': {'key': 'windChill', 'type': 'Measure'},
        'wind_direction': {'key': 'windDirection', 'type': 'Measure'},
        'wind_gust': {'key': 'windGust', 'type': 'Measure'},
        'wind_speed': {'key': 'windSpeed', 'type': 'Measure'},
        'id': {'key': 'id', 'type': 'str'},
        'e_tag': {'key': 'eTag', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'modified_date_time': {'key': 'modifiedDateTime', 'type': 'iso-8601'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        farmer_id: str,
        boundary_id: str,
        extension_id: str,
        location: "Location",
        date_time: datetime.datetime,
        extension_version: str,
        weather_data_type: str,
        granularity: str,
        unit_system_code: Optional[str] = None,
        cloud_cover: Optional["Measure"] = None,
        dew_point: Optional["Measure"] = None,
        growing_degree_day: Optional["Measure"] = None,
        precipitation: Optional["Measure"] = None,
        pressure: Optional["Measure"] = None,
        relative_humidity: Optional["Measure"] = None,
        soil_moisture: Optional["Measure"] = None,
        soil_temperature: Optional["Measure"] = None,
        temperature: Optional["Measure"] = None,
        visibility: Optional["Measure"] = None,
        wet_bulb_temperature: Optional["Measure"] = None,
        wind_chill: Optional["Measure"] = None,
        wind_direction: Optional["Measure"] = None,
        wind_gust: Optional["Measure"] = None,
        wind_speed: Optional["Measure"] = None,
        id: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(WeatherData, self).__init__(**kwargs)
        self.farmer_id = farmer_id
        self.boundary_id = boundary_id
        self.extension_id = extension_id
        self.location = location
        self.date_time = date_time
        self.unit_system_code = unit_system_code
        self.extension_version = extension_version
        self.weather_data_type = weather_data_type
        self.granularity = granularity
        self.cloud_cover = cloud_cover
        self.dew_point = dew_point
        self.growing_degree_day = growing_degree_day
        self.precipitation = precipitation
        self.pressure = pressure
        self.relative_humidity = relative_humidity
        self.soil_moisture = soil_moisture
        self.soil_temperature = soil_temperature
        self.temperature = temperature
        self.visibility = visibility
        self.wet_bulb_temperature = wet_bulb_temperature
        self.wind_chill = wind_chill
        self.wind_direction = wind_direction
        self.wind_gust = wind_gust
        self.wind_speed = wind_speed
        self.id = id
        self.e_tag = None
        self.created_date_time = None
        self.modified_date_time = None
        self.properties = properties


class WeatherDataDeleteJob(msrest.serialization.Model):
    """Schema of weather data delete job.

    Variables are only populated by the server, and will be ignored when sending a request.

    All required parameters must be populated in order to send to Azure.

    :param extension_id: Required. ID of the extension to be used for the providerInput. eg.
     DTN.ClearAg.
    :type extension_id: str
    :param farmer_id: Required. The id of the farmer object for which weather data is being
     fetched.
    :type farmer_id: str
    :param boundary_id: Required. The id of the boundary object for which weather data is being
     fetched.
    :type boundary_id: str
    :param weather_data_type: Type of weather data. Possible values include: 'forecast' ,
     'historical'.
    :type weather_data_type: str
    :param granularity: Granularity of weather data. Possible values include: 'daily' , 'hourly'.
    :type granularity: str
    :param start_date_time: Weather data start UTC date-time (inclusive), sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :type start_date_time: ~datetime.datetime
    :param end_date_time: Weather data end UTC date-time (inclusive), sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :type end_date_time: ~datetime.datetime
    :ivar id: Unique job id.
    :vartype id: str
    :ivar status: Status of the job.
     Possible values: 'Waiting', 'Running', 'Succeeded', 'Failed', 'Cancelled'.
    :vartype status: str
    :ivar duration_in_seconds: Duration of the job in seconds.
    :vartype duration_in_seconds: float
    :ivar message: Status message to capture more details of the job.
    :vartype message: str
    :ivar created_date_time: Job created at dateTime. Sample format: yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar last_action_date_time: Job was last acted upon at dateTime. Sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype last_action_date_time: ~datetime.datetime
    :ivar start_time: Job start time when available. Sample format: yyyy-MM-ddTHH:mm:ssZ.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: Job end time when available. Sample format: yyyy-MM-ddTHH:mm:ssZ.
    :vartype end_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'extension_id': {'required': True, 'max_length': 100, 'min_length': 2, 'pattern': r'^[A-za-z]{3,50}[.][A-za-z]{3,100}$'},
        'farmer_id': {'required': True},
        'boundary_id': {'required': True},
        'id': {'readonly': True},
        'status': {'readonly': True},
        'duration_in_seconds': {'readonly': True},
        'message': {'readonly': True},
        'created_date_time': {'readonly': True},
        'last_action_date_time': {'readonly': True},
        'start_time': {'readonly': True},
        'end_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'extension_id': {'key': 'extensionId', 'type': 'str'},
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'boundary_id': {'key': 'boundaryId', 'type': 'str'},
        'weather_data_type': {'key': 'weatherDataType', 'type': 'str'},
        'granularity': {'key': 'granularity', 'type': 'str'},
        'start_date_time': {'key': 'startDateTime', 'type': 'iso-8601'},
        'end_date_time': {'key': 'endDateTime', 'type': 'iso-8601'},
        'id': {'key': 'id', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'duration_in_seconds': {'key': 'durationInSeconds', 'type': 'float'},
        'message': {'key': 'message', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'last_action_date_time': {'key': 'lastActionDateTime', 'type': 'iso-8601'},
        'start_time': {'key': 'startTime', 'type': 'iso-8601'},
        'end_time': {'key': 'endTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        extension_id: str,
        farmer_id: str,
        boundary_id: str,
        weather_data_type: Optional[str] = None,
        granularity: Optional[str] = None,
        start_date_time: Optional[datetime.datetime] = None,
        end_date_time: Optional[datetime.datetime] = None,
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(WeatherDataDeleteJob, self).__init__(**kwargs)
        self.extension_id = extension_id
        self.farmer_id = farmer_id
        self.boundary_id = boundary_id
        self.weather_data_type = weather_data_type
        self.granularity = granularity
        self.start_date_time = start_date_time
        self.end_date_time = end_date_time
        self.id = None
        self.status = None
        self.duration_in_seconds = None
        self.message = None
        self.created_date_time = None
        self.last_action_date_time = None
        self.start_time = None
        self.end_time = None
        self.name = name
        self.description = description
        self.properties = properties


class WeatherDataIngestionJob(msrest.serialization.Model):
    """Schema of weather ingestion job.

    Variables are only populated by the server, and will be ignored when sending a request.

    All required parameters must be populated in order to send to Azure.

    :param boundary_id: Required. The id of the boundary object for which weather data is being
     fetched.
    :type boundary_id: str
    :param farmer_id: Required. The id of the farmer object for which weather data is being
     fetched.
    :type farmer_id: str
    :param extension_id: Required. ID of the extension to be used for the providerInput. eg.
     DTN.ClearAg.
    :type extension_id: str
    :param extension_api_name: Required. Extension api name to which request is to be made.
    :type extension_api_name: str
    :param extension_api_input: Required. Extension api input dictionary which would be used to
     feed request query/body/parameter information.
    :type extension_api_input: dict[str, any]
    :param extension_data_provider_app_id: App id of the weather data provider.
    :type extension_data_provider_app_id: str
    :param extension_data_provider_api_key: Api key of the weather data provider.
    :type extension_data_provider_api_key: str
    :ivar id: Unique job id.
    :vartype id: str
    :ivar status: Status of the job.
     Possible values: 'Waiting', 'Running', 'Succeeded', 'Failed', 'Cancelled'.
    :vartype status: str
    :ivar duration_in_seconds: Duration of the job in seconds.
    :vartype duration_in_seconds: float
    :ivar message: Status message to capture more details of the job.
    :vartype message: str
    :ivar created_date_time: Job created at dateTime. Sample format: yyyy-MM-ddTHH:mm:ssZ.
    :vartype created_date_time: ~datetime.datetime
    :ivar last_action_date_time: Job was last acted upon at dateTime. Sample format:
     yyyy-MM-ddTHH:mm:ssZ.
    :vartype last_action_date_time: ~datetime.datetime
    :ivar start_time: Job start time when available. Sample format: yyyy-MM-ddTHH:mm:ssZ.
    :vartype start_time: ~datetime.datetime
    :ivar end_time: Job end time when available. Sample format: yyyy-MM-ddTHH:mm:ssZ.
    :vartype end_time: ~datetime.datetime
    :param name: Name to identify resource.
    :type name: str
    :param description: Textual description of the resource.
    :type description: str
    :param properties: A collection of key value pairs that belongs to the resource.
     Each pair must not have a key greater than 50 characters
     and must not have a value greater than 150 characters.
     Note: A maximum of 25 key value pairs can be provided for a resource and only string and
     numeral values are supported.
    :type properties: dict[str, any]
    """

    _validation = {
        'boundary_id': {'required': True},
        'farmer_id': {'required': True},
        'extension_id': {'required': True, 'max_length': 100, 'min_length': 2, 'pattern': r'^[A-za-z]{3,50}[.][A-za-z]{3,100}$'},
        'extension_api_name': {'required': True, 'max_length': 100, 'min_length': 2},
        'extension_api_input': {'required': True},
        'extension_data_provider_app_id': {'max_length': 200, 'min_length': 2},
        'extension_data_provider_api_key': {'max_length': 200, 'min_length': 2},
        'id': {'readonly': True},
        'status': {'readonly': True},
        'duration_in_seconds': {'readonly': True},
        'message': {'readonly': True},
        'created_date_time': {'readonly': True},
        'last_action_date_time': {'readonly': True},
        'start_time': {'readonly': True},
        'end_time': {'readonly': True},
        'name': {'max_length': 100, 'min_length': 0},
        'description': {'max_length': 500, 'min_length': 0},
    }

    _attribute_map = {
        'boundary_id': {'key': 'boundaryId', 'type': 'str'},
        'farmer_id': {'key': 'farmerId', 'type': 'str'},
        'extension_id': {'key': 'extensionId', 'type': 'str'},
        'extension_api_name': {'key': 'extensionApiName', 'type': 'str'},
        'extension_api_input': {'key': 'extensionApiInput', 'type': '{object}'},
        'extension_data_provider_app_id': {'key': 'extensionDataProviderAppId', 'type': 'str'},
        'extension_data_provider_api_key': {'key': 'extensionDataProviderApiKey', 'type': 'str'},
        'id': {'key': 'id', 'type': 'str'},
        'status': {'key': 'status', 'type': 'str'},
        'duration_in_seconds': {'key': 'durationInSeconds', 'type': 'float'},
        'message': {'key': 'message', 'type': 'str'},
        'created_date_time': {'key': 'createdDateTime', 'type': 'iso-8601'},
        'last_action_date_time': {'key': 'lastActionDateTime', 'type': 'iso-8601'},
        'start_time': {'key': 'startTime', 'type': 'iso-8601'},
        'end_time': {'key': 'endTime', 'type': 'iso-8601'},
        'name': {'key': 'name', 'type': 'str'},
        'description': {'key': 'description', 'type': 'str'},
        'properties': {'key': 'properties', 'type': '{object}'},
    }

    def __init__(
        self,
        *,
        boundary_id: str,
        farmer_id: str,
        extension_id: str,
        extension_api_name: str,
        extension_api_input: Dict[str, Any],
        extension_data_provider_app_id: Optional[str] = None,
        extension_data_provider_api_key: Optional[str] = None,
        name: Optional[str] = None,
        description: Optional[str] = None,
        properties: Optional[Dict[str, Any]] = None,
        **kwargs
    ):
        super(WeatherDataIngestionJob, self).__init__(**kwargs)
        self.boundary_id = boundary_id
        self.farmer_id = farmer_id
        self.extension_id = extension_id
        self.extension_api_name = extension_api_name
        self.extension_api_input = extension_api_input
        self.extension_data_provider_app_id = extension_data_provider_app_id
        self.extension_data_provider_api_key = extension_data_provider_api_key
        self.id = None
        self.status = None
        self.duration_in_seconds = None
        self.message = None
        self.created_date_time = None
        self.last_action_date_time = None
        self.start_time = None
        self.end_time = None
        self.name = name
        self.description = description
        self.properties = properties


class WeatherDataListResponse(msrest.serialization.Model):
    """Paged response contains list of requested objects and a URL link to get the next set of results.

    :param value: List of requested objects.
    :type value: list[~azure.agrifood.farming.models.WeatherData]
    :param skip_token: Token used in retrieving the next page. If null, there are no additional
     pages.
    :type skip_token: str
    :param next_link: Continuation link (absolute URI) to the next page of results in the list.
    :type next_link: str
    """

    _attribute_map = {
        'value': {'key': 'value', 'type': '[WeatherData]'},
        'skip_token': {'key': '$skipToken', 'type': 'str'},
        'next_link': {'key': 'nextLink', 'type': 'str'},
    }

    def __init__(
        self,
        *,
        value: Optional[List["WeatherData"]] = None,
        skip_token: Optional[str] = None,
        next_link: Optional[str] = None,
        **kwargs
    ):
        super(WeatherDataListResponse, self).__init__(**kwargs)
        self.value = value
        self.skip_token = skip_token
        self.next_link = next_link
