[MERGE] forward port of branch 8.0 up to ed92589
authorChristophe Simonis <chs@odoo.com>
Thu, 23 Oct 2014 15:14:35 +0000 (17:14 +0200)
committerChristophe Simonis <chs@odoo.com>
Thu, 23 Oct 2014 15:14:35 +0000 (17:14 +0200)
20 files changed:
1  2 
addons/account/account_invoice_view.xml
addons/calendar/calendar.py
addons/mail/static/src/js/mail.js
addons/product/product.py
addons/product/product_view.xml
addons/project/report/project_report.py
addons/web/static/src/js/core.js
addons/web_graph/static/src/js/graph_widget.js
addons/website/models/website.py
addons/website/views/website_templates.xml
addons/website_forum/controllers/main.py
addons/website_forum/data/forum_data.xml
addons/website_forum/models/forum.py
addons/website_forum/static/src/js/website_forum.js
addons/website_forum/views/forum.xml
addons/website_forum/views/website_forum.xml
addons/website_mail/views/website_email_designer.xml
addons/website_sale/controllers/main.py
addons/website_sale/views/templates.xml
openerp/models.py

Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -1,12 -1,8 +1,10 @@@
  # -*- coding: utf-8 -*-
  
- from datetime import datetime
  import werkzeug.urls
  import werkzeug.wrappers
- import re
  import simplejson
 +import lxml
 +from urllib2 import urlopen
  
  from openerp import tools
  from openerp import SUPERUSER_ID
@@@ -37,13 -32,15 +34,16 @@@ class WebsiteForum(http.Controller)
  
      def _prepare_forum_values(self, forum=None, **kwargs):
          user = request.registry['res.users'].browse(request.cr, request.uid, request.uid, context=request.context)
-         values = {'user': user,
-                   'is_public_user': user.id == request.website.user_id.id,
-                   'notifications': self._get_notifications(),
-                   'header': kwargs.get('header', dict()),
-                   'searches': kwargs.get('searches', dict()),
-                   'no_introduction_message': request.httprequest.cookies.get('no_introduction_message', False),
-                   }
+         values = {
+             'user': user,
+             'is_public_user': user.id == request.website.user_id.id,
+             'notifications': self._get_notifications(),
+             'header': kwargs.get('header', dict()),
+             'searches': kwargs.get('searches', dict()),
++            'no_introduction_message': request.httprequest.cookies.get('no_introduction_message', False),
+             'validation_email_sent': request.session.get('validation_email_sent', False),
+             'validation_email_done': request.session.get('validation_email_done', False),
+         }
          if forum:
              values['forum'] = forum
          elif kwargs.get('forum_id'):
@@@ -23,35 -25,27 +25,41 @@@ class Forum(osv.Model)
      _description = 'Forums'
      _inherit = ['mail.thread', 'website.seo.metadata']
  
+     def init(self, cr):
+         """ Add forum uuid for user email validation. """
+         forum_uuids = self.pool['ir.config_parameter'].search(cr, SUPERUSER_ID, [('key', '=', 'website_forum.uuid')])
+         if not forum_uuids:
+             self.pool['ir.config_parameter'].set_param(cr, SUPERUSER_ID, 'website_forum.uuid', str(uuid.uuid4()), ['base.group_system'])
      _columns = {
 -        'name': fields.char('Name', required=True, translate=True),
 +        'name': fields.char('Forum Name', required=True, translate=True),
          'faq': fields.html('Guidelines'),
          'description': fields.html('Description'),
 +        'introduction_message': fields.html('Introduction Message'),
 +        'relevancy_option_first': fields.float('First Relevancy Parameter'),
 +        'relevancy_option_second': fields.float('Second Relevancy Parameter'),
 +        'default_order': fields.selection([
 +            ('create_date desc','Newest'),
 +            ('write_date desc','Last Updated'),
 +            ('vote_count desc','Most Voted'),
 +            ('relevancy desc','Relevancy'),
 +            ('child_count desc','Answered'),
 +            ], 'Default Order', required=True),
 +        'default_allow': fields.selection([('post_link','Link'),('ask_question','Question'),('post_discussion','Discussion')], 'Default Post', required=True),
 +        'allow_link': fields.boolean('Links', help="When clicking on the post, it redirects to an external link"),
 +        'allow_question': fields.boolean('Questions', help="Users can answer only once per question. Contributors can edit answers and mark the right ones."),
 +        'allow_discussion': fields.boolean('Discussions'),
          # karma generation
-         'karma_gen_question_new': fields.integer('Post a Questions'),
-         'karma_gen_question_upvote': fields.integer('Upvote a Question'),
-         'karma_gen_question_downvote': fields.integer('Downvote a Question'),
-         'karma_gen_answer_upvote': fields.integer('Upvote an Answer'),
-         'karma_gen_answer_downvote': fields.integer('Downvote an answer'),
-         'karma_gen_answer_accept': fields.integer('Accept an Answer'),
-         'karma_gen_answer_accepted': fields.integer('Have Your Answer Accepted'),
-         'karma_gen_answer_flagged': fields.integer('Have Your Answer Flagged'),
+         'karma_gen_question_new': fields.integer('Asking a question'),
+         'karma_gen_question_upvote': fields.integer('Question upvoted'),
+         'karma_gen_question_downvote': fields.integer('Question downvoted'),
+         'karma_gen_answer_upvote': fields.integer('Answer upvoted'),
+         'karma_gen_answer_downvote': fields.integer('Answer downvoted'),
+         'karma_gen_answer_accept': fields.integer('Accepting an answer'),
+         'karma_gen_answer_accepted': fields.integer('Answer accepted'),
+         'karma_gen_answer_flagged': fields.integer('Answer flagged'),
          # karma-based actions
 -        'karma_ask': fields.integer('Ask a question'),
 +        'karma_ask': fields.integer('Ask a new question'),
          'karma_answer': fields.integer('Answer a question'),
          'karma_edit_own': fields.integer('Edit its own posts'),
          'karma_edit_all': fields.integer('Edit all posts'),
@@@ -62,9 -56,9 +70,9 @@@
          'karma_upvote': fields.integer('Upvote'),
          'karma_downvote': fields.integer('Downvote'),
          'karma_answer_accept_own': fields.integer('Accept an answer on its own questions'),
-         'karma_answer_accept_all': fields.integer('Accept an answers to all questions'),
+         'karma_answer_accept_all': fields.integer('Accept an answer to all questions'),
          'karma_editor_link_files': fields.integer('Linking files (Editor)'),
 -        'karma_editor_clickable_link': fields.integer('Clickable links (Editor)'),
 +        'karma_editor_clickable_link': fields.integer('Add clickable links (Editor)'),
          'karma_comment_own': fields.integer('Comment its own posts'),
          'karma_comment_all': fields.integer('Comment all posts'),
          'karma_comment_convert_own': fields.integer('Convert its own answers to comments and vice versa'),
          return False
  
      _defaults = {
 +        'default_order': 'write_date desc',
 +        'allow_question': True,
 +        'default_allow': 'ask_question',
 +        'allow_link': False,
 +        'allow_discussion': False,
          'description': 'This community is for professionals and enthusiasts of our products and services.',
          'faq': _get_default_faq,
+         'karma_gen_question_new': 0,  # set to null for anti spam protection
 +        'introduction_message': """<h1 class="mt0">Welcome!</h1>
 +                  <p> This community is for professionals and enthusiasts of our products and services.
 +                      Share and discuss the best content and new marketing ideas,
 +                      build your professional profile and become a better marketer together.
 +                  </p>""",
 +        'relevancy_option_first': 0.8,
 +        'relevancy_option_second': 1.8,
-         'karma_gen_question_new': 2,
          'karma_gen_question_upvote': 5,
          'karma_gen_question_downvote': -2,
          'karma_gen_answer_upvote': 10,
@@@ -105,36 -101,25 +101,51 @@@ $(document).ready(function () 
              ev.preventDefault();
              var $link = $(ev.currentTarget);
              openerp.jsonRpc("/forum/notification_read", 'call', {
-                 'notification_id': $link.attr("id")})
-             return true;
+                 'notification_id': $link.attr("id")});
+         });
+         $('.send_validation_email').on('click', function (ev) {
+             ev.preventDefault();
+             var $link = $(ev.currentTarget);
+             openerp.jsonRpc("/forum/send_validation_email", 'call', {
+                 'forum_id': $link.attr('forum-id'),
+             }).then(function (data) {
+                 if (data) {
+                     $('button.validation_email_close').click();
+                 }
+             });
+         });
+         $('.validated_email_close').on('click', function (ev) {
+             openerp.jsonRpc("/forum/validate_email/close", 'call', {});
          });
  
 +        $('.js_close_intro').on('click', function (ev) {
 +            ev.preventDefault();
 +            document.cookie = "no_introduction_message = false";
 +            return true;
 +        });
 +
 +        $('.link_url').on('change', function (ev) {
 +            ev.preventDefault();
 +            var $link = $(ev.currentTarget);
 +            if ($link.attr("value").search("^http(s?)://.*")) {
 +                var $warning = $('<div class="alert alert-danger alert-dismissable" style="position:absolute; margin-top: -180px; margin-left: 90px;">'+
 +                    '<button type="button" class="close notification_close" data-dismiss="alert" aria-hidden="true">&times;</button>'+
 +                    'Please enter valid URl.'+
 +                    '</div>');
 +                $link.parent().append($warning);
 +                $link.parent().find("button#btn_post_your_article")[0].disabled = true;
 +                $link.parent().find("input[name='content']")[0].value = '';
 +            } else {
 +                openerp.jsonRpc("/forum/get_url_title", 'call', {'url': $link.attr("value")}).then(function (data) {
 +                    $link.parent().find("input[name='content']")[0].value = data;
 +                    $('button').prop('disabled', false);
 +                    $('input').prop('readonly', false);
 +                });
 +            }
 +        });
 +
          if($('input.load_tags').length){
              var tags = $("input.load_tags").val();
              $("input.load_tags").val("");
              <field name="arch" type="xml">
                  <form string="Forum">
                      <sheet>
 -                        <group>
 +                        <label for="name" class="oe_edit_only"/>
 +                        <h1>
                              <field name="name"/>
 +                        </h1>
-                         <group>
-                             <group string="Post Types">
+                         </group>
+                         <notebook>
++                            <page string="Options">
++                              <group string="Post Types">
 +                                <field name="allow_question"/>
 +                                <field name="allow_link"/>
 +                                <field name="allow_discussion"/>
 +                                <field name="default_allow"/>
-                             </group>
-                             <group string="Orders">
++                              </group>
++                              <group string="Orders">
 +                                <field name="default_order"/>
 +                                <label for="relevancy_option_first" string="Relevancy Computation"/>
 +                                <div>
 +                                    (votes - 1) ** <field name="relevancy_option_first" class="oe_inline"/> / (days + 2) ** <field name="relevancy_option_second" class="oe_inline"/>
 +                                </div>
-                             </group>
-                         </group>
-                         <group>
-                             <group string="Earn Karma">
-                                 <field name="karma_gen_question_new"/>
-                                 <field name="karma_gen_question_upvote"/>
-                                 <field name="karma_gen_question_downvote"/>
-                                 <field name="karma_gen_answer_upvote"/>
-                                 <field name="karma_gen_answer_downvote"/>
-                                 <field name="karma_gen_answer_accept"/>
-                                 <field name="karma_gen_answer_accepted"/>
-                                 <field name="karma_gen_answer_flagged"/>
-                             </group>
-                             <group string="Karma Related Rights">
-                                 <field name="karma_ask"/>
-                                 <field name="karma_edit_own"/>
-                                 <field name="karma_edit_all"/>
-                                 <field name="karma_close_own"/>
-                                 <field name="karma_close_all"/>
-                                 <field name="karma_unlink_own"/>
-                                 <field name="karma_unlink_all"/>
-                                 <field name="karma_upvote"/>
-                                 <field name="karma_downvote"/>
-                                 <field name="karma_answer_accept_own"/>
-                                 <field name="karma_answer_accept_all"/>
-                                 <field name="karma_editor_link_files"/>
-                                 <field name="karma_editor_clickable_link"/>
-                                 <field name="karma_comment_own"/>
-                                 <field name="karma_comment_all"/>
-                                 <field name="karma_comment_convert_own"/>
-                                 <field name="karma_comment_convert_all"/>
-                                 <field name="karma_comment_unlink_own"/>
-                                 <field name="karma_comment_unlink_all"/>
-                             </group>
-                         </group>
++                              </group>
++                            </page>
+                             <page string='Karma Gains'>
+                                 <group>
+                                     <field name="karma_gen_question_new"/>
+                                     <field name="karma_gen_question_upvote"/>
+                                     <field name="karma_gen_question_downvote"/>
+                                     <field name="karma_gen_answer_upvote"/>
+                                     <field name="karma_gen_answer_downvote"/>
+                                     <field name="karma_gen_answer_accept"/>
+                                     <field name="karma_gen_answer_accepted"/>
++                                    <field name="karma_gen_answer_flagged"/>
+                                 </group>
+                             </page>
 -                            <page string='Karma Requirements'>
++                            <page string='Karma Related Rights'>
+                                 <group>
+                                     <group>
+                                         <field name="karma_ask"/>
+                                         <field name="karma_upvote"/>
+                                         <field name="karma_downvote"/>
+                                         <field name="karma_edit_own"/>
+                                         <field name="karma_edit_all"/>
+                                         <field name="karma_close_own"/>
+                                         <field name="karma_close_all"/>
+                                         <field name="karma_unlink_own"/>
+                                         <field name="karma_unlink_all"/>
+                                     </group>
+                                     <group>
+                                         <field name="karma_answer_accept_own"/>
+                                         <field name="karma_answer_accept_all"/>
++                                        <field name="karma_editor_link_files"/>
++                                        <field name="karma_editor_clickable_link"/>
+                                         <field name="karma_comment_own"/>
+                                         <field name="karma_comment_all"/>
+                                         <field name="karma_comment_convert_own"/>
+                                         <field name="karma_comment_convert_all"/>
+                                         <field name="karma_comment_unlink_own"/>
+                                         <field name="karma_comment_unlink_all"/>
+                                     </group>
+                                 </group>
+                             </page>
+                         </notebook>
                      </sheet>
                      <div class="oe_chatter">
                          <field name="message_follower_ids" widget="mail_followers" groups="base.group_user"/>
                      <t t-raw="0"/>
                  </div>
                  <div class="col-sm-3" id="right-column">
-                     <div t-if="not header.get('ask_hide')" t-attf-class="btn-group btn-block mb16 #{user.karma &gt;= forum.karma_ask and '' or 'karma_required'}" t-attf-data-karma="#{forum.karma_ask}">
 -                    <a t-if="not header.get('ask_hide')"
 -                       t-attf-class="btn btn-primary btn-lg btn-block mb16 #{(user.karma &lt; forum.karma_ask) and 'karma_required' or ''}"
 -                       t-attf-href="/forum/#{slug(forum)}/ask"
 -                       t-attf-data-karma="#{forum.karma_ask}">Ask a Question</a>
++                    <div t-if="not header.get('ask_hide')" t-attf-class="btn-group btn-block mb16 #{(user.karma &lt; forum.karma_ask) and 'karma_required' or ''}" t-attf-data-karma="#{forum.karma_ask}">
 +                        <a type="button" class="btn btn-primary btn-lg col-sm-10" t-attf-href="/forum/#{slug(forum)}/#{forum.default_allow}">
 +                            <t t-if="forum.default_allow == 'ask_question'">Ask a Question</t>
 +                            <t t-if="forum.default_allow == 'post_link'">Submit a Post</t>
 +                            <t t-if="forum.default_allow == 'post_discussion'">New Discussion</t>
 +                        </a>
 +                        <button type="button" class="btn btn-primary btn-lg col-sm-2 dropdown-toggle" data-toggle="dropdown">
 +                            <span class="caret"></span>
 +                            <span class="sr-only">Select Post</span>
 +                        </button>
 +                        <ul class="dropdown-menu" role="menu">
 +                            <li t-if="forum.allow_link"><a t-attf-href="/forum/#{slug(forum)}/post_link">Submit a Post</a></li>
 +                            <li t-if="forum.allow_question"><a t-attf-href="/forum/#{slug(forum)}/ask_question">Ask a Question</a></li>
 +                            <li t-if="forum.allow_discussion"><a t-attf-href="/forum/#{slug(forum)}/post_discussion">Launch a Discussion</a></li>
 +                        </ul>
 +                    </div>
                      <div class="panel panel-default">
                          <div class="panel-heading">
                              <h3 class="panel-title">Keep Informed</h3>
                  <t t-esc="question_content"/>
              </textarea>
              <br/>
 -            <input type="text" name="question_tags" placeholder="Tags" class="form-control load_tags"/>
 +            <input type="text" name="post_tags" placeholder="Tags" class="form-control load_tags"/>
              <br/>
-             <button t-attf-class="btn btn-primary #{(user.karma &lt;= forum.karma_ask) and 'karma_required' or ''}"
+             <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>
          </form>
 -        <script type="text/javascript">
 -            CKEDITOR.replace("content");
 -        </script>
      </t>
  </template>
  
Simple merge