PURPOSE Remove complex or technical code adding few value. RATIONALE phone.validation.mixin is used in two models: crm.lead and res.partner. It only add a phone_format method used in onchange. We can inline this code in those two models and remove the whole mixin itself. It lessens inherit and class complexity. SPECIFICATIONS Remove phone.validation.mixin. Inline code in crm.lead (CRM application) and res.partner (phone validation module). Make phone_format private as it is now some internal tool method on those two models. Everything should behave as before this commit. No functional change is intended. LINKS Task ID-2416789 COM PR odoo/odoo#63333 ENT PR odoo/enterprise#15296 UPG PR odoo/upgrade#2025 Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
81 lines
4.1 KiB
Python
81 lines
4.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import http
|
|
from odoo.addons.phone_validation.tools import phone_validation
|
|
from odoo.addons.website_form.controllers import main
|
|
from odoo.http import request
|
|
|
|
|
|
class WebsiteForm(main.WebsiteForm):
|
|
|
|
def _get_country(self):
|
|
country_code = request.session.geoip and request.session.geoip.get('country_code') or False
|
|
if country_code:
|
|
return request.env['res.country'].sudo().search([('code', '=', country_code)], limit=1)
|
|
return request.env['res.country']
|
|
|
|
def _get_phone_fields_to_validate(self):
|
|
return ['phone', 'mobile']
|
|
|
|
# Check and insert values from the form on the model <model> + validation phone fields
|
|
def _handle_website_form(self, model_name, **kwargs):
|
|
model_record = request.env['ir.model'].sudo().search([('model', '=', model_name), ('website_form_access', '=', True)])
|
|
if model_record and hasattr(request.env[model_name], '_phone_format') or hasattr(request.env[model_name], 'phone_get_sanitized_number'):
|
|
# filter on either custom _phone_format method, either phone_get_sanitized_number but directly
|
|
# call phone_format from phone validation herebelow to simplify things as we don't have real
|
|
# records but a dictionary of value at this point (record.phone_get_sanitized_number would
|
|
# not work)
|
|
try:
|
|
data = self.extract_data(model_record, request.params)
|
|
except:
|
|
# no specific management, super will do it
|
|
pass
|
|
else:
|
|
record = data.get('record', {})
|
|
phone_fields = self._get_phone_fields_to_validate()
|
|
country = request.env['res.country'].browse(record.get('country_id'))
|
|
contact_country = country if country.exists() else self._get_country()
|
|
for phone_field in phone_fields:
|
|
if not record.get(phone_field):
|
|
continue
|
|
number = record[phone_field]
|
|
fmt_number = phone_validation.phone_format(
|
|
number, contact_country.code if contact_country else None,
|
|
contact_country.phone_code if contact_country else None,
|
|
force_format='INTERNATIONAL',
|
|
raise_exception=False
|
|
)
|
|
request.params.update({phone_field: fmt_number})
|
|
|
|
if model_name == 'crm.lead' and not request.params.get('state_id'):
|
|
geoip_country_code = request.session.get('geoip', {}).get('country_code')
|
|
geoip_state_code = request.session.get('geoip', {}).get('region')
|
|
if geoip_country_code and geoip_state_code:
|
|
state = request.env['res.country.state'].search([('code', '=', geoip_state_code), ('country_id.code', '=', geoip_country_code)])
|
|
if state:
|
|
request.params['state_id'] = state.id
|
|
return super(WebsiteForm, self)._handle_website_form(model_name, **kwargs)
|
|
|
|
def insert_record(self, request, model, values, custom, meta=None):
|
|
is_lead_model = model.model == 'crm.lead'
|
|
if is_lead_model:
|
|
if 'company_id' not in values:
|
|
values['company_id'] = request.website.company_id.id
|
|
lang = request.context.get('lang', False)
|
|
lang_id = request.env["res.lang"].sudo().search([('code', '=', lang)], limit=1).id
|
|
values['lang_id'] = lang_id
|
|
|
|
result = super(WebsiteForm, self).insert_record(request, model, values, custom, meta=meta)
|
|
|
|
if is_lead_model:
|
|
visitor_sudo = request.env['website.visitor']._get_visitor_from_request()
|
|
if visitor_sudo and result:
|
|
lead_sudo = request.env['crm.lead'].browse(result).sudo()
|
|
if lead_sudo.exists():
|
|
vals = {'lead_ids': [(4, result)]}
|
|
if not visitor_sudo.lead_ids and not visitor_sudo.partner_id:
|
|
vals['name'] = lead_sudo.contact_name
|
|
visitor_sudo.write(vals)
|
|
return result
|