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.
		
		
		
		
		
			
		
			
				
					
					
						
							160 lines
						
					
					
						
							7.2 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							160 lines
						
					
					
						
							7.2 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								##############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
							 | 
						|
								#    Author: Dhanya B (odoo@cybrosys.com)
							 | 
						|
								#
							 | 
						|
								#    You can modify it under the terms of the GNU LESSER
							 | 
						|
								#    GENERAL PUBLIC LICENSE (LGPL 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 LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
							 | 
						|
								#
							 | 
						|
								#    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
							 | 
						|
								#    (LGPL v3) along with this program.
							 | 
						|
								#    If not, see <http://www.gnu.org/licenses/>.
							 | 
						|
								#
							 | 
						|
								##############################################################################
							 | 
						|
								import json
							 | 
						|
								import requests
							 | 
						|
								from requests.auth import HTTPBasicAuth
							 | 
						|
								from odoo import api, fields, models, _
							 | 
						|
								from odoo.exceptions import ValidationError
							 | 
						|
								
							 | 
						|
								# The Header parameters
							 | 
						|
								HEADERS = {'Accept': 'application/json', 'Content-Type': 'application/json'}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class ProjectProject(models.Model):
							 | 
						|
								    """
							 | 
						|
								    This class is inherited for adding some extra field and override the
							 | 
						|
								    create and write function also to add function to show sprint
							 | 
						|
								    Methods:
							 | 
						|
								        create(vals_list):
							 | 
						|
								            extends create() to export project to Jira
							 | 
						|
								        write(vals):
							 | 
						|
								            extends write() to update corresponding project in Jira
							 | 
						|
								    """
							 | 
						|
								    _inherit = 'project.project'
							 | 
						|
								
							 | 
						|
								    project_id_jira = fields.Integer(string='Jira Project ID',
							 | 
						|
								                                     help='Corresponding project id of Jira.',
							 | 
						|
								                                     readonly=True)
							 | 
						|
								    jira_project_key = fields.Char(string='Jira Project Key',
							 | 
						|
								                                   help='Corresponding project key of Jira.',
							 | 
						|
								                                   readonly=True)
							 | 
						|
								    sprint_active = fields.Boolean(string='Sprint active',
							 | 
						|
								                                   help='To show sprint smart button.')
							 | 
						|
								    board_id_jira = fields.Integer(string='Jira Board ID',
							 | 
						|
								                                   help='Corresponding Board id of Jira.',
							 | 
						|
								                                   readonly=True)
							 | 
						|
								
							 | 
						|
								    def action_get_sprint(self):
							 | 
						|
								        """Getting sprint inside the project"""
							 | 
						|
								        return {
							 | 
						|
								            'type': 'ir.actions.act_window',
							 | 
						|
								            'name': 'Sprints',
							 | 
						|
								            'view_mode': 'tree,form',
							 | 
						|
								            'res_model': 'jira.sprint',
							 | 
						|
								            'context': {'default_project_id': self.id},
							 | 
						|
								            'domain': [('project_id', '=', self.id)],
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								    @api.model_create_multi
							 | 
						|
								    def create(self, vals_list):
							 | 
						|
								        """ Overrides create method of project to export project to Jira """
							 | 
						|
								        self = self.with_context(mail_create_nosubscribe=True)
							 | 
						|
								        projects = super().create(vals_list)
							 | 
						|
								        jira_connection = self.env['ir.config_parameter'].sudo().get_param(
							 | 
						|
								            'odoo_jira_connector.connection')
							 | 
						|
								        if jira_connection:
							 | 
						|
								            jira_url = self.env['ir.config_parameter'].sudo().get_param(
							 | 
						|
								                'odoo_jira_connector.url', False)
							 | 
						|
								            user = self.env['ir.config_parameter'].sudo().get_param(
							 | 
						|
								                'odoo_jira_connector.user_id_jira', False)
							 | 
						|
								            password = self.env['ir.config_parameter'].sudo().get_param(
							 | 
						|
								                'odoo_jira_connector.api_token', False)
							 | 
						|
								            auth = HTTPBasicAuth(user, password)
							 | 
						|
								            project_headers = {'Accept': 'application/json'}
							 | 
						|
								            response = requests.request(
							 | 
						|
								                'GET', jira_url + '/rest/api/3/project/',
							 | 
						|
								                headers=project_headers, auth=auth)
							 | 
						|
								            projects_json = json.dumps(
							 | 
						|
								                json.loads(response.text), sort_keys=True, indent=4,
							 | 
						|
								                separators=(',', ': '))
							 | 
						|
								            project_json = json.loads(projects_json)
							 | 
						|
								            name_list = [project['name'] for project in project_json]
							 | 
						|
								            key = projects.name.upper()
							 | 
						|
								            project_key = key[:3] + '1' + key[-3:]
							 | 
						|
								            project_keys = project_key.replace(' ', '')
							 | 
						|
								            auth = HTTPBasicAuth(user, password)
							 | 
						|
								            project_payload = {
							 | 
						|
								                'name': projects.name, 'key': project_keys,
							 | 
						|
								                'templateKey': 'com.pyxis.greenhopper.jira:gh-simplified'
							 | 
						|
								                               '-kanban-classic'
							 | 
						|
								            }
							 | 
						|
								            if projects.name not in name_list:
							 | 
						|
								                response = requests.request(
							 | 
						|
								                    'POST', jira_url + 'rest/simplified/latest/project',
							 | 
						|
								                    data=json.dumps(project_payload),
							 | 
						|
								                    headers=HEADERS, auth=auth)
							 | 
						|
								                data = response.json()
							 | 
						|
								                if 'projectId' in data:
							 | 
						|
								                    projects.write({'project_id_jira': data['projectId'],
							 | 
						|
								                                    'jira_project_key': data['projectKey']})
							 | 
						|
								                    self.env['ir.config_parameter'].sudo().set_param(
							 | 
						|
								                        'import_project_count', int(
							 | 
						|
								                            self.env['ir.config_parameter'].sudo().get_param(
							 | 
						|
								                                'import_project_count')) + 1)
							 | 
						|
								                elif 'errors' in data and 'projectName' in data['errors']:
							 | 
						|
								                    raise ValidationError(
							 | 
						|
								                        "A project with this name already exists. Please "
							 | 
						|
								                        "rename the project.")
							 | 
						|
								                elif 'errors' in data and 'projectKey' in data['errors']:
							 | 
						|
								                    raise ValidationError(data['errors']['projectKey'])
							 | 
						|
								        return projects
							 | 
						|
								
							 | 
						|
								    def write(self, vals):
							 | 
						|
								        """ Overrides the write method of project.project to update project
							 | 
						|
								        name in Jira when we update the project in Odoo"""
							 | 
						|
								
							 | 
						|
								        jira_connection = self.env['ir.config_parameter'].sudo().get_param(
							 | 
						|
								            'odoo_jira_connector.connection')
							 | 
						|
								        if jira_connection:
							 | 
						|
								            for project in self:
							 | 
						|
								                jira_url = self.env['ir.config_parameter'].sudo().get_param(
							 | 
						|
								                    'odoo_jira_connector.url')
							 | 
						|
								                user = self.env['ir.config_parameter'].sudo().get_param(
							 | 
						|
								                    'odoo_jira_connector.user_id_jira')
							 | 
						|
								                password = self.env['ir.config_parameter'].sudo().get_param(
							 | 
						|
								                    'odoo_jira_connector.api_token')
							 | 
						|
								                auth = (user, password)
							 | 
						|
								                headers = {
							 | 
						|
								                    "Accept": "application/json",
							 | 
						|
								                    "Content-Type": "application/json"
							 | 
						|
								                }
							 | 
						|
								                url = (f"{jira_url}/rest/api/3/project/"
							 | 
						|
								                       f"{project.jira_project_key}")
							 | 
						|
								                payload = json.dumps({
							 | 
						|
								                    "name": vals.get('name'),
							 | 
						|
								                })
							 | 
						|
								                payload_json = json.loads(payload)
							 | 
						|
								                response = requests.get(
							 | 
						|
								                    url,
							 | 
						|
								                    headers=headers,
							 | 
						|
								                    auth=auth)
							 | 
						|
								                data = response.json()
							 | 
						|
								                if 'name' in data:
							 | 
						|
								                    if data['name'] != payload_json['name']:
							 | 
						|
								                        requests.request(
							 | 
						|
								                            "PUT",
							 | 
						|
								                            url, data=payload, headers=headers, auth=auth)
							 | 
						|
								                else:
							 | 
						|
								                    requests.request(
							 | 
						|
								                        "PUT",
							 | 
						|
								                        url, data=payload, headers=headers, auth=auth)
							 | 
						|
								            return super(ProjectProject, self).write(vals)
							 | 
						|
								
							 |