[FIX] website_forum - replace texttext by select2 for the tags fields
authorJeremy Kersten <jke@odoo.com>
Fri, 14 Nov 2014 18:14:12 +0000 (19:14 +0100)
committerJeremy Kersten <jke@odoo.com>
Mon, 17 Nov 2014 15:50:34 +0000 (16:50 +0100)
addons/website_forum/controllers/main.py
addons/website_forum/static/src/js/website_forum.js
addons/website_forum/views/website_forum.xml

index 3253b94..d074c2e 100644 (file)
@@ -170,9 +170,18 @@ class WebsiteForum(http.Controller):
         return request.website.render("website_forum.faq", values)
 
     @http.route('/forum/get_tags', type='http', auth="public", methods=['GET'], website=True)
-    def tag_read(self, **post):
-        tags = request.registry['forum.tag'].search_read(request.cr, request.uid, [], ['name'], context=request.context)
-        data = [tag['name'] for tag in tags]
+    def tag_read(self, q='', l=25, t='texttext', **post):
+        data = request.registry['forum.tag'].search_read(
+            request.cr,
+            request.uid,
+            domain=[('name', '=ilike', (q or '') + "%")],
+            fields=['id', 'name'],
+            limit=int(l),
+            context=request.context
+        )
+        if t == 'texttext':
+            # old tag with texttext - Retro for V8 - #TODO Remove in master
+            data = [tag['name'] for tag in data]
         return simplejson.dumps(data)
 
     @http.route(['/forum/<model("forum.forum"):forum>/tag'], type='http', auth="public", website=True)
@@ -195,7 +204,7 @@ class WebsiteForum(http.Controller):
     def question_ask(self, forum, **post):
         if not request.session.uid:
             return login_redirect()
-        values = self._prepare_forum_values(forum=forum, searches={},  header={'ask_hide': True})
+        values = self._prepare_forum_values(forum=forum, searches={}, header={'ask_hide': True})
         return request.website.render("website_forum.ask_question", values)
 
     @http.route('/forum/<model("forum.forum"):forum>/question/new', type='http', auth="user", methods=['POST'], website=True)
@@ -203,14 +212,23 @@ class WebsiteForum(http.Controller):
         cr, uid, context = request.cr, request.uid, request.context
         Tag = request.registry['forum.tag']
         question_tag_ids = []
-        if post.get('question_tags').strip('[]'):
-            tags = post.get('question_tags').strip('[]').replace('"', '').split(",")
+        tag_version = post.get('tag_type', 'texttext')
+        if tag_version == "texttext":  # TODO Remove in master
+            if post.get('question_tags').strip('[]'):
+                tags = post.get('question_tags').strip('[]').replace('"', '').split(",")
+                for tag in tags:
+                    tag_ids = Tag.search(cr, uid, [('name', '=', tag)], context=context)
+                    if tag_ids:
+                        question_tag_ids.append((4, tag_ids[0]))
+                    else:
+                        question_tag_ids.append((0, 0, {'name': tag, 'forum_id': forum.id}))
+        elif tag_version == "select2":
+            tags = filter(None, post.get('question_tags', '').split(','))
             for tag in tags:
-                tag_ids = Tag.search(cr, uid, [('name', '=', tag)], context=context)
-                if tag_ids:
-                    question_tag_ids.append((4, tag_ids[0]))
+                if tag.startswith('_'):  # it's a new tag
+                    question_tag_ids.append((0, 0, {'name': tag[1:], 'forum_id': forum.id}))
                 else:
-                    question_tag_ids.append((0, 0, {'name': tag, 'forum_id': forum.id}))
+                    question_tag_ids.append((4, int(tag)))
 
         new_question_id = request.registry['forum.post'].create(
             request.cr, request.uid, {
@@ -357,10 +375,16 @@ class WebsiteForum(http.Controller):
 
     @http.route('/forum/<model("forum.forum"):forum>/post/<model("forum.post"):post>/edit', type='http', auth="user", website=True)
     def post_edit(self, forum, post, **kwargs):
-        tags = ""
-        for tag_name in post.tag_ids:
-            tags += tag_name.name + ","
+        tag_version = kwargs.get('tag_type', 'texttext')
+        if tag_version == "texttext":  # old version - retro v8 - #TODO Remove in master
+            tags = ""
+            for tag_name in post.tag_ids:
+                tags += tag_name.name + ","
+        elif tag_version == "select2":  # new version
+            tags = [dict(id=tag.id, name=tag.name) for tag in post.tag_ids]
+            tags = simplejson.dumps(tags)
         values = self._prepare_forum_values(forum=forum)
+
         values.update({
             'tags': tags,
             'post': post,
@@ -369,20 +393,46 @@ class WebsiteForum(http.Controller):
         })
         return request.website.render("website_forum.edit_post", values)
 
+    @http.route('/forum/<model("forum.forum"):forum>/post/<model("forum.post"):post>/edition', type='http', auth="user", website=True)
+    def post_edit_retro(self, forum, post, **kwargs):
+        # This function is only there for retrocompatibility between old template using texttext and template using select2
+        # It should be removed into master  #TODO JKE: remove in master all condition with tag_type
+        kwargs.update(tag_type="select2")
+        return self.post_edit(forum, post, **kwargs)
+
     @http.route('/forum/<model("forum.forum"):forum>/post/<model("forum.post"):post>/save', type='http', auth="user", methods=['POST'], website=True)
     def post_save(self, forum, post, **kwargs):
         cr, uid, context = request.cr, request.uid, request.context
         question_tags = []
-        if kwargs.get('question_tag') and kwargs.get('question_tag').strip('[]'):
-            Tag = request.registry['forum.tag']
-            tags = kwargs.get('question_tag').strip('[]').replace('"', '').split(",")
-            for tag in tags:
-                tag_ids = Tag.search(cr, uid, [('name', '=', tag)], context=context)
-                if tag_ids:
-                    question_tags += tag_ids
+        User = request.registry['res.users']
+        Tag = request.registry['forum.tag']
+        tag_version = kwargs.get('tag_type', 'texttext')
+        if tag_version == "texttext":  # old version - retro v8 - #TODO Remove in master
+            if kwargs.get('question_tag') and kwargs.get('question_tag').strip('[]'):
+                tags = kwargs.get('question_tag').strip('[]').replace('"', '').split(",")
+                for tag in tags:
+                    tag_ids = Tag.search(cr, uid, [('name', '=', tag)], context=context)
+                    if tag_ids:
+                        question_tags += tag_ids
+                    else:
+                        new_tag = Tag.create(cr, uid, {'name': tag, 'forum_id': forum.id}, context=context)
+                        question_tags.append(new_tag)
+        elif tag_version == "select2":  # new version
+            for tag in filter(None, kwargs.get('question_tag', '').split(',')):
+                if tag.startswith('_'):  # it's a new tag
+                # check if user have Karma needed to create need tag
+                    user = User.browse(cr, SUPERUSER_ID, uid, context=context)
+                    if user.exists() and user.karma >= forum.karma_retag:
+                        # check that not arleady created meanwhile and maybe excluded by the limit on the search
+                        tag_ids = Tag.search(cr, uid, [('name', '=', tag[1:])], context=context)
+                        if tag_ids:
+                            new_tag = tag_ids
+                        else:
+                            new_tag = Tag.create(cr, uid, {'name': tag[1:], 'forum_id': forum.id}, context=context)
+                        question_tags.append(new_tag)
                 else:
-                    new_tag = Tag.create(cr, uid, {'name': tag, 'forum_id': forum.id}, context=context)
-                    question_tags.append(new_tag)
+                    question_tags += [int(tag)]
+
         vals = {
             'tag_ids': [(6, 0, question_tags)],
             'name': kwargs.get('question_name'),
index 75cf37c..49aa2fc 100644 (file)
@@ -120,6 +120,67 @@ $(document).ready(function () {
             openerp.jsonRpc("/forum/validate_email/close", 'call', {});
         });
 
+
+        $('input.js_select2').select2({
+            tags: true,
+            tokenSeparators: [",", " ", "_"],
+            maximumInputLength: 35,
+            minimumInputLength: 2,
+            maximumSelectionSize: 5,
+            lastsearch: [],
+            createSearchChoice: function (term) {
+                if ($(lastsearch).filter(function () { return this.text.localeCompare(term) === 0;}).length === 0) {
+                    //check Karma
+                    if (parseInt($("#karma").val()) >= parseInt($("#karma_retag").val())) {
+                        return {
+                            id: "_" + $.trim(term),
+                            text: $.trim(term) + ' *',
+                            isNew: true,
+                        };
+                    }
+                    
+                }
+            },
+            formatResult: function(term) {
+                if (term.isNew) {
+                    return '<span class="label label-primary">New</span> ' + _.escape(term.text);
+                }
+                else {
+                    return _.escape(term.text);
+                }
+            },
+            ajax: {
+                url: '/forum/get_tags',
+                dataType: 'json',
+                data: function(term, page) {
+                    return {
+                        q: term,
+                        t: 'select2',
+                        l: 50
+                    };
+                },
+                results: function(data, page) {
+                    var ret = [];
+                    _.each(data, function(x) {
+                        ret.push({ id: x.id, text: x.name, isNew: false });
+                    });
+                    lastsearch = ret;
+                    return { results: ret };
+                }
+            },
+
+            // Take default tags from the input value
+            initSelection: function (element, callback) {
+                var data = [];
+                _.each(JSON.parse(element.val()), function(x) {
+                    data.push({ id: x.id, text: x.name, isNew: false });
+                });
+                element.val('');
+                callback(data);
+            },
+        });
+
+        //TODO Remove in master
         if($('input.load_tags').length){
             var tags = $("input.load_tags").val();
             $("input.load_tags").val("");
@@ -150,6 +211,7 @@ $(document).ready(function () {
                 }
             });
         }
+        //END-TODO Remove in master
 
         if ($('textarea.load_editor').length) {
             var editor = CKEDITOR.instances['content'];
@@ -159,6 +221,7 @@ $(document).ready(function () {
 });
 
 
+
 function IsKarmaValid(eventNumber,minKarma){
     "use strict";
     if(parseInt($("#karma").val()) >= minKarma){
index 565d348..4de5262 100644 (file)
                 class="form-control" placeholder="Enter your Question"/>
             <h5 class="mt20">Please enter a descriptive question (should finish with a '?')</h5>
             <input type="hidden" name="karma" t-attf-value="#{user.karma}" id="karma"/>
+            <input type="hidden" name="karma_retag" t-attf-value="#{forum.karma_retag}" id="karma_retag"/>
             <textarea name="content" required="True" class="form-control load_editor">
                 <t t-esc="question_content"/>
             </textarea>
             <br/>
-            <input type="text" name="question_tags" placeholder="Tags" class="form-control load_tags"/>
+            <input type="hidden" name="tag_type" value="select2"/>
+            <input type="hidden" name="question_tags" placeholder="Tags" class="form-control js_select2"/>
             <br/>
             <button t-attf-class="btn btn-primary #{(user.karma &lt; forum.karma_ask) and 'karma_required' or ''}"
                 id="btn_ask_your_question" t-att-data-karma="forum.karma_ask">Post Your Question</button>
                 <h5 class="mt20">Please enter a descriptive question (should finish by a '?')</h5>
             </div>
             <input type="hidden" name="karma" t-attf-value="#{user.karma}" id="karma"/>
+            <input type="hidden" name="karma_retag" t-attf-value="#{forum.karma_retag}" id="karma_retag"/>
             <textarea name="content" required="True" class="form-control load_editor">
                 <t t-esc="post.content"/>
             </textarea>
             <div t-if="not is_answer">
                 <br/>
-                <input type="text" name="question_tag" class="form-control col-md-9 load_tags" placeholder="Tags" t-attf-value="#{tags}"/>
+                <input type="hidden" name="tag_type" value="select2"/>
+                <input type="hidden" name="question_tag" class="form-control col-md-9 js_select2" placeholder="Tags" t-attf-value="#{tags}"/>
                 <br/>
             </div>
             <button class="btn btn-primary btn-lg">Save</button>
                             </li>
                             <li>
                                 <t t-call="website_forum.link_button">
-                                    <t t-set="url" t-value="'/forum/' + slug(forum) +'/post/' + slug(question) + '/edit'"/>
+                                    <t t-set="url" t-value="'/forum/' + slug(forum) +'/post/' + slug(question) + '/edition'"/>
                                     <t t-set="label" t-value="'Edit'"/>
                                     <t t-set="classes" t-value="'fa-edit'"/>
                                     <t t-set="karma" t-value="not question.can_edit and question.karma_edit or 0"/>