import requests import threading import firebase_admin from firebase_admin import db, credentials from firebase_admin import firestore import time def get_jeevan_ai_advisory(UID, FieldID, crop): endpointUrl = "https://us-central1-farmbase-b2f7e.cloudfunctions.net/askJeevnAPI" bodyObj = { "UID": UID, "FieldID": FieldID, # "1711985970653", "Crop": crop, # "grape", # "SowingMonth": sowing_month, # 0 } response = requests.post(endpointUrl, json=bodyObj) print(FieldID, " Status code: ", response.status_code) # print("Printing Entire Post Request") # print(FieldID, response.json()) return response.json() def getAdvisoryReport(uid, fields): endpointUrl = ( "https://us-central1-farmbase-b2f7e.cloudfunctions.net/getAdvisoryReport" ) bodyObj = {"UID": uid, "Fields": fields, "GlobalFlag": True} headersObj = { "Content-Type": "application/json", } response = requests.post(endpointUrl, headers=headersObj, json=bodyObj) if response.status_code == 200: jeevnAiReporturl = response.json().get("jeevnAiReporturl", None) return {"status": "success", "jeevnAiReportUrl": jeevnAiReporturl} elif response.status_code >= 400 and response.status_code < 500: error = response.json().get("error") return {"status": "error", "message": error} else: return {"status": "error", "message": response.json()} def process_one_field_data(UID, fieldId, fields_data_list): str_ref_db_userId = "/PaidMonitoredFields/PMF/" + UID + "/" + str(fieldId) ref = db.reference(f"{str_ref_db_userId}") if ref.child("Expired").get() == str(1) or ref.child("Paused").get() == "yes": print(fieldId, "Field is expired or paused") return lastSatelliteVisit = ref.child("LatestDay").get() if lastSatelliteVisit is None: print(fieldId, "No lastSatelliteVisit") ## skip return coordinates_db = ref.child("Coordinates").get() if coordinates_db is None: print(fieldId, "No coordinates") return #### get Advisory # get crop name crop_name = "Unknown Crop" crop_code_dict = db.reference("/CropCodes").get() crops = ref.child("FieldCrops").get() if crops: crop_name = crops[0] else: crop_code = ref.child("CropCode").get() if crop_code: crop_name = crop_code_dict.get(crop_code, "Unknown Crop") else: print(fieldId, "No crop defined for this field") if crop_name != "Unknown Crop": advisory_tree = get_jeevan_ai_advisory(UID, fieldId, crop_name) # if advisory exists or created successfully if advisory_tree.get("SensedDay"): fields_data_list[fieldId] = [advisory_tree.get("SensedDay")] else: print(fieldId, "No advisory") # jeevan_ai_data_list.append(jeevan_ai_row_dict) else: print(fieldId, "Crop code not in database") def create_interactive_report(UID): ##### MAIN ##### # # Firebase Config/Setup # #------------------------------------------------------------------------------- database_url = "https://farmbase-b2f7e-31c0c.firebaseio.com/" storage_url = "farmbase-b2f7e.appspot.com" cred = credentials.Certificate("servicekey.json") try: firebase_admin.initialize_app( cred, {"databaseURL": database_url, "storageBucket": storage_url} ) except: print("Already initialized") # default_app = firebase_admin._apps["[DEFAULT]"] print("\n" + "-" * 100) print("\n UID", UID) # Get all FieldIDs of the user str_ref_db_userId = "/PaidMonitoredFields/PMF/" + UID ref = db.reference(f"{str_ref_db_userId}") FieldIDs = list(ref.get(shallow=True).keys()) # Shallow to get only keys if len(FieldIDs) > 50: print("number of fields more than 50", len(FieldIDs)) print("\n" + "-" * 100) return FieldIDs = sorted(FieldIDs) fields_data_list = {} batch_size = 10 for i in range((len(FieldIDs) + batch_size - 1) // batch_size): threads = [] print( "\n Processing fields batch :- ", batch_size * (i), "to", batch_size * (i + 1), "\n", ) for fieldId in FieldIDs[ batch_size * (i) : batch_size * (i + 1) ]: # Limit the batch size t = threading.Thread( target=process_one_field_data, args=(UID, fieldId, fields_data_list), ) time.sleep(0.5) t.start() threads.append(t) for t in threads: t.join() # Wait for all threads to complete i = i + 1 print("\n Fields Sensed Day Data", fields_data_list) res = {} # Create Interactive Report using the cloud function print("\n Generating report ....") if fields_data_list: res = getAdvisoryReport(UID, fields_data_list) print("\n", res) else: print("\n No Fields data to Create Report") print("\n" + "-" * 100) return res #### How to use #UID = "I0C7dewCrhfejCBqaAj2U9PyjQw2" # Kapil farmonaut # UID = "3YYNNZU8miY9UpfmWprvxrrwSu22" # UID = "j7ji6kLaTmN9hbCCnnIRJAA7RB42" # UID = "HF9dSIoDEYcTwebrRWVzb08SQln2" ## loni_dcm - donot use for testing has very high number of farms # UID = "W851sDRFXHUkocpMIgIzWm9mI8B2" # demo account # UID = "lWgPLqmGG5Qxi6gsqIuxyIetsXj1" # UID = "Hcdz24Lz8MhMy4of7iqXzcDIrnB3" #UID = "UflixpPZiKP8ZuCxTOjhFSNumI83" #create_interactive_report(UID)