diff --git a/all_dynamic_entities_data.json b/all_dynamic_entities_data.json index 205c590..e0b3312 100644 --- a/all_dynamic_entities_data.json +++ b/all_dynamic_entities_data.json @@ -1,22 +1,17 @@ { - "ogcr3_project": [ + "project": [ { - "project_owner": "John Smith - Passport: US123456789", - "ogcr3_project_id": "95ad004f-1deb-491c-816d-c6dc877500a8" - }, - { - "project_owner": "Maria Garcia - Passport: ES987654321", - "ogcr3_project_id": "c8fa41ad-a833-4e45-9970-bc395c2f5bd8" - }, - { - "project_owner": "Wei Chen - Passport: CN456789123", - "ogcr3_project_id": "dd2047e6-38d7-4a63-96b8-549681828c26" + "project_id": "some-project-id-12345", + "project_name": "Planting Some Forest Somewhere", + "project_type": "Carbon Farming Sequestration", + "project_operator": "Agreena", + "project_country": "Spain" } ], - "ogcr3_parcel": [], - "ogcr3_parcel_owner_verification": [], - "ogcr3_project_parcel_verification": [], - "ogcr3_project_verification": [], - "ogcr3_parcel_monitoring_period_verification": [], - "ogcr3_project_monitoring_period_verification": [] + "parcel": [], + "parcel_owner_verification": [], + "project_parcel_verification": [], + "project_verification": [], + "parcel_monitoring_period_verification": [], + "project_monitoring_period_verification": [] } \ No newline at end of file diff --git a/create_dummy_data.py b/create_dummy_data.py index e40602b..fb1b4d0 100644 --- a/create_dummy_data.py +++ b/create_dummy_data.py @@ -1,26 +1,28 @@ import logging import random -import requests import time + +import requests from dotenv import load_dotenv -from obp_client import token, obp_host + from dynamic_entities import ( - ENTITY_PROJECT, ENTITY_PARCEL, + ENTITY_PARCEL_MONITORING_PERIOD_VERIFICATION, ENTITY_PARCEL_OWNERSHIP_VERIFICATION, + ENTITY_PROJECT, + ENTITY_PROJECT_MONITORING_PERIOD_VERIFICATION, ENTITY_PROJECT_PARCEL_VERIFICATION, ENTITY_PROJECT_VERIFICATION, - ENTITY_PARCEL_MONITORING_PERIOD_VERIFICATION, - ENTITY_PROJECT_MONITORING_PERIOD_VERIFICATION, + get_id_key, get_response_key, - get_id_key ) +from obp_client import obp_host, token # Configure logging with better formatting logging.basicConfig( level=logging.INFO, - format='%(asctime)s | %(levelname)-8s | %(message)s', - datefmt='%Y-%m-%d %H:%M:%S' + format="%(asctime)s | %(levelname)-8s | %(message)s", + datefmt="%Y-%m-%d %H:%M:%S", ) logger = logging.getLogger(__name__) @@ -49,9 +51,7 @@ def create_dynamic_entity_object(entity_name, data, token=None): """ url = f"{BASE_URL}/obp/dynamic-entity/{entity_name}" - headers = { - "Content-Type": "application/json" - } + headers = {"Content-Type": "application/json"} if token: headers["Authorization"] = f"DirectLogin token={token}" @@ -63,7 +63,7 @@ def create_dynamic_entity_object(entity_name, data, token=None): return result except requests.exceptions.RequestException as e: logger.error(f"Error creating object for {entity_name}: {e}") - if hasattr(e.response, 'text'): + if hasattr(e.response, "text"): logger.error(f"Response: {e.response.text}") raise @@ -82,9 +82,7 @@ def get_dynamic_entity_object(entity_name, object_id, token=None): """ url = f"{BASE_URL}/obp/dynamic-entity/{entity_name}/{object_id}" - headers = { - "Content-Type": "application/json" - } + headers = {"Content-Type": "application/json"} if token: headers["Authorization"] = f"DirectLogin token={token}" @@ -96,7 +94,7 @@ def get_dynamic_entity_object(entity_name, object_id, token=None): return result except requests.exceptions.RequestException as e: logger.error(f"Error getting object for {entity_name}/{object_id}: {e}") - if hasattr(e.response, 'text'): + if hasattr(e.response, "text"): logger.error(f"Response: {e.response.text}") raise @@ -117,22 +115,32 @@ def main(): projects_data = [ { - "project_owner": "John Smith - Passport: US123456789" + "project_owner": "John Smith - Passport: US123456789", + "project_name": "California Reforestation Project", + "project_type": "Reforestation", + "project_operator": "Green Earth Solutions Inc.", + "project_country": "United States", }, { - "project_owner": "Maria Garcia - Passport: ES987654321" + "project_owner": "Maria Garcia - Passport: ES987654321", + "project_name": "Iberian Forest Restoration Initiative", + "project_type": "Forest Conservation", + "project_operator": "EcoMediterraneo S.L.", + "project_country": "Spain", }, { - "project_owner": "Wei Chen - Passport: CN456789123" - } + "project_owner": "Wei Chen - Passport: CN456789123", + "project_name": "Beijing Urban Green Belt Project", + "project_type": "Afforestation", + "project_operator": "China Carbon Solutions Ltd.", + "project_country": "China", + }, ] for idx, project_data in enumerate(projects_data, 1): try: response = create_dynamic_entity_object( - ENTITY_PROJECT, - project_data, - DIRECTLOGIN_TOKEN + ENTITY_PROJECT, project_data, DIRECTLOGIN_TOKEN ) # The response contains a nested object with key like 'ogcr2_project' # Inside that object is the ID with key like 'ogcr2project_id' @@ -143,33 +151,43 @@ def main(): id_key = get_id_key(ENTITY_PROJECT) project_id = project_obj.get(id_key) if not project_id: - logger.error(f"Could not find {id_key} in nested object. Available keys: {list(project_obj.keys())}") + logger.error( + f"Could not find {id_key} in nested object. Available keys: {list(project_obj.keys())}" + ) raise KeyError(f"Could not find {id_key} in response") else: - logger.error(f"Could not find {response_key} in response. Available keys: {list(response.keys())}") + logger.error( + f"Could not find {response_key} in response. Available keys: {list(response.keys())}" + ) raise KeyError(f"Could not find {response_key} in response") - + created_projects.append(project_id) - logger.info(f" ✓ [{idx}/{len(projects_data)}] Created project: {project_data['project_owner'][:30]}... (ID: {project_id})") + logger.info( + f" ✓ [{idx}/{len(projects_data)}] Created project: {project_data['project_owner'][:30]}... (ID: {project_id})" + ) # Debug: Log the full response structure logger.debug(f"Full project response: {response}") except Exception as e: - logger.error(f" ✗ [{idx}/{len(projects_data)}] Failed to create project: {e}") + logger.error( + f" ✗ [{idx}/{len(projects_data)}] Failed to create project: {e}" + ) if not created_projects: logger.error("No projects created. Cannot continue with parcels.") return print_separator() - + # Debug: Log the created project IDs logger.info(f"Created project IDs: {created_projects}") - + # Verify projects exist by fetching them back logger.info("Verifying created projects exist...") for project_id in created_projects: try: - project = get_dynamic_entity_object(ENTITY_PROJECT, project_id, DIRECTLOGIN_TOKEN) + project = get_dynamic_entity_object( + ENTITY_PROJECT, project_id, DIRECTLOGIN_TOKEN + ) logger.info(f" ✓ Verified project {project_id[:8]}... exists") except Exception as e: logger.error(f" ✗ Failed to verify project {project_id}: {e}") @@ -182,41 +200,39 @@ def main(): # Use the proper foreign key field name that matches the referenced entity's ID field project_id_field = f"{ENTITY_PROJECT}_id" - + parcels_data = [ { project_id_field: created_projects[0], "parcel_owner": "John Smith - Passport: US123456789", - "geo_data": '{"type":"Polygon","coordinates":[[[-122.4,37.8],[-122.4,37.7],[-122.3,37.7],[-122.3,37.8],[-122.4,37.8]]]}' + "geo_data": '{"type":"Polygon","coordinates":[[[-122.4,37.8],[-122.4,37.7],[-122.3,37.7],[-122.3,37.8],[-122.4,37.8]]]}', }, { project_id_field: created_projects[0], "parcel_owner": "John Smith - Passport: US123456789", - "geo_data": '{"type":"Polygon","coordinates":[[[-122.3,37.8],[-122.3,37.7],[-122.2,37.7],[-122.2,37.8],[-122.3,37.8]]]}' + "geo_data": '{"type":"Polygon","coordinates":[[[-122.3,37.8],[-122.3,37.7],[-122.2,37.7],[-122.2,37.8],[-122.3,37.8]]]}', }, { project_id_field: created_projects[1], "parcel_owner": "Maria Garcia - Passport: ES987654321", - "geo_data": '{"type":"Polygon","coordinates":[[[-3.7,40.4],[-3.7,40.3],[-3.6,40.3],[-3.6,40.4],[-3.7,40.4]]]}' + "geo_data": '{"type":"Polygon","coordinates":[[[-3.7,40.4],[-3.7,40.3],[-3.6,40.3],[-3.6,40.4],[-3.7,40.4]]]}', }, { project_id_field: created_projects[1], "parcel_owner": "Maria Garcia - Passport: ES987654321", - "geo_data": '{"type":"Polygon","coordinates":[[[-3.6,40.4],[-3.6,40.3],[-3.5,40.3],[-3.5,40.4],[-3.6,40.4]]]}' + "geo_data": '{"type":"Polygon","coordinates":[[[-3.6,40.4],[-3.6,40.3],[-3.5,40.3],[-3.5,40.4],[-3.6,40.4]]]}', }, { project_id_field: created_projects[2], "parcel_owner": "Wei Chen - Passport: CN456789123", - "geo_data": '{"type":"Polygon","coordinates":[[[116.4,39.9],[116.4,39.8],[116.5,39.8],[116.5,39.9],[116.4,39.9]]]}' - } + "geo_data": '{"type":"Polygon","coordinates":[[[116.4,39.9],[116.4,39.8],[116.5,39.8],[116.5,39.9],[116.4,39.9]]]}', + }, ] for idx, parcel_data in enumerate(parcels_data, 1): try: response = create_dynamic_entity_object( - ENTITY_PARCEL, - parcel_data, - DIRECTLOGIN_TOKEN + ENTITY_PARCEL, parcel_data, DIRECTLOGIN_TOKEN ) response_key = get_response_key(ENTITY_PARCEL) if response_key in response: @@ -224,20 +240,27 @@ def main(): id_key = get_id_key(ENTITY_PARCEL) parcel_id = parcel_obj.get(id_key) if not parcel_id: - logger.error(f"Could not find {id_key} in nested object. Available keys: {list(parcel_obj.keys())}") + logger.error( + f"Could not find {id_key} in nested object. Available keys: {list(parcel_obj.keys())}" + ) raise KeyError(f"Could not find {id_key} in response") else: - logger.error(f"Could not find {response_key} in response. Available keys: {list(response.keys())}") + logger.error( + f"Could not find {response_key} in response. Available keys: {list(response.keys())}" + ) raise KeyError(f"Could not find {response_key} in response") - + # Store parcel ID and project_id for later use - created_parcels.append({ - "parcel_id": parcel_id, - "project_id": parcel_data[project_id_field] - }) - logger.info(f" ✓ [{idx}/{len(parcels_data)}] Created parcel for project {parcel_data[project_id_field][:8]}... (ID: {parcel_id})") + created_parcels.append( + {"parcel_id": parcel_id, "project_id": parcel_data[project_id_field]} + ) + logger.info( + f" ✓ [{idx}/{len(parcels_data)}] Created parcel for project {parcel_data[project_id_field][:8]}... (ID: {parcel_id})" + ) except Exception as e: - logger.error(f" ✗ [{idx}/{len(parcels_data)}] Failed to create parcel: {e}") + logger.error( + f" ✗ [{idx}/{len(parcels_data)}] Failed to create parcel: {e}" + ) if not created_parcels: logger.error("No parcels created. Cannot continue with verifications.") @@ -256,23 +279,29 @@ def main(): verification_data = { parcel_id_field: parcel["parcel_id"], "status_code": "verified" if idx % 3 != 0 else "in_progress", - "status_message": "Ownership verified successfully" if idx % 3 != 0 else "Verification pending cadastre response", - "authority": "National Land Registry" + "status_message": "Ownership verified successfully" + if idx % 3 != 0 + else "Verification pending cadastre response", + "authority": "National Land Registry", } try: response = create_dynamic_entity_object( ENTITY_PARCEL_OWNERSHIP_VERIFICATION, verification_data, - DIRECTLOGIN_TOKEN + DIRECTLOGIN_TOKEN, ) response_key = get_response_key(ENTITY_PARCEL_OWNERSHIP_VERIFICATION) verification_obj = response.get(response_key, {}) id_key = get_id_key(ENTITY_PARCEL_OWNERSHIP_VERIFICATION) verification_id = verification_obj.get(id_key) - logger.info(f" ✓ [{idx}/{len(created_parcels)}] Created ownership verification for parcel {parcel['parcel_id'][:8]}... (Status: {verification_data['status_code']})") + logger.info( + f" ✓ [{idx}/{len(created_parcels)}] Created ownership verification for parcel {parcel['parcel_id'][:8]}... (Status: {verification_data['status_code']})" + ) except Exception as e: - logger.error(f" ✗ [{idx}/{len(created_parcels)}] Failed to create ownership verification: {e}") + logger.error( + f" ✗ [{idx}/{len(created_parcels)}] Failed to create ownership verification: {e}" + ) print_separator() @@ -287,22 +316,26 @@ def main(): verification_data = { project_id_field: project_id, "status_code": "verified" if idx % 2 == 0 else "in_progress", - "status_message": "Project methodology verified" if idx % 2 == 0 else "Awaiting documentation review" + "status_message": "Project methodology verified" + if idx % 2 == 0 + else "Awaiting documentation review", } try: response = create_dynamic_entity_object( - ENTITY_PROJECT_VERIFICATION, - verification_data, - DIRECTLOGIN_TOKEN + ENTITY_PROJECT_VERIFICATION, verification_data, DIRECTLOGIN_TOKEN ) response_key = get_response_key(ENTITY_PROJECT_VERIFICATION) verification_obj = response.get(response_key, {}) id_key = get_id_key(ENTITY_PROJECT_VERIFICATION) verification_id = verification_obj.get(id_key) - logger.info(f" ✓ [{idx}/{len(created_projects)}] Created project verification for {project_id[:8]}... (Status: {verification_data['status_code']})") + logger.info( + f" ✓ [{idx}/{len(created_projects)}] Created project verification for {project_id[:8]}... (Status: {verification_data['status_code']})" + ) except Exception as e: - logger.error(f" ✗ [{idx}/{len(created_projects)}] Failed to create project verification: {e}") + logger.error( + f" ✗ [{idx}/{len(created_projects)}] Failed to create project verification: {e}" + ) print_separator() @@ -319,23 +352,27 @@ def main(): parcel_id_field: parcel["parcel_id"], project_id_field: parcel["project_id"], "status_code": "verified" if idx % 4 != 0 else "failed", - "status_message": "Baseline carbon estimation completed" if idx % 4 != 0 else "Insufficient historical data", - "amount": 150 + (idx * 50) if idx % 4 != 0 else 0 + "status_message": "Baseline carbon estimation completed" + if idx % 4 != 0 + else "Insufficient historical data", + "amount": 150 + (idx * 50) if idx % 4 != 0 else 0, } try: response = create_dynamic_entity_object( - ENTITY_PROJECT_PARCEL_VERIFICATION, - verification_data, - DIRECTLOGIN_TOKEN + ENTITY_PROJECT_PARCEL_VERIFICATION, verification_data, DIRECTLOGIN_TOKEN ) response_key = get_response_key(ENTITY_PROJECT_PARCEL_VERIFICATION) verification_obj = response.get(response_key, {}) id_key = get_id_key(ENTITY_PROJECT_PARCEL_VERIFICATION) verification_id = verification_obj.get(id_key) - logger.info(f" ✓ [{idx}/{len(created_parcels)}] Created project-parcel verification (Amount: {verification_data['amount']} tons CO2)") + logger.info( + f" ✓ [{idx}/{len(created_parcels)}] Created project-parcel verification (Amount: {verification_data['amount']} tons CO2)" + ) except Exception as e: - logger.error(f" ✗ [{idx}/{len(created_parcels)}] Failed to create project-parcel verification: {e}") + logger.error( + f" ✗ [{idx}/{len(created_parcels)}] Failed to create project-parcel verification: {e}" + ) print_separator() @@ -352,23 +389,31 @@ def main(): parcel_id_field: parcel["parcel_id"], project_id_field: parcel["project_id"], "status_code": "verified" if idx % 3 != 0 else "in_progress", - "status_message": "Monitoring period Q1-2024 verified" if idx % 3 != 0 else "Awaiting satellite data analysis", - "amount": 80 + (idx * 30) if idx % 3 != 0 else 0 + "status_message": "Monitoring period Q1-2024 verified" + if idx % 3 != 0 + else "Awaiting satellite data analysis", + "amount": 80 + (idx * 30) if idx % 3 != 0 else 0, } try: response = create_dynamic_entity_object( ENTITY_PARCEL_MONITORING_PERIOD_VERIFICATION, verification_data, - DIRECTLOGIN_TOKEN + DIRECTLOGIN_TOKEN, + ) + response_key = get_response_key( + ENTITY_PARCEL_MONITORING_PERIOD_VERIFICATION ) - response_key = get_response_key(ENTITY_PARCEL_MONITORING_PERIOD_VERIFICATION) verification_obj = response.get(response_key, {}) id_key = get_id_key(ENTITY_PARCEL_MONITORING_PERIOD_VERIFICATION) verification_id = verification_obj.get(id_key) - logger.info(f" ✓ [{idx}/{len(created_parcels)}] Created parcel monitoring verification (Amount: {verification_data['amount']} tons CO2)") + logger.info( + f" ✓ [{idx}/{len(created_parcels)}] Created parcel monitoring verification (Amount: {verification_data['amount']} tons CO2)" + ) except Exception as e: - logger.error(f" ✗ [{idx}/{len(created_parcels)}] Failed to create parcel monitoring verification: {e}") + logger.error( + f" ✗ [{idx}/{len(created_parcels)}] Failed to create parcel monitoring verification: {e}" + ) print_separator() @@ -383,22 +428,30 @@ def main(): verification_data = { project_id_field: project_id, "status_code": "verified" if idx % 2 == 1 else "in_progress", - "status_message": "Q1-2024 project period verified" if idx % 2 == 1 else "Pending final aggregation review" + "status_message": "Q1-2024 project period verified" + if idx % 2 == 1 + else "Pending final aggregation review", } try: response = create_dynamic_entity_object( ENTITY_PROJECT_MONITORING_PERIOD_VERIFICATION, verification_data, - DIRECTLOGIN_TOKEN + DIRECTLOGIN_TOKEN, + ) + response_key = get_response_key( + ENTITY_PROJECT_MONITORING_PERIOD_VERIFICATION ) - response_key = get_response_key(ENTITY_PROJECT_MONITORING_PERIOD_VERIFICATION) verification_obj = response.get(response_key, {}) id_key = get_id_key(ENTITY_PROJECT_MONITORING_PERIOD_VERIFICATION) verification_id = verification_obj.get(id_key) - logger.info(f" ✓ [{idx}/{len(created_projects)}] Created project period verification for {project_id[:8]}... (Status: {verification_data['status_code']})") + logger.info( + f" ✓ [{idx}/{len(created_projects)}] Created project period verification for {project_id[:8]}... (Status: {verification_data['status_code']})" + ) except Exception as e: - logger.error(f" ✗ [{idx}/{len(created_projects)}] Failed to create project period verification: {e}") + logger.error( + f" ✗ [{idx}/{len(created_projects)}] Failed to create project period verification: {e}" + ) print_separator() @@ -417,4 +470,4 @@ def main(): if __name__ == "__main__": - main() \ No newline at end of file + main()