Skip to content
Snippets Groups Projects
Commit d52ec7fc authored by Gaurav Panchal's avatar Gaurav Panchal Committed by Christophe Matthieu
Browse files

[IMP] website: keyword search base on language on website promote

parent 9fa38eea
No related branches found
No related tags found
No related merge requests found
......@@ -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">
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment