[IMP] website: keyword search base on language on website promote
This commit is contained in:
committed by
Christophe Matthieu
parent
9fa38eeab2
commit
d52ec7fc42
@@ -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/<keywords>'], 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 []
|
||||
|
||||
@@ -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 () {
|
||||
|
||||
@@ -4,6 +4,12 @@
|
||||
<t t-name="website.TopBar.menu.promote">
|
||||
<li><a data-action="promote-current-page" href="#"><span title="Promote page on the web">Promote</span></a></li>
|
||||
</t>
|
||||
|
||||
<t t-name="Configurator.language_promote">
|
||||
<t t-foreach="language" t-as="lang">
|
||||
<option t-att-value="lang[0]" t-att-selected="lang[0] == def_lang ? 'selected' : null"><t t-esc="lang[1]" /></option>
|
||||
</t>
|
||||
</t>
|
||||
|
||||
<t t-name="website.seo_configuration">
|
||||
<div class="modal fade oe_seo_configuration js_seo_configuration" tabindex="-1" role="dialog">
|
||||
@@ -24,14 +30,24 @@
|
||||
<div class="form-group">
|
||||
<label for="seo_page_keywords" class="col-sm-3 control-label">Add keyword:</label>
|
||||
<div class="col-sm-4">
|
||||
<div class="input-group">
|
||||
<div>
|
||||
<input type="text" name="seo_page_keywords" class="form-control" maxlength="30"/>
|
||||
<span class="input-group-btn">
|
||||
<button data-action="add" class="btn btn-default" type="button">Add</button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt8">
|
||||
<label for="seo_page_language" class="col-sm-3 control-label">Language:</label>
|
||||
<div>
|
||||
<div class="col-sm-4">
|
||||
<select name="seo_page_language" id="language-box" class="form-control"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row mt8">
|
||||
<div class="col-md-10 text-center">
|
||||
<button data-action="add" class="btn btn-default" type="button">Add</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<span class="text-muted">Most searched topics related to your keywords, ordered by importance:</span>
|
||||
<!-- filled in JS -->
|
||||
@@ -97,7 +113,7 @@
|
||||
<dl class="dl-horizontal mt8 mb8">
|
||||
<dt>
|
||||
<span t-attf-title="#{ widget.tooltip() }" t-attf-class="oe_seo_keyword #{ widget.highlight() } js_seo_keyword" t-att-data-keyword="widget.keyword">
|
||||
<a href="#" class="oe_remove" data-action="remove-keyword">x</a> <t t-raw="widget.keyword"/>
|
||||
<t t-raw="widget.keyword"/> <a href="#" class="oe_remove" data-action="remove-keyword">x</a>
|
||||
</span>
|
||||
</dt>
|
||||
<dd class="js_seo_keyword_suggestion">
|
||||
|
||||
Reference in New Issue
Block a user