diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index 32c006d1a6a..7aeec890d1b 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -257,12 +257,13 @@ class Website(openerp.addons.web.controllers.main.Home): obj = _object.browse(request.cr, request.uid, _id) return bool(obj.website_published) - @http.route(['/website/seo_suggest/'], type='http', auth="public", website=True) - def seo_suggest(self, keywords): + @http.route(['/website/seo_suggest'], type='json', auth="user", website=True) + def seo_suggest(self, keywords=None, lang=None): + language = lang.split("_") url = "http://google.com/complete/search" try: req = urllib2.Request("%s?%s" % (url, werkzeug.url_encode({ - 'ie': 'utf8', 'oe': 'utf8', 'output': 'toolbar', 'q': keywords}))) + 'ie': 'utf8', 'oe': 'utf8', 'output': 'toolbar', 'q': keywords, 'hl': language[0], 'gl': language[1]}))) request = urllib2.urlopen(req) except (urllib2.HTTPError, urllib2.URLError): return [] diff --git a/addons/website/static/src/js/website.seo.js b/addons/website/static/src/js/website.seo.js index a43d87c805d..d2b7683645f 100644 --- a/addons/website/static/src/js/website.seo.js +++ b/addons/website/static/src/js/website.seo.js @@ -10,6 +10,8 @@ var Widget = require('web.Widget'); var base = require('web_editor.base'); var website = require('website.website'); +var _t = core._t; + var qweb = core.qweb; ajax.loadXML('/website/static/src/xml/website.seo.xml', qweb); @@ -42,6 +44,7 @@ var Suggestion = Widget.extend({ init: function (parent, options) { this.root = options.root; this.keyword = options.keyword; + this.language = options.language; this.htmlPage = options.page; this._super(parent); }, @@ -67,6 +70,7 @@ var SuggestionList = Widget.extend({ template: 'website.seo_suggestion_list', init: function (parent, options) { this.root = options.root; + this.language = options.language; this.htmlPage = options.page; this._super(parent); }, @@ -75,31 +79,39 @@ var SuggestionList = Widget.extend({ }, refresh: function () { var self = this; - self.$el.append("Loading..."); - function addSuggestions (list) { - self.$el.empty(); - // TODO Improve algorithm + Ajust based on custom user keywords - var regex = new RegExp(self.root, "gi"); - var cleanList = _.map(list, function (word) { - return word.replace(regex, "").trim(); - }); - // TODO Order properly ? - _.each(_.uniq(cleanList), function (keyword) { - if (keyword) { - var suggestion = new Suggestion(self, { - root: self.root, - keyword: keyword, - page: self.htmlPage, - }); - suggestion.on('selected', self, function (word) { - self.trigger('selected', word); - }); - suggestion.appendTo(self.$el); - } - }); - } - $.getJSON("/website/seo_suggest/" + encodeURIComponent(this.root + " "), addSuggestions); + self.$el.append(_t("Loading...")); + var language = self.language || base.get_context().lang.toLowerCase(); + ajax.jsonRpc('/website/seo_suggest', 'call', { + 'keywords': self.root, + 'lang': language, + }).then(function(keyword_list){ + self.addSuggestions(JSON.parse(keyword_list)); + }); }, + addSuggestions: function(keywords) { + var self = this; + self.$el.empty(); + // TODO Improve algorithm + Ajust based on custom user keywords + var regex = new RegExp(self.root, "gi"); + var keywords = _.map(_.uniq(keywords), function (word) { + return word.replace(regex, "").trim(); + }); + // TODO Order properly ? + _.each(keywords, function (keyword) { + if (keyword) { + var suggestion = new Suggestion(self, { + root: self.root, + language: self.language, + keyword: keyword, + page: self.htmlPage, + }); + suggestion.on('selected', self, function (word, language) { + self.trigger('selected', word, language); + }); + suggestion.appendTo(self.$el); + } + }); + }, }); var Keyword = Widget.extend({ @@ -110,6 +122,7 @@ var Keyword = Widget.extend({ maxWordsPerKeyword: 4, // TODO Check init: function (parent, options) { this.keyword = options.word; + this.language = options.language; this.htmlPage = options.page; this._super(parent); }, @@ -118,10 +131,11 @@ var Keyword = Widget.extend({ this.htmlPage.on('description-changed', this, this.updateLabel); this.suggestionList = new SuggestionList(this, { root: this.keyword, + language: this.language, page: this.htmlPage, }); - this.suggestionList.on('selected', this, function (word) { - this.trigger('selected', word); + this.suggestionList.on('selected', this, function (word, language) { + this.trigger('selected', word, language); }); this.suggestionList.appendTo(this.$('.js_seo_keyword_suggestion')); }, @@ -159,11 +173,6 @@ var KeywordList = Widget.extend({ _.each(existingKeywords, function (word) { self.add.call(self, word); }); - } else { - var companyName = self.htmlPage.company().toLowerCase(); - if (companyName != 'yourcompany') { - self.add(companyName); - } } }, keywords: function () { @@ -179,21 +188,22 @@ var KeywordList = Widget.extend({ exists: function (word) { return _.contains(this.keywords(), word); }, - add: function (candidate) { + add: function (candidate, language) { var self = this; // TODO Refine var word = candidate ? candidate.replace(/[,;.:<>]+/g, " ").replace(/ +/g, " ").trim().toLowerCase() : ""; if (word && !self.isFull() && !self.exists(word)) { var keyword = new Keyword(self, { word: word, + language: language, page: this.htmlPage, }); keyword.on('removed', self, function () { self.trigger('list-not-full'); self.trigger('removed', word); }); - keyword.on('selected', self, function (word) { - self.trigger('selected', word); + keyword.on('selected', self, function (word, language) { + self.trigger('selected', word, language); }); keyword.appendTo(self.$el); } @@ -342,6 +352,7 @@ var Configurator = Widget.extend({ canEditTitle: false, canEditDescription: false, canEditKeywords: false, + canEditLanguage: false, maxTitleSize: 65, maxDescriptionSize: 150, start: function () { @@ -372,13 +383,31 @@ var Configurator = Widget.extend({ $modal.find('button[data-action=add]') .prop('disabled', false).removeClass('disabled'); }); - self.keywordList.on('selected', self, function (word) { - self.keywordList.add(word); + self.keywordList.on('selected', self, function (word, language) { + self.keywordList.add(word, language); }); self.keywordList.appendTo($modal.find('.js_seo_keywords_list')); self.disableUnsavableFields(); self.renderPreview(); $modal.modal(); + self.getLanguages(); + }, + getLanguages: function(){ + var self = this; + ajax.jsonRpc('/web/dataset/call_kw', 'call', { + model: 'website', + method: 'get_languages', + args: [], + kwargs: { + ids: [base.get_context().website_id], + context: base.get_context() + } + }).then( function(data) { + self.$('#language-box').html(core.qweb.render('Configurator.language_promote', { + 'language': data, + 'def_lang': base.get_context().lang + })); + }); }, disableUnsavableFields: function () { var self = this; @@ -431,8 +460,10 @@ var Configurator = Widget.extend({ }, addKeyword: function (word) { var $input = this.$('input[name=seo_page_keywords]'); + var $language = this.$('select[name=seo_page_language]'); var keyword = _.isString(word) ? word : $input.val(); - this.keywordList.add(keyword); + var language = $language.val().toLowerCase(); + this.keywordList.add(keyword, language); $input.val(""); }, update: function () { diff --git a/addons/website/static/src/xml/website.seo.xml b/addons/website/static/src/xml/website.seo.xml index c5522596a74..6e6e9438945 100644 --- a/addons/website/static/src/xml/website.seo.xml +++ b/addons/website/static/src/xml/website.seo.xml @@ -4,6 +4,12 @@
  • Promote
  • + + + + + +