[IMP] website_sale: small refactor to adapt the module to the inheritance of the localizations

* New method _get_vat_validation_fields to set the fields used
   in vat validation.
 * New method _get_country_related_render_values that returns all
   the fields related to the country to be rendered in the address form.

These methods are necessary to allow the different localizations
(see l10n_ar_website_sale) to adapt the ecommerce to their own needs.

closes odoo/odoo#68851

X-original-commit: 3b01c249a8d2b9673992942c2c5ea50ef0488708
Signed-off-by: Josse Colpaert <jco@openerp.com>
This commit is contained in:
Bruno Zanotti (ADHOC)
2021-04-07 13:45:20 +00:00
committed by Josse Colpaert
parent 8af1b9fd39
commit 5d295cb73d
+37 -16
View File
@@ -598,20 +598,24 @@ class WebsiteSale(http.Controller):
if data.get("vat") and hasattr(Partner, "check_vat"):
if country_id:
data["vat"] = Partner.fix_eu_vat_number(country_id, data.get("vat"))
partner_dummy = Partner.new({
'vat': data['vat'],
'country_id': country_id or False,
})
partner_dummy = Partner.new(self._get_vat_validation_fields(data))
try:
partner_dummy.check_vat()
except ValidationError:
except ValidationError as exception:
error["vat"] = 'error'
error_message.append(exception.args[0])
if [err for err in error.values() if err == 'missing']:
error_message.append(_('Some required fields are empty.'))
return error, error_message
def _get_vat_validation_fields(self, data):
return {
'vat': data['vat'],
'country_id': int(data['country_id']) if data.get('country_id') else False,
}
def _checkout_form_save(self, mode, checkout, all_values):
Partner = request.env['res.partner']
if mode[0] == 'new':
@@ -677,7 +681,6 @@ class WebsiteSale(http.Controller):
mode = (False, False)
can_edit_vat = False
def_country_id = order.partner_id.country_id
values, errors = {}, {}
partner_id = int(kw.get('partner_id', -1))
@@ -686,11 +689,6 @@ class WebsiteSale(http.Controller):
if order.partner_id.id == request.website.user_id.sudo().partner_id.id:
mode = ('new', 'billing')
can_edit_vat = True
country_code = request.session['geoip'].get('country_code')
if country_code:
def_country_id = request.env['res.country'].search([('code', '=', country_code)], limit=1)
else:
def_country_id = request.website.user_id.sudo().country_id
# IF ORDER LINKED TO A PARTNER
else:
if partner_id > 0:
@@ -740,23 +738,46 @@ class WebsiteSale(http.Controller):
if not errors:
return request.redirect(kw.get('callback') or '/shop/confirm_order')
country = 'country_id' in values and values['country_id'] != '' and request.env['res.country'].browse(int(values['country_id']))
country = country and country.exists() or def_country_id
render_values = {
'website_sale_order': order,
'partner_id': partner_id,
'mode': mode,
'checkout': values,
'can_edit_vat': can_edit_vat,
'country': country,
'country_states': country.get_website_sale_states(mode=mode[1]),
'countries': country.get_website_sale_countries(mode=mode[1]),
'error': errors,
'callback': kw.get('callback'),
'only_services': order and order.only_services,
}
render_values.update(self._get_country_related_render_values(kw, render_values))
return request.render("website_sale.address", render_values)
def _get_country_related_render_values(self, kw, render_values):
'''
This method provides fields related to the country to render the website sale form
'''
values = render_values['checkout']
mode = render_values['mode']
order = render_values['website_sale_order']
def_country_id = order.partner_id.country_id
# IF PUBLIC ORDER
if order.partner_id.id == request.website.user_id.sudo().partner_id.id:
country_code = request.session['geoip'].get('country_code')
if country_code:
def_country_id = request.env['res.country'].search([('code', '=', country_code)], limit=1)
else:
def_country_id = request.website.user_id.sudo().country_id
country = 'country_id' in values and values['country_id'] != '' and request.env['res.country'].browse(int(values['country_id']))
country = country and country.exists() or def_country_id
res = {
'country': country,
'country_states': country.get_website_sale_states(mode=mode[1]),
'countries': country.get_website_sale_countries(mode=mode[1]),
}
return res
@http.route(['/shop/checkout'], type='http', auth="public", website=True, sitemap=False)
def checkout(self, **post):
order = request.website.sale_get_order()