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

# -*- 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)