Source code for plantpredict.project

import requests
import json

from plantpredict.plant_predict_entity import PlantPredictEntity
from plantpredict.error_handlers import handle_refused_connection, handle_error_response
from plantpredict.utilities import convert_json, camel_to_snake


[docs]class Project(PlantPredictEntity): """ The Project entity in PlantPredict defines the location info and serves as a container for any number of Predictions. """
[docs] def create(self): """ **POST** */Project/* Creates a new :py:mod:`plantpredict.Project` entity in the PlantPredict database using the attributes assigned to the local object instance. Automatically assigns the resulting :py:attr:`id` to the local object instance. See the minimum required attributes (below) necessary to successfully create a new :py:mod:`plantpredict.Project`. Note that the full scope of attributes is not limited to the minimum required set. Use :py:meth:`plantpredict.Project.assign_location_attributes` to automatically assign all required (and non-required) location-related/geological attributes. .. container:: toggle .. container:: header **Required Attributes** .. container:: required_attributes .. csv-table:: Minimum required attributes for successful Prediction creation :delim: ; :header: Field, Type, Description :stub-columns: 1 name; str; Name of the project latitude; float; North-South GPS coordinate of the Project location. Must be between :py:data:`-90` and :py:data:`90` - units :py:data:`[decimal degrees]`. longitude; float; East-West coordinate of the Project location, in decimal degrees. Must be between :py:data:`-180` and :py:data:`180` units :py:data:`[decimal degrees]`. country; str; Full name of the country of the Project's location. country_code; str; Country code of the Project's location (ex. US for United States, AUS for Australia, etc.) elevation; float; The elevation of the Project location above seal level units :py:data:`[m]`. standard_offset_from_utc; float; Time zone with respect to Greenwich Mean Time (GMT) in +/- hours offset. """ self.create_url_suffix = "/Project" return super(Project, self).create()
[docs] def delete(self): """HTTP Request: DELETE /Project/{ProjectId} Deletes an existing Project entity in PlantPredict. The local instance of the Project entity must have attribute self.id identical to the project id of the Project to be deleted. :return: A dictionary {"is_successful": True}. :rtype: dict """ self.delete_url_suffix = "/Project/{}".format(self.id) return super(Project, self).delete()
[docs] def get(self): """HTTP Request: GET /Project/{Id} Retrieves an existing Project entity in PlantPredict and automatically assigns all of its attributes to the local Project object instance. The local instance of the Project entity must have attribute self.id identical to the project id of the Project to be retrieved. :return: A dictionary containing all of the retrieved Project attributes. :rtype: dict """ self.get_url_suffix = "/Project/{}".format(self.id) return super(Project, self).get()
[docs] def update(self): """HTTP Request: PUT /Project Updates an existing Project entity in PlantPredict using the full attributes of the local Project instance. Calling this method is most commonly preceded by instantiating a local instance of Project with a specified project id, calling the Project.get() method, and changing any attributes locally. :return: A dictionary {"is_successful": True}. :rtype: dict """ self.update_url_suffix = "/Project" return super(Project, self).update()
@handle_refused_connection @handle_error_response def get_all_predictions(self): """HTTP Request: GET /Project/{ProjectId}/Prediction Retrieves the full attributes of every Prediction associated with the Project. :return: A list of dictionaries, each containing the attributes of a Prediction entity. :rtype: list of dict """ return requests.get( url=self.api.base_url + "/Project/{}/Prediction".format(self.id), headers={"Authorization": "Bearer " + self.api.access_token} )
[docs] def search(self, latitude, longitude, search_radius=1.0): """HTTP Request: GET /Project/Search Searches for all existing Project entities within a search radius of a specified latitude/longitude. :param latitude: North-South coordinate of the Project location, in decimal degrees. :type latitude: float :param longitude: East-West coordinate of the Project location, in decimal degrees. :type longitude: float :param search_radius: search radius in miles :type search_radius: float :return: TODO """ response = requests.get( url=self.api.base_url + "/Project/Search", headers={"Authorization": "Bearer " + self.api.access_token}, params={'latitude': latitude, 'longitude': longitude, 'searchRadius': search_radius} ) project_list = json.loads(response.content) return [convert_json(p, camel_to_snake) for p in project_list]
@handle_refused_connection @handle_error_response def assign_location_attributes(self): """ :return: """ geo = self.api.geo(latitude=self.latitude, longitude=self.longitude) geo.get_location_info() geo.get_elevation() geo.get_time_zone() self.locality = geo.locality self.state_province_code = geo.state_province_code self.state_province = geo.state_province self.country_code = geo.country_code self.country = geo.country self.region = geo.region self.elevation = geo.elevation self.standard_offset_from_utc = geo.time_zone def __init__(self, api, id=None, name=None, latitude=None, longitude=None): if id: self.id = id self.name = name self.latitude = latitude self.longitude = longitude self.locality = None self.state_province_code = None self.state_province = None self.country_code = None self.country = None self.region = None self.elevation = None self.standard_offset_from_utc = None super(Project, self).__init__(api)