summaryrefslogtreecommitdiff
path: root/addons/website
diff options
context:
space:
mode:
authorFabien Meghazi <fme@openerp.com>2013-10-25 17:24:46 +0200
committerFabien Meghazi <fme@openerp.com>2013-10-25 17:24:46 +0200
commiteb7b1362cdaeb7a2221e542f1dad1ea483305477 (patch)
treed208b212dc8626e64842be9aea49d25edb8253a0 /addons/website
parentec09c0fa2cfe970c3aecabbf45b3e8a495206b4d (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.xml10
-rw-r--r--addons/website/models/website.py61
-rw-r--r--addons/website/security/ir.model.access.csv1
-rw-r--r--addons/website/static/src/js/website.editor.js38
-rw-r--r--addons/website/static/src/js/website.js1
-rw-r--r--addons/website/static/src/xml/website.editor.xml7
-rw-r--r--addons/website/views/website_templates.xml1
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