# -*- 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
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'):
_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'),
'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,
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">×</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 >= 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 < 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 < 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 <= forum.karma_ask) and 'karma_required' or ''}"
+ <button t-attf-class="btn btn-primary #{(user.karma < 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>