From bae0a775e16dbce8aef7792149582fcc39d0f146 Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Thu, 13 Aug 2015 15:25:30 +0200 Subject: [PATCH 1/8] [FIX] hr_evaluation: remove group by survey `survey_id` is a related field, non-stored. This isn't possible to apply a group-by on a non stored field. opw-647303 --- addons/hr_evaluation/hr_evaluation_view.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/hr_evaluation/hr_evaluation_view.xml b/addons/hr_evaluation/hr_evaluation_view.xml index ec929043366..19e65e1abe1 100644 --- a/addons/hr_evaluation/hr_evaluation_view.xml +++ b/addons/hr_evaluation/hr_evaluation_view.xml @@ -335,7 +335,6 @@ - From d98ac716c18e78090ee0de32f52b886e104e2114 Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Fri, 14 Aug 2015 10:40:57 +0200 Subject: [PATCH 2/8] [FIX] account: account type of account created on bank account creation When creating a new bank account e.g. Accounting > Configuration > Accounts > Setup your Bank Accounts When the user leaves the journal blank, a journal, and an account associated to this journal, are automatically created. The account type of the account created could be wrong, as it used the account type of the parent of the first account of internal type `Liquidity`, which could not be an account of account type Cash or Bank, but of account type 'View', and such an account type does not have the right delivery forward method, in order to report correctly the amounts when closing a fiscal year. Instead of using the account type of the parent, it should actually uses the account type of the sibbling, which have a correct delivery forward method opw-647311 --- addons/account/account_bank.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/account/account_bank.py b/addons/account/account_bank.py index acb0e640a7a..71c126530d4 100644 --- a/addons/account/account_bank.py +++ b/addons/account/account_bank.py @@ -69,7 +69,8 @@ class bank(osv.osv): # No liquidity account exists, no template available if not ids: continue - ref_acc_bank = obj_acc.browse(cr, uid, ids[0], context=context).parent_id + sibbling_acc_bank = obj_acc.browse(cr, uid, ids[0], context=context) + ref_acc_bank = sibbling_acc_bank.parent_id while True: new_code = str(ref_acc_bank.code.ljust(dig-len(str(current_num)), '0')) + str(current_num) ids = obj_acc.search(cr, uid, [('code', '=', new_code), ('company_id', '=', bank.company_id.id)]) @@ -81,7 +82,7 @@ class bank(osv.osv): 'name': name, 'code': new_code, 'type': 'liquidity', - 'user_type': ref_acc_bank.user_type.id, + 'user_type': sibbling_acc_bank.user_type.id, 'reconcile': False, 'parent_id': ref_acc_bank.id, 'company_id': bank.company_id.id, From d8c5299dc06ef86b8f05fe787771868ce435130e Mon Sep 17 00:00:00 2001 From: Joren Van Onder Date: Wed, 12 Aug 2015 15:46:43 +0200 Subject: [PATCH 3/8] [FIX] point_of_sale: posbox_create_image fixes - don't add comments in posbox ld.so.preload, it causes the second line to be interpreted as a library. - allow image creation in headless environment. This checks whether or not X is running and runs qemu-system-arm with or without graphics. --- .../tools/posbox/overwrite_before_init/etc/ld.so.preload | 1 - addons/point_of_sale/tools/posbox/posbox_create_image.sh | 6 +++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/ld.so.preload b/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/ld.so.preload index 5e9332843b5..cfa850b8356 100644 --- a/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/ld.so.preload +++ b/addons/point_of_sale/tools/posbox/overwrite_before_init/etc/ld.so.preload @@ -1,2 +1 @@ -# the used qemu-kernel doesn't work well with this library, so get rid of it #/usr/lib/arm-linux-gnueabihf/libcofi_rpi.so diff --git a/addons/point_of_sale/tools/posbox/posbox_create_image.sh b/addons/point_of_sale/tools/posbox/posbox_create_image.sh index 2a2a0dd9425..9e65410f8fe 100755 --- a/addons/point_of_sale/tools/posbox/posbox_create_image.sh +++ b/addons/point_of_sale/tools/posbox/posbox_create_image.sh @@ -59,7 +59,11 @@ umount "${MOUNT_POINT}" # from http://paulscott.co.za/blog/full-raspberry-pi-raspbian-emulation-with-qemu/ # ssh pi@localhost -p10022 -qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" -hda posbox.img -net user,hostfwd=tcp::10022-:22,hostfwd=tcp::18069-:8069 -net nic +QEMU_OPTS=(-kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append 'root=/dev/sda2 panic=1 rootfstype=ext4 rw' -hda posbox.img -net user,hostfwd=tcp::10022-:22,hostfwd=tcp::18069-:8069 -net nic) +if [ -z ${DISPLAY:-} ] ; then + QEMU_OPTS+=(-nographic) +fi +qemu-system-arm "${QEMU_OPTS[@]}" mount "${LOOP_MAPPER_PATH}" "${MOUNT_POINT}" cp -av "${OVERWRITE_FILES_AFTER_INIT_DIR}"/* "${MOUNT_POINT}" From 11cd8ba06c27014d2d73279601f4ca9be9dba7a0 Mon Sep 17 00:00:00 2001 From: Christophe Combelles Date: Fri, 14 Aug 2015 15:34:14 +0200 Subject: [PATCH 4/8] [FIX] web_kanban: access gravatar with current scheme When Odoo is accessed in https, inserting the gravatar image using the http protocol leads to a security alert in most browsers. Closes #3042 --- addons/web_kanban/static/src/js/kanban.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 60e7f1e6585..22da37cc8d7 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -991,7 +991,7 @@ instance.web_kanban.KanbanRecord = instance.web.Widget.extend({ email = _.str.trim(email || '').toLowerCase(); var default_ = _.str.isBlank(email) ? 'mm' : 'identicon'; var email_md5 = $.md5(email); - return 'http://www.gravatar.com/avatar/' + email_md5 + '.png?s=' + size + '&d=' + default_; + return '//www.gravatar.com/avatar/' + email_md5 + '.png?s=' + size + '&d=' + default_; }, kanban_image: function(model, field, id, cache, options) { options = options || {}; From dac52e344c43808d76b8e57a059f803d3863db28 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Thu, 13 Aug 2015 16:52:58 +0200 Subject: [PATCH 5/8] [FIX] models: "ORDER BY" on many2one fields When ordering results on a many2one fields, results are ordered by order of the target model. The code was wrongly assuming that this `_order` attribute only contains `_classic_read` fields (that can be directly read from the table in database). Now correctly generate the "ORDER BY" clause using the current table alias. `res.users` can now be sorted by name. --- openerp/addons/base/res/res_users.py | 1 + openerp/addons/base/tests/test_search.py | 15 ++++ openerp/models.py | 106 +++++++++++------------ openerp/osv/fields.py | 3 +- 4 files changed, 69 insertions(+), 56 deletions(-) diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py index 3b79fa03ea7..68676035d02 100644 --- a/openerp/addons/base/res/res_users.py +++ b/openerp/addons/base/res/res_users.py @@ -148,6 +148,7 @@ class res_users(osv.osv): } _name = "res.users" _description = 'Users' + _order = 'name, login' def _set_new_password(self, cr, uid, id, name, value, args, context=None): if value is False: diff --git a/openerp/addons/base/tests/test_search.py b/openerp/addons/base/tests/test_search.py index 4f93eff240c..af14fc88e85 100644 --- a/openerp/addons/base/tests/test_search.py +++ b/openerp/addons/base/tests/test_search.py @@ -104,6 +104,21 @@ class test_search(common.TransactionCase): self.assertEqual(test_user_ids, expected_ids, 'search on res_users did not provide expected ids or expected order') users_obj._order = old_order + def test_11_indirect_inherits_m2order(self): + registry, cr, uid = self.registry, self.cr, self.uid + Cron = registry('ir.cron') + Users = registry('res.users') + + user_ids = {} + cron_ids = {} + for u in 'BAC': + user_ids[u] = Users.create(cr, uid, {'name': u, 'login': u}) + cron_ids[u] = Cron.create(cr, uid, {'name': u, 'user_id': user_ids[u]}) + + ids = Cron.search(cr, uid, [('id', 'in', cron_ids.values())], order='user_id') + expected_ids = [cron_ids[l] for l in 'ABC'] + self.assertEqual(ids, expected_ids) + if __name__ == '__main__': unittest2.main() diff --git a/openerp/models.py b/openerp/models.py index 4161f6a0ebc..581bc882e3f 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -1946,7 +1946,7 @@ class BaseModel(object): gb_function = split[1] if len(split) == 2 else None temporal = field_type in ('date', 'datetime') tz_convert = field_type == 'datetime' and context.get('tz') in pytz.all_timezones - qualified_field = self._inherits_join_calc(split[0], query) + qualified_field = self._inherits_join_calc(self._table, split[0], query) if temporal: display_formats = { # Careful with week/year formats: @@ -2103,7 +2103,7 @@ class BaseModel(object): if getattr(self._fields[f].base_field.column, '_classic_write', False) ] - field_formatter = lambda f: (self._fields[f].group_operator or 'sum', self._inherits_join_calc(f, query), f) + field_formatter = lambda f: (self._fields[f].group_operator or 'sum', self._inherits_join_calc(self._table, f, query), f) select_terms = ["%s(%s) AS %s" % field_formatter(f) for f in aggregated_fields] for gb in annotated_groupbys: @@ -2177,17 +2177,18 @@ class BaseModel(object): parent_alias, parent_alias_statement = query.add_join((current_model._table, parent_model._table, inherits_field, 'id', inherits_field), implicit=True) return parent_alias - def _inherits_join_calc(self, field, query): + def _inherits_join_calc(self, alias, field, query): """ Adds missing table select and join clause(s) to ``query`` for reaching the field coming from an '_inherits' parent table (no duplicates). + :param alias: name of the initial SQL alias :param field: name of inherited field to reach :param query: query object on which the JOIN should be added :return: qualified name of field, to be used in SELECT clause """ # INVARIANT: alias is the SQL alias of model._table in query - model, alias = self, self._table + model = self while field in model._inherit_fields and field not in model._columns: # retrieve the parent model where field is inherited from parent_model_name = model._inherit_fields[field][0] @@ -3274,7 +3275,7 @@ class BaseModel(object): def qualify(field): col = field.name if field.inherited: - res = self._inherits_join_calc(field.name, query) + res = self._inherits_join_calc(self._table, field.name, query) else: res = '"%s"."%s"' % (self._table, col) if field.type == 'binary' and (context.get('bin_size') or context.get('bin_size_' + col)): @@ -4523,9 +4524,9 @@ class BaseModel(object): for inherited_model in self._inherits: rule_where_clause, rule_where_clause_params, rule_tables = rule_obj.domain_get(cr, uid, inherited_model, mode, context=context) apply_rule(rule_where_clause, rule_where_clause_params, rule_tables, - parent_model=inherited_model) + parent_model=inherited_model) - def _generate_m2o_order_by(self, order_field, query): + def _generate_m2o_order_by(self, alias, order_field, query): """ Add possibly missing JOIN to ``query`` and generate the ORDER BY clause for m2o fields, either native m2o fields or function/related fields that are stored, including @@ -4535,10 +4536,10 @@ class BaseModel(object): """ if order_field not in self._columns and order_field in self._inherit_fields: # also add missing joins for reaching the table containing the m2o field - qualified_field = self._inherits_join_calc(order_field, query) + qualified_field = self._inherits_join_calc(alias, order_field, query) order_field_column = self._inherit_fields[order_field][2] else: - qualified_field = '"%s"."%s"' % (self._table, order_field) + qualified_field = '"%s"."%s"' % (alias, order_field) order_field_column = self._columns[order_field] assert order_field_column._type == 'many2one', 'Invalid field passed to _generate_m2o_order_by()' @@ -4554,19 +4555,52 @@ class BaseModel(object): if not regex_order.match(m2o_order): # _order is complex, can't use it here, so we default to _rec_name m2o_order = dest_model._rec_name - else: - # extract the field names, to be able to qualify them and add desc/asc - m2o_order_list = [] - for order_part in m2o_order.split(","): - m2o_order_list.append(order_part.strip().split(" ", 1)[0].strip()) - m2o_order = m2o_order_list # Join the dest m2o table if it's not joined yet. We use [LEFT] OUTER join here # as we don't want to exclude results that have NULL values for the m2o src_table, src_field = qualified_field.replace('"', '').split('.', 1) dst_alias, dst_alias_statement = query.add_join((src_table, dest_model._table, src_field, 'id', src_field), implicit=False, outer=True) - qualify = lambda field: '"%s"."%s"' % (dst_alias, field) - return map(qualify, m2o_order) if isinstance(m2o_order, list) else qualify(m2o_order) + return dest_model._generate_order_by_inner(dst_alias, m2o_order, query) + + def _generate_order_by_inner(self, alias, order_spec, query): + order_by_elements = [] + self._check_qorder(order_spec) + for order_part in order_spec.split(','): + order_split = order_part.strip().split(' ') + order_field = order_split[0].strip() + order_direction = order_split[1].strip() if len(order_split) == 2 else '' + order_column = None + inner_clause = None + if order_field == 'id': + order_by_elements.append('"%s"."%s" %s' % (alias, order_field, order_direction)) + elif order_field in self._columns: + order_column = self._columns[order_field] + if order_column._classic_read: + inner_clause = '"%s"."%s"' % (alias, order_field) + elif order_column._type == 'many2one': + inner_clause = self._generate_m2o_order_by(alias, order_field, query) + else: + continue # ignore non-readable or "non-joinable" fields + elif order_field in self._inherit_fields: + parent_obj = self.pool[self._inherit_fields[order_field][3]] + order_column = parent_obj._columns[order_field] + if order_column._classic_read: + inner_clause = self._inherits_join_calc(alias, order_field, query) + elif order_column._type == 'many2one': + inner_clause = self._generate_m2o_order_by(alias, order_field, query) + else: + continue # ignore non-readable or "non-joinable" fields + else: + raise ValueError(_("Sorting field %s not found on model %s") % (order_field, self._name)) + if order_column and order_column._type == 'boolean': + inner_clause = "COALESCE(%s, false)" % inner_clause + if inner_clause: + if isinstance(inner_clause, list): + for clause in inner_clause: + order_by_elements.append("%s %s" % (clause, order_direction)) + else: + order_by_elements.append("%s %s" % (inner_clause, order_direction)) + return order_by_elements def _generate_order_by(self, order_spec, query): """ @@ -4578,43 +4612,7 @@ class BaseModel(object): order_by_clause = '' order_spec = order_spec or self._order if order_spec: - order_by_elements = [] - self._check_qorder(order_spec) - for order_part in order_spec.split(','): - order_split = order_part.strip().split(' ') - order_field = order_split[0].strip() - order_direction = order_split[1].strip() if len(order_split) == 2 else '' - order_column = None - inner_clause = None - if order_field == 'id': - order_by_elements.append('"%s"."%s" %s' % (self._table, order_field, order_direction)) - elif order_field in self._columns: - order_column = self._columns[order_field] - if order_column._classic_read: - inner_clause = '"%s"."%s"' % (self._table, order_field) - elif order_column._type == 'many2one': - inner_clause = self._generate_m2o_order_by(order_field, query) - else: - continue # ignore non-readable or "non-joinable" fields - elif order_field in self._inherit_fields: - parent_obj = self.pool[self._inherit_fields[order_field][3]] - order_column = parent_obj._columns[order_field] - if order_column._classic_read: - inner_clause = self._inherits_join_calc(order_field, query) - elif order_column._type == 'many2one': - inner_clause = self._generate_m2o_order_by(order_field, query) - else: - continue # ignore non-readable or "non-joinable" fields - else: - raise ValueError( _("Sorting field %s not found on model %s") %( order_field, self._name)) - if order_column and order_column._type == 'boolean': - inner_clause = "COALESCE(%s, false)" % inner_clause - if inner_clause: - if isinstance(inner_clause, list): - for clause in inner_clause: - order_by_elements.append("%s %s" % (clause, order_direction)) - else: - order_by_elements.append("%s %s" % (inner_clause, order_direction)) + order_by_elements = self._generate_order_by_inner(self._table, order_spec, query) if order_by_elements: order_by_clause = ",".join(order_by_elements) diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index 5ef82ed2683..3b7a18edf53 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -988,12 +988,11 @@ class many2many(_column): wquery = obj._where_calc(cr, user, domain, context=context) obj._apply_ir_rules(cr, user, wquery, 'read', context=context) + order_by = obj._generate_order_by(None, wquery) from_c, where_c, where_params = wquery.get_sql() if where_c: where_c = ' AND ' + where_c - order_by = ' ORDER BY "%s".%s' %(obj._table, obj._order.split(',')[0]) - limit_str = '' if self._limit is not None: limit_str = ' LIMIT %d' % self._limit From 856cb6fcb02239c72be4fb4e42344ee698cccf3d Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Thu, 13 Aug 2015 20:20:44 +0200 Subject: [PATCH 6/8] [FIX] models: distribute ORDER BY direction --- openerp/models.py | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/openerp/models.py b/openerp/models.py index 581bc882e3f..081bf307271 100644 --- a/openerp/models.py +++ b/openerp/models.py @@ -4526,7 +4526,7 @@ class BaseModel(object): apply_rule(rule_where_clause, rule_where_clause_params, rule_tables, parent_model=inherited_model) - def _generate_m2o_order_by(self, alias, order_field, query): + def _generate_m2o_order_by(self, alias, order_field, query, reverse_direction): """ Add possibly missing JOIN to ``query`` and generate the ORDER BY clause for m2o fields, either native m2o fields or function/related fields that are stored, including @@ -4560,46 +4560,53 @@ class BaseModel(object): # as we don't want to exclude results that have NULL values for the m2o src_table, src_field = qualified_field.replace('"', '').split('.', 1) dst_alias, dst_alias_statement = query.add_join((src_table, dest_model._table, src_field, 'id', src_field), implicit=False, outer=True) - return dest_model._generate_order_by_inner(dst_alias, m2o_order, query) + return dest_model._generate_order_by_inner(dst_alias, m2o_order, query, + reverse_direction=reverse_direction) - def _generate_order_by_inner(self, alias, order_spec, query): + def _generate_order_by_inner(self, alias, order_spec, query, reverse_direction=False): order_by_elements = [] self._check_qorder(order_spec) for order_part in order_spec.split(','): order_split = order_part.strip().split(' ') order_field = order_split[0].strip() - order_direction = order_split[1].strip() if len(order_split) == 2 else '' + order_direction = order_split[1].strip().upper() if len(order_split) == 2 else '' + if reverse_direction: + order_direction = 'ASC' if order_direction == 'DESC' else 'DESC' + do_reverse = order_direction == 'DESC' order_column = None - inner_clause = None + inner_clauses = [] + add_dir = False if order_field == 'id': order_by_elements.append('"%s"."%s" %s' % (alias, order_field, order_direction)) elif order_field in self._columns: order_column = self._columns[order_field] if order_column._classic_read: - inner_clause = '"%s"."%s"' % (alias, order_field) + inner_clauses = ['"%s"."%s"' % (alias, order_field)] + add_dir = True elif order_column._type == 'many2one': - inner_clause = self._generate_m2o_order_by(alias, order_field, query) + inner_clauses = self._generate_m2o_order_by(alias, order_field, query, do_reverse) else: continue # ignore non-readable or "non-joinable" fields elif order_field in self._inherit_fields: parent_obj = self.pool[self._inherit_fields[order_field][3]] order_column = parent_obj._columns[order_field] if order_column._classic_read: - inner_clause = self._inherits_join_calc(alias, order_field, query) + inner_clauses = [self._inherits_join_calc(alias, order_field, query)] + add_dir = True elif order_column._type == 'many2one': - inner_clause = self._generate_m2o_order_by(alias, order_field, query) + inner_clauses = self._generate_m2o_order_by(alias, order_field, query, do_reverse) else: continue # ignore non-readable or "non-joinable" fields else: raise ValueError(_("Sorting field %s not found on model %s") % (order_field, self._name)) if order_column and order_column._type == 'boolean': - inner_clause = "COALESCE(%s, false)" % inner_clause - if inner_clause: - if isinstance(inner_clause, list): - for clause in inner_clause: - order_by_elements.append("%s %s" % (clause, order_direction)) + inner_clauses = ["COALESCE(%s, false)" % inner_clauses[0]] + + for clause in inner_clauses: + if add_dir: + order_by_elements.append("%s %s" % (clause, order_direction)) else: - order_by_elements.append("%s %s" % (inner_clause, order_direction)) + order_by_elements.append(clause) return order_by_elements def _generate_order_by(self, order_spec, query): From c9d41679fbeebf244a75964f8875f9b6c6c9f4e1 Mon Sep 17 00:00:00 2001 From: Mathias Neef Date: Fri, 14 Aug 2015 16:57:53 +0200 Subject: [PATCH 7/8] [FIX] website*: `active` class in menu In the top menu bar, the `active` class is set when the menu url matches the page url (the url in the browser url bar) A while ago, we made so all urls `/page/website.***' were automatically redirected to `/page/****` Therefore, if the menu url still contains this `website.` prefix, the active class wasn't set on it, while it should. Fixes #3059 Closes #3070 --- addons/website/controllers/main.py | 2 +- addons/website/data/data.xml | 4 ++-- addons/website_crm/data/website_crm_data.xml | 2 +- addons/website_hr/data/website_hr_data.xml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index 1dce8d28488..cd9f7e0d601 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -176,7 +176,7 @@ class Website(openerp.addons.web.controllers.main.Home): model, id = request.registry["ir.model.data"].get_object_reference(request.cr, request.uid, 'website', 'main_menu') request.registry['website.menu'].create(request.cr, request.uid, { 'name': path, - 'url': "/page/" + xml_id, + 'url': "/page/" + xml_id[8:], 'parent_id': id, }, context=request.context) # Reverse action in order to allow shortcut for /page/ diff --git a/addons/website/data/data.xml b/addons/website/data/data.xml index c5254d65c0f..95e1c1873ec 100644 --- a/addons/website/data/data.xml +++ b/addons/website/data/data.xml @@ -22,7 +22,7 @@ Contact us - /page/website.contactus + /page/contactus 60 @@ -64,7 +64,7 @@ Website Homepage - /page/website.homepage + /page/homepage self diff --git a/addons/website_crm/data/website_crm_data.xml b/addons/website_crm/data/website_crm_data.xml index ba131d22f34..7a831dc7adb 100644 --- a/addons/website_crm/data/website_crm_data.xml +++ b/addons/website_crm/data/website_crm_data.xml @@ -5,7 +5,7 @@ Website Contact Form self - /page/website.contactus + /page/contactus diff --git a/addons/website_hr/data/website_hr_data.xml b/addons/website_hr/data/website_hr_data.xml index 161b875556a..5afe68add8f 100644 --- a/addons/website_hr/data/website_hr_data.xml +++ b/addons/website_hr/data/website_hr_data.xml @@ -5,7 +5,7 @@ Website About self - /page/website.aboutus + /page/aboutus From 19b5ba2b08476ea2ede46ab7cf482526c47e62c8 Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Fri, 14 Aug 2015 17:02:53 +0200 Subject: [PATCH 8/8] [FIX] website: condition to flag a menu as `active` in the top menu 1. A menu with `/page/website.***` should be flagged as `active` if the current url is `/page/***`. This is a retro-compatibility patch for c9d41679fbeebf244a75964f8875f9b6c6c9f4e1, so the menu is marked as active without having to rename it, by removing this `website.` thing. 2. If you defined two menus with as url `/page/test` and `/page/test2` Both menus were flagged as `active` when you browsed the url `/page/test2`, because it started by both menus urls. Fixes #3059 Closes #3070 --- addons/website/views/website_templates.xml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml index b2255ac50ea..6febb78f87e 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -33,16 +33,15 @@