mirror of
https://github.com/danswer-ai/danswer.git
synced 2025-06-24 23:11:01 +02:00
salesforce qol changes (#1644)
This commit is contained in:
parent
722a1dd919
commit
c3577cf346
@ -35,33 +35,28 @@ class SalesforceConnector(LoadConnector, PollConnector):
|
|||||||
) -> None:
|
) -> None:
|
||||||
self.batch_size = batch_size
|
self.batch_size = batch_size
|
||||||
self.sf_client: Salesforce | None = None
|
self.sf_client: Salesforce | None = None
|
||||||
self.parent_object_list: list[str] = []
|
self.parent_object_list = (
|
||||||
if requested_objects:
|
[obj.capitalize() for obj in requested_objects]
|
||||||
for requested_object in requested_objects:
|
if requested_objects
|
||||||
if requested_object: # ensure first letter is capitalized
|
else DEFAULT_PARENT_OBJECT_TYPES
|
||||||
self.parent_object_list.append(
|
)
|
||||||
requested_object[0].upper() + requested_object[1:]
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
self.parent_object_list = DEFAULT_PARENT_OBJECT_TYPES
|
|
||||||
|
|
||||||
def load_credentials(self, credentials: dict[str, Any]) -> dict[str, Any] | None:
|
def load_credentials(self, credentials: dict[str, Any]) -> dict[str, Any] | None:
|
||||||
salesforce_username = credentials["sf_username"]
|
|
||||||
salesforce_password = credentials["sf_password"]
|
|
||||||
salesforce_security_token = credentials["sf_security_token"]
|
|
||||||
|
|
||||||
self.sf_client = Salesforce(
|
self.sf_client = Salesforce(
|
||||||
username=salesforce_username,
|
username=credentials["sf_username"],
|
||||||
password=salesforce_password,
|
password=credentials["sf_password"],
|
||||||
security_token=salesforce_security_token,
|
security_token=credentials["sf_security_token"],
|
||||||
)
|
)
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def _get_sf_type_object(self, type_name: str) -> SFType:
|
def _get_sf_type_object_json(self, type_name: str) -> Any:
|
||||||
if self.sf_client is None:
|
if self.sf_client is None:
|
||||||
raise ConnectorMissingCredentialError("Salesforce")
|
raise ConnectorMissingCredentialError("Salesforce")
|
||||||
return SFType(type_name, self.sf_client.session_id, self.sf_client.sf_instance)
|
sf_object = SFType(
|
||||||
|
type_name, self.sf_client.session_id, self.sf_client.sf_instance
|
||||||
|
)
|
||||||
|
return sf_object.describe()
|
||||||
|
|
||||||
def _get_name_from_id(self, id: str) -> str:
|
def _get_name_from_id(self, id: str) -> str:
|
||||||
if self.sf_client is None:
|
if self.sf_client is None:
|
||||||
@ -73,6 +68,7 @@ class SalesforceConnector(LoadConnector, PollConnector):
|
|||||||
name = user_object_info.get("Records", [{}])[0].get("Name", "Null User")
|
name = user_object_info.get("Records", [{}])[0].get("Name", "Null User")
|
||||||
return name
|
return name
|
||||||
except Exception:
|
except Exception:
|
||||||
|
logger.warning(f"Couldnt find name for object id: {id}")
|
||||||
return "Null User"
|
return "Null User"
|
||||||
|
|
||||||
def _convert_object_instance_to_document(
|
def _convert_object_instance_to_document(
|
||||||
@ -81,11 +77,11 @@ class SalesforceConnector(LoadConnector, PollConnector):
|
|||||||
if self.sf_client is None:
|
if self.sf_client is None:
|
||||||
raise ConnectorMissingCredentialError("Salesforce")
|
raise ConnectorMissingCredentialError("Salesforce")
|
||||||
|
|
||||||
extracted_id = object_dict["Id"]
|
extracted_id = f"SALESFORCE_{object_dict['Id']}"
|
||||||
extracted_link = f"https://{self.sf_client.sf_instance}/{extracted_id}"
|
extracted_link = f"https://{self.sf_client.sf_instance}/{extracted_id}"
|
||||||
extracted_doc_updated_at = time_str_to_utc(object_dict["LastModifiedDate"])
|
extracted_doc_updated_at = time_str_to_utc(object_dict["LastModifiedDate"])
|
||||||
extracted_object_text = extract_dict_text(object_dict)
|
extracted_object_text = extract_dict_text(object_dict)
|
||||||
extracted_semantic_identifier = object_dict.get("Name", "Uknown Object Name")
|
extracted_semantic_identifier = object_dict.get("Name", "Unknown Object")
|
||||||
extracted_primary_owners = [
|
extracted_primary_owners = [
|
||||||
BasicExpertInfo(
|
BasicExpertInfo(
|
||||||
display_name=self._get_name_from_id(object_dict["LastModifiedById"])
|
display_name=self._get_name_from_id(object_dict["LastModifiedById"])
|
||||||
@ -113,8 +109,7 @@ class SalesforceConnector(LoadConnector, PollConnector):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
sf_type = child_relationship["childSObject"]
|
sf_type = child_relationship["childSObject"]
|
||||||
sf_object = self._get_sf_type_object(sf_type)
|
object_description = self._get_sf_type_object_json(sf_type)
|
||||||
object_description = sf_object.describe()
|
|
||||||
if not object_description["queryable"]:
|
if not object_description["queryable"]:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@ -139,8 +134,7 @@ class SalesforceConnector(LoadConnector, PollConnector):
|
|||||||
if self.sf_client is None:
|
if self.sf_client is None:
|
||||||
raise ConnectorMissingCredentialError("Salesforce")
|
raise ConnectorMissingCredentialError("Salesforce")
|
||||||
|
|
||||||
sf_object = self._get_sf_type_object(sf_type)
|
object_description = self._get_sf_type_object_json(sf_type)
|
||||||
object_description = sf_object.describe()
|
|
||||||
|
|
||||||
children_objects: list[dict] = []
|
children_objects: list[dict] = []
|
||||||
for child_relationship in object_description["childRelationships"]:
|
for child_relationship in object_description["childRelationships"]:
|
||||||
@ -157,18 +151,24 @@ class SalesforceConnector(LoadConnector, PollConnector):
|
|||||||
if self.sf_client is None:
|
if self.sf_client is None:
|
||||||
raise ConnectorMissingCredentialError("Salesforce")
|
raise ConnectorMissingCredentialError("Salesforce")
|
||||||
|
|
||||||
sf_object = self._get_sf_type_object(sf_type)
|
object_description = self._get_sf_type_object_json(sf_type)
|
||||||
all_account_objects = sf_object.describe()
|
|
||||||
|
|
||||||
fields = [
|
fields = [
|
||||||
field.get("name")
|
field.get("name")
|
||||||
for field in all_account_objects["fields"]
|
for field in object_description["fields"]
|
||||||
if field.get("type", "base64") != "base64"
|
if field.get("type", "base64") != "base64"
|
||||||
]
|
]
|
||||||
|
|
||||||
return fields
|
return fields
|
||||||
|
|
||||||
def _generate_query_per_parent_type(self, parent_sf_type: str) -> Iterator[str]:
|
def _generate_query_per_parent_type(self, parent_sf_type: str) -> Iterator[str]:
|
||||||
|
"""
|
||||||
|
This function takes in an object_type and generates query(s) designed to grab
|
||||||
|
information associated to objects of that type.
|
||||||
|
It does that by getting all the fields of the parent object type.
|
||||||
|
Then it gets all the child objects of that object type and all the fields of
|
||||||
|
those children as well.
|
||||||
|
"""
|
||||||
parent_fields = self._get_all_fields_for_sf_type(parent_sf_type)
|
parent_fields = self._get_all_fields_for_sf_type(parent_sf_type)
|
||||||
child_sf_types = self._get_all_children_of_sf_type(parent_sf_type)
|
child_sf_types = self._get_all_children_of_sf_type(parent_sf_type)
|
||||||
|
|
||||||
@ -214,6 +214,10 @@ class SalesforceConnector(LoadConnector, PollConnector):
|
|||||||
for record_dict in query_result["records"]:
|
for record_dict in query_result["records"]:
|
||||||
query_results.setdefault(record_dict["Id"], {}).update(record_dict)
|
query_results.setdefault(record_dict["Id"], {}).update(record_dict)
|
||||||
|
|
||||||
|
logger.info(
|
||||||
|
f"Number of {parent_object_type} Objects processed: {len(query_results)}"
|
||||||
|
)
|
||||||
|
|
||||||
for combined_object_dict in query_results.values():
|
for combined_object_dict in query_results.values():
|
||||||
doc_batch.append(
|
doc_batch.append(
|
||||||
self._convert_object_instance_to_document(combined_object_dict)
|
self._convert_object_instance_to_document(combined_object_dict)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user