diff options
| author | Fabien Meghazi <fme@openerp.com> | 2013-10-25 17:24:46 +0200 |
|---|---|---|
| committer | Fabien Meghazi <fme@openerp.com> | 2013-10-25 17:24:46 +0200 |
| commit | eb7b1362cdaeb7a2221e542f1dad1ea483305477 (patch) | |
| tree | d208b212dc8626e64842be9aea49d25edb8253a0 /addons/website | |
| parent | ec09c0fa2cfe970c3aecabbf45b3e8a495206b4d (diff) | |
[WIP] Menu working from database (not yet multi-website)
bzr revid: fme@openerp.com-20131025152446-si9gsjujzcn40hip
Diffstat (limited to 'addons/website')
| -rw-r--r-- | addons/website/data/website_data.xml | 10 | ||||
| -rw-r--r-- | addons/website/models/website.py | 61 | ||||
| -rw-r--r-- | addons/website/security/ir.model.access.csv | 1 | ||||
| -rw-r--r-- | addons/website/static/src/js/website.editor.js | 38 | ||||
| -rw-r--r-- | addons/website/static/src/js/website.js | 1 | ||||
| -rw-r--r-- | addons/website/static/src/xml/website.editor.xml | 7 | ||||
| -rw-r--r-- | addons/website/views/website_templates.xml | 1 |
7 files changed, 102 insertions, 17 deletions
diff --git a/addons/website/data/website_data.xml b/addons/website/data/website_data.xml index 854462ca606..da1ba324030 100644 --- a/addons/website/data/website_data.xml +++ b/addons/website/data/website_data.xml @@ -8,6 +8,16 @@ <field name="default_lang_id" ref="base.lang_en"/> </record> + <record id="main_menu" model="website.menu"> + <field name="name">Main Menu</field> + </record> + + <record id="menu_contactus" model="website.menu"> + <field name="name">Contact us</field> + <field name="url">/page/website.contactus</field> + <field name="parent_id" ref="website.main_menu"/> + </record> + <record id="public_user" model="res.users"> <field name="name">public</field> <field name="login">public</field> diff --git a/addons/website/models/website.py b/addons/website/models/website.py index 0436fd1931a..8a0bdec4d39 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import fnmatch import functools +import operator import simplejson import openerp @@ -362,8 +363,7 @@ class website(osv.osv): return html def get_menu_tree(self, cr, uid, ids, context=None): - return self.pool['website.menu'].get_tree(cr, uid, ids[0]) - + return self.pool['website.menu'].get_tree(cr, uid, ids[0], context=context) class website_menu(osv.osv): _name = "website.menu" @@ -378,21 +378,50 @@ class website_menu(osv.osv): 'parent_left': fields.integer('Parent Left', select=True), 'parent_right': fields.integer('Parent Right', select=True), } + _defaults = { + 'url': '', + 'sequence': 0, + } + _order = "parent_left" + + # TODO: ormcache + def get_tree(self, cr, uid, website_id, fields=None, context=None): + if not fields: + fields = ['id', 'name', 'url', 'sequence', 'parent_id'] + root_domain = [('parent_id', '=', False)] # ('website_id', '=', website_id), + root_menu_id = self.search(cr, uid, root_domain, limit=1, context=context)[0] + menu_ids = self.search(cr, uid, [('id', 'child_of', root_menu_id)], 0, False, False, context) + menu_items = self.read(cr, uid, menu_ids, fields, context=context) + menu_items_map = dict( + (menu_item["id"], menu_item) for menu_item in menu_items) + for menu_item in menu_items: + if menu_item['parent_id']: + parent = menu_item['parent_id'][0] + else: + parent = False + if parent in menu_items_map: + menu_items_map[parent].setdefault( + 'children', []).append(menu_item) + + # sort by sequence a tree using parent_id + for menu_item in menu_items: + menu_item.setdefault('children', []).sort( + key=operator.itemgetter('sequence')) + + return menu_items[0] + + def get_list(self, cr, uid, website_id, context=None): + def get_menu_item(node, level=0): + item = node.copy() + item['level'] = level + item.pop('children') + yield item + level += 1 + for child in node['children']: + yield get_menu_item(child, level) + tree = self.get_tree(cr, uid, website_id) + return list(get_menu_item(tree)) - def get_tree(self, cr, uid, website_id=False, context=None): - menu_root = { - 'id': False, - 'name': 'root', - 'url': '', - 'children': [], - 'parent_id': 0, - } - domain = [('parent_id', '=', 0)] # ('website_id', '=', website_id)] - root = self.search(cr, uid, domain, context=context) - if root: - pass - #menu_ids = Menus.search([('id', 'child_of', root)], 0, False, False, context) - return menu_root class ir_attachment(osv.osv): _inherit = "ir.attachment" diff --git a/addons/website/security/ir.model.access.csv b/addons/website/security/ir.model.access.csv index 431170e462b..8304e9861ea 100644 --- a/addons/website/security/ir.model.access.csv +++ b/addons/website/security/ir.model.access.csv @@ -1,6 +1,7 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_website_public,website,website.model_website,base.group_public,1,0,0,0 access_website,website,website.model_website,base.group_user,1,0,0,0 +access_website_menu,access_website_menu,model_website_menu,,1,0,0,0 access_website_converter_test,access_website_converter_test,model_website_converter_test,,1,1,1,1 access_website_converter_test_sub,access_website_converter_test_sub,model_website_converter_test_sub,,1,1,1,1 access_website_qweb,access_website_qweb,model_website_qweb,,0,0,0,0 diff --git a/addons/website/static/src/js/website.editor.js b/addons/website/static/src/js/website.editor.js index f9d2aef339b..826c2e39091 100644 --- a/addons/website/static/src/js/website.editor.js +++ b/addons/website/static/src/js/website.editor.js @@ -674,6 +674,7 @@ return $.when( this.fetch_pages().done(this.proxy('fill_pages')), + this.fetch_menus().done(this.proxy('fill_menus')), this._super() ).done(this.proxy('bind_data')); }, @@ -762,6 +763,23 @@ '/pagenew/%s?noredirect', encodeURI(val))) .then(function (response) { self.make_link(response, false, val); + var parent_id = self.$('.add-to-menu').val(); + if (parent_id) { + return openerp.jsonRpc('/web/dataset/call_kw', 'call', { + model: 'website.menu', + method: 'create', + args: [{ + 'name': val, + 'url': response, + 'sequence': 0, // TODO: better tree widget + 'website_id': website.id, + 'parent_id': parent_id|0, + }], + kwargs: { + context: website.get_context() + }, + }); + } }); } else { this.make_link(val, this.$('input.window-new').prop('checked')); @@ -828,6 +846,26 @@ new Option(result.name, result.url); }); }, + fetch_menus: function () { + var context = website.get_context(); + return openerp.jsonRpc('/web/dataset/call_kw', 'call', { + model: 'website.menu', + method: 'get_list', + args: [[context.website_id]], + kwargs: { + context: context + }, + }); + }, + fill_menus: function (results) { + var self = this; + var menus = this.$('select.add-to-menu')[0]; + _(results).each(function (result) { + var name = (new Array(result.level).join('|-')) + ' ' + result.name; + menus.options[menus.options.length] = + new Option(name, result.id || 0); + }); + }, }); /** * ImageDialog widget. Lets users change an image, including uploading a diff --git a/addons/website/static/src/js/website.js b/addons/website/static/src/js/website.js index fc3a8e570cc..df9e5e40414 100644 --- a/addons/website/static/src/js/website.js +++ b/addons/website/static/src/js/website.js @@ -114,6 +114,7 @@ var tpl = website.load_templates(templates); all_ready = dom_ready.then(function () { if ($('html').data('editable')) { + website.id = $('html').data('website-id'); website.session = new openerp.Session(); var modules = ['website']; return openerp._t.database.load_translations(website.session, modules, website.get_context().lang); diff --git a/addons/website/static/src/xml/website.editor.xml b/addons/website/static/src/xml/website.editor.xml index 685712d3411..894ea0baffe 100644 --- a/addons/website/static/src/xml/website.editor.xml +++ b/addons/website/static/src/xml/website.editor.xml @@ -50,6 +50,13 @@ </select> </li> <li class="list-group-item form-group"> + <div class="pull-right"> + <label> + <select class="add-to-menu"> + <option>Create a menu entry in ...</option> + </select> + </label> + </div> <h3 class="list-group-item-heading"> <label for="link-new" class="control-label"> New page diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml index 886e3868662..7e838df745c 100644 --- a/addons/website/views/website_templates.xml +++ b/addons/website/views/website_templates.xml @@ -120,7 +120,6 @@ <t t-call="website.submenu"/> </t> - <li name="contactus"><a t-href="/page/website.contactus">Contact us</a></li> <li t-if="user_id.id == website.public_user.id"><a href="/web">Sign in</a></li> <li t-if="user_id.id != website.public_user.id"><a href="/web"><span t-field="user_id.name"/></a></li> <li t-if="request.multilang and |
