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()))
							 | 
						|
								
							 |