From 0e212f22a1fafe816e515123ec25f90f97d8c2ea Mon Sep 17 00:00:00 2001 From: matze Date: Thu, 31 Oct 2024 20:48:36 +0100 Subject: [PATCH] neofarm half done NEXT: finish and extract orm into separate files --- neofarm/lib.py | 7 +++ neofarm/orm.py | 161 ++++++++++++++++++++++++++++++++++++++++++++++++ neofarm/test.py | 6 ++ 3 files changed, 174 insertions(+) create mode 100644 neofarm/lib.py create mode 100644 neofarm/orm.py create mode 100644 neofarm/test.py diff --git a/neofarm/lib.py b/neofarm/lib.py new file mode 100644 index 0000000..5c36d68 --- /dev/null +++ b/neofarm/lib.py @@ -0,0 +1,7 @@ +import orm + +def getHarvests(): + # result = orm.Harvest.from_id("750511d3-5f7b-4e70-b541-d2f70696734f") + # print(result.name) + result = orm.Harvest.get_list() + return result \ No newline at end of file diff --git a/neofarm/orm.py b/neofarm/orm.py new file mode 100644 index 0000000..0435f8a --- /dev/null +++ b/neofarm/orm.py @@ -0,0 +1,161 @@ +import requests +from oauthlib.oauth2 import BackendApplicationClient +from requests_oauthlib import OAuth2Session, OAuth2 +import jsonapi_requests +import lib + +# constants: +root_url = 'https://farmos.wagframe.duckdns.org/' +api_root = root_url + 'api/' +token_url = root_url + 'oauth/token/' +client_id = 'neofarm' +client_secret = 'Wk&%g#d8lYFUDrU7k7k%5ZS$V@hHauBq' + +api_path_separator = '/' +api_type_spatrator = '--' + +def init_api(): + client = BackendApplicationClient(client_id=client_id) + oauth_session = OAuth2Session(client=client) + token = oauth_session.fetch_token( + token_url = token_url, + client_id = client_id, + client_secret = client_secret + ) + oauth = OAuth2(client_id=client_id, client=client, token=token) + + api = jsonapi_requests.orm.OrmApi.config({ + 'API_ROOT': api_root, + 'AUTH': oauth, + 'TIMEOUT': 1, + }) + jsonapi_requests.configuration.default = api + return api + +api = init_api() + + + + + + +# Logs +# Assets +# Quantities +# Taxonomy Terms + +class Log(jsonapi_requests.orm.ApiModel): + class Meta: + type = 'log' + api = api + @classmethod + def get_type_and_path(cls, name): + return (f"{cls.type}{api_type_spatrator}{name}", f"{cls.path}{api_path_separator}{name}") + + name = jsonapi_requests.orm.AttributeField('name') + timestamp = jsonapi_requests.orm.AttributeField('timestamp') + isMovement = jsonapi_requests.orm.AttributeField('isMovement') + assets = jsonapi_requests.orm.RelationField('asset') + location = jsonapi_requests.orm.RelationField('location') + equipment = jsonapi_requests.orm.RelationField('equipment') + quantities = jsonapi_requests.orm.RelationField('quantity') + + def getPlant(self): + for asset in self.assets: + if asset.type == 'asset--plant': + return asset + +class Activity(Log): + class Meta(Log.Meta): + name = 'activity' + type, path = Log.Meta.get_type_and_path(name) +class Maintenance(Log): + class Meta(Log.Meta): + name = 'maintenance' + type, path = Log.Meta.get_type_and_path(name) +class Purchase(Log): + class Meta(Log.Meta): + name = 'purchase' + type, path = Log.Meta.get_type_and_path(name) +class Seeding(Log): + class Meta(Log.Meta): + name = 'seeding' + type, path = Log.Meta.get_type_and_path(name) +class Input(Log): + class Meta(Log.Meta): + name = 'input' + type, path = Log.Meta.get_type_and_path(name) +class Medical(Log): + class Meta(Log.Meta): + name = 'medical' + type, path = Log.Meta.get_type_and_path(name) +class Harvest(Log): + class Meta(Log.Meta): + name = 'harvest' + type, path = Log.Meta.get_type_and_path(name) +class Sale(Log): + class Meta(Log.Meta): + name = 'sale' + type, path = Log.Meta.get_type_and_path(name) + + + +class Asset(jsonapi_requests.orm.ApiModel): + class Meta: + type = 'asset' + api = api + @classmethod + def get_type_and_path(cls, name): + return (f"{cls.type}{api_type_spatrator}{name}", f"{cls.path}{api_path_separator}{name}") + + name = jsonapi_requests.orm.AttributeField('name') + timestamp = jsonapi_requests.orm.AttributeField('timestamp') + +class Land(Asset): + class Meta(Asset.Meta): + name = 'land' + type, path = Asset.Meta.get_type_and_path(name) + geometry = jsonapi_requests.orm.AttributeField('intrinsic_geometry') +class Plant(Asset): + class Meta(Asset.Meta): + name = 'plant' + type, path = Asset.Meta.get_type_and_path(name) + crop = jsonapi_requests.orm.RelationField('plant_type') + season = jsonapi_requests.orm.RelationField('season') +class Equipment(Asset): + class Meta(Asset.Meta): + name = 'equipment' + type, path = Asset.Meta.get_type_and_path(name) +class Material(Asset): + class Meta(Asset.Meta): + name = 'material' + type, path = Asset.Meta.get_type_and_path(name) + crop = jsonapi_requests.orm.RelationField('material_type') +class Seed(Asset): + class Meta(Asset.Meta): + name = 'seed' + type, path = Asset.Meta.get_type_and_path(name) + crop = jsonapi_requests.orm.RelationField('plant_type') + season = jsonapi_requests.orm.RelationField('season') +class Product(Asset): + class Meta(Asset.Meta): + name = 'product' + type, path = Asset.Meta.get_type_and_path(name) + type = jsonapi_requests.orm.RelationField('product_type') + + + +class Quantity(jsonapi_requests.orm.ApiModel): + class Meta: + type = 'quantity' + api = api + @classmethod + def get_type_and_path(cls, name): + return (f"{cls.type}{api_type_spatrator}{name}", f"{cls.path}{api_path_separator}{name}") + + measure = jsonapi_requests.orm.AttributeField('measure') +class Standard(Quantity): + class Meta(Asset.Meta): + name = 'standard' + type, path = Asset.Meta.get_type_and_path(name) + type = jsonapi_requests.orm.RelationField('product_type') diff --git a/neofarm/test.py b/neofarm/test.py new file mode 100644 index 0000000..14d8d8d --- /dev/null +++ b/neofarm/test.py @@ -0,0 +1,6 @@ +import lib as neo + +if __name__ == "__main__": + result = neo.getHarvests() + for i in result: + print(f"name: {i.name} plant: {i.getPlant().name}") \ No newline at end of file