text: # -*- coding: utf-8 -*-
  # Part of Odoo. See LICENSE file for full copyright and licensing details.
  
  from odoo import http
  from odoo.http import request
  from odoo.addons.website_form.controllers.main import WebsiteForm
  
  
  class WebsiteForm(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'):
              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.exists() and country or self._get_country()
                  for phone_field in phone_fields:
                      if not record.get(phone_field):
                          continue
                      number = record[phone_field]
                      fmt_number = request.env[model_name].phone_format(number, contact_country)
                      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)
              values['lang_id'] = values.get('lang_id') or request.env['res.lang']._lang_get_id(lang)
  
          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
  