diff --git a/addons/google_calendar/google_calendar.py b/addons/google_calendar/google_calendar.py index 7e17d1aaf45..e00b97a8336 100644 --- a/addons/google_calendar/google_calendar.py +++ b/addons/google_calendar/google_calendar.py @@ -857,11 +857,9 @@ class google_calendar(osv.AbstractModel): if actSrc == 'GG': try: self.delete_an_event(cr, uid, current_event[0], context=context) - except Exception, e: - error = json.loads(e.read()) - error_nr = error.get('error', {}).get('code') + except urllib2.HTTPError, e: # if already deleted from gmail or never created - if error_nr in (404, 410,): + if e.code in (404, 410,): pass else: raise e diff --git a/addons/payment/models/payment_acquirer.py b/addons/payment/models/payment_acquirer.py index cb95bad942d..5d65f7fbaff 100644 --- a/addons/payment/models/payment_acquirer.py +++ b/addons/payment/models/payment_acquirer.py @@ -395,7 +395,7 @@ class PaymentTransaction(osv.Model): custom_method_name = '%s_compute_fees' % acquirer.provider if hasattr(Acquirer, custom_method_name): fees = getattr(Acquirer, custom_method_name)( - cr, uid, acquirer.id, values.get('amount', 0.0), values.get('currency_id'), values.get('country_id'), context=None) + cr, uid, acquirer.id, values.get('amount', 0.0), values.get('currency_id'), values.get('partner_country_id'), context=None) values['fees'] = float_round(fees, 2) # custom create diff --git a/addons/point_of_sale/views/report_sessionsummary.xml b/addons/point_of_sale/views/report_sessionsummary.xml index 483fadd99aa..052ce7c2e70 100644 --- a/addons/point_of_sale/views/report_sessionsummary.xml +++ b/addons/point_of_sale/views/report_sessionsummary.xml @@ -79,8 +79,7 @@ t-field-options='{"widget": "monetary", "display_currency": "statement.currency_id"}'/> - + diff --git a/addons/portal/wizard/portal_wizard.py b/addons/portal/wizard/portal_wizard.py index 74bbc7d1237..a48d730ad03 100644 --- a/addons/portal/wizard/portal_wizard.py +++ b/addons/portal/wizard/portal_wizard.py @@ -140,8 +140,8 @@ class wizard_user(osv.osv_memory): wizard_user.user_id.write({'active': True, 'groups_id': [(4, portal.id)]}) # prepare for the signup process wizard_user.user_id.partner_id.signup_prepare() + self._send_email(cr, uid, wizard_user.id, context) wizard_user.refresh() - self._send_email(cr, uid, wizard_user.id, context) else: # remove the user (if it exists) from the portal group if wizard_user.user_id and (portal in wizard_user.user_id.groups_id): diff --git a/addons/stock/stock.py b/addons/stock/stock.py index c009cf1f086..c75f978f14b 100644 --- a/addons/stock/stock.py +++ b/addons/stock/stock.py @@ -2341,7 +2341,7 @@ class stock_move(osv.osv): context = context or {} quant_obj = self.pool.get("stock.quant") uom_obj = self.pool['product.uom'] - to_assign_moves = [] + to_assign_moves = set() main_domain = {} todo_moves = [] operations = set() @@ -2349,12 +2349,12 @@ class stock_move(osv.osv): if move.state not in ('confirmed', 'waiting', 'assigned'): continue if move.location_id.usage in ('supplier', 'inventory', 'production'): - to_assign_moves.append(move.id) + to_assign_moves.add(move.id) #in case the move is returned, we want to try to find quants before forcing the assignment if not move.origin_returned_move_id: continue if move.product_id.type == 'consu': - to_assign_moves.append(move.id) + to_assign_moves.add(move.id) continue else: todo_moves.append(move) @@ -2419,7 +2419,7 @@ class stock_move(osv.osv): #force assignation of consumable products and incoming from supplier/inventory/production # Do not take force_assign as it would create pack operations if to_assign_moves: - self.write(cr, uid, to_assign_moves, {'state': 'assigned'}, context=context) + self.write(cr, uid, list(to_assign_moves), {'state': 'assigned'}, context=context) if not no_prepare: self.check_recompute_pack_op(cr, uid, ids, context=context) diff --git a/addons/stock/wizard/stock_change_product_qty.py b/addons/stock/wizard/stock_change_product_qty.py index c21d61b9a3b..0216dce3367 100644 --- a/addons/stock/wizard/stock_change_product_qty.py +++ b/addons/stock/wizard/stock_change_product_qty.py @@ -44,7 +44,7 @@ class stock_change_product_qty(osv.osv_memory): try: self.pool.get('stock.location').check_access_rule(cr, uid, [location_id], 'read', context=context) except (AccessError): - pass + location_id = False res['location_id'] = location_id return res diff --git a/addons/website_membership/controllers/main.py b/addons/website_membership/controllers/main.py index ebd38f94139..7fc325bdbbb 100644 --- a/addons/website_membership/controllers/main.py +++ b/addons/website_membership/controllers/main.py @@ -37,16 +37,16 @@ class WebsiteMembership(http.Controller): partner_obj = request.registry['res.partner'] post_name = post.get('search') or post.get('name', '') current_country = None + today = time.strftime(DEFAULT_SERVER_DATE_FORMAT) # base domain for groupby / searches - base_line_domain = [("partner.website_published", "=", True), ('state', 'in', ['free', 'paid'])] + base_line_domain = [ + ("partner.website_published", "=", True), ('state', '=', 'paid'), + ('date_to', '>=', today), ('date_from', '<=', today) + ] if membership_id and membership_id != 'free': membership_id = int(membership_id) - today = time.strftime(DEFAULT_SERVER_DATE_FORMAT) - base_line_domain += [ - ('membership_id', '=', membership_id), ('date_to', '>=', today), - ('date_from', '<=', today), ('state', '=', 'paid') - ] + base_line_domain.append(('membership_id', '=', membership_id)) membership = product_obj.browse(cr, uid, membership_id, context=context) else: membership = None @@ -58,12 +58,14 @@ class WebsiteMembership(http.Controller): if membership_id != 'free': membership_line_ids = membership_line_obj.search(cr, SUPERUSER_ID, base_line_domain, context=context) country_domain = [('member_lines', 'in', membership_line_ids)] + if not membership_id: + country_domain = ['|', country_domain[0], ('membership_state', '=', 'free')] else: membership_line_ids = [] country_domain = [('membership_state', '=', 'free')] - if post_name: - country_domain += ['|', ('name', 'ilike', post_name), - ('website_description', 'ilike', post_name)] + if post_name: + country_domain += ['|', ('name', 'ilike', post_name), + ('website_description', 'ilike', post_name)] countries = partner_obj.read_group( cr, SUPERUSER_ID, country_domain + [("website_published", "=", True)], ["id", "country_id"], groupby="country_id", orderby="country_id", context=request.context) diff --git a/addons/website_payment/views/website_payment_templates.xml b/addons/website_payment/views/website_payment_templates.xml index 9eb3bafa872..0395b6ccfaf 100644 --- a/addons/website_payment/views/website_payment_templates.xml +++ b/addons/website_payment/views/website_payment_templates.xml @@ -36,8 +36,8 @@

Payment Methods

-

Add a new payment method:

-
+

Add a new payment method:

+

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)