Update app.py
Browse files
app.py
CHANGED
|
@@ -65,7 +65,7 @@ else:
|
|
| 65 |
def init_salesforce():
|
| 66 |
if not SALESFORCE_AVAILABLE:
|
| 67 |
logging.error("Salesforce library not available. Skipping connection.")
|
| 68 |
-
return None, "Salesforce library not available"
|
| 69 |
|
| 70 |
try:
|
| 71 |
logging.info("Attempting to connect to Salesforce...")
|
|
@@ -76,23 +76,46 @@ def init_salesforce():
|
|
| 76 |
instance_url=SF_INSTANCE_URL
|
| 77 |
)
|
| 78 |
logging.info("Salesforce connected successfully")
|
|
|
|
| 79 |
# Test read access on Project_Closure_Handover__c
|
| 80 |
test_query = sf.query("SELECT Id FROM Project_Closure_Handover__c LIMIT 1")
|
| 81 |
logging.info(f"Test query result (read access): {test_query}")
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
logging.info(f"Project__c test query result (read access): {project_query}")
|
| 85 |
-
# Test object permissions
|
| 86 |
object_description = sf.Project_Closure_Handover__c.describe()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 87 |
permissions = {
|
| 88 |
"createable": object_description.get("createable", False),
|
| 89 |
"updateable": object_description.get("updateable", False)
|
| 90 |
}
|
| 91 |
-
logging.info(f"Object permissions: {permissions}")
|
| 92 |
if not permissions["createable"]:
|
| 93 |
logging.error("User lacks create permission on Project_Closure_Handover__c")
|
| 94 |
-
return None, "User lacks create permission on Project_Closure_Handover__c"
|
| 95 |
-
|
|
|
|
| 96 |
except SalesforceError as e:
|
| 97 |
logging.error(f"Salesforce authentication failed: {str(e)}")
|
| 98 |
logging.error("Possible issues: Incorrect credentials, IP restrictions, or insufficient permissions.")
|
|
@@ -103,16 +126,17 @@ def init_salesforce():
|
|
| 103 |
raise
|
| 104 |
|
| 105 |
# Function to get the Salesforce record ID for a project based on its custom identifier
|
| 106 |
-
def get_project_record_id(sf, project_code):
|
| 107 |
try:
|
| 108 |
-
#
|
| 109 |
-
#
|
| 110 |
-
|
|
|
|
| 111 |
result = sf.query(query)
|
| 112 |
logging.debug(f"Project query result: {result}")
|
| 113 |
if result['totalSize'] == 0:
|
| 114 |
-
logging.error(f"No project found with Project_Code__c: {project_code}")
|
| 115 |
-
return None, f"No project found with Project Code: {project_code}"
|
| 116 |
record_id = result['records'][0]['Id']
|
| 117 |
logging.info(f"Found project record ID: {record_id} for Project_Code__c: {project_code}")
|
| 118 |
return record_id, "Success"
|
|
@@ -150,13 +174,13 @@ def create_salesforce_record(project_id, score, checklist_summary, missing_summa
|
|
| 150 |
return "Salesforce library not available"
|
| 151 |
|
| 152 |
try:
|
| 153 |
-
sf, connection_message = init_salesforce()
|
| 154 |
-
if not sf:
|
| 155 |
logging.error(f"Skipping Salesforce record creation due to connection failure: {connection_message}")
|
| 156 |
return connection_message
|
| 157 |
|
| 158 |
# Get the Salesforce record ID for the project
|
| 159 |
-
project_record_id, project_query_message = get_project_record_id(sf, project_id)
|
| 160 |
if not project_record_id:
|
| 161 |
logging.error(f"Failed to get project record ID: {project_query_message}")
|
| 162 |
return f"Error: {project_query_message}"
|
|
|
|
| 65 |
def init_salesforce():
|
| 66 |
if not SALESFORCE_AVAILABLE:
|
| 67 |
logging.error("Salesforce library not available. Skipping connection.")
|
| 68 |
+
return None, None, "Salesforce library not available"
|
| 69 |
|
| 70 |
try:
|
| 71 |
logging.info("Attempting to connect to Salesforce...")
|
|
|
|
| 76 |
instance_url=SF_INSTANCE_URL
|
| 77 |
)
|
| 78 |
logging.info("Salesforce connected successfully")
|
| 79 |
+
|
| 80 |
# Test read access on Project_Closure_Handover__c
|
| 81 |
test_query = sf.query("SELECT Id FROM Project_Closure_Handover__c LIMIT 1")
|
| 82 |
logging.info(f"Test query result (read access): {test_query}")
|
| 83 |
+
|
| 84 |
+
# Describe Project_Closure_Handover__c to find the related object for Project_ID__c
|
|
|
|
|
|
|
| 85 |
object_description = sf.Project_Closure_Handover__c.describe()
|
| 86 |
+
project_id_field = None
|
| 87 |
+
for field in object_description['fields']:
|
| 88 |
+
if field['name'] == 'Project_ID__c':
|
| 89 |
+
project_id_field = field
|
| 90 |
+
break
|
| 91 |
+
|
| 92 |
+
if not project_id_field:
|
| 93 |
+
logging.error("Project_ID__c field not found on Project_Closure_Handover__c")
|
| 94 |
+
return None, None, "Project_ID__c field not found on Project_Closure_Handover__c"
|
| 95 |
+
|
| 96 |
+
# Check if Project_ID__c is a reference (Lookup) field
|
| 97 |
+
if not project_id_field['referenceTo']:
|
| 98 |
+
logging.error("Project_ID__c is not a reference field. It must be a Lookup or Master-Detail field.")
|
| 99 |
+
return None, None, "Project_ID__c is not a reference field"
|
| 100 |
+
|
| 101 |
+
related_object = project_id_field['referenceTo'][0] # e.g., 'Projects__c'
|
| 102 |
+
logging.info(f"Project_ID__c references object: {related_object}")
|
| 103 |
+
|
| 104 |
+
# Test read access on the related object
|
| 105 |
+
related_query = sf.query(f"SELECT Id FROM {related_object} LIMIT 1")
|
| 106 |
+
logging.info(f"{related_object} test query result (read access): {related_query}")
|
| 107 |
+
|
| 108 |
+
# Test object permissions for Project_Closure_Handover__c
|
| 109 |
permissions = {
|
| 110 |
"createable": object_description.get("createable", False),
|
| 111 |
"updateable": object_description.get("updateable", False)
|
| 112 |
}
|
| 113 |
+
logging.info(f"Object permissions for Project_Closure_Handover__c: {permissions}")
|
| 114 |
if not permissions["createable"]:
|
| 115 |
logging.error("User lacks create permission on Project_Closure_Handover__c")
|
| 116 |
+
return None, None, "User lacks create permission on Project_Closure_Handover__c"
|
| 117 |
+
|
| 118 |
+
return sf, related_object, "Salesforce connected successfully"
|
| 119 |
except SalesforceError as e:
|
| 120 |
logging.error(f"Salesforce authentication failed: {str(e)}")
|
| 121 |
logging.error("Possible issues: Incorrect credentials, IP restrictions, or insufficient permissions.")
|
|
|
|
| 126 |
raise
|
| 127 |
|
| 128 |
# Function to get the Salesforce record ID for a project based on its custom identifier
|
| 129 |
+
def get_project_record_id(sf, related_object, project_code):
|
| 130 |
try:
|
| 131 |
+
# Query the related object to find a record matching the project_code
|
| 132 |
+
# Assuming the related object has a field 'Project_Code__c' to match the identifier
|
| 133 |
+
# Adjust the field name (e.g., to 'Name' or 'ProjectNumber__c') based on your Salesforce org
|
| 134 |
+
query = f"SELECT Id FROM {related_object} WHERE Project_Code__c = '{project_code}' LIMIT 1"
|
| 135 |
result = sf.query(query)
|
| 136 |
logging.debug(f"Project query result: {result}")
|
| 137 |
if result['totalSize'] == 0:
|
| 138 |
+
logging.error(f"No project found with Project_Code__c: {project_code} in {related_object}")
|
| 139 |
+
return None, f"No project found with Project Code: {project_code} in {related_object}"
|
| 140 |
record_id = result['records'][0]['Id']
|
| 141 |
logging.info(f"Found project record ID: {record_id} for Project_Code__c: {project_code}")
|
| 142 |
return record_id, "Success"
|
|
|
|
| 174 |
return "Salesforce library not available"
|
| 175 |
|
| 176 |
try:
|
| 177 |
+
sf, related_object, connection_message = init_salesforce()
|
| 178 |
+
if not sf or not related_object:
|
| 179 |
logging.error(f"Skipping Salesforce record creation due to connection failure: {connection_message}")
|
| 180 |
return connection_message
|
| 181 |
|
| 182 |
# Get the Salesforce record ID for the project
|
| 183 |
+
project_record_id, project_query_message = get_project_record_id(sf, related_object, project_id)
|
| 184 |
if not project_record_id:
|
| 185 |
logging.error(f"Failed to get project record ID: {project_query_message}")
|
| 186 |
return f"Error: {project_query_message}"
|