Python API
Salesforce
- class RPA.Salesforce.Salesforce(sandbox: bool = False, domain: str = 'login')
Salesforce is a library for accessing Salesforce using REST API. The library extends simple-salesforce library.
More information available at Salesforce REST API Developer Guide.
Dataloader
The keyword execute_dataloader_import can be used to mimic Salesforce Dataloader import behaviour.
input_object can be given in different formats. Below is an example where input is in RPA.Table format in method a and list format in method b.
*** Settings *** Library RPA.Salesforce Library RPA.Database Task Setup Authorize Salesforce *** Tasks *** # Method a ${orders}= Database Query Result As Table ... SELECT * FROM incoming_orders ${status}= Execute Dataloader Insert ... ${orders} ${mapping_dict} Tilaus__c # Method b ${status}= Execute Dataloader Insert ... ${WORKDIR}${/}orders.json ${mapping_dict} Tilaus__c
Example file orders.json
[ { "asiakas": "0015I000002jBLIQA2" }, { "asiakas": "0015I000002jBLDQA2" }, ]
mapping_object describes how the input data fields are mapped into Salesforce object attributes. In the example, the mapping defines that asiakas attribute in the input object is mapped into Tilaaja__c attribute of Tilaus__c custom Salesforce object.
{ "Tilaus__c": { "asiakas": "Tilaaja__c" }, }
Object type could be, for example, Tilaus__c.
Salesforce object operations
Following operations can be used to manage Salesforce objects:
Get Salesforce Object By Id
Create Salesforce Object
Update Salesforce Object
Upsert Salesforce Object
Delete Salesforce Object
Get Salesforce Object Metadata
Describe Salesforce Object
There are two ways to set the Salesforce domain. You can set the domain at time of library import or using the Set Domain keyword.
There are several ways to declare a domain at time of library import:
*** Settings *** Library RPA.Salesforce sandbox=${TRUE}
Or using the domain to your Salesforce My domain:
*** Settings *** Library RPA.Salesforce domain="robocorp"
The domain can also be set using the keyword Set Domain:
*** Settings *** Library RPA.Salesforce *** Tasks *** # Sets the domain for a sandbox environment Set Domain sandbox # Sets the domain to a Salseforce My domain Set Domain robocorp # Sets to domain to the default of 'login' Set Domain
Examples
Robot Framework
*** Settings *** Library RPA.Salesforce Task Setup Authorize Salesforce *** Variables *** ${ACCOUNT_NOKIA} 0015I000002jBLDQA2 *** Tasks *** Change account details in Salesforce &{account}= Get Salesforce Object By Id Account ${ACCOUNT_NOKIA} &{update_obj}= Create Dictionary Name=Nokia Ltd BillingStreet=Nokia bulevard 1 ${result}= Update Salesforce Object Account ${ACCOUNT_NOKIA} ${update_obj} *** Keywords *** Authorize Salesforce ${secrets}= Get Secret salesforce Auth With Token ... username=${secrets}[USERNAME] ... password=${secrets}[PASSWORD] ... api_token=${secrets}[API_TOKEN]
Python
import pprint from RPA.Salesforce import Salesforce from RPA.Robocorp.Vault import FileSecrets pp = pprint.PrettyPrinter(indent=4) filesecrets = FileSecrets("secrets.json") secrets = filesecrets.get_secret("salesforce") sf = Salesforce() sf.auth_with_token( username=secrets["USERNAME"], password=secrets["PASSWORD"], api_token=secrets["API_TOKEN"], ) nokia_account_id = "0015I000002jBLDQA2" account = sf.get_salesforce_object_by_id("Account", nokia_account_id) pp.pprint(account) billing_information = { "BillingStreet": "Nokia Bulevard 1", "BillingCity": "Espoo", "BillingPostalCode": "01210", "BillingCountry": "Finland", } result = sf.update_salesforce_object("Account", nokia_account_id, billing_information) print(f"Update result: {result}")
- ROBOT_LIBRARY_DOC_FORMAT = 'REST'
- ROBOT_LIBRARY_SCOPE = 'GLOBAL'
- account = {'Id': None, 'Name': None}
- add_product_into_opportunity(product_name: str, quantity: int, opportunity_id: Optional[str] = None, pricebook_name: Optional[str] = None, custom_total_price: Optional[float] = None) bool
Add Salesforce Product into Opportunity.
- Parameters
product_name – type of the product in the Pricelist
quantity – number of products to add
opportunity_id – identifier of Opportunity, default None
pricebook_name – name of the pricelist, default None
custom_total_price – price that overrides quantity and product price, default None
- Returns
True is operation is successful or False
- auth_with_connected_app(username: str, password: str, api_token: str, consumer_key: str, consumer_secret: str, embed_api_token: bool = False) None
Authorize to Salesforce with security token, username, password, connected app key, and connected app secret creating instance.
- Parameters
username – Salesforce API username
password – Salesforce API password
api_token – Salesforce API security token
consumer_key – Salesforce connected app client ID
consumer_secret – Salesforce connected app client secret
embed_api_token – Embed API token to password (default: False)
Python
from RPA.Salesforce import Salesforce from RPA.Robocorp.Vault import Vault SF = Salesforce(domain="robocorp-testing-stuff.develop.my") VAULT = Vault() secrets = VAULT.get_secret("salesforce") SF.auth_with_connected_app( username=secrets["USERNAME"], password=secrets["PASSWORD"], api_token=secrets["API_TOKEN"], consumer_key=secrets["CONSUMER_KEY"], consumer_secret=secrets["CONSUMER_SECRET"], )
Robot Framework
*** Settings *** Library RPA.Salesforce domain=robocop-testing-stuff.develop.my Library RPA.Robocorp.Vault *** Tasks *** Authenticate to Salesforce using connected app ${secrets}= Get Secret salesforce Auth with connected app ... username=${secrets}[USERNAME] ... password=${secrets}[PASSWORD] ... api_token=${secrets}[API_TOKEN] ... consumer_key=${secrets}[CONSUMER_KEY] ... consumer_secret=${secrets}[CONSUMER_SECRET]
- auth_with_token(username: str, password: str, api_token: str) None
Authorize to Salesforce with security token, username and password creating instance.
- Parameters
username – Salesforce API username
password – Salesforce API password
api_token – Salesforce API security token
- create_new_opportunity(close_date: str, opportunity_name: str, stage_name: str = 'Closed Won', account_name: Optional[str] = None) Any
Create Salesforce Opportunity object.
- Parameters
close_date – closing date for the Opportunity, format ‘YYYY-MM-DD’
opportunity_name – as string
stage_name – needs to be one of the defined stages, defaults to “Closed Won”
account_name – by default uses previously set account, defaults to None
- Returns
created opportunity or False
- create_salesforce_object(object_type: str, object_data: Any) dict
Create Salesforce object by type and data.
- Parameters
object_type – Salesforce object type
object_data – Salesforce object data
- Raises
SalesforceDataNotAnDictionary – when object_data is not dictionary
- Returns
resulting object as dictionary
- delete_salesforce_object(object_type: str, object_id: str) bool
Delete Salesfoce object by type and id.
- Parameters
object_type – Salesforce object type
object_id – Salesforce object id
- Returns
True if successful
- describe_salesforce_object(object_type: str) dict
Get Salesfoce object description by type.
- Parameters
object_type – Salesforce object type
- Returns
object description as dictionary
- execute_apex(apex: str, apex_data: Optional[Dict] = None, apex_method: str = 'POST', **kwargs)
Execute APEX operation.
The APEX classes can be added via Salesforce Developer console (from menu: File > New > Apex Class).
Permissions for the APEX classes can be set via Salesforce Setup (Apex Classes -> Security).
- Parameters
apex – endpoint of the APEX operation
apex_data – data to be sent to the APEX operation
apex_method – operation method
kwargs – additional arguments to be passed to the APEX request
- Returns
result of the APEX operation
Python
from RPA.Salesforce import Salesforce SF = Salesforce(domain="robocorp-testing-stuff.develop.my") # authenticate to Salesforce SF.execute_apex(apex="MyClass", apex_data={"data": "value"}) result = SF.execute_apex( apex="getAccount/?id=0017R00002xmXB1QAM", apex_method="GET")
Robot Framework
*** Settings *** Library RPA.Salesforce domain=robocop-testing-stuff.develop.my *** Tasks *** Executing APEX operations # Authenticate to Salesforce &{apex_data}= Create Dictionary data=value ${result}= Execute APEX MyClass apex_data=${apex_data} ${result}= Execute APEX ... apex=getAccount/?id=0017R00002xmXB1QAM ... apex_method=GET
- execute_dataloader_insert(input_object: Any, mapping_object: Any, object_type: str) bool
Keyword mimics Salesforce Dataloader ‘insert’ behaviour by taking in a input_object`representing dictionary of data to input into Salesforce, a `mapping_object representing dictionary mapping the input keys into Salesforce keys, an object_type representing Salesforce object which Datahandler will handle with operation type.
Stores operation successes into Salesforce.dataloader_success array. Stores operation errors into Salesforce.dataloader_errors.
These can be retrieved with keywords get_dataloader_success_table and get_dataloader_error_table which return corresponding data as RPA.Table.
- Parameters
input_object – filepath or list of dictionaries
mapping_object – filepath or dictionary
object_type – Salesforce object type
- Returns
True if operation is successful
- get_dataloader_error_table() Table
Return Dataloader error entries as RPA.Table
- get_dataloader_success_table() Table
Return Dataloader success entries as RPA.Table
- get_domain() str
Used to determine the current domain that has been set
- Returns
string of the currently set domain
- get_opportunity_id(opportunity_name: str) Any
Get ID of an Opportunity linked to set account.
- Parameters
opportunity_name – opportunity to query
- Returns
Id of the opportunity or False
- get_pricebook_entries() dict
Get all pricebook entries.
- Returns
query result
- get_pricebook_id(pricebook_name: str) Any
Get ID of a pricelist.
Returns False if unique Id is not found.
- Parameters
pricebook_name – pricelist to query
- Returns
Id of the pricelist or False
- get_products_in_pricelist(pricebook_name: str) dict
Get all products in a pricelist.
- Parameters
pricebook_name – pricelist to query
- Returns
products in dictionary
- get_salesforce_object_by_id(object_type: str, object_id: str) dict
Get Salesforce object by id and type.
- Parameters
object_type – Salesforce object type
object_id – Salesforce object id
- Returns
dictionary of object attributes
- get_salesforce_object_metadata(object_type: str) dict
Get Salesfoce object metadata by type.
- Parameters
object_type – Salesforce object type
- Returns
object metadata as dictionary
- property instance
- read_dictionary_from_file(mapping_file: str) dict
Read dictionary from file.
- Parameters
mapping_file – path to the file
- Returns
file content as dictionary
- salesforce_query(sql_string: str, as_table: bool = False) Union[dict, Table]
Perform SQL query and return result as dict or Table.
- Parameters
sql_string – SQL clause to perform.
as_table – Set to True if the result should be of RPA.Tables.Table type. (dictionary is returned by default)
- Returns
Result of the SQL query.
- salesforce_query_result_as_table(sql_string: str) Table
Shorthand for
Salesforce Query ${sql_string} as_table=${True}
.- Parameters
sql_string – SQL clause to perform.
- Returns
Result of the SQL query as RPA.Tables.Table.
- property session_id
- set_account(account_name: str = '', account_id: str = '') bool
Set account name and id by giving either parameter.
- Can be used together with keywords:
get_opportunity_id
create_new_opportunity
- Parameters
account_name – string, defaults to “”
account_id – string, defaults to “”
- Returns
True if account was found from Salesforce, else False
- set_domain(domain: str = 'login') None
Used to set the domain the Auth With Token keyword will use. To set the domain to ‘test’ or if using a sandbox environment use “sandbox” as the domain. If you have a Salsesforce My domain you may also input that name. If the domain argument is not used the default domain is “login”.
- Parameters
domain – “sandbox” or the name of the Salesforce My domain; if no argument provided defaults to “login”
- set_pricebook(pricebook_name: str) None
Sets Pricebook to be used in Salesforce operations.
- Parameters
pricebook_name – pricelist to use
- update_salesforce_object(object_type: str, object_id: str, object_data: Any) bool
Update Salesfoce object by type, id and data.
- Parameters
object_type – Salesforce object type
object_id – Salesforce object id
object_data – Salesforce object data
- Raises
SalesforceDataNotAnDictionary – when object_data is not dictionary
- Returns
True if successful
- upsert_salesforce_object(object_type: str, object_id: str, object_data: Any) bool
Upsert Salesfoce object by type, id and data.
- Parameters
object_type – Salesforce object type
object_id – Salesforce object id
object_data – Salesforce object data
- Raises
SalesforceDataNotAnDictionary – when object_data is not dictionary
- Returns
True if successful