ms-salesforce-api 3.3.0__tar.gz → 3.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/PKG-INFO +2 -2
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/account/constants.py +2 -2
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/account/dto/AccountDTO.py +10 -2
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/account/export_data/Bigquery.py +2 -2
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity/constants.py +1 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity/dto/OpportunityDTO.py +4 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity/export_data/Bigquery.py +1 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/project/__tests__/test_Project.py +2 -4
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/project/constants.py +2 -3
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/project/dto/OpportunityDTO.py +4 -12
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/project/export_data/Bigquery.py +2 -3
- ms_salesforce_api-3.5.0/ms_salesforce_api/salesforce/api/projects_with_backup/__init__.py +55 -0
- ms_salesforce_api-3.5.0/ms_salesforce_api/salesforce/api/projects_with_backup/constants.py +16 -0
- ms_salesforce_api-3.5.0/ms_salesforce_api/salesforce/api/projects_with_backup/dto/ProjectDTO.py +86 -0
- ms_salesforce_api-3.5.0/ms_salesforce_api/salesforce/api/projects_with_backup/export_data/Bigquery.py +75 -0
- ms_salesforce_api-3.5.0/ms_salesforce_api/salesforce/api/projects_with_backup/export_data/__init__.py +0 -0
- ms_salesforce_api-3.5.0/ms_salesforce_api/salesforce/helpers/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/pyproject.toml +2 -2
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/LICENSE +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/README.md +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/Auth.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/JWTGenerator.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/SalesforceQueryExecutor.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/__tests__/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/__tests__/test_Auth.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/__tests__/test_JWTGenerator.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/__tests__/test_SalesforceRequester.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/account/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/account/dto/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/account/export_data/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/addtech_onboarding/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/addtech_onboarding/constants.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/addtech_onboarding/dto/AddTechOnboarding.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/addtech_onboarding/dto/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/addtech_onboarding/export_data/Bigquery.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/addtech_onboarding/export_data/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/contact/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/contact/constants.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/contact/dto/ContactDTO.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/contact/dto/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/contact/export_data/Bigquery.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/contact/export_data/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/lead/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/lead/constants.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/lead/dto/LeadDTO.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/lead/dto/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/lead/export_data/Bigquery.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/lead/export_data/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity/dto/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity/export_data/CloudSQL.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity/export_data/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity/export_data/__tests__/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity/export_data/__tests__/test_CloudSQL.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity/helpers.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity_contact_role/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity_contact_role/constants.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity_contact_role/dto/OpportunityContactDTO.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity_contact_role/dto/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity_contact_role/export_data/Bigquery.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity_contact_role/export_data/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity_history/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity_history/constants.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity_history/dto/OpportunityDTO.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity_history/dto/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity_history/export_data/Bigquery.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/opportunity_history/export_data/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/product/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/product/__tests__/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/product/__tests__/test_Product.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/product/constants.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/product/dto/ProductDTO.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/product/dto/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/product/export_data/Bigquery.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/product/export_data/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/profit_center/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/profit_center/__tests__/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/profit_center/__tests__/test_ProfitCenter.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/profit_center/constants.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/profit_center/dto/ProfitCenterDTO.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/profit_center/dto/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/profit_center/export_data/Bigquery.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/profit_center/export_data/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/project/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/project/__tests__/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/project/dto/BillingLineDTO.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/project/dto/ProjectLineItemDTO.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/project/dto/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/project/export_data/CloudSQL.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/project/export_data/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/project/export_data/__tests__/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/project/export_data/__tests__/test_CloudSQL.py +0 -0
- {ms_salesforce_api-3.3.0/ms_salesforce_api/salesforce/helpers → ms_salesforce_api-3.5.0/ms_salesforce_api/salesforce/api/projects_with_backup/dto}/__init__.py +0 -0
- {ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/helpers/string.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ms-salesforce-api
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.5.0
|
|
4
4
|
Summary: Python library used to extract data from Salesforce API and migrate it to Bigquery and Postgres.
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Author: Making Science
|
|
@@ -13,7 +13,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.13
|
|
14
14
|
Classifier: Programming Language :: Python :: 3.14
|
|
15
15
|
Requires-Dist: flake8 (>=6.0.0,<7.0.0)
|
|
16
|
-
Requires-Dist: gc-google-services-api (
|
|
16
|
+
Requires-Dist: gc-google-services-api (==2.4.0)
|
|
17
17
|
Requires-Dist: isort (>=5.12.0,<6.0.0)
|
|
18
18
|
Requires-Dist: pre-commit (>=3.1.1,<4.0.0)
|
|
19
19
|
Requires-Dist: psycopg2-binary (>=2.9.6,<3.0.0)
|
|
@@ -262,6 +262,14 @@ class AccountDTO(object):
|
|
|
262
262
|
except Exception:
|
|
263
263
|
return ""
|
|
264
264
|
|
|
265
|
+
def _get_customer_group_id():
|
|
266
|
+
try:
|
|
267
|
+
return normalize_value(
|
|
268
|
+
record["LKP_CustomerSubgroup__r"]["LKP_CustomerGroup__c"]
|
|
269
|
+
)
|
|
270
|
+
except (TypeError, KeyError):
|
|
271
|
+
return None
|
|
272
|
+
|
|
265
273
|
return AccountDTO(
|
|
266
274
|
id=record["Id"],
|
|
267
275
|
accelerator=record["Accelerator__c"],
|
|
@@ -304,9 +312,9 @@ class AccountDTO(object):
|
|
|
304
312
|
billing_state_code=normalize_value(record["BillingStateCode"]),
|
|
305
313
|
mail_invoincing=normalize_value(record["MAIL_Invoicing__c"]),
|
|
306
314
|
invoincing_email=normalize_value(record["Invoicing_Email__c"]),
|
|
307
|
-
customer_group_id=
|
|
315
|
+
customer_group_id=_get_customer_group_id(),
|
|
308
316
|
customer_subgroup_id=normalize_value(
|
|
309
|
-
record["
|
|
317
|
+
record["LKP_CustomerSubgroup__c"]
|
|
310
318
|
),
|
|
311
319
|
customer_subgroup_name=normalize_value(_get_subgroup_name()),
|
|
312
320
|
customer_subgroup_dt_start=normalize_value(_get_subgroup_start()),
|
|
@@ -55,8 +55,8 @@ class BigQueryExporter:
|
|
|
55
55
|
"billing_state_code": "STRING",
|
|
56
56
|
"mail_invoincing": "STRING",
|
|
57
57
|
"invoincing_email": "STRING",
|
|
58
|
-
"customer_group_id": "
|
|
59
|
-
"customer_subgroup_id": "
|
|
58
|
+
"customer_group_id": "STRING",
|
|
59
|
+
"customer_subgroup_id": "STRING",
|
|
60
60
|
"customer_subgroup_name": "STRING",
|
|
61
61
|
"customer_subgroup_dt_start": "DATE",
|
|
62
62
|
"customer_subgroup_dt_end": "DATE",
|
|
@@ -213,6 +213,7 @@ class OpportunityDTO(object):
|
|
|
213
213
|
billing_info,
|
|
214
214
|
parent_opportunity,
|
|
215
215
|
project_name,
|
|
216
|
+
tech_old_new_business,
|
|
216
217
|
):
|
|
217
218
|
self.opportunity_id = opportunity_id
|
|
218
219
|
self.account_billing_country = account_billing_country
|
|
@@ -296,6 +297,7 @@ class OpportunityDTO(object):
|
|
|
296
297
|
self.billing_info = billing_info
|
|
297
298
|
self.parent_opportunity = parent_opportunity
|
|
298
299
|
self.project_name = project_name
|
|
300
|
+
self.tech_old_new_business = tech_old_new_business
|
|
299
301
|
|
|
300
302
|
@staticmethod
|
|
301
303
|
def from_salesforce_record(record):
|
|
@@ -530,6 +532,7 @@ class OpportunityDTO(object):
|
|
|
530
532
|
billing_info=record["TXT_BillingInfo__c"],
|
|
531
533
|
parent_opportunity=record["LKP_ParentOpportunity__c"],
|
|
532
534
|
project_name=record["FRM_ProjectName__c"],
|
|
535
|
+
tech_old_new_business=record["TECH_Old_NewBusiness__c"],
|
|
533
536
|
)
|
|
534
537
|
|
|
535
538
|
def to_dict(self):
|
|
@@ -616,4 +619,5 @@ class OpportunityDTO(object):
|
|
|
616
619
|
"billing_info": self.billing_info,
|
|
617
620
|
"parent_opportunity": self.parent_opportunity,
|
|
618
621
|
"project_name": self.project_name,
|
|
622
|
+
"tech_old_new_business": self.tech_old_new_business,
|
|
619
623
|
}
|
|
@@ -397,8 +397,8 @@ class TestProject(unittest.TestCase):
|
|
|
397
397
|
"account_company_invoicing": "",
|
|
398
398
|
"account_created_date": "2020-03-18 15:32:15",
|
|
399
399
|
"account_currency_code": "EUR",
|
|
400
|
-
"account_customer_groupId": "
|
|
401
|
-
"account_customer_subgroupId": "
|
|
400
|
+
"account_customer_groupId": "",
|
|
401
|
+
"account_customer_subgroupId": "",
|
|
402
402
|
"account_fax": None,
|
|
403
403
|
"account_invoicing_email": "client1@test.com",
|
|
404
404
|
"account_mail_invoicing": "client1@test.com",
|
|
@@ -452,7 +452,6 @@ class TestProject(unittest.TestCase):
|
|
|
452
452
|
"group_pck_type": "Key Account",
|
|
453
453
|
"group_start_date": "2023-06-01",
|
|
454
454
|
"group_supervisor_email": "employee2@test.com",
|
|
455
|
-
"international_deparments": False,
|
|
456
455
|
"invoicing_country_code": "US",
|
|
457
456
|
"jira_task_url": "<a "
|
|
458
457
|
"href=https://makingscience.atlassian.net/browse/ESMSBD0001-7168 "
|
|
@@ -523,7 +522,6 @@ class TestProject(unittest.TestCase):
|
|
|
523
522
|
"subgroup_subgroupid": "a19AX0000004simYAA",
|
|
524
523
|
}
|
|
525
524
|
self.assertIsInstance(opportunity, dict)
|
|
526
|
-
|
|
527
525
|
self.assertDictEqual(
|
|
528
526
|
opportunity,
|
|
529
527
|
opportunity_result,
|
|
@@ -6,7 +6,6 @@ SELECT
|
|
|
6
6
|
CurrencyIsoCode,
|
|
7
7
|
End_Date__c,
|
|
8
8
|
Id,
|
|
9
|
-
International_Departments__c,
|
|
10
9
|
LastModifiedDate,
|
|
11
10
|
LKP_CostCenter__r.Name,
|
|
12
11
|
LKP_MSCompanyInvoicing__r.PCK_Prefix__c,
|
|
@@ -38,8 +37,8 @@ SELECT
|
|
|
38
37
|
Project_Account__r.BillingPostalCode,
|
|
39
38
|
Project_Account__r.BillingStateCode,
|
|
40
39
|
Project_Account__r.BillingStreet,
|
|
41
|
-
Project_Account__r.
|
|
42
|
-
Project_Account__r.
|
|
40
|
+
Project_Account__r.LKP_CustomerSubgroup__r.LKP_CustomerGroup__c,
|
|
41
|
+
Project_Account__r.LKP_CustomerSubgroup__c,
|
|
43
42
|
Project_Account__r.Business_Name__c,
|
|
44
43
|
Project_Account__r.CIF__c,
|
|
45
44
|
Project_Account__r.CreatedDate,
|
|
@@ -77,7 +77,6 @@ class OpportunityDTO(object):
|
|
|
77
77
|
autorenewal,
|
|
78
78
|
comments,
|
|
79
79
|
end_date,
|
|
80
|
-
international_deparments,
|
|
81
80
|
opportunity_extension,
|
|
82
81
|
maintance_project,
|
|
83
82
|
ms_project_id,
|
|
@@ -167,7 +166,6 @@ class OpportunityDTO(object):
|
|
|
167
166
|
self.autorenewal = autorenewal
|
|
168
167
|
self.comments = comments
|
|
169
168
|
self.end_date = end_date
|
|
170
|
-
self.international_deparments = international_deparments
|
|
171
169
|
self.opportunity_extension = opportunity_extension
|
|
172
170
|
self.maintance_project = maintance_project
|
|
173
171
|
self.ms_project_id = ms_project_id
|
|
@@ -442,7 +440,9 @@ class OpportunityDTO(object):
|
|
|
442
440
|
|
|
443
441
|
def _get_account_customer_groupid():
|
|
444
442
|
try:
|
|
445
|
-
data = record["Project_Account__r"]["
|
|
443
|
+
data = record["Project_Account__r"]["LKP_CustomerSubgroup__r"][
|
|
444
|
+
"LKP_CustomerGroup__c"
|
|
445
|
+
]
|
|
446
446
|
if data:
|
|
447
447
|
return normalize_value(data)
|
|
448
448
|
except (TypeError, KeyError):
|
|
@@ -450,7 +450,7 @@ class OpportunityDTO(object):
|
|
|
450
450
|
|
|
451
451
|
def _get_account_customer_subgroupid():
|
|
452
452
|
try:
|
|
453
|
-
data = record["Project_Account__r"]["
|
|
453
|
+
data = record["Project_Account__r"]["LKP_CustomerSubgroup__c"]
|
|
454
454
|
if data:
|
|
455
455
|
return normalize_value(data)
|
|
456
456
|
except (TypeError, KeyError):
|
|
@@ -682,12 +682,6 @@ class OpportunityDTO(object):
|
|
|
682
682
|
except KeyError:
|
|
683
683
|
return ""
|
|
684
684
|
|
|
685
|
-
def _get_international_deparments():
|
|
686
|
-
try:
|
|
687
|
-
return record["International_Departments__c"]
|
|
688
|
-
except KeyError:
|
|
689
|
-
return False
|
|
690
|
-
|
|
691
685
|
def _get_opportunity_extension():
|
|
692
686
|
try:
|
|
693
687
|
return record["LKP_OpportunityExtension__c"]
|
|
@@ -865,7 +859,6 @@ class OpportunityDTO(object):
|
|
|
865
859
|
autorenewal=_get_autorenewal(),
|
|
866
860
|
comments=_get_comments(),
|
|
867
861
|
end_date=_get_end_date(),
|
|
868
|
-
international_deparments=_get_international_deparments(),
|
|
869
862
|
opportunity_extension=_get_opportunity_extension(),
|
|
870
863
|
maintance_project=_get_maintance_project(),
|
|
871
864
|
ms_project_id=_get_ms_project_id(),
|
|
@@ -960,7 +953,6 @@ class OpportunityDTO(object):
|
|
|
960
953
|
"autorenewal": self.autorenewal,
|
|
961
954
|
"comments": self.comments,
|
|
962
955
|
"end_date": self.end_date,
|
|
963
|
-
"international_deparments": self.international_deparments,
|
|
964
956
|
"opportunity_extension": self.opportunity_extension,
|
|
965
957
|
"maintance_project": self.maintance_project,
|
|
966
958
|
"ms_project_id": self.ms_project_id,
|
|
@@ -48,7 +48,6 @@ class BigQueryExporter:
|
|
|
48
48
|
"autorenewal": "BOOLEAN",
|
|
49
49
|
"comments": "STRING",
|
|
50
50
|
"end_date": "DATE",
|
|
51
|
-
"international_deparments": "BOOLEAN",
|
|
52
51
|
"opportunity_extension": "STRING",
|
|
53
52
|
"maintance_project": "BOOLEAN",
|
|
54
53
|
"ms_project_id": "STRING",
|
|
@@ -136,8 +135,8 @@ class BigQueryExporter:
|
|
|
136
135
|
"tax_id_type": "STRING",
|
|
137
136
|
"tier": "STRING",
|
|
138
137
|
"website": "STRING",
|
|
139
|
-
"customer_groupId": "
|
|
140
|
-
"customer_subgroupId": "
|
|
138
|
+
"customer_groupId": "STRING",
|
|
139
|
+
"customer_subgroupId": "STRING",
|
|
141
140
|
},
|
|
142
141
|
"groups": {
|
|
143
142
|
"project_id": "STRING",
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from ms_salesforce_api.salesforce.api.projects_with_backup.constants import (
|
|
4
|
+
DEFAULT_PROJECTS_QUERY,
|
|
5
|
+
)
|
|
6
|
+
from ms_salesforce_api.salesforce.api.projects_with_backup.dto.ProjectDTO import ( # noqa: E501
|
|
7
|
+
ProjectDTO,
|
|
8
|
+
)
|
|
9
|
+
from ms_salesforce_api.salesforce.SalesforceQueryExecutor import (
|
|
10
|
+
SalesforceQueryExecutor,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
logging.basicConfig(
|
|
14
|
+
level=logging.INFO,
|
|
15
|
+
format="%(asctime)s - %(levelname)s - %(message)s",
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
MAX_PROJECT_IDS_PER_QUERY = 200
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Project(SalesforceQueryExecutor):
|
|
22
|
+
def get_batches(self, lst, n):
|
|
23
|
+
"""Yield successive n-sized chunks from lst."""
|
|
24
|
+
for i in range(0, len(lst), n):
|
|
25
|
+
yield lst[i : i + n] # noqa: E203
|
|
26
|
+
|
|
27
|
+
def get_all(
|
|
28
|
+
self,
|
|
29
|
+
query: str = DEFAULT_PROJECTS_QUERY,
|
|
30
|
+
format: str = "json",
|
|
31
|
+
):
|
|
32
|
+
data = self.fetch_data(query)
|
|
33
|
+
if data is None:
|
|
34
|
+
logging.error(
|
|
35
|
+
"[ERROR - SalesforceAPI]: No projects data return from Salesforce API" # noqa: E501
|
|
36
|
+
)
|
|
37
|
+
return []
|
|
38
|
+
|
|
39
|
+
try:
|
|
40
|
+
projects = [
|
|
41
|
+
ProjectDTO.from_salesforce_record(record) for record in data
|
|
42
|
+
]
|
|
43
|
+
projects_list = list(projects)
|
|
44
|
+
|
|
45
|
+
if format == "json":
|
|
46
|
+
projects_list = [
|
|
47
|
+
project.to_dict() for project in projects_list
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
return projects_list
|
|
51
|
+
except Exception as e:
|
|
52
|
+
logging.error(
|
|
53
|
+
f"[ERROR - get_all]: Failed to get all projects: {e}"
|
|
54
|
+
)
|
|
55
|
+
return []
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
DEFAULT_PROJECTS_QUERY = """
|
|
2
|
+
SELECT
|
|
3
|
+
Id,
|
|
4
|
+
Account.LKP_CustomerSubgroup__r.LKP_CustomerGroup__r.Name,
|
|
5
|
+
Account.Name,
|
|
6
|
+
FRM_ProjectName__c,
|
|
7
|
+
FRM_ProjectCode__c,
|
|
8
|
+
Tolabel(PCK_ProjectStatus__c),
|
|
9
|
+
DT_ProjectStartDate__c,
|
|
10
|
+
DT_ProjectEndDate__c,
|
|
11
|
+
LKP_AccountManager__r.Name,
|
|
12
|
+
Account_Billing_Country__c,
|
|
13
|
+
PCK_Division__c
|
|
14
|
+
FROM
|
|
15
|
+
Opportunity
|
|
16
|
+
"""
|
ms_salesforce_api-3.5.0/ms_salesforce_api/salesforce/api/projects_with_backup/dto/ProjectDTO.py
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
from ms_salesforce_api.salesforce.helpers.string import normalize_value
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class ProjectDTO(object):
|
|
5
|
+
def __init__(
|
|
6
|
+
self,
|
|
7
|
+
id,
|
|
8
|
+
account_customer_group_name,
|
|
9
|
+
account_name,
|
|
10
|
+
project_name,
|
|
11
|
+
project_code,
|
|
12
|
+
project_status,
|
|
13
|
+
project_startdate,
|
|
14
|
+
project_enddate,
|
|
15
|
+
account_manager_name,
|
|
16
|
+
account_billing_country,
|
|
17
|
+
division,
|
|
18
|
+
):
|
|
19
|
+
self.id = id
|
|
20
|
+
self.account_customer_group_name = account_customer_group_name
|
|
21
|
+
self.account_name = account_name
|
|
22
|
+
self.project_name = project_name
|
|
23
|
+
self.project_code = project_code
|
|
24
|
+
self.project_status = project_status
|
|
25
|
+
self.project_startdate = project_startdate
|
|
26
|
+
self.project_enddate = project_enddate
|
|
27
|
+
self.account_manager_name = account_manager_name
|
|
28
|
+
self.account_billing_country = account_billing_country
|
|
29
|
+
self.division = division
|
|
30
|
+
|
|
31
|
+
@staticmethod
|
|
32
|
+
def from_salesforce_record(record):
|
|
33
|
+
def _get_account_customer_group_name():
|
|
34
|
+
try:
|
|
35
|
+
return normalize_value(
|
|
36
|
+
record["Account"]["LKP_CustomerSubgroup__r"][
|
|
37
|
+
"LKP_CustomerGroup__r"
|
|
38
|
+
][
|
|
39
|
+
"Name"
|
|
40
|
+
] # noqa: E501
|
|
41
|
+
)
|
|
42
|
+
except (KeyError, TypeError):
|
|
43
|
+
return None
|
|
44
|
+
|
|
45
|
+
def _get_account_name():
|
|
46
|
+
try:
|
|
47
|
+
return normalize_value(record["Account"]["Name"]) # noqa: E501
|
|
48
|
+
except (KeyError, TypeError):
|
|
49
|
+
return None
|
|
50
|
+
|
|
51
|
+
def _get_account_manager_name():
|
|
52
|
+
try:
|
|
53
|
+
return normalize_value(
|
|
54
|
+
record["LKP_AccountManager__r"]["Name"] # noqa: E501
|
|
55
|
+
)
|
|
56
|
+
except (KeyError, TypeError):
|
|
57
|
+
return None
|
|
58
|
+
|
|
59
|
+
return ProjectDTO(
|
|
60
|
+
id=record["Id"],
|
|
61
|
+
account_customer_group_name=_get_account_customer_group_name(),
|
|
62
|
+
account_name=_get_account_name(),
|
|
63
|
+
project_name=record["FRM_ProjectName__c"],
|
|
64
|
+
project_code=record["FRM_ProjectCode__c"],
|
|
65
|
+
project_status=record["PCK_ProjectStatus__c"],
|
|
66
|
+
project_startdate=record["DT_ProjectStartDate__c"],
|
|
67
|
+
project_enddate=record["DT_ProjectEndDate__c"],
|
|
68
|
+
account_manager_name=_get_account_manager_name(),
|
|
69
|
+
account_billing_country=record["Account_Billing_Country__c"],
|
|
70
|
+
division=record["PCK_Division__c"],
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
def to_dict(self):
|
|
74
|
+
return {
|
|
75
|
+
"id": self.id,
|
|
76
|
+
"account_customer_group_name": self.account_customer_group_name,
|
|
77
|
+
"account_name": self.account_name,
|
|
78
|
+
"project_name": self.project_name,
|
|
79
|
+
"project_code": self.project_code,
|
|
80
|
+
"project_status": self.project_status,
|
|
81
|
+
"project_startdate": self.project_startdate,
|
|
82
|
+
"project_enddate": self.project_enddate,
|
|
83
|
+
"account_manager_name": self.account_manager_name,
|
|
84
|
+
"account_billing_country": self.account_billing_country,
|
|
85
|
+
"division": self.division,
|
|
86
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
|
|
3
|
+
from gc_google_services_api.bigquery import BigQueryManager
|
|
4
|
+
|
|
5
|
+
logging.basicConfig(
|
|
6
|
+
level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class BigQueryExporter:
|
|
11
|
+
"""
|
|
12
|
+
Initializes the Bigquery exporter with the given project ID and dataset ID.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
project_id (str): The ID of the Google Cloud project.
|
|
16
|
+
dataset_id (str): The ID of the BigQuery dataset.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
def __init__(self, project_id, dataset_id):
|
|
20
|
+
self.project_id = project_id
|
|
21
|
+
self.dataset_id = dataset_id
|
|
22
|
+
self.client = BigQueryManager(
|
|
23
|
+
project_id=project_id,
|
|
24
|
+
dataset_id=dataset_id,
|
|
25
|
+
)
|
|
26
|
+
self.batch_size = 200
|
|
27
|
+
self.schemas = {
|
|
28
|
+
"projects_with_backup": {
|
|
29
|
+
"id": "STRING",
|
|
30
|
+
"account_customer_group_name": "STRING",
|
|
31
|
+
"account_name": "STRING",
|
|
32
|
+
"project_name": "STRING",
|
|
33
|
+
"project_code": "STRING",
|
|
34
|
+
"project_status": "STRING",
|
|
35
|
+
"project_startdate": "STRING",
|
|
36
|
+
"project_enddate": "STRING",
|
|
37
|
+
"account_manager_name": "STRING",
|
|
38
|
+
"account_billing_country": "STRING",
|
|
39
|
+
"division": "STRING",
|
|
40
|
+
},
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
for table_name, table_schema in self.schemas.items():
|
|
44
|
+
self.client.create_table_if_not_exists(table_name, table_schema)
|
|
45
|
+
|
|
46
|
+
def _execute_query(self, query, log_id, default_error_value=None):
|
|
47
|
+
custom_error_value = f"{log_id}_custom_error"
|
|
48
|
+
|
|
49
|
+
result = self.client.execute_query(
|
|
50
|
+
query,
|
|
51
|
+
custom_error_value,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
if result == custom_error_value:
|
|
55
|
+
logging.error(
|
|
56
|
+
f"[ERROR - _execute_query]: Error executing query for {log_id} in BigQuery." # noqa: E501
|
|
57
|
+
)
|
|
58
|
+
result = default_error_value
|
|
59
|
+
|
|
60
|
+
return result
|
|
61
|
+
|
|
62
|
+
def export_data(self, profit_centers):
|
|
63
|
+
self.client.load_massive_data(
|
|
64
|
+
rows_to_insert=profit_centers,
|
|
65
|
+
table_name="projects_with_backup",
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
def delete_all_rows(self):
|
|
69
|
+
table_names = self.schemas.keys()
|
|
70
|
+
for table_name in table_names:
|
|
71
|
+
delete_query_table = f"DELETE FROM `{self.project_id}.{self.dataset_id}.{table_name}` WHERE true" # noqa: E501
|
|
72
|
+
self._execute_query(
|
|
73
|
+
query=delete_query_table,
|
|
74
|
+
log_id=f"delete_table_{table_name}",
|
|
75
|
+
)
|
|
File without changes
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "ms-salesforce-api"
|
|
3
|
-
version = "3.
|
|
3
|
+
version = "3.5.0"
|
|
4
4
|
description = "Python library used to extract data from Salesforce API and migrate it to Bigquery and Postgres."
|
|
5
5
|
authors = ["Making Science"]
|
|
6
6
|
readme = "README.md"
|
|
@@ -15,7 +15,7 @@ pre-commit = "^3.1.1"
|
|
|
15
15
|
pyjwt = {extras = ["crypto"], version = "^2.6.0"}
|
|
16
16
|
requests = "^2.28.2"
|
|
17
17
|
psycopg2-binary = "^2.9.6"
|
|
18
|
-
gc-google-services-api = "
|
|
18
|
+
gc-google-services-api = "2.4.0"
|
|
19
19
|
|
|
20
20
|
[build-system]
|
|
21
21
|
requires = ["poetry-core"]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/JWTGenerator.py
RENAMED
|
File without changes
|
|
File without changes
|
{ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/api/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{ms_salesforce_api-3.3.0 → ms_salesforce_api-3.5.0}/ms_salesforce_api/salesforce/helpers/string.py
RENAMED
|
File without changes
|