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.
		
		
		
		
		
			
		
			
				
					
					
						
							170 lines
						
					
					
						
							6.8 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							170 lines
						
					
					
						
							6.8 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ############################################################################### | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | |
| #    Author:  Cybrosys Techno Solutions(<https://www.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 logging | |
| import requests | |
| from odoo import fields, models, _ | |
| from odoo.exceptions import ValidationError | |
| 
 | |
| _logger = logging.getLogger(__name__) | |
| try: | |
|     import asana | |
| except ImportError: | |
|     _logger.debug('Cannot `import asana`.') | |
| 
 | |
| 
 | |
| def action_notify(success): | |
|     """ | |
|     Method action_notify used to notify whether the connection to the asana is | |
|     successful or not. | |
|     """ | |
|     notification = { | |
|         'type': 'ir.actions.client', | |
|         'tag': 'display_notification', | |
|         'params': { | |
|             'title': _('Connection successful!') if success is True else _( | |
|                 'Connection not successful!'), | |
|             'message': 'Connection to Asana is successful.' if success is True else 'Connection to Asana is not successful.', | |
|             'sticky': True, | |
|             'type': 'success' if success is True else 'danger' | |
|         } | |
|     } | |
|     return notification | |
| 
 | |
| 
 | |
| def action_import_project_stages(project_gid, api_client): | |
|     """ | |
|     Method action_import_project_stages used to import the project stages from | |
|     asana to odoo | |
|     """ | |
|     api_instance = asana.SectionsApi(api_client) | |
|     section_response = api_instance.get_sections_for_project( | |
|         project_gid) | |
|     return section_response | |
| 
 | |
| 
 | |
| class ResConfigSettings(models.TransientModel): | |
|     """ | |
|     Inherits the model Res Config Settings to add extra fields and | |
|     functionalities to this model | |
|     """ | |
|     _inherit = 'res.config.settings' | |
| 
 | |
|     workspace_gid = fields.Char(string='Workspace ID', | |
|                                 help='ID of the workspace in asana', | |
|                                 config_parameter='asana_odoo_connector.workspace_gid') | |
|     app_token = fields.Char(string='App Token', | |
|                             help='Personal Access Token of the corresponding ' | |
|                                  'asana account', | |
|                             config_parameter='asana_odoo_connector.app_token') | |
| 
 | |
|     def action_test_asana(self): | |
|         """ | |
|         Method action_test_asana to test the connection from odoo to asana | |
|         """ | |
|         workspace_gid = self.workspace_gid | |
|         api_endpoint = f'https://app.asana.com/api/1.0/workspaces/{workspace_gid}' | |
|         access_token = self.app_token | |
|         headers = { | |
|             'Authorization': f'Bearer {access_token}', | |
|         } | |
|         response = requests.get(api_endpoint, headers=headers, timeout=10) | |
|         if response.status_code == 200: | |
|             success = True | |
|             notification = action_notify(success) | |
|             self.env['ir.config_parameter'].sudo().set_param( | |
|                 'asana_odoo_connector.connection_successful', True) | |
|             return notification | |
|         success = False | |
|         notification = action_notify(success) | |
|         return notification | |
| 
 | |
|     def action_import_projects(self): | |
|         """ | |
|         Method action_import_projects to import the project from asana to odoo | |
|         """ | |
|         configuration = asana.Configuration() | |
|         configuration.access_token = self.app_token | |
|         api_client = asana.ApiClient(configuration) | |
|         project_instance = asana.ProjectsApi(api_client) | |
|         section_instance = asana.SectionsApi(api_client) | |
|         workspace = self.workspace_gid | |
|         opts = { | |
|             'workspace': workspace | |
|         } | |
|         try: | |
|             project_response = project_instance.get_projects(opts) | |
|             for project in project_response: | |
|                 asana_gid = project['gid'] | |
|                 existing_project = self.env['project.project'].search( | |
|                     [('asana_gid', '=', asana_gid)]) | |
|                 if not existing_project: | |
|                     opts = {} | |
|                     section_data = section_instance.get_sections_for_project( | |
|                         asana_gid, opts) | |
|                     type_ids = [ | |
|                         (0, 0, {'name': section['name'], | |
|                                 'asana_gid': section['gid']}) | |
|                         for section in section_data] | |
|                     new_project = self.env['project.project'].create({ | |
|                         'name': project['name'], | |
|                         'asana_gid': asana_gid, | |
|                         'type_ids': type_ids | |
|                     }) | |
|                     self.action_import_tasks( | |
|                         api_client=api_client, | |
|                         project_id=new_project.id, | |
|                         asana_gid= asana_gid) | |
|                 else: | |
|                     self.action_import_tasks( | |
|                         api_client=api_client, | |
|                         project_id=existing_project.id, | |
|                         asana_gid=asana_gid) | |
|         except Exception as exc: | |
|             raise ValidationError( | |
|                 _('Please check the workspace ID or the app token')) from exc | |
| 
 | |
|     def action_import_tasks(self, api_client, project_id, asana_gid): | |
|         """ | |
|         Method action_import_tasks to import tasks from the asana to odoo | |
|         """ | |
|         api_instance = asana.TasksApi(api_client) | |
|         section_instance = asana.SectionsApi(api_client) | |
|         opts = {} | |
|         section_data = section_instance.get_sections_for_project(asana_gid, | |
|                                                                  opts) | |
|         for section in section_data: | |
|             opts ={} | |
|             task_response = api_instance.get_tasks_for_section(section['gid'], | |
|                                                                opts) | |
|             for task in task_response: | |
|                 existing_task = self.env['project.task'].search( | |
|                     [('asana_gid', '=', task['gid']), | |
|                      ('project_id', '=', project_id)]) | |
|                 if not existing_task: | |
|                     self.env['project.task'].create({ | |
|                         'name': task['name'], | |
|                         'project_id': project_id, | |
|                         'asana_gid': task['gid'], | |
|                         'stage_id': self.env['project.task.type'].search( | |
|                             [('asana_gid', '=', section['gid']), | |
|                              ('project_ids', '=', project_id)]).id, | |
|                     })
 | |
| 
 |