From 122ddb8e310df0a4cfd597cb49cbe8863f862d8b Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 13 Nov 2013 11:18:24 +0100 Subject: [PATCH] [IMP] rename list_pages to enumerate_pages, add a search method and a basic non-contiguous substring match bzr revid: xmo@openerp.com-20131113101824-uqatvqokkzhvi0ei --- addons/website/controllers/main.py | 4 +- addons/website/models/website.py | 37 ++++++++++++++++++- .../website/static/src/js/website.editor.js | 3 +- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index aa214b8c998..f22f9c2b052 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -273,12 +273,12 @@ class Website(openerp.addons.web.controllers.main.Home): @website.route('/sitemap', type='http', auth='public', multilang=True) def sitemap(self): - return request.website.render('website.sitemap', {'pages': request.website.list_pages()}) + return request.website.render('website.sitemap', {'pages': request.website.enumerate_pages()}) @website.route('/sitemap.xml', type='http', auth="public") def sitemap_xml(self): body = request.website.render('website.sitemap_xml', { - 'pages': request.website.list_pages() + 'pages': request.website.enumerate_pages() }) return request.make_response(body, [ diff --git a/addons/website/models/website.py b/addons/website/models/website.py index e34139273f1..6efa419c892 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -323,7 +323,7 @@ class website(osv.osv): (arg == 'self' or arg in rule._converters) for arg in args) - def list_pages(self, cr, uid, ids, context=None): + def enumerate_pages(self, cr, uid, ids, context=None): """ Available pages in the website/CMS. This is mostly used for links generation and can be overridden by modules setting up new HTML controllers for dynamic pages (e.g. blog). @@ -363,6 +363,41 @@ class website(osv.osv): domain_part, url = rule.build(values, append_unknown=False) yield {'name': url, 'url': url } + def search_pages(self, cr, uid, ids, needle=None, limit=None, context=None): + pages = self.enumerate_pages(cr, uid, ids, context=context) + + if needle: + pages = itertools.ifilter(lambda v: self.page_matches( + cr, uid, v, needle, context=None), pages) + + return list(itertools.islice(pages, limit)) + + def page_matches(self, cr, uid, page, needle, context=None): + """ Checks that a "page" matches a user-provide search string. + + The default implementation attempts to perform a non-contiguous + substring match of the page's name. + + :param page: {'name': str, 'url': str} + :param needle: str + :rtype: bool + """ + haystack = page['name'].lower() + + needle = iter(needle.lower()) + n = next(needle) + end = object() + + for char in haystack: + if char != n: continue + + n = next(needle, end) + # found all characters of needle in haystack in order + if n is end: + return True + + return False + def kanban(self, cr, uid, ids, model, domain, column, template, step=None, scope=None, orderby=None, context=None): step = step and int(step) or 10 scope = scope and int(scope) or 5 diff --git a/addons/website/static/src/js/website.editor.js b/addons/website/static/src/js/website.editor.js index 5915ee5b359..af5763b9500 100644 --- a/addons/website/static/src/js/website.editor.js +++ b/addons/website/static/src/js/website.editor.js @@ -930,9 +930,10 @@ fetch_pages: function () { return openerp.jsonRpc('/web/dataset/call_kw', 'call', { model: 'website', - method: 'list_pages', + method: 'search_pages', args: [null], kwargs: { + limit: 10, context: website.get_context() }, });