From 31f9e49f08f24bc886d96e60719b3c24ba401817 Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Tue, 16 May 2023 15:35:58 +0530 Subject: [PATCH 01/24] feature: support of error parser for expense report export --- netsuitesdk/api/expense_reports.py | 17 ++++++++++++- netsuitesdk/internal/error_parser.py | 37 ++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 netsuitesdk/internal/error_parser.py diff --git a/netsuitesdk/api/expense_reports.py b/netsuitesdk/api/expense_reports.py index 48ed750..8401c47 100644 --- a/netsuitesdk/api/expense_reports.py +++ b/netsuitesdk/api/expense_reports.py @@ -4,6 +4,8 @@ import logging from netsuitesdk.internal.utils import PaginatedSearch +from netsuitesdk.internal.exceptions import NetSuiteRequestError +from netsuitesdk.internal.error_parser import error_matcher, replace_numbers logger = logging.getLogger(__name__) @@ -97,5 +99,18 @@ def post(self, data) -> OrderedDict: er['entity'] = self.ns_client.RecordRef(**(data['entity'])) logger.debug('able to create er = %s', er) - res = self.ns_client.upsert(er) + try: + res = self.ns_client.upsert(er) + except Exception as e: + print('jere') + error_dict = error_matcher(e.message) + message = e.message + if error_dict: + category = self.ns_client.get('ExpenseCategory', error_dict['category'])['name'] + entity = self.ns_client.get('Employee', error_dict['entity'])['email'] + message = replace_numbers(e.message, category, entity, error_dict['category'], error_dict['entity']) + raise NetSuiteRequestError(message, e.code) + + raise NetSuiteRequestError(e.message, e.code) + return self._serialize(res) diff --git a/netsuitesdk/internal/error_parser.py b/netsuitesdk/internal/error_parser.py new file mode 100644 index 0000000..eac8395 --- /dev/null +++ b/netsuitesdk/internal/error_parser.py @@ -0,0 +1,37 @@ +import re + +def decode_project_or_customer_name(name): + value = name.replace(u'\xa0', ' ') + value = value.replace('/', '-') + return value + + +def replace_numbers(string , replacement1, replacement2, number1, number2): + + replaced_string = re.sub(r'\b({}|{})\b'.format(number1, number2), lambda m: replacement1 if m.group() == number1 else replacement2, string) + return replaced_string + + +def expense_report_error_matcher(string): + category_reference_error = r"An error occured in a upsert request: Invalid category reference key \d+ for entity \d+" + account_reference_error = r"An error occured in a upsert request: Invalid account reference key \d+ for subsidiary \d+" + project_reference_error = r"An error occured in a upsert request: Invalid customer reference key \d+ for entity \d+" + location_reference_error = r"An error occured in a upsert request: Invalid location reference key \d+ for subsidiary \d+" + + if re.match(category_reference_error, string): + numbers = re.findall(r'\d+', string) + return {"category": numbers[0], "entity": numbers[1]} + + if re.match(account_reference_error, string): + numbers = re.findall(r'\d+', string) + return {"account": numbers[0], "subsidiary": numbers[1]} + + if re.match(project_reference_error, string): + numbers = re.findall(r'\d+', string) + return {"customer": numbers[0], "entity": numbers[1]} + + if re.match(location_reference_error, string): + numbers = re.findall(r'\d+', string) + return {"location": numbers[0], "subsidiary": numbers[1]} + + return {} From ce8481b9557e0060e1bb00de1118cdf032cfb8c7 Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Tue, 16 May 2023 15:39:55 +0530 Subject: [PATCH 02/24] test fix --- netsuitesdk/api/expense_reports.py | 32 ++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/netsuitesdk/api/expense_reports.py b/netsuitesdk/api/expense_reports.py index 8401c47..027b9a8 100644 --- a/netsuitesdk/api/expense_reports.py +++ b/netsuitesdk/api/expense_reports.py @@ -5,7 +5,7 @@ from netsuitesdk.internal.utils import PaginatedSearch from netsuitesdk.internal.exceptions import NetSuiteRequestError -from netsuitesdk.internal.error_parser import error_matcher, replace_numbers +from netsuitesdk.internal.error_parser import expense_report_error_matcher, replace_numbers, decode_project_or_customer_name logger = logging.getLogger(__name__) @@ -102,15 +102,35 @@ def post(self, data) -> OrderedDict: try: res = self.ns_client.upsert(er) except Exception as e: - print('jere') - error_dict = error_matcher(e.message) + error_dict = expense_report_error_matcher(e.message) message = e.message - if error_dict: + if list(error_dict) == ['category', 'entity']: category = self.ns_client.get('ExpenseCategory', error_dict['category'])['name'] - entity = self.ns_client.get('Employee', error_dict['entity'])['email'] - message = replace_numbers(e.message, category, entity, error_dict['category'], error_dict['entity']) + entity = self.ns_client.get('Employee', error_dict['entity']) + entity_name = entity['email'] if entity['email'] else entity['firstName'] + " " + entity['lastName'] + message = replace_numbers(e.message, category, entity_name, error_dict['category'], error_dict['entity']) raise NetSuiteRequestError(message, e.code) + elif list(error_dict) == ['account', 'subsidiary']: + account = self.ns_client.get('Account', error_dict['account'])['acctName'] + subsdiary = self.ns_client.get('Subsidiary', error_dict['subsidiary'])['name'] + message = replace_numbers(e.message, account, subsdiary, error_dict['account'], error_dict['subsidiary']) + raise NetSuiteRequestError(message, e.code) + + elif list(error_dict) == ['customer', 'entity']: + customer = self.ns_client.get('Customer', error_dict['customer'])['entityId'] + customer_name = decode_project_or_customer_name(customer) + entity = self.ns_client.get('Employee', error_dict['entity']) + entity_name = entity['email'] if entity['email'] else entity['firstName'] + " " + entity['lastName'] + message = replace_numbers(e.message, customer_name, entity_name, error_dict['customer'], error_dict['entity']) + raise NetSuiteRequestError(message, e.code) + + elif list(error_dict) == ['location', 'subsidiary']: + location = self.ns_client.get('Location', error_dict['location'])['name'] + subsdiary = self.ns_client.get('Subsidiary', error_dict['subsidiary'])['name'] + message = replace_numbers(e.message, location, subsdiary, error_dict['location'], error_dict['subsidiary']) + raise NetSuiteRequestError(message, e.code) + raise NetSuiteRequestError(e.message, e.code) return self._serialize(res) From b288c3fc5d3fdb090fe5030d1f2f330f026569e2 Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Wed, 24 May 2023 20:50:41 +0530 Subject: [PATCH 03/24] beautify netsuite errors --- netsuitesdk/api/expense_reports.py | 33 ++--------------- netsuitesdk/errors/__init__.py | 0 netsuitesdk/errors/errors.py | 6 ++++ netsuitesdk/errors/helpers.py | 12 +++++++ netsuitesdk/errors/parser.py | 53 ++++++++++++++++++++++++++++ netsuitesdk/internal/error_parser.py | 37 ------------------- 6 files changed, 74 insertions(+), 67 deletions(-) create mode 100644 netsuitesdk/errors/__init__.py create mode 100644 netsuitesdk/errors/errors.py create mode 100644 netsuitesdk/errors/helpers.py create mode 100644 netsuitesdk/errors/parser.py delete mode 100644 netsuitesdk/internal/error_parser.py diff --git a/netsuitesdk/api/expense_reports.py b/netsuitesdk/api/expense_reports.py index 027b9a8..973df20 100644 --- a/netsuitesdk/api/expense_reports.py +++ b/netsuitesdk/api/expense_reports.py @@ -5,7 +5,7 @@ from netsuitesdk.internal.utils import PaginatedSearch from netsuitesdk.internal.exceptions import NetSuiteRequestError -from netsuitesdk.internal.error_parser import expense_report_error_matcher, replace_numbers, decode_project_or_customer_name +from netsuitesdk.errors.parser import expense_report_error_parser, expense_report_error_matcher logger = logging.getLogger(__name__) @@ -103,34 +103,7 @@ def post(self, data) -> OrderedDict: res = self.ns_client.upsert(er) except Exception as e: error_dict = expense_report_error_matcher(e.message) - message = e.message - if list(error_dict) == ['category', 'entity']: - category = self.ns_client.get('ExpenseCategory', error_dict['category'])['name'] - entity = self.ns_client.get('Employee', error_dict['entity']) - entity_name = entity['email'] if entity['email'] else entity['firstName'] + " " + entity['lastName'] - message = replace_numbers(e.message, category, entity_name, error_dict['category'], error_dict['entity']) - raise NetSuiteRequestError(message, e.code) - - elif list(error_dict) == ['account', 'subsidiary']: - account = self.ns_client.get('Account', error_dict['account'])['acctName'] - subsdiary = self.ns_client.get('Subsidiary', error_dict['subsidiary'])['name'] - message = replace_numbers(e.message, account, subsdiary, error_dict['account'], error_dict['subsidiary']) - raise NetSuiteRequestError(message, e.code) - - elif list(error_dict) == ['customer', 'entity']: - customer = self.ns_client.get('Customer', error_dict['customer'])['entityId'] - customer_name = decode_project_or_customer_name(customer) - entity = self.ns_client.get('Employee', error_dict['entity']) - entity_name = entity['email'] if entity['email'] else entity['firstName'] + " " + entity['lastName'] - message = replace_numbers(e.message, customer_name, entity_name, error_dict['customer'], error_dict['entity']) - raise NetSuiteRequestError(message, e.code) - - elif list(error_dict) == ['location', 'subsidiary']: - location = self.ns_client.get('Location', error_dict['location'])['name'] - subsdiary = self.ns_client.get('Subsidiary', error_dict['subsidiary'])['name'] - message = replace_numbers(e.message, location, subsdiary, error_dict['location'], error_dict['subsidiary']) - raise NetSuiteRequestError(message, e.code) - - raise NetSuiteRequestError(e.message, e.code) + message = expense_report_error_parser(error_dict, self.ns_client, e.message) + raise NetSuiteRequestError(message, e.code) return self._serialize(res) diff --git a/netsuitesdk/errors/__init__.py b/netsuitesdk/errors/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/netsuitesdk/errors/errors.py b/netsuitesdk/errors/errors.py new file mode 100644 index 0000000..d657d3e --- /dev/null +++ b/netsuitesdk/errors/errors.py @@ -0,0 +1,6 @@ +error_reference = { + "category_reference_error": r"An error occured in a upsert request: Invalid category reference key \d+ for entity \d+", + "account_reference_error": r"An error occured in a upsert request: Invalid account reference key \d+ for subsidiary \d+", + "project_reference_error": r"An error occured in a upsert request: Invalid customer reference key \d+ for entity \d+", + "location_reference_error": r"An error occured in a upsert request: Invalid location reference key \d+ for subsidiary \d+" +} diff --git a/netsuitesdk/errors/helpers.py b/netsuitesdk/errors/helpers.py new file mode 100644 index 0000000..c3c2306 --- /dev/null +++ b/netsuitesdk/errors/helpers.py @@ -0,0 +1,12 @@ +import re + +def decode_project_or_customer_name(name): + value = name.replace(u'\xa0', ' ') + value = value.replace('/', '-') + return value + + +def replace_numbers(string , replacement1, replacement2, number1, number2): + + replaced_string = re.sub(r'\b({}|{})\b'.format(number1, number2), lambda m: replacement1 if m.group() == number1 else replacement2, string) + return replaced_string diff --git a/netsuitesdk/errors/parser.py b/netsuitesdk/errors/parser.py new file mode 100644 index 0000000..05a0a6c --- /dev/null +++ b/netsuitesdk/errors/parser.py @@ -0,0 +1,53 @@ +import re + +from .errors import error_reference +from .helpers import decode_project_or_customer_name, replace_numbers + + +def expense_report_error_matcher(string): + + if re.match(error_reference['category_reference_error'], string): + numbers = re.findall(r'\d+', string) + return {"category": numbers[0], "entity": numbers[1]} + + if re.match(error_reference['account_reference_error'], string): + numbers = re.findall(r'\d+', string) + return {"account": numbers[0], "subsidiary": numbers[1]} + + if re.match(error_reference['project_reference_error'], string): + numbers = re.findall(r'\d+', string) + return {"customer": numbers[0], "entity": numbers[1]} + + if re.match(error_reference['location_reference_error'], string): + numbers = re.findall(r'\d+', string) + return {"location": numbers[0], "subsidiary": numbers[1]} + + return {} + + +def expense_report_error_parser(error_dict, ns_client, message): + + if list(error_dict) == ['category', 'entity']: + category = ns_client.get('ExpenseCategory', error_dict['category'])['name'] + entity = ns_client.get('Employee', error_dict['entity']) + entity_name = entity['email'] if entity['email'] else entity['firstName'] + " " + entity['lastName'] + message = replace_numbers(message, category, entity_name, error_dict['category'], error_dict['entity']) + + elif list(error_dict) == ['account', 'subsidiary']: + account = ns_client.get('Account', error_dict['account'])['acctName'] + subsdiary = ns_client.get('Subsidiary', error_dict['subsidiary'])['name'] + message = replace_numbers(message, account, subsdiary, error_dict['account'], error_dict['subsidiary']) + + elif list(error_dict) == ['customer', 'entity']: + customer = ns_client.get('Customer', error_dict['customer'])['entityId'] + customer_name = decode_project_or_customer_name(customer) + entity = ns_client.get('Employee', error_dict['entity']) + entity_name = entity['email'] if entity['email'] else entity['firstName'] + " " + entity['lastName'] + message = replace_numbers(message, customer_name, entity_name, error_dict['customer'], error_dict['entity']) + + elif list(error_dict) == ['location', 'subsidiary']: + location = ns_client.get('Location', error_dict['location'])['name'] + subsdiary = ns_client.get('Subsidiary', error_dict['subsidiary'])['name'] + message = replace_numbers(message, location, subsdiary, error_dict['location'], error_dict['subsidiary']) + + return message diff --git a/netsuitesdk/internal/error_parser.py b/netsuitesdk/internal/error_parser.py deleted file mode 100644 index eac8395..0000000 --- a/netsuitesdk/internal/error_parser.py +++ /dev/null @@ -1,37 +0,0 @@ -import re - -def decode_project_or_customer_name(name): - value = name.replace(u'\xa0', ' ') - value = value.replace('/', '-') - return value - - -def replace_numbers(string , replacement1, replacement2, number1, number2): - - replaced_string = re.sub(r'\b({}|{})\b'.format(number1, number2), lambda m: replacement1 if m.group() == number1 else replacement2, string) - return replaced_string - - -def expense_report_error_matcher(string): - category_reference_error = r"An error occured in a upsert request: Invalid category reference key \d+ for entity \d+" - account_reference_error = r"An error occured in a upsert request: Invalid account reference key \d+ for subsidiary \d+" - project_reference_error = r"An error occured in a upsert request: Invalid customer reference key \d+ for entity \d+" - location_reference_error = r"An error occured in a upsert request: Invalid location reference key \d+ for subsidiary \d+" - - if re.match(category_reference_error, string): - numbers = re.findall(r'\d+', string) - return {"category": numbers[0], "entity": numbers[1]} - - if re.match(account_reference_error, string): - numbers = re.findall(r'\d+', string) - return {"account": numbers[0], "subsidiary": numbers[1]} - - if re.match(project_reference_error, string): - numbers = re.findall(r'\d+', string) - return {"customer": numbers[0], "entity": numbers[1]} - - if re.match(location_reference_error, string): - numbers = re.findall(r'\d+', string) - return {"location": numbers[0], "subsidiary": numbers[1]} - - return {} From b5a2c0318430e7cabb0d1966e7c006e631ffa2f8 Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Wed, 24 May 2023 21:14:47 +0530 Subject: [PATCH 04/24] minor fix --- netsuitesdk/api/expense_reports.py | 5 +++-- netsuitesdk/errors/errors.py | 12 ++++++++---- netsuitesdk/errors/helpers.py | 24 +++++++++++++++++++++++- netsuitesdk/errors/parser.py | 24 ------------------------ 4 files changed, 34 insertions(+), 31 deletions(-) diff --git a/netsuitesdk/api/expense_reports.py b/netsuitesdk/api/expense_reports.py index 973df20..d8f6e47 100644 --- a/netsuitesdk/api/expense_reports.py +++ b/netsuitesdk/api/expense_reports.py @@ -5,7 +5,8 @@ from netsuitesdk.internal.utils import PaginatedSearch from netsuitesdk.internal.exceptions import NetSuiteRequestError -from netsuitesdk.errors.parser import expense_report_error_parser, expense_report_error_matcher +from netsuitesdk.errors.parser import expense_report_error_parser +from netsuitesdk.errors.helpers import export_error_matcher logger = logging.getLogger(__name__) @@ -102,7 +103,7 @@ def post(self, data) -> OrderedDict: try: res = self.ns_client.upsert(er) except Exception as e: - error_dict = expense_report_error_matcher(e.message) + error_dict = export_error_matcher(e.message, 'expense_report') message = expense_report_error_parser(error_dict, self.ns_client, e.message) raise NetSuiteRequestError(message, e.code) diff --git a/netsuitesdk/errors/errors.py b/netsuitesdk/errors/errors.py index d657d3e..5a984e7 100644 --- a/netsuitesdk/errors/errors.py +++ b/netsuitesdk/errors/errors.py @@ -1,6 +1,10 @@ + error_reference = { - "category_reference_error": r"An error occured in a upsert request: Invalid category reference key \d+ for entity \d+", - "account_reference_error": r"An error occured in a upsert request: Invalid account reference key \d+ for subsidiary \d+", - "project_reference_error": r"An error occured in a upsert request: Invalid customer reference key \d+ for entity \d+", - "location_reference_error": r"An error occured in a upsert request: Invalid location reference key \d+ for subsidiary \d+" + "expense_report": + { + "category_reference_error": r"An error occured in a upsert request: Invalid category reference key \d+ for entity \d+", + "account_reference_error": r"An error occured in a upsert request: Invalid account reference key \d+ for subsidiary \d+", + "project_reference_error": r"An error occured in a upsert request: Invalid customer reference key \d+ for entity \d+", + "location_reference_error": r"An error occured in a upsert request: Invalid location reference key \d+ for subsidiary \d+" + } } diff --git a/netsuitesdk/errors/helpers.py b/netsuitesdk/errors/helpers.py index c3c2306..46dafe5 100644 --- a/netsuitesdk/errors/helpers.py +++ b/netsuitesdk/errors/helpers.py @@ -1,4 +1,6 @@ import re +from .errors import error_reference + def decode_project_or_customer_name(name): value = name.replace(u'\xa0', ' ') @@ -7,6 +9,26 @@ def decode_project_or_customer_name(name): def replace_numbers(string , replacement1, replacement2, number1, number2): - replaced_string = re.sub(r'\b({}|{})\b'.format(number1, number2), lambda m: replacement1 if m.group() == number1 else replacement2, string) return replaced_string + + +def export_error_matcher(string, export_type): + + if re.match(error_reference[export_type]['category_reference_error'], string): + numbers = re.findall(r'\d+', string) + return {"category": numbers[0], "entity": numbers[1]} + + if re.match(error_reference[export_type]['account_reference_error'], string): + numbers = re.findall(r'\d+', string) + return {"account": numbers[0], "subsidiary": numbers[1]} + + if re.match(error_reference[export_type]['project_reference_error'], string): + numbers = re.findall(r'\d+', string) + return {"customer": numbers[0], "entity": numbers[1]} + + if re.match(error_reference[export_type]['location_reference_error'], string): + numbers = re.findall(r'\d+', string) + return {"location": numbers[0], "subsidiary": numbers[1]} + + return {} diff --git a/netsuitesdk/errors/parser.py b/netsuitesdk/errors/parser.py index 05a0a6c..db069ec 100644 --- a/netsuitesdk/errors/parser.py +++ b/netsuitesdk/errors/parser.py @@ -1,30 +1,6 @@ -import re - -from .errors import error_reference from .helpers import decode_project_or_customer_name, replace_numbers -def expense_report_error_matcher(string): - - if re.match(error_reference['category_reference_error'], string): - numbers = re.findall(r'\d+', string) - return {"category": numbers[0], "entity": numbers[1]} - - if re.match(error_reference['account_reference_error'], string): - numbers = re.findall(r'\d+', string) - return {"account": numbers[0], "subsidiary": numbers[1]} - - if re.match(error_reference['project_reference_error'], string): - numbers = re.findall(r'\d+', string) - return {"customer": numbers[0], "entity": numbers[1]} - - if re.match(error_reference['location_reference_error'], string): - numbers = re.findall(r'\d+', string) - return {"location": numbers[0], "subsidiary": numbers[1]} - - return {} - - def expense_report_error_parser(error_dict, ns_client, message): if list(error_dict) == ['category', 'entity']: From 30b7b4aab0ae1efd8a7977a3ae08eb95eb1c93da Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Thu, 25 May 2023 12:12:49 +0530 Subject: [PATCH 05/24] add more errors --- netsuitesdk/errors/errors.py | 4 +++- netsuitesdk/errors/helpers.py | 8 ++++++++ netsuitesdk/errors/parser.py | 10 ++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/netsuitesdk/errors/errors.py b/netsuitesdk/errors/errors.py index 5a984e7..ee3460c 100644 --- a/netsuitesdk/errors/errors.py +++ b/netsuitesdk/errors/errors.py @@ -5,6 +5,8 @@ "category_reference_error": r"An error occured in a upsert request: Invalid category reference key \d+ for entity \d+", "account_reference_error": r"An error occured in a upsert request: Invalid account reference key \d+ for subsidiary \d+", "project_reference_error": r"An error occured in a upsert request: Invalid customer reference key \d+ for entity \d+", - "location_reference_error": r"An error occured in a upsert request: Invalid location reference key \d+ for subsidiary \d+" + "location_reference_error": r"An error occured in a upsert request: Invalid location reference key \d+ for subsidiary \d+", + "department_reference_error": r"An error occured in a upsert request: Invalid department reference key \d+ for subsidiary \d+", + "currency_reference_error": r"An error occured in a upsert request: Invalid currency reference key \d+ for subsidiary \d+", } } diff --git a/netsuitesdk/errors/helpers.py b/netsuitesdk/errors/helpers.py index 46dafe5..135f702 100644 --- a/netsuitesdk/errors/helpers.py +++ b/netsuitesdk/errors/helpers.py @@ -30,5 +30,13 @@ def export_error_matcher(string, export_type): if re.match(error_reference[export_type]['location_reference_error'], string): numbers = re.findall(r'\d+', string) return {"location": numbers[0], "subsidiary": numbers[1]} + + if re.match(error_reference[export_type]['department_reference_error'], string): + numbers = re.findall(r'\d+', string) + return {"department": numbers[0], "subsidiary": numbers[1]} + + if re.match(error_reference[export_type]['currency_reference_error'], string): + numbers = re.findall(r'\d+', string) + return {"currency": numbers[0], "subsidiary": numbers[1]} return {} diff --git a/netsuitesdk/errors/parser.py b/netsuitesdk/errors/parser.py index db069ec..eb0b1ab 100644 --- a/netsuitesdk/errors/parser.py +++ b/netsuitesdk/errors/parser.py @@ -26,4 +26,14 @@ def expense_report_error_parser(error_dict, ns_client, message): subsdiary = ns_client.get('Subsidiary', error_dict['subsidiary'])['name'] message = replace_numbers(message, location, subsdiary, error_dict['location'], error_dict['subsidiary']) + elif list(error_dict) == ['department', 'subsidiary']: + department = ns_client.get('Department', error_dict['department'])['name'] + subsdiary = ns_client.get('Subsidiary', error_dict['subsidiary'])['name'] + message = replace_numbers(message, department, subsdiary, error_dict['department'], error_dict['subsidiary']) + + elif list(error_dict) == ['currency', 'subsidiary']: + currency = ns_client.get('Currency', error_dict['currency'])['name'] + subsdiary = ns_client.get('Subsidiary', error_dict['subsidiary'])['name'] + message = replace_numbers(message, currency, subsdiary, error_dict['currency'], error_dict['subsidiary']) + return message From 8aa7b4eea33361ee61e26f8b73eed40eda31b43c Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Thu, 25 May 2023 15:00:20 +0530 Subject: [PATCH 06/24] minor change --- netsuitesdk/errors/errors.py | 6 ++++ netsuitesdk/errors/helpers.py | 14 ++++---- netsuitesdk/errors/parser.py | 67 +++++++++++++++-------------------- 3 files changed, 40 insertions(+), 47 deletions(-) diff --git a/netsuitesdk/errors/errors.py b/netsuitesdk/errors/errors.py index ee3460c..eb4c345 100644 --- a/netsuitesdk/errors/errors.py +++ b/netsuitesdk/errors/errors.py @@ -10,3 +10,9 @@ "currency_reference_error": r"An error occured in a upsert request: Invalid currency reference key \d+ for subsidiary \d+", } } + +list_of_dicts = { + ['category', 'entity'], ['account', 'subsidiary'], + ['customer', 'entity'], ['location', 'subsidiary'], + ['department', 'subsidiary'], ['currency', 'subsidiary'] + } diff --git a/netsuitesdk/errors/helpers.py b/netsuitesdk/errors/helpers.py index 135f702..225dcb0 100644 --- a/netsuitesdk/errors/helpers.py +++ b/netsuitesdk/errors/helpers.py @@ -2,22 +2,20 @@ from .errors import error_reference -def decode_project_or_customer_name(name): - value = name.replace(u'\xa0', ' ') - value = value.replace('/', '-') - return value - - def replace_numbers(string , replacement1, replacement2, number1, number2): replaced_string = re.sub(r'\b({}|{})\b'.format(number1, number2), lambda m: replacement1 if m.group() == number1 else replacement2, string) return replaced_string +def convert_to_camelcase(word): + return ''.join(word.title().split('_')) + + def export_error_matcher(string, export_type): if re.match(error_reference[export_type]['category_reference_error'], string): numbers = re.findall(r'\d+', string) - return {"category": numbers[0], "entity": numbers[1]} + return {"expense_category": numbers[0], "employee": numbers[1]} if re.match(error_reference[export_type]['account_reference_error'], string): numbers = re.findall(r'\d+', string) @@ -25,7 +23,7 @@ def export_error_matcher(string, export_type): if re.match(error_reference[export_type]['project_reference_error'], string): numbers = re.findall(r'\d+', string) - return {"customer": numbers[0], "entity": numbers[1]} + return {"customer": numbers[0], "employee": numbers[1]} if re.match(error_reference[export_type]['location_reference_error'], string): numbers = re.findall(r'\d+', string) diff --git a/netsuitesdk/errors/parser.py b/netsuitesdk/errors/parser.py index eb0b1ab..2bb6cd2 100644 --- a/netsuitesdk/errors/parser.py +++ b/netsuitesdk/errors/parser.py @@ -1,39 +1,28 @@ -from .helpers import decode_project_or_customer_name, replace_numbers - - -def expense_report_error_parser(error_dict, ns_client, message): - - if list(error_dict) == ['category', 'entity']: - category = ns_client.get('ExpenseCategory', error_dict['category'])['name'] - entity = ns_client.get('Employee', error_dict['entity']) - entity_name = entity['email'] if entity['email'] else entity['firstName'] + " " + entity['lastName'] - message = replace_numbers(message, category, entity_name, error_dict['category'], error_dict['entity']) - - elif list(error_dict) == ['account', 'subsidiary']: - account = ns_client.get('Account', error_dict['account'])['acctName'] - subsdiary = ns_client.get('Subsidiary', error_dict['subsidiary'])['name'] - message = replace_numbers(message, account, subsdiary, error_dict['account'], error_dict['subsidiary']) - - elif list(error_dict) == ['customer', 'entity']: - customer = ns_client.get('Customer', error_dict['customer'])['entityId'] - customer_name = decode_project_or_customer_name(customer) - entity = ns_client.get('Employee', error_dict['entity']) - entity_name = entity['email'] if entity['email'] else entity['firstName'] + " " + entity['lastName'] - message = replace_numbers(message, customer_name, entity_name, error_dict['customer'], error_dict['entity']) - - elif list(error_dict) == ['location', 'subsidiary']: - location = ns_client.get('Location', error_dict['location'])['name'] - subsdiary = ns_client.get('Subsidiary', error_dict['subsidiary'])['name'] - message = replace_numbers(message, location, subsdiary, error_dict['location'], error_dict['subsidiary']) - - elif list(error_dict) == ['department', 'subsidiary']: - department = ns_client.get('Department', error_dict['department'])['name'] - subsdiary = ns_client.get('Subsidiary', error_dict['subsidiary'])['name'] - message = replace_numbers(message, department, subsdiary, error_dict['department'], error_dict['subsidiary']) - - elif list(error_dict) == ['currency', 'subsidiary']: - currency = ns_client.get('Currency', error_dict['currency'])['name'] - subsdiary = ns_client.get('Subsidiary', error_dict['subsidiary'])['name'] - message = replace_numbers(message, currency, subsdiary, error_dict['currency'], error_dict['subsidiary']) - - return message +from .helpers import replace_numbers, convert_to_camelcase +from .errors import list_of_dicts + + +def get_entity_values(error_dict, ns_client): + entity_keys = list(error_dict) + entity_1 = ns_client.get(convert_to_camelcase(entity_keys[0]), error_dict[entity_keys[0]]) + entity_2 = ns_client.get(convert_to_camelcase(entity_keys[1]), error_dict[entity_keys[1]]) + + if entity_keys[1] == 'employee': + entity_2 = entity_2['email'] if entity_2['email'] else entity_2['firstName'] + " " + entity_2['lastName'] + return entity_1['name'], entity_2 + + if entity_keys[0] == 'account': + entity_1 = entity_1['acctName'] + return entity_1, entity_2['name'] + + return entity_1['name'], entity_2['name'] + + +def export_error_parser(error_dict, ns_client, message): + + if list(error_dict) in list_of_dicts: + entity_1, entity_2 = get_entity_values(error_dict, ns_client) + entity_keys = list(error_dict) + parsed_message = replace_numbers(message, entity_1, entity_2, error_dict[entity_keys[0]], error_dict[entity_keys[1]]) + + return parsed_message From 56edf686e409279fafc371f65f74fb5b43c1562a Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Thu, 25 May 2023 15:02:53 +0530 Subject: [PATCH 07/24] kik --- netsuitesdk/errors/errors.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netsuitesdk/errors/errors.py b/netsuitesdk/errors/errors.py index eb4c345..4045fc0 100644 --- a/netsuitesdk/errors/errors.py +++ b/netsuitesdk/errors/errors.py @@ -11,8 +11,8 @@ } } -list_of_dicts = { +list_of_dicts = [ ['category', 'entity'], ['account', 'subsidiary'], ['customer', 'entity'], ['location', 'subsidiary'], ['department', 'subsidiary'], ['currency', 'subsidiary'] - } + ] From 09b34732566d62dae2841b2fefd5e365ae2a8114 Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Thu, 25 May 2023 15:05:11 +0530 Subject: [PATCH 08/24] iuyg --- netsuitesdk/api/expense_reports.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netsuitesdk/api/expense_reports.py b/netsuitesdk/api/expense_reports.py index d8f6e47..d7bd6a9 100644 --- a/netsuitesdk/api/expense_reports.py +++ b/netsuitesdk/api/expense_reports.py @@ -5,7 +5,7 @@ from netsuitesdk.internal.utils import PaginatedSearch from netsuitesdk.internal.exceptions import NetSuiteRequestError -from netsuitesdk.errors.parser import expense_report_error_parser +from netsuitesdk.errors.parser import export_error_parser from netsuitesdk.errors.helpers import export_error_matcher logger = logging.getLogger(__name__) @@ -104,7 +104,7 @@ def post(self, data) -> OrderedDict: res = self.ns_client.upsert(er) except Exception as e: error_dict = export_error_matcher(e.message, 'expense_report') - message = expense_report_error_parser(error_dict, self.ns_client, e.message) + message = export_error_parser(error_dict, self.ns_client, e.message) raise NetSuiteRequestError(message, e.code) return self._serialize(res) From 7c8674132bdf7dedc8eb2ab15efb1375b120a1b2 Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Thu, 25 May 2023 15:08:47 +0530 Subject: [PATCH 09/24] bump up version --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index afaf535..c79c622 100644 --- a/setup.py +++ b/setup.py @@ -5,7 +5,7 @@ setuptools.setup( name='netsuitesdk', - version='2.17.0', + version='2.18.0', author='Siva Narayanan', author_email='siva@fyle.in', description='Python SDK for accessing the NetSuite SOAP webservice', From 96cd969818787e8dff7abc7498ef7f940b7a7f85 Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Thu, 25 May 2023 19:59:52 +0530 Subject: [PATCH 10/24] tests --- netsuitesdk/api/expense_reports.py | 7 ++--- netsuitesdk/errors/errors.py | 6 ++--- netsuitesdk/errors/parser.py | 41 +++++++++++++++++------------- test/internal/test_helper.py | 34 +++++++++++++++++++++++++ test/internal/test_parser.py | 13 ++++++++++ 5 files changed, 78 insertions(+), 23 deletions(-) create mode 100644 test/internal/test_helper.py create mode 100644 test/internal/test_parser.py diff --git a/netsuitesdk/api/expense_reports.py b/netsuitesdk/api/expense_reports.py index d7bd6a9..52fb019 100644 --- a/netsuitesdk/api/expense_reports.py +++ b/netsuitesdk/api/expense_reports.py @@ -5,7 +5,7 @@ from netsuitesdk.internal.utils import PaginatedSearch from netsuitesdk.internal.exceptions import NetSuiteRequestError -from netsuitesdk.errors.parser import export_error_parser +from netsuitesdk.errors.parser import ErrorParser from netsuitesdk.errors.helpers import export_error_matcher logger = logging.getLogger(__name__) @@ -103,8 +103,9 @@ def post(self, data) -> OrderedDict: try: res = self.ns_client.upsert(er) except Exception as e: - error_dict = export_error_matcher(e.message, 'expense_report') - message = export_error_parser(error_dict, self.ns_client, e.message) + error_parser = ErrorParser(self.ns_client) + error_dict = export_error_matcher(e.message, 'er') + message = error_parser.export_error_parser(error_dict, e.message) raise NetSuiteRequestError(message, e.code) return self._serialize(res) diff --git a/netsuitesdk/errors/errors.py b/netsuitesdk/errors/errors.py index 4045fc0..7d94791 100644 --- a/netsuitesdk/errors/errors.py +++ b/netsuitesdk/errors/errors.py @@ -1,6 +1,6 @@ error_reference = { - "expense_report": + "er": { "category_reference_error": r"An error occured in a upsert request: Invalid category reference key \d+ for entity \d+", "account_reference_error": r"An error occured in a upsert request: Invalid account reference key \d+ for subsidiary \d+", @@ -12,7 +12,7 @@ } list_of_dicts = [ - ['category', 'entity'], ['account', 'subsidiary'], - ['customer', 'entity'], ['location', 'subsidiary'], + ['expense_category', 'employee'], ['account', 'subsidiary'], + ['customer', 'employee'], ['location', 'subsidiary'], ['department', 'subsidiary'], ['currency', 'subsidiary'] ] diff --git a/netsuitesdk/errors/parser.py b/netsuitesdk/errors/parser.py index 2bb6cd2..62e333f 100644 --- a/netsuitesdk/errors/parser.py +++ b/netsuitesdk/errors/parser.py @@ -1,28 +1,35 @@ from .helpers import replace_numbers, convert_to_camelcase from .errors import list_of_dicts +class ErrorParser(): -def get_entity_values(error_dict, ns_client): - entity_keys = list(error_dict) - entity_1 = ns_client.get(convert_to_camelcase(entity_keys[0]), error_dict[entity_keys[0]]) - entity_2 = ns_client.get(convert_to_camelcase(entity_keys[1]), error_dict[entity_keys[1]]) + def __init__(self, ns_client): + self.ns_client = ns_client - if entity_keys[1] == 'employee': - entity_2 = entity_2['email'] if entity_2['email'] else entity_2['firstName'] + " " + entity_2['lastName'] - return entity_1['name'], entity_2 + def get_entity_values(self, error_dict): - if entity_keys[0] == 'account': - entity_1 = entity_1['acctName'] - return entity_1, entity_2['name'] + entity_keys = list(error_dict) + entity_1 = self.ns_client.get(convert_to_camelcase(entity_keys[0]), error_dict[entity_keys[0]]) + entity_2 = self.ns_client.get(convert_to_camelcase(entity_keys[1]), error_dict[entity_keys[1]]) - return entity_1['name'], entity_2['name'] + if entity_1 and entity_2: + if entity_keys[1] == 'employee': + entity_2 = entity_2['email'] if entity_2['email'] else entity_2['firstName'] + " " + entity_2['lastName'] + return entity_1['name'], entity_2 + if entity_keys[0] == 'account': + entity_1 = entity_1['acctName'] + return entity_1, entity_2['name'] -def export_error_parser(error_dict, ns_client, message): + return entity_1['name'], entity_2['name'] - if list(error_dict) in list_of_dicts: - entity_1, entity_2 = get_entity_values(error_dict, ns_client) - entity_keys = list(error_dict) - parsed_message = replace_numbers(message, entity_1, entity_2, error_dict[entity_keys[0]], error_dict[entity_keys[1]]) - return parsed_message + def export_error_parser(self, error_dict, message): + + parsed_message = message + if list(error_dict) in list_of_dicts: + entity_1, entity_2 = self.get_entity_values(error_dict) + entity_keys = list(error_dict) + parsed_message = replace_numbers(message, entity_1, entity_2, error_dict[entity_keys[0]], error_dict[entity_keys[1]]) + + return parsed_message diff --git a/test/internal/test_helper.py b/test/internal/test_helper.py new file mode 100644 index 0000000..30c0b36 --- /dev/null +++ b/test/internal/test_helper.py @@ -0,0 +1,34 @@ +import pytest +from netsuitesdk.errors.helpers import replace_numbers, convert_to_camelcase, export_error_matcher + +errors = [ + ('An error occured in a upsert request: Invalid category reference key 1 for entity 12', {'expense_category': '1', 'employee': '12'}), + ('An error occured in a upsert request: Invalid account reference key 1 for subsidiary 12', {'account': '1', 'subsidiary': '12'}), + ('An error occured in a upsert request: Invalid customer reference key 1 for entity 12', {'customer': '1', 'employee': '12'}), + ('An error occured in a upsert request: Invalid location reference key 1 for subsidiary 12', {'location': '1', 'subsidiary': '12'}), + ('An error occured in a upsert request: Invalid department reference key 1 for subsidiary 12', {'department': '1', 'subsidiary': '12'}), + ('An error occured in a upsert request: Invalid currency reference key 1 for subsidiary 12', {'currency': '1', 'subsidiary': '12'}) +] + +def test_replace_number(): + final_string = "An error occured in a upsert request: Invalid category reference key Travel for entity John Doe" + replaced_string = replace_numbers('An error occured in a upsert request: Invalid category reference key 1 for entity 2', 'Travel', 'John Doe', '1', '2') + + assert final_string == replaced_string + + +def test_convert_to_camelcase(): + entity_type = 'ExpenseCategory' + result = convert_to_camelcase('expense_category') + assert entity_type == result + + entity_type = 'Currency' + result = convert_to_camelcase('currency') + assert entity_type == result + + +@pytest.mark.parametrize("input, output", errors) +def test_export_error_matcher(input, output): + + result = export_error_matcher(input, 'expense_report') + assert result == output diff --git a/test/internal/test_parser.py b/test/internal/test_parser.py new file mode 100644 index 0000000..5b47db8 --- /dev/null +++ b/test/internal/test_parser.py @@ -0,0 +1,13 @@ +import pytest +from netsuitesdk.errors.parser import export_error_parser + + +def test_export_error_parser(mocker, ns): + + mocker.patch( + 'netsuitesdk.errors.parser.get_entity_values', + return_value={'John Doe', 'Travel'} + ) + + result = export_error_parser({'expense_category': '1', 'employee': '12'}, ns, 'An error occured in a upsert request: Invalid category reference key 1 for entity 12') + assert result == "An error occured in a upsert request: Invalid category reference key Travel for entity John Doe" From 2c0f88dcfb311eff47901fbe5f125624c5ddf59a Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Thu, 25 May 2023 20:16:12 +0530 Subject: [PATCH 11/24] refactor --- netsuitesdk/errors/errors.py | 12 ++++++------ netsuitesdk/errors/helpers.py | 30 ++++++------------------------ 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/netsuitesdk/errors/errors.py b/netsuitesdk/errors/errors.py index 7d94791..b1dd336 100644 --- a/netsuitesdk/errors/errors.py +++ b/netsuitesdk/errors/errors.py @@ -2,12 +2,12 @@ error_reference = { "er": { - "category_reference_error": r"An error occured in a upsert request: Invalid category reference key \d+ for entity \d+", - "account_reference_error": r"An error occured in a upsert request: Invalid account reference key \d+ for subsidiary \d+", - "project_reference_error": r"An error occured in a upsert request: Invalid customer reference key \d+ for entity \d+", - "location_reference_error": r"An error occured in a upsert request: Invalid location reference key \d+ for subsidiary \d+", - "department_reference_error": r"An error occured in a upsert request: Invalid department reference key \d+ for subsidiary \d+", - "currency_reference_error": r"An error occured in a upsert request: Invalid currency reference key \d+ for subsidiary \d+", + 'category_reference_error': {'regex': r"An error occured in a upsert request: Invalid category reference key \d+ for entity \d+", 'keys': ['expense_category', 'employee']}, + 'account_reference_error': {'regex': r"An error occured in a upsert request: Invalid account reference key \d+ for subsidiary \d+", 'keys': ['account', 'subsidiary']}, + 'project_reference_error': {'regex': r"An error occured in a upsert request: Invalid customer reference key \d+ for entity \d+", 'keys': ['customer', 'employee']}, + 'location_reference_error': {'regex': r"An error occured in a upsert request: Invalid location reference key \d+ for subsidiary \d+", 'keys': ['location', 'subsidiary']}, + 'department_reference_error': {'regex':r"An error occured in a upsert request: Invalid department reference key \d+ for subsidiary \d+" , 'keys': ['department', 'subsidiary']}, + 'currency_reference_error': {'regex': r"An error occured in a upsert request: Invalid currency reference key \d+ for subsidiary \d+", 'keys': ['currency', 'subsidiary']} } } diff --git a/netsuitesdk/errors/helpers.py b/netsuitesdk/errors/helpers.py index 225dcb0..31aa545 100644 --- a/netsuitesdk/errors/helpers.py +++ b/netsuitesdk/errors/helpers.py @@ -11,30 +11,12 @@ def convert_to_camelcase(word): return ''.join(word.title().split('_')) -def export_error_matcher(string, export_type): +import re - if re.match(error_reference[export_type]['category_reference_error'], string): - numbers = re.findall(r'\d+', string) - return {"expense_category": numbers[0], "employee": numbers[1]} - - if re.match(error_reference[export_type]['account_reference_error'], string): - numbers = re.findall(r'\d+', string) - return {"account": numbers[0], "subsidiary": numbers[1]} - - if re.match(error_reference[export_type]['project_reference_error'], string): - numbers = re.findall(r'\d+', string) - return {"customer": numbers[0], "employee": numbers[1]} - - if re.match(error_reference[export_type]['location_reference_error'], string): - numbers = re.findall(r'\d+', string) - return {"location": numbers[0], "subsidiary": numbers[1]} - - if re.match(error_reference[export_type]['department_reference_error'], string): - numbers = re.findall(r'\d+', string) - return {"department": numbers[0], "subsidiary": numbers[1]} +def export_error_matcher(string, export_type): + for _, error_data in error_reference[export_type].items(): + if re.match(error_data['regex'], string): + numbers = re.findall(r'\d+', string) + return {key: int(number) for key, number in zip(error_data['keys'], numbers)} - if re.match(error_reference[export_type]['currency_reference_error'], string): - numbers = re.findall(r'\d+', string) - return {"currency": numbers[0], "subsidiary": numbers[1]} - return {} From 0081e3a0cc7832bc896fd90f5a1e423a0290be5a Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Thu, 25 May 2023 20:32:33 +0530 Subject: [PATCH 12/24] fix; --- netsuitesdk/errors/helpers.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/netsuitesdk/errors/helpers.py b/netsuitesdk/errors/helpers.py index 31aa545..b714aab 100644 --- a/netsuitesdk/errors/helpers.py +++ b/netsuitesdk/errors/helpers.py @@ -11,8 +11,6 @@ def convert_to_camelcase(word): return ''.join(word.title().split('_')) -import re - def export_error_matcher(string, export_type): for _, error_data in error_reference[export_type].items(): if re.match(error_data['regex'], string): From d8120b5003b749dff63e416f2cee4300ad3bc21b Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Fri, 26 May 2023 12:24:03 +0530 Subject: [PATCH 13/24] move exceptions to upsert function --- netsuitesdk/api/expense_reports.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/netsuitesdk/api/expense_reports.py b/netsuitesdk/api/expense_reports.py index 52fb019..d73b14a 100644 --- a/netsuitesdk/api/expense_reports.py +++ b/netsuitesdk/api/expense_reports.py @@ -100,12 +100,6 @@ def post(self, data) -> OrderedDict: er['entity'] = self.ns_client.RecordRef(**(data['entity'])) logger.debug('able to create er = %s', er) - try: - res = self.ns_client.upsert(er) - except Exception as e: - error_parser = ErrorParser(self.ns_client) - error_dict = export_error_matcher(e.message, 'er') - message = error_parser.export_error_parser(error_dict, e.message) - raise NetSuiteRequestError(message, e.code) + res = self.ns_client.upsert(er, 'er') return self._serialize(res) From 1807dd713aa70bd3f0d69429e29d08961d311849 Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Fri, 26 May 2023 12:47:08 +0530 Subject: [PATCH 14/24] added --- netsuitesdk/errors/parser.py | 24 ++++++++++++------------ netsuitesdk/internal/client.py | 16 +++++++++++++--- 2 files changed, 25 insertions(+), 15 deletions(-) diff --git a/netsuitesdk/errors/parser.py b/netsuitesdk/errors/parser.py index 62e333f..a1bc237 100644 --- a/netsuitesdk/errors/parser.py +++ b/netsuitesdk/errors/parser.py @@ -3,33 +3,33 @@ class ErrorParser(): - def __init__(self, ns_client): - self.ns_client = ns_client + def __init__(self, get_instance): + self.get_instance = get_instance def get_entity_values(self, error_dict): entity_keys = list(error_dict) - entity_1 = self.ns_client.get(convert_to_camelcase(entity_keys[0]), error_dict[entity_keys[0]]) - entity_2 = self.ns_client.get(convert_to_camelcase(entity_keys[1]), error_dict[entity_keys[1]]) + object_1 = self.get_instance(convert_to_camelcase(entity_keys[0]), error_dict[entity_keys[0]]) + object_2 = self.get_instance(convert_to_camelcase(entity_keys[1]), error_dict[entity_keys[1]]) - if entity_1 and entity_2: + if object_1 and object_2: if entity_keys[1] == 'employee': - entity_2 = entity_2['email'] if entity_2['email'] else entity_2['firstName'] + " " + entity_2['lastName'] - return entity_1['name'], entity_2 + object_2 = object_2['email'] if object_2['email'] else object_2['firstName'] + " " + object_2['lastName'] + return object_1['name'], object_2 if entity_keys[0] == 'account': - entity_1 = entity_1['acctName'] - return entity_1, entity_2['name'] + object_1 = object_1['acctName'] + return object_1, object_2['name'] - return entity_1['name'], entity_2['name'] + return object_1['name'], object_2['name'] def export_error_parser(self, error_dict, message): parsed_message = message if list(error_dict) in list_of_dicts: - entity_1, entity_2 = self.get_entity_values(error_dict) + object_1, object_2 = self.get_entity_values(error_dict) entity_keys = list(error_dict) - parsed_message = replace_numbers(message, entity_1, entity_2, error_dict[entity_keys[0]], error_dict[entity_keys[1]]) + parsed_message = replace_numbers(message, object_1, object_2, error_dict[entity_keys[0]], error_dict[entity_keys[1]]) return parsed_message diff --git a/netsuitesdk/internal/client.py b/netsuitesdk/internal/client.py index 706c007..5c525ae 100644 --- a/netsuitesdk/internal/client.py +++ b/netsuitesdk/internal/client.py @@ -22,6 +22,10 @@ from .netsuite_types import * +from netsuitesdk.errors.parser import ErrorParser +from netsuitesdk.errors.helpers import export_error_matcher + + class NetSuiteClient: """The Netsuite client class providing access to the Netsuite SOAP/WSDL web service""" @@ -289,6 +293,7 @@ def logout(self): def _request_error(self, service_name, detail, error_cls=None): if error_cls is None: error_cls = NetSuiteRequestError + exc = error_cls( "An error occured in a {service_name} request: {msg}".format( service_name=service_name, @@ -366,7 +371,6 @@ def get(self, recordType, internalId=None, externalId=None): :rtype: Record :raises ValueError: if neither internalId nor externalId was passed """ - recordType = recordType[0].lower() + recordType[1:] if internalId is not None: record_ref = self.RecordRef(type=recordType, internalId=internalId) @@ -377,7 +381,6 @@ def get(self, recordType, internalId=None, externalId=None): response = self.request('get', baseRef=record_ref) response = response.body.readResponse - status = response.status if status.isSuccess: record = response['record'] @@ -482,7 +485,7 @@ def searchMoreWithId(self, searchId, pageIndex): exc = self._request_error('searchMoreWithId', detail=status['statusDetail'][0]) raise exc - def upsert(self, record): + def upsert(self, record, record_type=None): """ Add an object of type recordType with given externalId.. If a record of specified type with matching externalId already @@ -512,6 +515,13 @@ def upsert(self, record): return record_ref else: exc = self._request_error('upsert', detail=status['statusDetail'][0]) + + if record_type: + error_parser = ErrorParser(self.get) + error_dict = export_error_matcher(exc.message, 'er') + message = error_parser.export_error_parser(error_dict, exc.message) + exc.message = message + raise exc def basic_stringfield_search(self, type_name, attribute, value, operator=None): From a064027a7d0356b7f80aa63ad6aef34eabdc0517 Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Fri, 26 May 2023 13:16:01 +0530 Subject: [PATCH 15/24] fixed tests --- test/internal/test_helper.py | 14 +++++++------- test/internal/test_parser.py | 5 +++-- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/test/internal/test_helper.py b/test/internal/test_helper.py index 30c0b36..d22ac0b 100644 --- a/test/internal/test_helper.py +++ b/test/internal/test_helper.py @@ -2,12 +2,12 @@ from netsuitesdk.errors.helpers import replace_numbers, convert_to_camelcase, export_error_matcher errors = [ - ('An error occured in a upsert request: Invalid category reference key 1 for entity 12', {'expense_category': '1', 'employee': '12'}), - ('An error occured in a upsert request: Invalid account reference key 1 for subsidiary 12', {'account': '1', 'subsidiary': '12'}), - ('An error occured in a upsert request: Invalid customer reference key 1 for entity 12', {'customer': '1', 'employee': '12'}), - ('An error occured in a upsert request: Invalid location reference key 1 for subsidiary 12', {'location': '1', 'subsidiary': '12'}), - ('An error occured in a upsert request: Invalid department reference key 1 for subsidiary 12', {'department': '1', 'subsidiary': '12'}), - ('An error occured in a upsert request: Invalid currency reference key 1 for subsidiary 12', {'currency': '1', 'subsidiary': '12'}) + ('An error occured in a upsert request: Invalid category reference key 1 for entity 12', {'expense_category': 1, 'employee': 12}), + ('An error occured in a upsert request: Invalid account reference key 1 for subsidiary 12', {'account': 1, 'subsidiary': 12}), + ('An error occured in a upsert request: Invalid customer reference key 1 for entity 12', {'customer': 1, 'employee': 12}), + ('An error occured in a upsert request: Invalid location reference key 1 for subsidiary 12', {'location': 1, 'subsidiary': 12}), + ('An error occured in a upsert request: Invalid department reference key 1 for subsidiary 12', {'department': 1, 'subsidiary': 12}), + ('An error occured in a upsert request: Invalid currency reference key 1 for subsidiary 12', {'currency': 1, 'subsidiary': 12}) ] def test_replace_number(): @@ -30,5 +30,5 @@ def test_convert_to_camelcase(): @pytest.mark.parametrize("input, output", errors) def test_export_error_matcher(input, output): - result = export_error_matcher(input, 'expense_report') + result = export_error_matcher(input, 'er') assert result == output diff --git a/test/internal/test_parser.py b/test/internal/test_parser.py index 5b47db8..1a08974 100644 --- a/test/internal/test_parser.py +++ b/test/internal/test_parser.py @@ -1,5 +1,5 @@ import pytest -from netsuitesdk.errors.parser import export_error_parser +from netsuitesdk.errors.parser import ErrorParser def test_export_error_parser(mocker, ns): @@ -9,5 +9,6 @@ def test_export_error_parser(mocker, ns): return_value={'John Doe', 'Travel'} ) - result = export_error_parser({'expense_category': '1', 'employee': '12'}, ns, 'An error occured in a upsert request: Invalid category reference key 1 for entity 12') + parser = ErrorParser() + result = parser.export_error_parser({'expense_category': '1', 'employee': '12'}, ns, 'An error occured in a upsert request: Invalid category reference key 1 for entity 12') assert result == "An error occured in a upsert request: Invalid category reference key Travel for entity John Doe" From c5115a8207cb0be6dc4dcf0f199888068872cb77 Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Fri, 26 May 2023 13:22:53 +0530 Subject: [PATCH 16/24] fixed tests --- test/internal/test_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/internal/test_parser.py b/test/internal/test_parser.py index 1a08974..be21e86 100644 --- a/test/internal/test_parser.py +++ b/test/internal/test_parser.py @@ -5,7 +5,7 @@ def test_export_error_parser(mocker, ns): mocker.patch( - 'netsuitesdk.errors.parser.get_entity_values', + 'netsuitesdk.errors.parser.ErrorParser.get_entity_values', return_value={'John Doe', 'Travel'} ) From c5648f1b23bd836e80eb82b9f18f4ed80d151006 Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Fri, 26 May 2023 13:30:11 +0530 Subject: [PATCH 17/24] ad --- test/internal/test_parser.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/internal/test_parser.py b/test/internal/test_parser.py index be21e86..cf623f4 100644 --- a/test/internal/test_parser.py +++ b/test/internal/test_parser.py @@ -9,6 +9,6 @@ def test_export_error_parser(mocker, ns): return_value={'John Doe', 'Travel'} ) - parser = ErrorParser() - result = parser.export_error_parser({'expense_category': '1', 'employee': '12'}, ns, 'An error occured in a upsert request: Invalid category reference key 1 for entity 12') + parser = ErrorParser(ns) + result = parser.export_error_parser({'expense_category': '1', 'employee': '12'}, 'An error occured in a upsert request: Invalid category reference key 1 for entity 12') assert result == "An error occured in a upsert request: Invalid category reference key Travel for entity John Doe" From 24e56f98d73b930a719cface0daafb1b23d6fcce Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Fri, 26 May 2023 14:57:46 +0530 Subject: [PATCH 18/24] ad --- test/internal/test_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/internal/test_parser.py b/test/internal/test_parser.py index cf623f4..0e714f3 100644 --- a/test/internal/test_parser.py +++ b/test/internal/test_parser.py @@ -6,7 +6,7 @@ def test_export_error_parser(mocker, ns): mocker.patch( 'netsuitesdk.errors.parser.ErrorParser.get_entity_values', - return_value={'John Doe', 'Travel'} + return_value={'Travel', 'John Doe'} ) parser = ErrorParser(ns) From c40803cf528a19a6a8a3e3347d0e767dc051d05e Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Fri, 26 May 2023 15:02:38 +0530 Subject: [PATCH 19/24] ad --- test/internal/test_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/internal/test_parser.py b/test/internal/test_parser.py index 0e714f3..2b6073a 100644 --- a/test/internal/test_parser.py +++ b/test/internal/test_parser.py @@ -11,4 +11,4 @@ def test_export_error_parser(mocker, ns): parser = ErrorParser(ns) result = parser.export_error_parser({'expense_category': '1', 'employee': '12'}, 'An error occured in a upsert request: Invalid category reference key 1 for entity 12') - assert result == "An error occured in a upsert request: Invalid category reference key Travel for entity John Doe" + assert result == "An error occured in a upsert request: Invalid category reference key John Doe for entity Travel" From 42dd6f9a38247d2b23af0cd75b532c3968d24424 Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Mon, 29 May 2023 13:27:58 +0530 Subject: [PATCH 20/24] test fix --- netsuitesdk/api/expense_reports.py | 6 +++--- netsuitesdk/errors/errors.py | 2 +- netsuitesdk/internal/client.py | 2 +- test/internal/test_helper.py | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/netsuitesdk/api/expense_reports.py b/netsuitesdk/api/expense_reports.py index d73b14a..82f3512 100644 --- a/netsuitesdk/api/expense_reports.py +++ b/netsuitesdk/api/expense_reports.py @@ -5,8 +5,8 @@ from netsuitesdk.internal.utils import PaginatedSearch from netsuitesdk.internal.exceptions import NetSuiteRequestError -from netsuitesdk.errors.parser import ErrorParser -from netsuitesdk.errors.helpers import export_error_matcher +from netsuitesdk.export_errors.parser import ErrorParser +from netsuitesdk.export_errors.helpers import export_error_matcher logger = logging.getLogger(__name__) @@ -100,6 +100,6 @@ def post(self, data) -> OrderedDict: er['entity'] = self.ns_client.RecordRef(**(data['entity'])) logger.debug('able to create er = %s', er) - res = self.ns_client.upsert(er, 'er') + res = self.ns_client.upsert(er, 'expense_report') return self._serialize(res) diff --git a/netsuitesdk/errors/errors.py b/netsuitesdk/errors/errors.py index b1dd336..648f57a 100644 --- a/netsuitesdk/errors/errors.py +++ b/netsuitesdk/errors/errors.py @@ -1,6 +1,6 @@ error_reference = { - "er": + "expense_report": { 'category_reference_error': {'regex': r"An error occured in a upsert request: Invalid category reference key \d+ for entity \d+", 'keys': ['expense_category', 'employee']}, 'account_reference_error': {'regex': r"An error occured in a upsert request: Invalid account reference key \d+ for subsidiary \d+", 'keys': ['account', 'subsidiary']}, diff --git a/netsuitesdk/internal/client.py b/netsuitesdk/internal/client.py index 5c525ae..0eaad59 100644 --- a/netsuitesdk/internal/client.py +++ b/netsuitesdk/internal/client.py @@ -518,7 +518,7 @@ def upsert(self, record, record_type=None): if record_type: error_parser = ErrorParser(self.get) - error_dict = export_error_matcher(exc.message, 'er') + error_dict = export_error_matcher(exc.message, 'expense_report') message = error_parser.export_error_parser(error_dict, exc.message) exc.message = message diff --git a/test/internal/test_helper.py b/test/internal/test_helper.py index d22ac0b..5ddcabc 100644 --- a/test/internal/test_helper.py +++ b/test/internal/test_helper.py @@ -11,7 +11,7 @@ ] def test_replace_number(): - final_string = "An error occured in a upsert request: Invalid category reference key Travel for entity John Doe" + final_string = "An error occured in a upsert request: Invalid category reference key John Doe for entity Travel" replaced_string = replace_numbers('An error occured in a upsert request: Invalid category reference key 1 for entity 2', 'Travel', 'John Doe', '1', '2') assert final_string == replaced_string @@ -30,5 +30,5 @@ def test_convert_to_camelcase(): @pytest.mark.parametrize("input, output", errors) def test_export_error_matcher(input, output): - result = export_error_matcher(input, 'er') + result = export_error_matcher(input, 'expense_report') assert result == output From cef0812296b1c32d7e060f533e48a156fdc9ae8b Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Mon, 29 May 2023 13:29:55 +0530 Subject: [PATCH 21/24] asd --- netsuitesdk/api/expense_reports.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/netsuitesdk/api/expense_reports.py b/netsuitesdk/api/expense_reports.py index 82f3512..b85dd20 100644 --- a/netsuitesdk/api/expense_reports.py +++ b/netsuitesdk/api/expense_reports.py @@ -4,9 +4,7 @@ import logging from netsuitesdk.internal.utils import PaginatedSearch -from netsuitesdk.internal.exceptions import NetSuiteRequestError -from netsuitesdk.export_errors.parser import ErrorParser -from netsuitesdk.export_errors.helpers import export_error_matcher + logger = logging.getLogger(__name__) From 42b6777d89b67d40c37d52fd444ee87cef666422 Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Mon, 29 May 2023 13:38:09 +0530 Subject: [PATCH 22/24] sdf --- test/internal/test_parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/internal/test_parser.py b/test/internal/test_parser.py index 2b6073a..0e714f3 100644 --- a/test/internal/test_parser.py +++ b/test/internal/test_parser.py @@ -11,4 +11,4 @@ def test_export_error_parser(mocker, ns): parser = ErrorParser(ns) result = parser.export_error_parser({'expense_category': '1', 'employee': '12'}, 'An error occured in a upsert request: Invalid category reference key 1 for entity 12') - assert result == "An error occured in a upsert request: Invalid category reference key John Doe for entity Travel" + assert result == "An error occured in a upsert request: Invalid category reference key Travel for entity John Doe" From 811c7b8ce3dcbc6dce8f2606b81046a1d8933262 Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Mon, 29 May 2023 13:45:14 +0530 Subject: [PATCH 23/24] test fixed --- test/internal/test_helper.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/internal/test_helper.py b/test/internal/test_helper.py index 5ddcabc..4fb0d36 100644 --- a/test/internal/test_helper.py +++ b/test/internal/test_helper.py @@ -11,9 +11,8 @@ ] def test_replace_number(): - final_string = "An error occured in a upsert request: Invalid category reference key John Doe for entity Travel" + final_string = "An error occured in a upsert request: Invalid category reference key Travel for entity John Doe" replaced_string = replace_numbers('An error occured in a upsert request: Invalid category reference key 1 for entity 2', 'Travel', 'John Doe', '1', '2') - assert final_string == replaced_string From f7fb31b43b4f41a014c7379c45f74a2ae9d122a6 Mon Sep 17 00:00:00 2001 From: Nilesh Pant Date: Mon, 29 May 2023 16:17:40 +0530 Subject: [PATCH 24/24] added tests --- test/internal/test_upsert.py | 37 ++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/test/internal/test_upsert.py b/test/internal/test_upsert.py index effe6ef..3415e8d 100644 --- a/test/internal/test_upsert.py +++ b/test/internal/test_upsert.py @@ -1,4 +1,5 @@ from netsuitesdk.internal.utils import PaginatedSearch +from netsuitesdk.internal.exceptions import NetSuiteRequestError import logging import pytest import zeep @@ -118,6 +119,42 @@ def test_upsert_journal_entry(ns): assert (je['externalId'] == 'JE_1234'), 'Journal Entry External ID does not match' +def test_failed_expense_report(ns): + employee_ref = ns.RecordRef(type='employee', internalId=get_employee(ns).internalId) + cat_account_ref = ns.RecordRef(type='account', internalId='3') + loc_ref = ns.RecordRef(type='location', internalId=12) + subs_ref = ns.RecordRef(type='subsdiary', internalId=5) + dep_ref = ns.RecordRef(type='department', internalId=get_department(ns).internalId) + class_ref = ns.RecordRef(type='classification', internalId=get_department(ns).internalId) + currency_ref = ns.RecordRef(type='currency', internalId=get_currency(ns).internalId) + expenses = [] + + er = ns.ExpenseReportExpense() + er['category'] = cat_account_ref + er['amount'] = 10.0 + er['department'] = dep_ref + er['class'] = class_ref + er['location'] = loc_ref + er['currency'] = currency_ref + er['subsdiary'] = subs_ref + + expenses.append(er) + + expense_report = ns.ExpenseReport(externalId='EXPR_1') + expense_report['expenseReportCurrency'] = currency_ref # US dollar + expense_report['exchangerate'] = 1.0 + expense_report['expenseList'] = ns.ExpenseReportExpenseList(expense=expenses) + expense_report['memo'] = 'test memo' + expense_report['entity'] = employee_ref + logger.debug('upserting expense report %s', expense_report) + + try: + record_ref = ns.upsert(expense_report, record_type='expense_report') + logger.debug('record_ref = %s', record_ref) + except NetSuiteRequestError as e: + assert e.message == 'An error occured in a upsert request: Invalid location reference key Honeycomb Mfg. for subsidiary Honeycomb Mfg..' + assert e.code == 'INVALID_KEY_OR_REF' + def test_upsert_expense_report(ns): employee_ref = ns.RecordRef(type='employee', internalId=get_employee(ns).internalId) bill_account_ref = ns.RecordRef(type='account', internalId=25)