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.
232 lines
10 KiB
232 lines
10 KiB
# -*- coding: utf-8 -*-
|
|
#############################################################################
|
|
#
|
|
# Cybrosys Technologies Pvt. Ltd.
|
|
#
|
|
# Copyright (C) 2023-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 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 odoo import fields, models, _
|
|
from odoo.exceptions import UserError
|
|
|
|
|
|
class HelpTicket(models.Model):
|
|
"""In this class there are functions for create a ticket in to zendesk,
|
|
update a ticket, and delete a ticket from zendesk"""
|
|
_inherit = 'help.ticket'
|
|
|
|
zendesk_ticket_no = fields.Char(string='Zendesk Ticket Id',
|
|
help='Shows the Id of ticket in Zendesk',
|
|
readonly=True)
|
|
is_ticket_from_zendesk = fields.Boolean(string='Ticket From Zendesk',
|
|
help='Is this a ticket from'
|
|
' Zendesk')
|
|
email = fields.Char(string='Email', help='Shows the email of the customer',
|
|
required=True)
|
|
|
|
def action_create_to_zendesk(self):
|
|
"""This function will help to create a ticket in to the zendesk"""
|
|
company_domain = self.env['ir.config_parameter'].sudo().get_param(
|
|
'odoo_zendesk_connector.company_domain')
|
|
company_email = self.env['ir.config_parameter'].sudo().get_param(
|
|
'odoo_zendesk_connector.company_email')
|
|
password = self.env['ir.config_parameter'].sudo().get_param(
|
|
'odoo_zendesk_connector.password')
|
|
# Searching for the existence of the tickets in the zendesk
|
|
if self.zendesk_ticket_no:
|
|
zen_id_search_url = f'https://{company_domain}.zendesk.com/api/v2/tickets/{self.zendesk_ticket_no}.json'
|
|
zen_id_search_response = requests.get(zen_id_search_url, timeout=180,
|
|
auth=(company_email, password))
|
|
if zen_id_search_response.status_code == 200:
|
|
return {
|
|
'type': 'ir.actions.client',
|
|
'tag': 'display_notification',
|
|
'params': {
|
|
'title': _("Warning"),
|
|
'message': _("Ticket already exist"),
|
|
'sticky': False,
|
|
},
|
|
}
|
|
priority = {
|
|
'1': 'low',
|
|
'2': 'normal',
|
|
'3': 'high',
|
|
'4': 'urgent'
|
|
}
|
|
zen_prio = 'None'
|
|
if self.priority in priority:
|
|
zen_prio = priority[self.priority]
|
|
headers = {'content-type': 'application/json'}
|
|
# Url for searching whether the in the customer is already existing in
|
|
# zendesk
|
|
customer_search_url = f'https://{company_domain}.zendesk.com/api/v2/users/search.json?query=email:{self.email}'
|
|
search_response = requests.get(customer_search_url,
|
|
auth=(company_email, password),
|
|
timeout=20)
|
|
if search_response.status_code == 200:
|
|
results = search_response.json().get('users')
|
|
if results and len(results) > 0:
|
|
# Customer already exists, use existing ID
|
|
customer_id = results[0]['id']
|
|
else:
|
|
# Customer does not exists
|
|
data = {
|
|
'user': {
|
|
'name': self.customer_id.name,
|
|
'email': self.email,
|
|
}
|
|
}
|
|
# Url for creating new user in zendesk
|
|
user_url = f'https://{company_domain}.zendesk.com/api/v2/users.json'
|
|
user_response = requests.post(user_url, json=data,
|
|
auth=(company_email, password),
|
|
headers=headers)
|
|
if user_response.status_code == 201:
|
|
# User created successfully, get new ID
|
|
customer_id = user_response.json().get('user').get('id')
|
|
else:
|
|
raise UserError(_(user_response.json()['error']))
|
|
# Details for creating a Zendesk ticket
|
|
data = {'ticket': {'subject': self.subject, 'priority': zen_prio,
|
|
'comment': {'body': self.description},
|
|
'requester_id': customer_id}}
|
|
# Url for creating a ticket in Zendesk
|
|
url = f'https://{company_domain}.zendesk.com/api/v2/tickets.json'
|
|
response = requests.post(url, data=json.dumps(data),
|
|
auth=(company_email, password),
|
|
headers=headers)
|
|
if response.json().get("ticket"):
|
|
self.zendesk_ticket_no = response.json()['ticket']['id']
|
|
if response.status_code != 201:
|
|
return {
|
|
'type': 'ir.actions.client',
|
|
'tag': 'display_notification',
|
|
'params': {
|
|
'title': _("Error!"),
|
|
'message': _("Creation of Zendesk ticket seems to be "
|
|
"failed!"),
|
|
'sticky': False,
|
|
}
|
|
}
|
|
|
|
return {
|
|
'type': 'ir.actions.client',
|
|
'tag': 'display_notification',
|
|
'params': {
|
|
'title': _("Success!"),
|
|
'message': _("Successfully Created the ticket to Zendesk"),
|
|
'sticky': False,
|
|
}
|
|
}
|
|
|
|
def action_update_zendesk_ticket(self):
|
|
"""This function is used to update a ticket from oddo"""
|
|
company_domain = self.env['ir.config_parameter'].sudo().get_param(
|
|
'odoo_zendesk_connector.company_domain')
|
|
company_email = self.env['ir.config_parameter'].sudo().get_param(
|
|
'odoo_zendesk_connector.company_email')
|
|
password = self.env['ir.config_parameter'].sudo().get_param(
|
|
'odoo_zendesk_connector.password')
|
|
zen_id = self.zendesk_ticket_no
|
|
priority = {
|
|
'1': 'low',
|
|
'2': 'normal',
|
|
'3': 'high',
|
|
'4': 'urgent'
|
|
}
|
|
zen_prio = 'None'
|
|
if self.priority in priority:
|
|
zen_prio = priority[self.priority]
|
|
data = {
|
|
'ticket': {
|
|
'comment': {'body': self.description},
|
|
'priority': zen_prio,
|
|
'subject': self.subject,
|
|
'requester': {
|
|
'name': self.customer_name, # Add the customer name field
|
|
'email': self.email # Add the customer email field
|
|
}
|
|
}
|
|
}
|
|
# Url that access the updating ticket in zendesk
|
|
url = f'https://{company_domain}.zendesk.com/api/v2/tickets/{zen_id}.json'
|
|
headers = {'content-type': 'application/json'}
|
|
# Do the HTTP put request
|
|
response = requests.put(url, data=json.dumps(data),
|
|
auth=(company_email, password),
|
|
headers=headers)
|
|
# Check for HTTP codes other than 200
|
|
if response.status_code != 200:
|
|
# Error in Updating ticket
|
|
return {
|
|
'type': 'ir.actions.client',
|
|
'tag': 'display_notification',
|
|
'params': {
|
|
'title': _("Error!"),
|
|
'message': _("Updation of the ticket seems to be failed"),
|
|
'sticky': False,
|
|
}
|
|
}
|
|
# Successfully updated the ticket
|
|
return {
|
|
'type': 'ir.actions.client',
|
|
'tag': 'display_notification',
|
|
'params': {
|
|
'title': _("Success!"),
|
|
'message': _("Successfully Updated the ticket"),
|
|
'sticky': False,
|
|
}
|
|
}
|
|
|
|
def action_delete_zendesk_ticket(self):
|
|
"""This function is used to delete a ticket from zendesk"""
|
|
company_domain = self.env['ir.config_parameter'].sudo().get_param(
|
|
'odoo_zendesk_connector.company_domain')
|
|
company_email = self.env['ir.config_parameter'].sudo().get_param(
|
|
'odoo_zendesk_connector.company_email')
|
|
password = self.env['ir.config_parameter'].sudo().get_param(
|
|
'odoo_zendesk_connector.password')
|
|
zendesk_id = self.zendesk_ticket_no
|
|
# Set up the API request headers and URL
|
|
headers = {'Content-Type': 'application/json'}
|
|
# Url for finding the ticket which want to be deleted
|
|
url = f'https://{company_domain}.zendesk.com/api/v2/tickets/{zendesk_id}.json'
|
|
response = requests.delete(url, auth=(company_email, password),
|
|
headers=headers, timeout=180)
|
|
if response.status_code == 204:
|
|
# Ticket deleted successfully
|
|
return {
|
|
'type': 'ir.actions.client',
|
|
'tag': 'display_notification',
|
|
'params': {
|
|
'title': _("Success!"),
|
|
'message': _("Successfully deleted the tickets"),
|
|
'sticky': False,
|
|
}
|
|
}
|
|
else:
|
|
# Have issue in deleting the ticket
|
|
return {
|
|
'type': 'ir.actions.client',
|
|
'tag': 'display_notification',
|
|
'params': {
|
|
'title': _("Error"),
|
|
'message': _("Have issues with deleting the ticket"),
|
|
'sticky': False,
|
|
}
|
|
}
|
|
|