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.
 
 
 
 
 

113 lines
5.6 KiB

# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Cybrosys Techno Solutions (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 base64
import json
from odoo import _
from odoo.exceptions import ValidationError
from odoo.http import request
from psycopg2 import IntegrityError
from odoo.addons.website_form.controllers.main import WebsiteForm
class WebsiteForm(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):
"""Handle the submission of a website form. This function processes
the submitted form data based on the provided model name.Which will
returns encoded response containing the result of the form
submission"""
if model_name == 'help.ticket':
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': request.env['ticket.stage'].search(
[('name', '=', 'Inbox')], limit=1).id,
}
partner = request.env['res.partner'].sudo().search(
[('name', '=', kwargs.get('customer_name')),
('email', '=', kwargs.get('email_from'))], order='id asc',
limit=1)
rec_val['customer_id'] = partner.id if partner else None
rec_val['public_ticket'] = not partner
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})