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.
		
		
		
		
		
			
		
			
				
					
					
						
							233 lines
						
					
					
						
							10 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							233 lines
						
					
					
						
							10 KiB
						
					
					
				| # -*- coding: utf-8 -*- | |
| ################################################################################ | |
| # | |
| #    Cybrosys Technologies Pvt. Ltd. | |
| # | |
| #    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>). | |
| #    Author: Unnimaya C O (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 requests | |
| from odoo import fields, models, _ | |
| from odoo.exceptions import ValidationError | |
| 
 | |
| 
 | |
| class ResUsers(models.Model): | |
|     """Inherits res users for including Trello fields and functions""" | |
|     _inherit = 'res.users' | |
| 
 | |
|     api_key = fields.Char(string='API KEY', | |
|                           help="It is used to connect with Trello") | |
|     token = fields.Char(string='Token', | |
|                         help="The token for connecting Odoo with Trello") | |
|     user_name = fields.Char(string='Trello Username', | |
|                             help="The member name used in Trello") | |
| 
 | |
|     _sql_constraints = [ | |
|         ('api_key_uniq', | |
|          'unique(api_key)', | |
|          'API Key must be unique per User !'), | |
|         ('username_uniq', | |
|          'unique(user_name)', | |
|          'Username must be unique per User !') | |
|     ] | |
| 
 | |
|     def action_import(self): | |
|         """Function that imports boards, lists and cards from Trello to Odoo""" | |
|         if not self.api_key or not self.token or not self.user_name: | |
|             raise ValidationError(_("Please fill all fields.")) | |
|         query = { | |
|             "key": self.api_key, | |
|             "token": self.token, | |
|         } | |
|         header = { | |
|             "Accept": "application/json" | |
|         } | |
|         member = self.get_member_id(header, self.user_name) | |
|         for board in self.get_boards(header, query, | |
|                                      member): | |
|             project = self.env['project.project'].sudo().search( | |
|                 [('trello_reference', '=', board['id'])]) | |
|             if not project: | |
|                 project = self.env['project.project'].sudo().create({ | |
|                     'name': board['name'], | |
|                     'description': board['desc'], | |
|                     'trello_reference': board['id'] | |
|                 }) | |
|             for rec in self.get_list_on_board(header, query, board['id']): | |
|                 stages = self.env[ | |
|                     'project.task.type'].search([]) | |
|                 if rec['name'] not in stages.mapped('name'): | |
|                     self.env['project.task.type'].sudo().create({ | |
|                         'name': rec['name'] | |
|                     }) | |
|                 project.sudo().write( | |
|                     {'type_ids': [(4, stages.search([( | |
|                         'name', '=', rec['name'])])[0].id, project.id)]}) | |
|             for card in self.get_cards(header, query, | |
|                                        board['id']): | |
|                 if card['id'] not in self.env['project.task'].search([]).mapped( | |
|                         'trello_reference'): | |
|                     self.env['project.task'].create({ | |
|                         'name': card['name'], | |
|                         'project_id': project.id, | |
|                         'stage_id': self.env[ | |
|                             'project.task.type'].search([('name', '=', | |
|                                                           self.get_a_list( | |
|                                                               header, query, | |
|                                                               card['idList'])[ | |
|                                                               'name'])])[0].id, | |
|                         'trello_reference': card['id'] | |
|                     }) | |
| 
 | |
|     def action_export(self): | |
|         """Function that exports Project, Stages and Tasks from Odoo to | |
|         Trello""" | |
|         if not self.api_key or not self.token or not self.user_name: | |
|             raise ValidationError(_("Please fill all fields")) | |
|         query = { | |
|             "key": self.api_key, | |
|             "token": self.token, | |
|         } | |
|         header = { | |
|             "Accept": "application/json" | |
|         } | |
|         for project in self.env['project.project'].search([]): | |
|             if not project.trello_reference: | |
|                 board = self.create_board(header, query, | |
|                                           project.name) | |
|                 project.write({ | |
|                     'trello_reference': board | |
|                 }) | |
|             lists_on_board = self.get_list_on_board(header, | |
|                                                     query, | |
|                                                     project.trello_reference) | |
|             for stage in project.type_ids: | |
|                 if stage.name not in [rec['name'] for rec in | |
|                                       lists_on_board]: | |
|                     list_ref = self.create_list(header, query, | |
|                                                 project.trello_reference, | |
|                                                 stage.name)['id'] | |
|                     self.env['project.task'].search( | |
|                         [('project_id', '=', project.id)]).filtered( | |
|                         lambda x: x.stage_id == stage).write({ | |
|                             'stage_reference': list_ref | |
|                         }) | |
|             for task in self.env['project.task'].search( | |
|                     [('project_id', '=', project.id)]).filtered( | |
|                         lambda x: x.display_project_id): | |
|                 for rec in lists_on_board: | |
|                     if rec['name'] == task.stage_id.name: | |
|                         task.write({ | |
|                             'stage_reference': rec['id'] | |
|                         }) | |
|                 if not task.trello_reference: | |
|                     card = self.create_card(header, query, | |
|                                             task.stage_reference, | |
|                                             task.name) | |
|                     task.write({ | |
|                         'trello_reference': card['id'] | |
|                     }) | |
| 
 | |
|     def get_member_id(self, headers, username): | |
|         """Returns member id of the user""" | |
|         response = requests.get( | |
|             f"https://api.trello.com/1/members/{username}", | |
|             headers=headers, timeout=10) | |
|         if response.status_code == 200: | |
|             return response.json()['id'] | |
|         if response.status_code == 404: | |
|             raise ValidationError(_('Please Check Your Credentials')) | |
|         raise ValidationError(_(response.text.capitalize())) | |
| 
 | |
|     def get_boards(self, headers, query, member_id): | |
|         """Returns details of all boards that a member belongs to""" | |
|         query['filter'] = 'open' | |
|         response = requests.get( | |
|             f"https://api.trello.com/1/members/{member_id}/boards", | |
|             headers=headers, timeout=10, params=query) | |
|         if response.status_code == 200: | |
|             return response.json() | |
|         raise ValidationError(_(response.text.capitalize())) | |
| 
 | |
|     def get_cards(self, headers, query, board_id): | |
|         """Returns all cards on a board""" | |
|         response = requests.get( | |
|             f"https://api.trello.com/1/boards/{board_id}/cards", | |
|             headers=headers, timeout=10, params=query) | |
|         if response.status_code == 200: | |
|             return response.json() | |
|         raise ValidationError(_(response.text.capitalize())) | |
| 
 | |
|     def get_list_on_board(self, headers, query, board_id): | |
|         """Returns all list of a board""" | |
|         response = requests.get( | |
|             f"https://api.trello.com/1/boards/{board_id}/lists", | |
|             headers=headers, timeout=10, params=query) | |
|         if response.status_code == 200: | |
|             return response.json() | |
|         raise ValidationError(_(response.text.capitalize())) | |
| 
 | |
|     def create_board(self, headers, query, name): | |
|         """Create new board in Trello""" | |
|         query['name'] = {name} | |
|         response = requests.post("https://api.trello.com/1/boards/", | |
|                                  headers=headers, params=query, | |
|                                  timeout=10) | |
|         if response.status_code == 200: | |
|             lists = requests.get( | |
|                 f"https://api.trello.com/1/boards/{response.json()['id']}/" | |
|                 f"lists", | |
|                 headers=headers, timeout=10, params=query) | |
|             if lists.status_code == 200: | |
|                 for rec in lists.json(): | |
|                     query['closed'] = 'true' | |
|                     requests.put( | |
|                         f"https://api.trello.com/1/lists/{rec['id']}", | |
|                         headers=headers, params=query, timeout=10) | |
|             query['closed'] = 'false' | |
|         else: | |
|             raise ValidationError(_(response.text.capitalize())) | |
|         return response.json()['id'] | |
| 
 | |
|     def create_list(self, headers, query, board_id, name): | |
|         """Create new list in Trello""" | |
|         query['name'] = {name} | |
|         response = requests.post( | |
|             f"https://api.trello.com/1/boards/{board_id}/lists", | |
|             headers=headers, timeout=10, params=query) | |
|         if response.status_code == 200: | |
|             return response.json() | |
|         raise ValidationError(_(response.text.capitalize())) | |
| 
 | |
|     def create_card(self, headers, query, list_id, name): | |
|         """Create new card in Trello""" | |
|         query['idList'] = list_id | |
|         query['name'] = {name} | |
|         response = requests.post( | |
|             "https://api.trello.com/1/cards", headers=headers, | |
|             params=query, timeout=10) | |
|         if response.status_code == 200: | |
|             return response.json() | |
|         raise ValidationError(_(response.text.capitalize())) | |
| 
 | |
|     def get_a_list(self, headers, query, list_id): | |
|         """Method for fetching a list""" | |
|         response = requests.get( | |
|             f"https://api.trello.com/1/lists/{list_id}", headers=headers, | |
|             params=query, timeout=10) | |
|         if response.status_code == 200: | |
|             return response.json() | |
|         raise ValidationError(_(response.text.capitalize()))
 | |
| 
 |