You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							602 lines
						
					
					
						
							26 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							602 lines
						
					
					
						
							26 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ############################################################################### | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |
| #    Author: Shafna K(odoo@cybrosys.com) | |
| # | |
| #    You can modify it under the terms of the GNU AFFERO | |
| #    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | |
| # | |
| #    This program is distributed in the hope that it will be useful, | |
| #    but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | |
| #    GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. | |
| # | |
| #    You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE | |
| #    (AGPL v3) along with this program. | |
| #    If not, see <http://www.gnu.org/licenses/>. | |
| # | |
| ############################################################################### | |
| import boto3 | |
| import json | |
| import time | |
| from odoo import api, fields, models, _ | |
| from odoo.exceptions import UserError | |
| 
 | |
| 
 | |
| class AmazonDataset(models.Model): | |
|     """Class to create a forecast of stock""" | |
|     _name = "amazon.dataset" | |
|     _description = "Amazon Dataset" | |
|     _rec_name = "table_name" | |
| 
 | |
|     table_name = fields.Char(string="Table Name", required=True, | |
|                              help="Provide the table name.") | |
|     role_name = fields.Char(string="Role Name", | |
|                             help="Provide the Role name.") | |
|     policy_name = fields.Char(string="Policy Name", | |
|                               help="Provide the Policy name.") | |
|     dataset_group = fields.Char(string="Dataset Group", | |
|                                 help="Provide the Dataset Group name.") | |
|     dataset = fields.Char(string="Dataset", | |
|                           help="Provide the Dataset name.") | |
|     state = fields.Selection([ | |
|         ('table', "Table"), | |
|         ('role', "Role"), | |
|         ('kms', "KMS"), | |
|         ('policy', "Policy"), | |
|         ('dataset', "Dataset"), | |
|         ('import_dataset', "Import Dataset"), | |
|         ('predictor', "Predictor"), | |
|         ('forecast', "Forecast"), | |
|         ('query_forecast', "Query Forecast"), | |
|     ], default="table", string="State", | |
|         help="States of dataset creation.") | |
|     table_arn = fields.Char(string="Table ARN", | |
|                             help="Table arn will be computed based on table" | |
|                                  " name provided after creating the table.") | |
|     role_arn = fields.Char(string="Role Arn", help="Role Arn will be computed " | |
|                                                    "after Role is created.") | |
|     policy_arn = fields.Char(string="Policy Arn", | |
|                              help="Policy Arn will be created after the " | |
|                                   "policy is created.") | |
|     kms_alias = fields.Char(string="KMS Alias Name", | |
|                             help="Provide an Alias name for KMS.") | |
|     kms_arn = fields.Char(string="KMS Arn", help="KMS Arn will be created " | |
|                                                  "after KMS key is created.") | |
|     dataset_group_arn = fields.Char(string="Dataset Group Arn", | |
|                                     help="Dataset Group Arn will be created " | |
|                                          "after Dataset Group is created.") | |
|     dataset_arn = fields.Char(string="Dataset Arn", | |
|                               help="Dataset Arn will be craeted after" | |
|                                    " Dataset is created.") | |
|     forecast_frequency = fields.Selection([ | |
|         ('D', 'Days'), | |
|         ('W', 'Weeks'), | |
|         ('M', 'Months'), | |
|         ('Y', 'Years'), | |
|         ('T', 'Minutes'), | |
|         ('H', 'Hours'), | |
|     ], default='D', string="Forecast Frequency", help="Choose the frequency" | |
|                                                       " for forecasting.") | |
|     import_job_name = fields.Char(string="Import Job Name", | |
|                                   help="Provide the import job name.") | |
|     import_job_arn = fields.Char(string="Import Job Arn", | |
|                                  help="Import job Arn will be computed after" | |
|                                       " import job is done.") | |
|     predictor_name = fields.Char(string="Predictor Name", | |
|                                  help="Provide a name for Predictor function.") | |
|     predictor_algorithm = fields.Selection([ | |
|         ('arn:aws:forecast:::algorithm/ARIMA', 'ARIMA'), | |
|         ('arn:aws:forecast:::algorithm/CNN-QR', 'CNN-QR'), | |
|         ('arn:aws:forecast:::algorithm/NPTS', 'NPTS'), | |
|         ('arn:aws:forecast:::algorithm/MQRNN', 'MQRNN'), | |
|     ], string="Algorithm", default='arn:aws:forecast:::algorithm/ARIMA', | |
|         help="Choose desired Predictor Algorithm.") | |
|     predictor_arn = fields.Char(string="Predictor Arn", | |
|                                 help="Predictor Arn will be computed after " | |
|                                      "predictor function is created.") | |
|     forecast_name = fields.Char(string="Forecast Name", | |
|                                 help="Provide the name for forecast function.") | |
|     forecast_arn = fields.Char(string="Forecast Arn", | |
|                                help="Forecast Arn will be computed after " | |
|                                     "forecasting is completed.") | |
|     item_id = fields.Char(string="Item id", | |
|                           help="Provide the name of product you want to know " | |
|                                "the forecasting.") | |
|     bucket_id = fields.Many2one('amazon.bucket', string="Bucket", | |
|                                 help="Choose the bucket name " | |
|                                                     "from which the data must" | |
|                                                     "be taken.") | |
| 
 | |
|     def forecast_values(self): | |
|         """To connect with the Amazon Forecast services using credentials""" | |
|         amazon_forecast = self.env['ir.config_parameter'].sudo().get_param( | |
|             'amazon_forecast_integration.amazon_forecast') | |
|         amazon_access_key = self.env['ir.config_parameter'].sudo().get_param( | |
|             'amazon_forecast_integration.amazon_access_key') | |
|         amazon_secret_access_key = self.env[ | |
|             'ir.config_parameter'].sudo().get_param( | |
|             'amazon_forecast_integration.amazon_secret_access_key') | |
|         amazon_region = self.env['ir.config_parameter'].sudo().get_param( | |
|             'amazon_forecast_integration.amazon_region') | |
|         return { | |
|             'amazon_forecast': amazon_forecast, | |
|             'amazon_access_key': amazon_access_key, | |
|             'amazon_secret_access_key': amazon_secret_access_key, | |
|             'amazon_region': amazon_region, | |
|         } | |
| 
 | |
|     def action_create_table(self): | |
|         """To create a dynamodb in Amazon Forecast""" | |
|         values = self.forecast_values() | |
|         amazon_forecast = values['amazon_forecast'] | |
|         if amazon_forecast: | |
|             amazon_access_key = values['amazon_access_key'] | |
|             amazon_secret_access_key = values['amazon_secret_access_key'] | |
|             amazon_region = values['amazon_region'] | |
|             session = boto3.Session( | |
|                 aws_access_key_id=amazon_access_key, | |
|                 aws_secret_access_key=amazon_secret_access_key, | |
|                 region_name=amazon_region | |
|             ) | |
|             dynamodb_client = session.client('dynamodb') | |
|             try: | |
|                 response = dynamodb_client.create_table( | |
|                     TableName=self.table_name, | |
|                     AttributeDefinitions=[ | |
|                         { | |
|                             'AttributeName': 'id', | |
|                             'AttributeType': 'N' | |
|                         } | |
|                     ], | |
|                     KeySchema=[ | |
|                         { | |
|                             'AttributeName': 'id', | |
|                             'KeyType': 'HASH' | |
|                         } | |
|                     ], | |
|                     ProvisionedThroughput={ | |
|                         'ReadCapacityUnits': 5, | |
|                         'WriteCapacityUnits': 5 | |
|                     } | |
|                 ) | |
|                 self.write({ | |
|                     'state': 'role', | |
|                     'table_arn': response['TableDescription']['TableArn'] | |
|                 }) | |
|             except dynamodb_client.exceptions.ClientError as e: | |
|                 raise UserError(e) | |
| 
 | |
|     def action_create_role(self): | |
|         """To create a Role for Forecasting""" | |
|         values = self.forecast_values() | |
|         amazon_forecast = values['amazon_forecast'] | |
|         if amazon_forecast: | |
|             amazon_access_key = values['amazon_access_key'] | |
|             amazon_secret_access_key = values['amazon_secret_access_key'] | |
|             amazon_region = values['amazon_region'] | |
|             session = boto3.Session( | |
|                 aws_access_key_id=amazon_access_key, | |
|                 aws_secret_access_key=amazon_secret_access_key, | |
|                 region_name=amazon_region | |
|             ) | |
|             assume_role_policy_document = { | |
|                 "Version": "2012-10-17", | |
|                 "Statement": [ | |
|                     { | |
|                         "Effect": "Allow", | |
|                         "Principal": { | |
|                             "Service": "forecast.amazonaws.com" | |
|                         }, | |
|                         "Action": "sts:AssumeRole" | |
|                     } | |
|                 ] | |
|             } | |
|             iam_client = session.client('iam') | |
|             try: | |
|                 response = iam_client.create_role( | |
|                     RoleName=self.role_name, | |
|                     AssumeRolePolicyDocument=json.dumps( | |
|                         assume_role_policy_document) | |
|                 ) | |
|                 self.write({ | |
|                     'state': 'kms', | |
|                     'role_arn': response['Role']['Arn'] | |
|                 }) | |
|             except iam_client.exceptions.ClientError as e: | |
|                 raise UserError(e) | |
| 
 | |
|     def action_create_kms(self): | |
|         """To create a Key Management Service in AWS""" | |
|         values = self.forecast_values() | |
|         amazon_forecast = values['amazon_forecast'] | |
|         if amazon_forecast: | |
|             amazon_access_key = values['amazon_access_key'] | |
|             amazon_secret_access_key = values['amazon_secret_access_key'] | |
|             amazon_region = values['amazon_region'] | |
|             session = boto3.Session( | |
|                 aws_access_key_id=amazon_access_key, | |
|                 aws_secret_access_key=amazon_secret_access_key, | |
|                 region_name=amazon_region | |
|             ) | |
|             kms_client = session.client('kms') | |
|             response = kms_client.create_key( | |
|                 Description='KMS Key' | |
|             ) | |
|             key_id = response['KeyMetadata']['KeyId'] | |
|             key_response = kms_client.describe_key(KeyId=key_id) | |
|             key_arn = key_response['KeyMetadata']['Arn'] | |
|             self.write({ | |
|                 'kms_arn': key_arn, | |
|             }) | |
|             kms_client.create_alias( | |
|                 AliasName='alias/'+self.kms_alias, | |
|                 TargetKeyId=key_id | |
|             ) | |
|             kms_client.create_grant( | |
|                 KeyId=key_id, | |
|                 GranteePrincipal=self.role_arn, | |
|                 Operations=['Encrypt', 'Decrypt'] | |
|             ) | |
|             self.write({ | |
|                 'state': 'policy' | |
|             }) | |
|             return key_id | |
| 
 | |
|     def action_create_policy(self): | |
|         """To create a policies for the role and attach it with the role""" | |
|         values = self.forecast_values() | |
|         amazon_forecast = values['amazon_forecast'] | |
|         if amazon_forecast: | |
|             amazon_access_key = values['amazon_access_key'] | |
|             amazon_secret_access_key = values['amazon_secret_access_key'] | |
|             amazon_region = values['amazon_region'] | |
|             session = boto3.Session( | |
|                 aws_access_key_id=amazon_access_key, | |
|                 aws_secret_access_key=amazon_secret_access_key, | |
|                 region_name=amazon_region | |
|             ) | |
|             iam_client = session.client('iam') | |
|             sts_client = session.client('sts') | |
|             response = sts_client.get_caller_identity() | |
|             account_id = response['Account'] | |
|             policy_name = self.policy_name | |
|             policy_document = { | |
|                 "Version": "2012-10-17", | |
|                 "Statement": [ | |
|                     { | |
|                         "Effect": "Allow", | |
|                         "Action": [ | |
|                             "s3:ListBucket" | |
|                         ], | |
|                         "Resource": "arn:aws:s3:::"+self.bucket_id.bucket_name | |
|                     }, | |
|                     { | |
|                         "Effect": "Allow", | |
|                         "Action": [ | |
|                             "s3:GetObject", | |
|                             "s3:PutObject" | |
|                         ], | |
|                         "Resource": | |
|                             "arn:aws:s3:::"+self.bucket_id.bucket_name+"/*" | |
|                     }, | |
|                     { | |
|                         "Effect": "Allow", | |
|                         "Action": [ | |
|                             "dynamodb:PutItem", | |
|                             "dynamodb:GetItem" | |
|                         ], | |
|                         "Resource": self.table_arn | |
|                     }, | |
|                     { | |
|                         "Effect": "Allow", | |
|                         "Action": [ | |
|                             "kms:Encrypt", | |
|                             "kms:Decrypt", | |
|                             "kms:ReEncrypt*", | |
|                             "kms:GenerateDataKey*", | |
|                             "kms:DescribeKey", | |
|                             "kms:CreateGrant" | |
|                         ], | |
|                         "Resource": self.kms_arn | |
|                     } | |
|                 ] | |
|             } | |
|             response = iam_client.create_policy( | |
|                 PolicyName=policy_name, | |
|                 PolicyDocument=json.dumps(policy_document), | |
|             ) | |
|             self.write({ | |
|                 'policy_arn': response['Policy']['Arn'] | |
|             }) | |
|             try: | |
|                 iam_client.put_role_policy( | |
|                     RoleName=self.role_name, | |
|                     PolicyName=policy_name, | |
|                     PolicyDocument=json.dumps(policy_document) | |
|                 ) | |
|             except Exception as e: | |
|                 raise UserError(e) | |
|             try: | |
|                 policy_arn1 = 'arn:aws:iam::aws:policy/AmazonS3FullAccess' | |
|                 policy_arn2 = ( | |
|                         'arn:aws:iam::'+account_id+':policy/'+self.policy_name) | |
|                 iam_client.attach_role_policy( | |
|                     RoleName=self.role_name, | |
|                     PolicyArn=policy_arn1 | |
|                 ) | |
|                 iam_client.attach_role_policy( | |
|                     RoleName=self.role_name, | |
|                     PolicyArn=policy_arn2 | |
|                 ) | |
|                 self.write({ | |
|                     'state': 'dataset' | |
|                 }) | |
|             except iam_client.exceptions.ClientError as e: | |
|                 raise UserError(e) | |
|             except iam_client.exceptions.ClientError as e: | |
|                 raise UserError(e) | |
| 
 | |
|     def action_create_dataset(self): | |
|         """To create required Dataset for forecasting""" | |
|         values = self.forecast_values() | |
|         amazon_forecast = values['amazon_forecast'] | |
|         if amazon_forecast: | |
|             amazon_access_key = values['amazon_access_key'] | |
|             amazon_secret_access_key = values['amazon_secret_access_key'] | |
|             amazon_region = values['amazon_region'] | |
|             session = boto3.Session( | |
|                 aws_access_key_id=amazon_access_key, | |
|                 aws_secret_access_key=amazon_secret_access_key, | |
|                 region_name=amazon_region | |
|             ) | |
|             dataset_group_name = self.dataset_group | |
|             forecast_client = session.client('forecast') | |
|             try: | |
|                 dataset_group_response = forecast_client.create_dataset_group( | |
|                     DatasetGroupName=dataset_group_name, | |
|                     Domain='RETAIL', | |
|                     Tags=[ | |
|                         {'Key': 'Name', 'Value': dataset_group_name} | |
|                     ] | |
|                 ) | |
|                 self.write({'dataset_group_arn': dataset_group_response[ | |
|                     'DatasetGroupArn']}) | |
|                 dataset_name = self.dataset | |
|             except forecast_client.exceptions.ClientError as e: | |
|                 raise UserError(e) | |
|             try: | |
|                 schema = { | |
|                     "Attributes": [ | |
|                         {"AttributeName": "item_id", | |
|                          "AttributeType": "string"}, | |
|                         {"AttributeName": "timestamp", | |
|                          "AttributeType": "timestamp"}, | |
|                         {"AttributeName": "demand", | |
|                          "AttributeType": "float"}, | |
|                         {"AttributeName": "id", "AttributeType": "string"}, | |
|                         {"AttributeName": "reference", | |
|                          "AttributeType": "string"}, | |
|                         {"AttributeName": "location_id", | |
|                          "AttributeType": "string"}, | |
|                         {"AttributeName": "location_dest_id", | |
|                          "AttributeType": "string"}, | |
|                         {"AttributeName": "origin", | |
|                          "AttributeType": "string"}, | |
|                     ] | |
|                 } | |
|                 dataset_response = forecast_client.create_dataset( | |
|                     DatasetName=dataset_name, | |
|                     DatasetType='TARGET_TIME_SERIES', | |
|                     Domain='RETAIL', | |
|                     DataFrequency=self.forecast_frequency, | |
|                     Schema=schema, | |
|                     EncryptionConfig={ | |
|                         'RoleArn': self.role_arn, | |
|                         'KMSKeyArn': self.kms_arn, | |
|                     } | |
|                 ) | |
|                 self.write({ | |
|                     'dataset_arn': dataset_response['DatasetArn'] | |
|                 }) | |
|                 forecast_client.update_dataset_group( | |
|                     DatasetGroupArn=self.dataset_group_arn, | |
|                     DatasetArns=[self.dataset_arn]) | |
|                 self.write({ | |
|                     'state': 'import_dataset' | |
|                 }) | |
|             except forecast_client.exceptions.ClientError as e: | |
|                 raise UserError(e) | |
| 
 | |
|     def action_import_dataset(self): | |
|         """To import dataset from Amazon S3 bucket""" | |
|         values = self.forecast_values() | |
|         amazon_forecast = values['amazon_forecast'] | |
|         if amazon_forecast: | |
|             amazon_access_key = values['amazon_access_key'] | |
|             amazon_secret_access_key = values['amazon_secret_access_key'] | |
|             amazon_region = values['amazon_region'] | |
|             session = boto3.Session( | |
|                 aws_access_key_id=amazon_access_key, | |
|                 aws_secret_access_key=amazon_secret_access_key, | |
|                 region_name=amazon_region | |
|             ) | |
|             forecast_client = session.client('forecast') | |
|             try: | |
|                 response = forecast_client.create_dataset_import_job( | |
|                     DatasetImportJobName=self.import_job_name, | |
|                     DatasetArn=self.dataset_arn, | |
|                     DataSource={ | |
|                         'S3Config': { | |
|                             'Path': self.bucket_id.s3_uri, | |
|                             'RoleArn': self.role_arn | |
|                         } | |
|                     } | |
|                 ) | |
|                 self.write({ | |
|                     'import_job_arn': response['DatasetImportJobArn'], | |
|                     'state': 'predictor' | |
|                 }) | |
|                 while True: | |
|                     response = forecast_client.describe_dataset_import_job( | |
|                         DatasetImportJobArn=self.import_job_arn) | |
|                     status = response['Status'] | |
|                     if status == 'ACTIVE': | |
|                         break | |
|                     elif status == 'FAILED' or status == 'CREATE_FAILED': | |
|                         raise UserError(_('Error: Dataset Import Job failed.')) | |
|                         break | |
|                     else: | |
|                         time.sleep(10) | |
|             except forecast_client.exceptions.ClientError as e: | |
|                 raise UserError(e) | |
| 
 | |
|     def action_create_predictor(self): | |
|         """To create the predictor function for forecasting""" | |
|         values = self.forecast_values() | |
|         amazon_forecast = values['amazon_forecast'] | |
|         if amazon_forecast: | |
|             amazon_access_key = values['amazon_access_key'] | |
|             amazon_secret_access_key = values['amazon_secret_access_key'] | |
|             amazon_region = values['amazon_region'] | |
|             session = boto3.Session( | |
|                 aws_access_key_id=amazon_access_key, | |
|                 aws_secret_access_key=amazon_secret_access_key, | |
|                 region_name=amazon_region | |
|             ) | |
|             forecast_client = session.client('forecast') | |
|             try: | |
|                 response_group = forecast_client.describe_dataset_group( | |
|                     DatasetGroupArn=self.dataset_group_arn) | |
|                 dataset_arns = response_group['DatasetArns'] | |
|                 while True: | |
|                     all_datasets_imported = True | |
|                     for dataset_arn in dataset_arns: | |
|                         response = forecast_client.list_dataset_import_jobs( | |
|                             Filters=[{'Key': 'DatasetArn', | |
|                                       'Value': dataset_arn, | |
|                                       'Condition': 'IS'}]) | |
|                         import_jobs = response["DatasetImportJobs"] | |
|                         if (len(import_jobs) == 0 or | |
|                                 import_jobs[0]["Status"] != "ACTIVE"): | |
|                             all_datasets_imported = False | |
|                             break | |
|                     if all_datasets_imported: | |
|                         break | |
|                     time.sleep(10) | |
|                 response = forecast_client.describe_dataset( | |
|                     DatasetArn=self.dataset_arn) | |
|                 featurization_config = response['DataFrequency'] | |
|                 response = forecast_client.create_predictor( | |
|                     PredictorName=self.predictor_name, | |
|                     AlgorithmArn=self.predictor_algorithm, | |
|                     ForecastHorizon=1, | |
|                     PerformAutoML=False, | |
|                     PerformHPO=False, | |
|                     InputDataConfig={ | |
|                         'DatasetGroupArn': self.dataset_group_arn, | |
|                     }, | |
|                     FeaturizationConfig={ | |
|                         'ForecastFrequency': featurization_config, | |
|                     } | |
|                 ) | |
|                 self.write({ | |
|                     'predictor_arn': response['PredictorArn'], | |
|                     'state': 'forecast' | |
|                 }) | |
|             except forecast_client.exceptions.ClientError as e: | |
|                 raise UserError(e) | |
| 
 | |
|     def action_create_forecast(self): | |
|         """To create the forecast based on our data""" | |
|         values = self.forecast_values() | |
|         amazon_forecast = values['amazon_forecast'] | |
|         if amazon_forecast: | |
|             amazon_access_key = values['amazon_access_key'] | |
|             amazon_secret_access_key = values['amazon_secret_access_key'] | |
|             amazon_region = values['amazon_region'] | |
|             session = boto3.Session( | |
|                 aws_access_key_id=amazon_access_key, | |
|                 aws_secret_access_key=amazon_secret_access_key, | |
|                 region_name=amazon_region | |
|             ) | |
|             forecast_client = session.client('forecast') | |
|             try: | |
|                 response = forecast_client.create_forecast( | |
|                     ForecastName=self.forecast_name, | |
|                     PredictorArn=self.predictor_arn | |
|                 ) | |
|                 self.write({ | |
|                     'forecast_arn': response['ForecastArn'], | |
|                     'state': 'query_forecast' | |
|                 }) | |
|                 while True: | |
|                     response = forecast_client.describe_forecast( | |
|                         ForecastArn=response['ForecastArn']) | |
|                     status = response['Status'] | |
|                     if status == 'ACTIVE': | |
|                         break | |
|                     elif status == 'FAILED': | |
|                         raise UserError(_('Error: Forecast creation failed.')) | |
|                         break | |
|                     else: | |
|                         time.sleep(10) | |
|             except forecast_client.exceptions.ClientError as e: | |
|                 raise UserError(e) | |
|         time.sleep(60) | |
| 
 | |
|     def query_forecast(self): | |
|         """To get the forecast result""" | |
|         values = self.forecast_values() | |
|         amazon_forecast = values['amazon_forecast'] | |
|         if amazon_forecast: | |
|             amazon_access_key = values['amazon_access_key'] | |
|             amazon_secret_access_key = values['amazon_secret_access_key'] | |
|             amazon_region = values['amazon_region'] | |
|             session = boto3.Session( | |
|                 aws_access_key_id=amazon_access_key, | |
|                 aws_secret_access_key=amazon_secret_access_key, | |
|                 region_name=amazon_region | |
|             ) | |
|             forecast_client = session.client('forecastquery') | |
|             try: | |
|                 forecast_client.query_forecast( | |
|                     ForecastArn=self.forecast_arn, | |
|                     Filters={ | |
|                         'item_id': self.item_id | |
|                     } | |
|                 ) | |
|                 return { | |
|                     'type': 'ir.actions.client', | |
|                     'tag': 'forecast', | |
|                 } | |
|             except forecast_client.exceptions.ClientError as e: | |
|                 raise UserError(e) | |
| 
 | |
|     @api.model | |
|     def get_query_result(self): | |
|         """To get the response from the query forecast""" | |
|         values = self.forecast_values() | |
|         amazon_forecast = values['amazon_forecast'] | |
|         if amazon_forecast: | |
|             amazon_access_key = values['amazon_access_key'] | |
|             amazon_secret_access_key = values['amazon_secret_access_key'] | |
|             amazon_region = values['amazon_region'] | |
|             session = boto3.Session( | |
|                 aws_access_key_id=amazon_access_key, | |
|                 aws_secret_access_key=amazon_secret_access_key, | |
|                 region_name=amazon_region | |
|             ) | |
|             forecast_client = session.client('forecastquery') | |
|             data = self.search([], limit=1) | |
|             response = forecast_client.query_forecast( | |
|                 ForecastArn=data.forecast_arn, | |
|                 Filters={ | |
|                     'item_id': data.item_id | |
|                 } | |
|             ) | |
|             forecast_result = response['Forecast']['Predictions'] | |
|             return forecast_result
 | |
| 
 |