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.
173 lines
8.7 KiB
173 lines
8.7 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 base64
|
|
import json
|
|
from odoo import _, http
|
|
from psycopg2 import IntegrityError
|
|
from odoo.http import request
|
|
from odoo.exceptions import ValidationError
|
|
from odoo.addons.website.controllers.form import WebsiteForm
|
|
|
|
|
|
class HelpdeskProduct(http.Controller):
|
|
"""It controls the website products and return the product."""
|
|
@http.route('/product', auth='public', type='json')
|
|
def product(self):
|
|
"""Product control function"""
|
|
products = request.env['product.template'].sudo().search_read([],
|
|
['name',
|
|
'id'])
|
|
return products
|
|
|
|
|
|
class WebsiteFormInherit(WebsiteForm):
|
|
"""This module extends the functionality of the website form controller
|
|
to handle the creation of new help desk tickets. It provides a new
|
|
controller to display a list of tickets for the current user in their
|
|
portal, and overrides the website form controller's method for handling
|
|
form submissions to create a new help desk ticket instead."""
|
|
def _handle_website_form(self, model_name, **kwargs):
|
|
"""Website Help Desk Form"""
|
|
if model_name == 'help.ticket':
|
|
tickets = request.env['ticket.stage'].sudo().search([])
|
|
for rec in tickets:
|
|
sequence = tickets.mapped('sequence')
|
|
lowest_sequence = tickets.filtered(
|
|
lambda x: x.sequence == min(sequence))
|
|
if rec == lowest_sequence:
|
|
lowest_stage_id = lowest_sequence
|
|
products = kwargs.get('product')
|
|
partner_create = request.env['res.partner'].sudo().create({
|
|
'name':kwargs.get('customer_name'),
|
|
'company_name':kwargs.get('company'),
|
|
'phone':kwargs.get('phone'),
|
|
'email':kwargs.get('email_from')
|
|
})
|
|
if products:
|
|
splited_product = products.split(',')
|
|
product_list = [int(i) for i in splited_product]
|
|
rec_val = {
|
|
'customer_name': kwargs.get('customer_name'),
|
|
'subject': kwargs.get('subject'),
|
|
'description': kwargs.get('description'),
|
|
'email': kwargs.get('email_from'),
|
|
'phone': kwargs.get('phone'),
|
|
'priority': kwargs.get('priority'),
|
|
'product_ids': product_list,
|
|
'stage_id': lowest_stage_id.id,
|
|
'customer_id': partner_create.id,
|
|
'ticket_type': kwargs.get('ticket_type'),
|
|
'category_id': kwargs.get('category'),
|
|
}
|
|
ticket_id = request.env['help.ticket'].sudo().create(rec_val)
|
|
request.session['ticket_number'] = ticket_id.name
|
|
request.session['ticket_id'] = ticket_id.id
|
|
model_record = request.env['ir.model'].sudo().search(
|
|
[('model', '=', model_name)])
|
|
data = self.extract_data(model_record, request.params)
|
|
if ('ticket_attachment' in request.params or
|
|
request.httprequest.files or data.get(
|
|
'attachments')):
|
|
attached_files = data.get('attachments')
|
|
for attachment in attached_files:
|
|
attached_file = attachment.read()
|
|
request.env['ir.attachment'].sudo().create({
|
|
'name': attachment.filename,
|
|
'res_model': 'help.ticket',
|
|
'res_id': ticket_id.id,
|
|
'type': 'binary',
|
|
'datas': base64.encodebytes(attached_file),
|
|
})
|
|
request.session[
|
|
'form_builder_model_model'] = model_record.model
|
|
request.session['form_builder_model'] = model_record.name
|
|
request.session['form_builder_id'] = ticket_id.id
|
|
return json.dumps({'id': ticket_id.id})
|
|
else:
|
|
rec_val = {
|
|
'customer_name': kwargs.get('customer_name'),
|
|
'subject': kwargs.get('subject'),
|
|
'description': kwargs.get('description'),
|
|
'email': kwargs.get('email_from'),
|
|
'phone': kwargs.get('phone'),
|
|
'priority': kwargs.get('priority'),
|
|
'stage_id': lowest_stage_id.id,
|
|
'customer_id': partner_create.id,
|
|
'ticket_type': kwargs.get('ticket_type'),
|
|
'category_id': kwargs.get('category'),
|
|
}
|
|
ticket_id = request.env['help.ticket'].sudo().create(rec_val)
|
|
request.session['ticket_number'] = ticket_id.name
|
|
request.session['ticket_id'] = ticket_id.id
|
|
model_record = request.env['ir.model'].sudo().search(
|
|
[('model', '=', model_name)])
|
|
data = self.extract_data(model_record, request.params)
|
|
if ('ticket_attachment' in request.params or
|
|
request.httprequest.files or data.get(
|
|
'attachments')):
|
|
attached_files = data.get('attachments')
|
|
for attachment in attached_files:
|
|
attached_file = attachment.read()
|
|
request.env['ir.attachment'].sudo().create({
|
|
'name': attachment.filename,
|
|
'res_model': 'help.ticket',
|
|
'res_id': ticket_id.id,
|
|
'type': 'binary',
|
|
'datas': base64.encodebytes(attached_file),
|
|
})
|
|
request.session['form_builder_model_model'] = model_record.model
|
|
request.session['form_builder_model'] = model_record.name
|
|
request.session['form_builder_id'] = ticket_id.id
|
|
return json.dumps({'id': ticket_id.id})
|
|
else:
|
|
model_record = request.env['ir.model'].sudo().search(
|
|
[('model', '=', model_name)])
|
|
if not model_record:
|
|
return json.dumps({
|
|
'error': _("The form's specified model does not exist")
|
|
})
|
|
try:
|
|
data = self.extract_data(model_record, request.params)
|
|
# If we encounter an issue while extracting data
|
|
except ValidationError as e:
|
|
return json.dumps({'error_fields': e.args[0]})
|
|
try:
|
|
id_record = self.insert_record(request, model_record,
|
|
data['record'], data['custom'],
|
|
data.get('meta'))
|
|
if id_record:
|
|
self.insert_attachment(model_record, id_record,
|
|
data['attachments'])
|
|
# In case of an email, we want to send it immediately instead of waiting
|
|
# For the email queue to process
|
|
if model_name == 'mail.mail':
|
|
request.env[model_name].sudo().browse(id_record).send()
|
|
|
|
# Some fields have additional SQL constraints that we can't check generically
|
|
# Ex: crm.lead.probability which is a float between 0 and 1
|
|
# TODO: How to get the name of the erroneous field ?
|
|
except IntegrityError:
|
|
return json.dumps(False)
|
|
request.session['form_builder_model_model'] = model_record.model
|
|
request.session['form_builder_model'] = model_record.name
|
|
request.session['form_builder_id'] = id_record
|
|
return json.dumps({'id': id_record})
|
|
|