[IMP] base, website_sale: handle required zip/state on eCommerce

task-2172788

closes odoo/odoo#54746

Related: odoo/upgrade#1509
Signed-off-by: Jérémy Kersten (jke) <jke@openerp.com>
This commit is contained in:
Jeremy Kersten
2020-07-22 09:56:03 +00:00
parent a2a8a91b9f
commit 79807d6907
8 changed files with 41 additions and 9 deletions
+6 -2
View File
@@ -555,8 +555,10 @@ class WebsiteSale(http.Controller):
country = request.env['res.country']
if data.get('country_id'):
country = country.browse(int(data.get('country_id')))
if 'state_code' in country.get_address_fields() and country.state_ids:
if country.state_required:
required_fields += ['state_id']
if country.zip_required:
required_fields += ['zip']
# error message for empty required fields
for field_name in required_fields:
@@ -1118,7 +1120,9 @@ class WebsiteSale(http.Controller):
return dict(
fields=country.get_address_fields(),
states=[(st.id, st.name, st.code) for st in country.get_website_sale_states(mode=mode)],
phone_code=country.phone_code
phone_code=country.phone_code,
zip_required=country.zip_required,
state_required=country.state_required,
)
# --------------------------------------------------------------------------
@@ -347,13 +347,13 @@ publicWidget.registry.WebsiteSale = publicWidget.Widget.extend(VariantMixin, {
},
}).then(function (data) {
// placeholder phone_code
//$("input[name='phone']").attr('placeholder', data.phone_code !== 0 ? '+'+ data.phone_code : '');
$("input[name='phone']").attr('placeholder', data.phone_code !== 0 ? '+'+ data.phone_code : '');
// populate states and display
var selectStates = $("select[name='state_id']");
// dont reload state at first loading (done in qweb)
if (selectStates.data('init')===0 || selectStates.find('option').length===1) {
if (data.states.length) {
if (data.states.length || data.state_required) {
selectStates.html('');
_.each(data.states, function (x) {
var opt = $('<option>').text(x[1])
@@ -382,6 +382,11 @@ publicWidget.registry.WebsiteSale = publicWidget.Widget.extend(VariantMixin, {
$(".checkout_autoformat .div_" + field.split('_')[0]).toggle($.inArray(field, data.fields)>=0);
});
}
$("label[for='zip']").toggleClass('label-optional', !data.zip_required);
$("label[for='state_id']").toggleClass('label-optional', !data.state_required);
$("label[for='zip']").get(0).toggleAttribute('required', !!data.zip_required);
$("label[for='state_id']").get(0).toggleAttribute('required', !!data.state_required);
});
},
/**
@@ -55,6 +55,7 @@ odoo.define('website_sale_tour.tour', function (require) {
$('input[name="email"]').val('abc@odoo.com');
$('input[name="street"]').val('SO1 Billing Street, 33');
$('input[name="city"]').val('SO1BillingCity');
$('input[name="zip"]').val('10000');
$('#country_id option:eq(1)').attr('selected', true);
},
},
@@ -75,6 +76,7 @@ odoo.define('website_sale_tour.tour', function (require) {
$('input[name="phone"]').val('8888888888');
$('input[name="street"]').val('17, SO1 Shipping Road');
$('input[name="city"]').val('SO1ShippingCity');
$('input[name="zip"]').val('10000');
$('#country_id option:eq(1)').attr('selected', true);
},
},
@@ -263,6 +265,7 @@ odoo.define('website_sale_tour.tour', function (require) {
$('input[name="phone"]').val('7777777777');
$('input[name="street"]').val('SO2New Shipping Street, 5');
$('input[name="city"]').val('SO2NewShipping');
$('input[name="zip"]').val('1200');
$('#country_id option:eq(1)').attr('selected', true);
},
},
@@ -111,11 +111,11 @@ class TestWebsiteSaleCheckoutAddress(TransactionCaseWithUserDemo):
def setUp(self):
super(TestWebsiteSaleCheckoutAddress, self).setUp()
self.website = self.env.ref('website.default_website')
self.country_id = self.env['res.country'].search([], limit=1).id
self.country_id = self.env.ref('base.be').id
self.WebsiteSaleController = WebsiteSale()
self.default_address_values = {
'name': 'a res.partner address', 'email': 'email@email.email', 'street': 'ooo',
'city': 'ooo', 'country_id': self.country_id, 'submitted': 1,
'city': 'ooo', 'zip': '1200', 'country_id': self.country_id, 'submitted': 1,
}
def _create_so(self, partner_id=None):
+3 -3
View File
@@ -1209,16 +1209,16 @@
<h2 class="o_page_header mt8">Shipping Address </h2>
</t>
<t t-if="partner_id == website_sale_order.partner_shipping_id.id == website_sale_order.partner_invoice_id.id">
<div class="alert alert-warning" role="alert">
<div class="alert alert-warning" role="alert" t-if="not only_services">
<h4 class="alert-heading">Be aware!</h4>
<p t-if="not only_services" groups="sale.group_delivery_invoice_address">
<p groups="sale.group_delivery_invoice_address">
You are editing your <b>billing and shipping</b> addresses at the same time!<br/>
If you want to modify your shipping address, create a <a href='/shop/address'>new address</a>.
</p>
</div>
</t>
<t t-if="error" t-foreach="error.get('error_message', [])" t-as="err">
<h4 class="text-danger" t-esc="err" />
<h5 class="text-danger" t-esc="err" />
</t>
<form action="/shop/address" method="post" class="checkout_autoformat">
<div class="form-row">
@@ -54,6 +54,7 @@
<record id="ao" model="res.country">
<field name="name">Angola</field>
<field name="code">ao</field>
<field name='zip_required'>0</field>
<field file="base/static/img/country_flags/ao.png" name="image" type="base64" />
<field name="currency_id" ref="AOA" />
<field eval="244" name="phone_code" />
@@ -67,6 +68,7 @@
<record id="ar" model="res.country">
<field name="name">Argentina</field>
<field name="code">ar</field>
<field name='state_required'>1</field>
<field file="base/static/img/country_flags/ar.png" name="image" type="base64" />
<field name="currency_id" ref="ARS" />
<field eval="54" name="phone_code" />
@@ -92,6 +94,7 @@
<record id="au" model="res.country">
<field name="name">Australia</field>
<field name="code">au</field>
<field name='state_required'>1</field>
<field file="base/static/img/country_flags/au.png" name="image" type="base64" />
<field eval="'%(street)s\n%(street2)s\n%(city)s %(state_code)s %(zip)s\n%(country_name)s'" name="address_format" />
<field name="currency_id" ref="AUD" />
@@ -180,6 +183,7 @@
<record id="bj" model="res.country">
<field name="name">Benin</field>
<field name="code">bj</field>
<field name='zip_required'>0</field>
<field file="base/static/img/country_flags/bj.png" name="image" type="base64" />
<field name="currency_id" ref="XOF" />
<field eval="229" name="phone_code" />
@@ -263,6 +267,7 @@
<record id="bz" model="res.country">
<field name="name">Belize</field>
<field name="code">bz</field>
<field name='zip_required'>0</field>
<field file="base/static/img/country_flags/bz.png" name="image" type="base64" />
<field name="currency_id" ref="BZD" />
<field eval="501" name="phone_code" />
@@ -270,6 +275,7 @@
<record id="ca" model="res.country">
<field name="name">Canada</field>
<field name="code">ca</field>
<field name='state_required'>1</field>
<field file="base/static/img/country_flags/ca.png" name="image" type="base64" />
<field eval="'%(street)s\n%(street2)s\n%(city)s %(state_code)s %(zip)s\n%(country_name)s'" name="address_format" />
<field name="currency_id" ref="CAD" />
@@ -682,6 +688,7 @@
<record id="hk" model="res.country">
<field name="name">Hong Kong</field>
<field name="code">hk</field>
<field name='zip_required'>0</field>
<field file="base/static/img/country_flags/hk.png" name="image" type="base64" />
<field name="currency_id" ref="HKD" />
<field eval="852" name="phone_code" />
@@ -726,6 +733,7 @@
<record id="id" model="res.country">
<field name="name">Indonesia</field>
<field name="code">id</field>
<field name='state_required'>1</field>
<field file="base/static/img/country_flags/id.png" name="image" type="base64" />
<field name="currency_id" ref="IDR" />
<field eval="62" name="phone_code" />
@@ -734,6 +742,7 @@
<record id="ie" model="res.country">
<field name="name">Ireland</field>
<field name="code">ie</field>
<field name='zip_required'>0</field>
<field file="base/static/img/country_flags/ie.png" name="image" type="base64" />
<field name="currency_id" ref="EUR" />
<field eval="353" name="phone_code" />
@@ -756,6 +765,7 @@
<record id="in" model="res.country">
<field name="name">India</field>
<field name="code">in</field>
<field name='state_required'>1</field>
<field file="base/static/img/country_flags/in.png" name="image" type="base64" />
<field eval="'%(street)s\n%(street2)s\n%(city)s %(zip)s\n%(state_name)s %(state_code)s\n%(country_name)s'" name="address_format" />
<field name="currency_id" ref="INR" />
@@ -793,6 +803,7 @@
<record id="it" model="res.country">
<field name="name">Italy</field>
<field name="code">it</field>
<field name='state_required'>1</field>
<field file="base/static/img/country_flags/it.png" name="image" type="base64" />
<field name="currency_id" ref="EUR" />
<field eval="39" name="phone_code" />
@@ -822,6 +833,7 @@
<record id="jp" model="res.country">
<field name="name">Japan</field>
<field name="code">jp</field>
<field name='state_required'>1</field>
<field file="base/static/img/country_flags/jp.png" name="image" type="base64" />
<field name="currency_id" ref="JPY" />
<field name="address_format" eval="'%(zip)s\n%(state_name)s %(city)s\n%(street)s\n%(street2)s\n%(country_name)s'"/>
@@ -1065,6 +1077,7 @@
<record id="mo" model="res.country">
<field name="name">Macau</field>
<field name="code">mo</field>
<field name='zip_required'>0</field>
<field file="base/static/img/country_flags/mo.png" name="image" type="base64" />
<field name="currency_id" ref="MOP" />
<field eval="853" name="phone_code" />
@@ -1130,6 +1143,7 @@
<record id="mx" model="res.country">
<field name="name">Mexico</field>
<field name="code">mx</field>
<field name='state_required'>1</field>
<field file="base/static/img/country_flags/mx.png" name="image" type="base64" />
<field name="currency_id" ref="MXN" />
<field eval="52" name="phone_code" />
@@ -1681,6 +1695,7 @@
<record id="us" model="res.country">
<field name="name">United States</field>
<field name="code">us</field>
<field name='state_required'>1</field>
<field file="base/static/img/country_flags/us.png" name="image" type="base64" />
<field eval="'%(street)s\n%(street2)s\n%(city)s %(state_code)s %(zip)s\n%(country_name)s'" name="address_format" />
<field name="currency_id" ref="USD" />
+3
View File
@@ -67,6 +67,9 @@ class Country(models.Model):
help="Determines where the customer/company name should be placed, i.e. after or before the address.")
vat_label = fields.Char(string='Vat Label', translate=True, help="Use this field if you want to change vat label.")
state_required = fields.Boolean(default=False)
zip_required = fields.Boolean(default=True)
_sql_constraints = [
('name_uniq', 'unique (name)',
'The name of the country must be unique !'),
@@ -33,6 +33,8 @@
<group name="phone_vat_settings">
<field name="phone_code" options="{'format': false}"/>
<field name="vat_label"/>
<field name="zip_required"/>
<field name="state_required"/>
</group>
<group name="advanced_address_formatting" string="Advanced Address Formatting" groups="base.group_no_one" col="4" colspan="4">
<field name="address_view_id"/>