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
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							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})
							 | 
						|
								
							 |