diff --git a/addons/website_sale/models/sale_order.py b/addons/website_sale/models/sale_order.py
index 8be8ea51548..17bc507bb42 100644
--- a/addons/website_sale/models/sale_order.py
+++ b/addons/website_sale/models/sale_order.py
@@ -229,6 +229,11 @@ class website(orm.Model):
sale_order_id = request.session.get('sale_order_id') or (partner.last_website_so_id.id if partner.last_website_so_id and partner.last_website_so_id.state == 'draft' else False)
sale_order = None
+ # Test validity of the sale_order_id
+ if sale_order_id and sale_order_obj.exists(cr, SUPERUSER_ID, sale_order_id, context=context):
+ sale_order = sale_order_obj.browse(cr, SUPERUSER_ID, sale_order_id, context=context)
+ else:
+ sale_order_id = None
pricelist_id = request.session.get('website_sale_current_pl')
if force_pricelist and self.pool['product.pricelist'].search_count(cr, uid, [('id', '=', force_pricelist)], context=context):
@@ -254,15 +259,12 @@ class website(orm.Model):
sale_order_obj.write(cr, SUPERUSER_ID, [sale_order_id], values, context=context)
request.session['sale_order_id'] = sale_order_id
+ sale_order = sale_order_obj.browse(cr, SUPERUSER_ID, sale_order_id, context=context)
if request.website.partner_id.id != partner.id:
self.pool['res.partner'].write(cr, SUPERUSER_ID, partner.id, {'last_website_so_id': sale_order_id})
if sale_order_id:
- sale_order = sale_order_obj.browse(cr, SUPERUSER_ID, sale_order_id, context=context)
- if not sale_order.exists():
- request.session['sale_order_id'] = None
- return None
# check for change of pricelist with a coupon
pricelist_id = pricelist_id or partner.property_product_pricelist.id
@@ -321,6 +323,10 @@ class website(orm.Model):
if (code and code != sale_order.pricelist_id.code) or sale_order.partner_id.id != partner.id or force_pricelist:
sale_order = sale_order_obj.browse(cr, SUPERUSER_ID, sale_order.id, context=context)
+ else:
+ request.session['sale_order_id'] = None
+ return None
+
return sale_order
def sale_get_transaction(self, cr, uid, ids, context=None):
diff --git a/addons/website_sale_options/views/templates.xml b/addons/website_sale_options/views/templates.xml
index ef35041cb1d..590fa78f2b3 100644
--- a/addons/website_sale_options/views/templates.xml
+++ b/addons/website_sale_options/views/templates.xml
@@ -59,7 +59,7 @@
t-field="product.lst_price"
t-field-options='{
"widget": "monetary",
- "from_currency": "website.currency_id",
+ "from_currency": "product.company_id.currency_id",
"display_currency": "user_id.partner_id.property_product_pricelist.currency_id"
}'/>
@@ -107,7 +107,7 @@
t-field="product.lst_price"
t-field-options='{
"widget": "monetary",
- "from_currency": "website.currency_id",
+ "from_currency": "product.company_id.currency_id",
"display_currency": "user_id.partner_id.property_product_pricelist.currency_id"
}'/>
R$
0.01
+ before
@@ -229,6 +230,7 @@
$
0.01
+ before
diff --git a/openerp/addons/base/tests/test_ir_filters.py b/openerp/addons/base/tests/test_ir_filters.py
index d3f7809456c..2132fdb946b 100644
--- a/openerp/addons/base/tests/test_ir_filters.py
+++ b/openerp/addons/base/tests/test_ir_filters.py
@@ -275,3 +275,27 @@ class TestGlobalDefaults(FiltersCase):
dict(name='a', user_id=False, is_default=False, domain='[]', context='{}', sort='[]'),
dict(name='b', user_id=False, is_default=True, domain='[]', context=context_value, sort='[]'),
])
+
+from openerp.tests.common import TransactionCase
+
+class TestReadGroup(TransactionCase):
+ """Test function read_group with groupby on a many2one field to a model
+ (in test, "user_id" to "res.users") which is ordered by an inherited not stored field (in
+ test, "name" inherited from "res.partners").
+ """
+
+ def setUp(self):
+ super(TestReadGroup, self).setUp()
+ self.ir_filters_model = self.env['ir.filters']
+ self.res_partner_model = self.env['res.partner']
+ self.res_users_model = self.env['res.users']
+
+ def test_read_group_1(self):
+ self.assertEqual(self.res_users_model._order, "name, login", "Model res.users must be ordered by name, login")
+ self.assertFalse(self.res_users_model._fields['name'].store, "Field name is not stored in res.users")
+
+ filter_a = self.ir_filters_model.create(dict(name="Filter_A", model_id="ir.filters"))
+ filter_b = self.ir_filters_model.create(dict(name="Filter_B", model_id="ir.filters"))
+ filter_b.write(dict(user_id=False))
+ res = self.ir_filters_model.read_group([], ['name', 'user_id'], ['user_id'])
+ self.assertTrue(any(val['user_id'] == False for val in res), "At least one group must contain val['user_id'] == False.")
diff --git a/openerp/models.py b/openerp/models.py
index 8b34a64a410..e785807ef1b 100644
--- a/openerp/models.py
+++ b/openerp/models.py
@@ -2152,7 +2152,7 @@ class BaseModel(object):
return parent_alias
@api.model
- def _inherits_join_calc(self, alias, field, query):
+ def _inherits_join_calc(self, alias, field, query, implicit=True, outer=False):
"""
Adds missing table select and join clause(s) to ``query`` for reaching
the field coming from an '_inherits' parent table (no duplicates).
@@ -2172,7 +2172,7 @@ class BaseModel(object):
# JOIN parent_model._table AS parent_alias ON alias.parent_field = parent_alias.id
parent_alias, _ = query.add_join(
(alias, parent_model._table, parent_field, 'id', parent_field),
- implicit=True,
+ implicit=implicit, outer=outer,
)
model, alias = parent_model, parent_alias
# handle the case where the field is translated
@@ -4673,7 +4673,7 @@ class BaseModel(object):
parent_obj = self.pool[self._inherit_fields[order_field][3]]
order_column = parent_obj._columns[order_field]
if order_column._classic_read:
- inner_clauses = [self._inherits_join_calc(alias, order_field, query)]
+ inner_clauses = [self._inherits_join_calc(alias, order_field, query, implicit=False, outer=True)]
add_dir = True
elif order_column._type == 'many2one':
key = (parent_obj._name, order_column._obj, order_field)