[MERGE] from trunk

bzr revid: rim@openerp.com-20140416101400-4hvdv1z59sl6zqgw
This commit is contained in:
Richard Mathot (OpenERP) 2014-04-16 12:14:00 +02:00
commit 598d23a4a5
28 changed files with 454 additions and 379 deletions

View File

@ -840,16 +840,11 @@ class account_journal(osv.osv):
def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=100): def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=100):
if not args: if not args:
args = [] args = []
if context is None: if operator in expression.NEGATIVE_TERM_OPERATORS:
context = {} domain = [('code', operator, name), ('name', operator, name)]
ids = [] else:
if context.get('journal_type', False): domain = ['|', ('code', operator, name), ('name', operator, name)]
args += [('type','=',context.get('journal_type'))] ids = self.search(cr, user, expression.AND([domain, args]), limit=limit, context=context)
if name:
ids = self.search(cr, user, [('code', 'ilike', name)]+ args, limit=limit, context=context)
if not ids:
ids = self.search(cr, user, [('name', 'ilike', name)]+ args, limit=limit, context=context)#fix it ilike should be replace with operator
return self.name_get(cr, user, ids, context=context) return self.name_get(cr, user, ids, context=context)
@ -938,13 +933,11 @@ class account_fiscalyear(osv.osv):
def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=80): def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=80):
if args is None: if args is None:
args = [] args = []
if context is None: if operator in expression.NEGATIVE_TERM_OPERATORS:
context = {} domain = [('code', operator, name), ('name', operator, name)]
ids = [] else:
if name: domain = ['|', ('code', operator, name), ('name', operator, name)]
ids = self.search(cr, user, [('code', 'ilike', name)]+ args, limit=limit) ids = self.search(cr, user, expression.AND([domain, args]), limit=limit, context=context)
if not ids:
ids = self.search(cr, user, [('name', operator, name)]+ args, limit=limit)
return self.name_get(cr, user, ids, context=context) return self.name_get(cr, user, ids, context=context)
@ -1040,19 +1033,11 @@ class account_period(osv.osv):
def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=100): def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=100):
if args is None: if args is None:
args = [] args = []
if context is None: if operator in expression.NEGATIVE_TERM_OPERATORS:
context = {} domain = [('code', operator, name), ('name', operator, name)]
ids = [] else:
if name: domain = ['|', ('code', operator, name), ('name', operator, name)]
ids = self.search(cr, user, ids = self.search(cr, user, expression.AND([domain, args]), limit=limit, context=context)
[('code', 'ilike', name)] + args,
limit=limit,
context=context)
if not ids:
ids = self.search(cr, user,
[('name', operator, name)] + args,
limit=limit,
context=context)
return self.name_get(cr, user, ids, context=context) return self.name_get(cr, user, ids, context=context)
def write(self, cr, uid, ids, vals, context=None): def write(self, cr, uid, ids, vals, context=None):
@ -1187,36 +1172,6 @@ class account_move(osv.osv):
'company_id': company_id, 'company_id': company_id,
} }
def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=80):
"""
Returns a list of tupples containing id, name, as internally it is called {def name_get}
result format: {[(id, name), (id, name), ...]}
@param cr: A database cursor
@param user: ID of the user currently logged in
@param name: name to search
@param args: other arguments
@param operator: default operator is 'ilike', it can be changed
@param context: context arguments, like lang, time zone
@param limit: Returns first 'n' ids of complete result, default is 80.
@return: Returns a list of tuples containing id and name
"""
if not args:
args = []
ids = []
if name:
ids += self.search(cr, user, [('name','ilike',name)]+args, limit=limit, context=context)
if not ids and name and type(name) == int:
ids += self.search(cr, user, [('id','=',name)]+args, limit=limit, context=context)
if not ids:
ids += self.search(cr, user, args, limit=limit, context=context)
return self.name_get(cr, user, ids, context=context)
def name_get(self, cursor, user, ids, context=None): def name_get(self, cursor, user, ids, context=None):
if isinstance(ids, (int, long)): if isinstance(ids, (int, long)):
ids = [ids] ids = [ids]
@ -1842,10 +1797,12 @@ class account_tax_code(osv.osv):
def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=80): def name_search(self, cr, user, name, args=None, operator='ilike', context=None, limit=80):
if not args: if not args:
args = [] args = []
if context is None: if operator in expression.NEGATIVE_TERM_OPERATORS:
context = {} domain = [('code', operator, name), ('name', operator, name)]
ids = self.search(cr, user, ['|',('name',operator,name),('code',operator,name)] + args, limit=limit, context=context) else:
return self.name_get(cr, user, ids, context) domain = ['|', ('code', operator, name), ('name', operator, name)]
ids = self.search(cr, user, expression.AND([domain, args]), limit=limit, context=context)
return self.name_get(cr, user, ids, context=context)
def name_get(self, cr, uid, ids, context=None): def name_get(self, cr, uid, ids, context=None):
if isinstance(ids, (int, long)): if isinstance(ids, (int, long)):
@ -1974,15 +1931,11 @@ class account_tax(osv.osv):
""" """
if not args: if not args:
args = [] args = []
if context is None: if operator in expression.NEGATIVE_TERM_OPERATORS:
context = {} domain = [('description', operator, name), ('name', operator, name)]
ids = []
if name:
ids = self.search(cr, user, [('description', '=', name)] + args, limit=limit, context=context)
if not ids:
ids = self.search(cr, user, [('name', operator, name)] + args, limit=limit, context=context)
else: else:
ids = self.search(cr, user, args, limit=limit, context=context or {}) domain = ['|', ('description', operator, name), ('name', operator, name)]
ids = self.search(cr, user, expression.AND([domain, args]), limit=limit, context=context)
return self.name_get(cr, user, ids, context=context) return self.name_get(cr, user, ids, context=context)
def write(self, cr, uid, ids, vals, context=None): def write(self, cr, uid, ids, vals, context=None):

View File

@ -165,7 +165,7 @@ class account_invoice_refund(osv.osv_memory):
to_reconcile_ids = {} to_reconcile_ids = {}
for line in movelines: for line in movelines:
if line.account_id.id == inv.account_id.id: if line.account_id.id == inv.account_id.id:
to_reconcile_ids[line.account_id.id] = [line.id] to_reconcile_ids.setdefault(line.account_id.id, []).append(line.id)
if line.reconcile_id: if line.reconcile_id:
line.reconcile_id.unlink() line.reconcile_id.unlink()
inv_obj.signal_invoice_open(cr, uid, [refund.id]) inv_obj.signal_invoice_open(cr, uid, [refund.id])

View File

@ -162,7 +162,7 @@ class crossovered_budget_lines(osv.osv):
elapsed = strToDate(date_to) - strToDate(date_to) elapsed = strToDate(date_to) - strToDate(date_to)
if total.days: if total.days:
theo_amt = float(elapsed.days / float(total.days)) * line.planned_amount theo_amt = float((elapsed.days + 1) / float(total.days + 1)) * line.planned_amount
else: else:
theo_amt = line.planned_amount theo_amt = line.planned_amount

View File

@ -197,6 +197,10 @@ class calendar_attendee(osv.Model):
@param email_from: email address for user sending the mail @param email_from: email address for user sending the mail
""" """
res = False res = False
if self.pool['ir.config_parameter'].get_param(cr, uid, 'calendar.block_mail', default=False):
return res
mail_ids = [] mail_ids = []
data_pool = self.pool['ir.model.data'] data_pool = self.pool['ir.model.data']
mailmess_pool = self.pool['mail.message'] mailmess_pool = self.pool['mail.message']
@ -431,7 +435,7 @@ class calendar_alarm_manager(osv.AbstractModel):
if cron and len(cron) == 1: if cron and len(cron) == 1:
cron = self.pool.get('ir.cron').browse(cr, uid, cron[0], context=context) cron = self.pool.get('ir.cron').browse(cr, uid, cron[0], context=context)
else: else:
raise ("Cron for " + self._name + " not identified :( !") _logger.exception("Cron for " + self._name + " can not be identified !")
if cron.interval_type == "weeks": if cron.interval_type == "weeks":
cron_interval = cron.interval_number * 7 * 24 * 60 * 60 cron_interval = cron.interval_number * 7 * 24 * 60 * 60
@ -445,7 +449,7 @@ class calendar_alarm_manager(osv.AbstractModel):
cron_interval = cron.interval_number cron_interval = cron.interval_number
if not cron_interval: if not cron_interval:
raise ("Cron delay for " + self._name + " can not be calculated :( !") _logger.exception("Cron delay can not be computed !")
all_events = self.get_next_potential_limit_alarm(cr, uid, cron_interval, notif=False, context=context) all_events = self.get_next_potential_limit_alarm(cr, uid, cron_interval, notif=False, context=context)
@ -649,7 +653,7 @@ class calendar_event(osv.Model):
_inherit = ["mail.thread", "ir.needaction_mixin"] _inherit = ["mail.thread", "ir.needaction_mixin"]
def do_run_scheduler(self, cr, uid, id, context=None): def do_run_scheduler(self, cr, uid, id, context=None):
self.pool['calendar.alarm_manager'].do_run_scheduler(cr, uid, context=context) self.pool['calendar.alarm_manager'].get_next_mail(cr, uid, context=context)
def get_recurrent_date_by_event(self, cr, uid, event, context=None): def get_recurrent_date_by_event(self, cr, uid, event, context=None):
"""Get recurrent dates based on Rule string and all event where recurrent_id is child """Get recurrent dates based on Rule string and all event where recurrent_id is child

View File

@ -287,30 +287,33 @@ class gamification_goal(osv.Model):
field_date_name = definition.field_date_id and definition.field_date_id.name or False field_date_name = definition.field_date_id and definition.field_date_id.name or False
if definition.computation_mode == 'count' and definition.batch_mode: if definition.computation_mode == 'count' and definition.batch_mode:
# batch mode, trying to do as much as possible in one request
general_domain = safe_eval(definition.domain) general_domain = safe_eval(definition.domain)
# goal_distinct_values = {goal.id: safe_eval(definition.batch_user_expression, {'user': goal.user_id}) for goal in goals}
field_name = definition.batch_distinctive_field.name field_name = definition.batch_distinctive_field.name
# general_domain.append((field_name, 'in', list(set(goal_distinct_values.keys()))))
subqueries = {} subqueries = {}
for goal in goals: for goal in goals:
start_date = field_date_name and goal.start_date or False start_date = field_date_name and goal.start_date or False
end_date = field_date_name and goal.end_date or False end_date = field_date_name and goal.end_date or False
subqueries.setdefault((start_date, end_date), {}).update({goal.id:safe_eval(definition.batch_user_expression, {'user': goal.user_id})}) subqueries.setdefault((start_date, end_date), {}).update({goal.id:safe_eval(definition.batch_user_expression, {'user': goal.user_id})})
# the global query should be split by time periods (especially for recurrent goals)
for (start_date, end_date), query_goals in subqueries.items(): for (start_date, end_date), query_goals in subqueries.items():
subquery_domain = list(general_domain) subquery_domain = list(general_domain)
subquery_domain.append((field_name, 'in', list(set(query_goals.values())))) subquery_domain.append((field_name, 'in', list(set(query_goals.values()))))
if start_date: if start_date:
subquery_domain.append((field_date_name, '>=', start_date)) subquery_domain.append((field_date_name, '>=', start_date))
if end_date: if end_date:
subquery_domain.append((field_date_name, '>=', end_date)) subquery_domain.append((field_date_name, '<=', end_date))
user_values = obj.read_group(cr, uid, subquery_domain, fields=[field_name], groupby=[field_name], context=context)
if field_name == 'id':
# grouping on id does not work and is similar to search anyway
user_ids = obj.search(cr, uid, subquery_domain, context=context)
user_values = [{'id': user_id, 'id_count': 1} for user_id in user_ids]
else:
user_values = obj.read_group(cr, uid, subquery_domain, fields=[field_name], groupby=[field_name], context=context)
# user_values has format of read_group: [{'partner_id': 42, 'partner_id_count': 3},...]
for goal in [g for g in goals if g.id in query_goals.keys()]: for goal in [g for g in goals if g.id in query_goals.keys()]:
for user_value in user_values: for user_value in user_values:
# return format of read_group: [{'partner_id': 42, 'partner_id_count': 3},...]
queried_value = field_name in user_value and user_value[field_name] or False queried_value = field_name in user_value and user_value[field_name] or False
if isinstance(queried_value, tuple) and len(queried_value) == 2 and isinstance(queried_value[0], (int, long)): if isinstance(queried_value, tuple) and len(queried_value) == 2 and isinstance(queried_value[0], (int, long)):
queried_value = queried_value[0] queried_value = queried_value[0]

View File

@ -61,13 +61,12 @@ class res_users_gamification_group(osv.Model):
challenge_obj.generate_goals_from_challenge(cr, SUPERUSER_ID, challenge_ids, context=context) challenge_obj.generate_goals_from_challenge(cr, SUPERUSER_ID, challenge_ids, context=context)
return write_res return write_res
# def get_goals_todo_info(self, cr, uid, context=None): def get_serialised_gamification_summary(self, cr, uid, excluded_categories=None, context=None):
return self._serialised_goals_summary(cr, uid, user_id=uid, excluded_categories=excluded_categories, context=context)
def get_serialised_gamification_summary(self, cr, uid, context=None): def _serialised_goals_summary(self, cr, uid, user_id, excluded_categories=None, context=None):
return self._serialised_goals_summary(cr, uid, user_id=uid, context=context)
def _serialised_goals_summary(self, cr, uid, user_id, context=None):
"""Return a serialised list of goals assigned to the user, grouped by challenge """Return a serialised list of goals assigned to the user, grouped by challenge
:excluded_categories: list of challenge categories to exclude in search
[ [
{ {
@ -81,9 +80,11 @@ class res_users_gamification_group(osv.Model):
""" """
all_goals_info = [] all_goals_info = []
challenge_obj = self.pool.get('gamification.challenge') challenge_obj = self.pool.get('gamification.challenge')
domain = [('user_ids', 'in', uid), ('state', '=', 'inprogress')]
if excluded_categories and isinstance(excluded_categories, list):
domain.append(('category', 'not in', excluded_categories))
user = self.browse(cr, uid, uid, context=context) user = self.browse(cr, uid, uid, context=context)
challenge_ids = challenge_obj.search(cr, uid, [('user_ids', 'in', uid), ('state', '=', 'inprogress')], context=context) challenge_ids = challenge_obj.search(cr, uid, domain, context=context)
for challenge in challenge_obj.browse(cr, uid, challenge_ids, context=context): for challenge in challenge_obj.browse(cr, uid, challenge_ids, context=context):
# serialize goals info to be able to use it in javascript # serialize goals info to be able to use it in javascript
lines = challenge_obj._get_serialized_challenge_lines(cr, uid, challenge, user_id, restrict_top=MAX_VISIBILITY_RANKING, context=context) lines = challenge_obj._get_serialized_challenge_lines(cr, uid, challenge, user_id, restrict_top=MAX_VISIBILITY_RANKING, context=context)

View File

@ -81,12 +81,12 @@
</page> </page>
<page string="Reward"> <page string="Reward">
<group> <group>
<field name="reward_id"/> <field name="reward_id" attrs="{'required': [('reward_realtime','=', True)]}" />
<field name="reward_first_id" /> <field name="reward_first_id" />
<field name="reward_second_id" attrs="{'invisible': [('reward_first_id','=', False)]}" /> <field name="reward_second_id" attrs="{'invisible': [('reward_first_id','=', False)]}" />
<field name="reward_third_id" attrs="{'invisible': ['|',('reward_first_id','=', False),('reward_second_id','=', False)]}" /> <field name="reward_third_id" attrs="{'invisible': ['|',('reward_first_id','=', False),('reward_second_id','=', False)]}" />
<field name="reward_failure" attrs="{'invisible': [('reward_first_id','=', False)]}" /> <field name="reward_failure" attrs="{'invisible': [('reward_first_id','=', False)]}" />
<field name="reward_realtime" attrs="{'readonly': [('reward_id','=', False)], 'required': [('reward_id','!=', False)]}" /> <field name="reward_realtime" />
</group> </group>
<div class="oe_grey"> <div class="oe_grey">
<p>Badges are granted when a challenge is finished. This is either at the end of a running period (eg: end of the month for a monthly challenge), at the end date of a challenge (if no periodicity is set) or when the challenge is manually closed.</p> <p>Badges are granted when a challenge is finished. This is either at the end of a running period (eg: end of the month for a monthly challenge), at the end date of a challenge (if no periodicity is set) or when the challenge is manually closed.</p>

View File

@ -31,6 +31,7 @@ except ImportError:
from lxml import etree from lxml import etree
import logging import logging
import pytz import pytz
import socket
import time import time
import xmlrpclib import xmlrpclib
from email.message import Message from email.message import Message
@ -880,25 +881,30 @@ class mail_thread(osv.AbstractModel):
# 2. message is a reply to an existign thread (6.1 compatibility) # 2. message is a reply to an existign thread (6.1 compatibility)
ref_match = thread_references and tools.reference_re.search(thread_references) ref_match = thread_references and tools.reference_re.search(thread_references)
if ref_match: if ref_match:
thread_id = int(ref_match.group(1)) reply_thread_id = int(ref_match.group(1))
model = ref_match.group(2) or fallback_model reply_model = ref_match.group(2) or fallback_model
if thread_id and model in self.pool: reply_hostname = ref_match.group(3)
model_obj = self.pool[model] local_hostname = socket.gethostname()
compat_mail_msg_ids = mail_msg_obj.search( # do not match forwarded emails from another OpenERP system (thread_id collision!)
cr, uid, [ if local_hostname == reply_hostname:
('message_id', '=', False), thread_id, model = reply_thread_id, reply_model
('model', '=', model), if thread_id and model in self.pool:
('res_id', '=', thread_id), model_obj = self.pool[model]
], context=context) compat_mail_msg_ids = mail_msg_obj.search(
if compat_mail_msg_ids and model_obj.exists(cr, uid, thread_id) and hasattr(model_obj, 'message_update'): cr, uid, [
_logger.info( ('message_id', '=', False),
'Routing mail from %s to %s with Message-Id %s: direct thread reply (compat-mode) to model: %s, thread_id: %s, custom_values: %s, uid: %s', ('model', '=', model),
email_from, email_to, message_id, model, thread_id, custom_values, uid) ('res_id', '=', thread_id),
route = self.message_route_verify( ], context=context)
cr, uid, message, message_dict, if compat_mail_msg_ids and model_obj.exists(cr, uid, thread_id) and hasattr(model_obj, 'message_update'):
(model, thread_id, custom_values, uid, None), _logger.info(
update_author=True, assert_model=True, create_fallback=True, context=context) 'Routing mail from %s to %s with Message-Id %s: direct thread reply (compat-mode) to model: %s, thread_id: %s, custom_values: %s, uid: %s',
return route and [route] or [] email_from, email_to, message_id, model, thread_id, custom_values, uid)
route = self.message_route_verify(
cr, uid, message, message_dict,
(model, thread_id, custom_values, uid, None),
update_author=True, assert_model=True, create_fallback=True, context=context)
return route and [route] or []
# 2. Reply to a private message # 2. Reply to a private message
if in_reply_to: if in_reply_to:

View File

@ -21,6 +21,7 @@
from openerp.addons.mail.tests.common import TestMail from openerp.addons.mail.tests.common import TestMail
from openerp.tools import mute_logger from openerp.tools import mute_logger
import socket
MAIL_TEMPLATE = """Return-Path: <whatever-2a840@postmaster.twitter.com> MAIL_TEMPLATE = """Return-Path: <whatever-2a840@postmaster.twitter.com>
To: {to} To: {to}
@ -400,13 +401,15 @@ class TestMailgateway(TestMail):
to='noone@example.com', subject='spam', to='noone@example.com', subject='spam',
extra='In-Reply-To: <12321321-openerp-%d-mail.group@example.com>' % frog_group.id, extra='In-Reply-To: <12321321-openerp-%d-mail.group@example.com>' % frog_group.id,
msg_id='<1.1.JavaMail.new@agrolait.com>') msg_id='<1.1.JavaMail.new@agrolait.com>')
# There are 6.1 messages, activate compat mode
# When 6.1 messages are present, compat mode is available
# Create a fake 6.1 message
tmp_msg_id = self.mail_message.create(cr, uid, {'message_id': False, 'model': 'mail.group', 'res_id': frog_group.id}) tmp_msg_id = self.mail_message.create(cr, uid, {'message_id': False, 'model': 'mail.group', 'res_id': frog_group.id})
# Do: compat mode accepts partial-matching emails # Do: compat mode accepts partial-matching emails
frog_groups = format_and_process(MAIL_TEMPLATE, email_from='other5@gmail.com', frog_groups = format_and_process(MAIL_TEMPLATE, email_from='other5@gmail.com',
msg_id='<1.2.JavaMail.new@agrolait.com>', msg_id='<1.2.JavaMail.new@agrolait.com>',
to='noone@example.com>', subject='spam', to='noone@example.com>', subject='spam',
extra='In-Reply-To: <12321321-openerp-%d-mail.group@example.com>' % frog_group.id) extra='In-Reply-To: <12321321-openerp-%d-mail.group@%s>' % (frog_group.id, socket.gethostname()))
self.mail_message.unlink(cr, uid, [tmp_msg_id]) self.mail_message.unlink(cr, uid, [tmp_msg_id])
# Test: no group 'Re: news' created, still only 1 Frogs group # Test: no group 'Re: news' created, still only 1 Frogs group
self.assertEqual(len(frog_groups), 0, self.assertEqual(len(frog_groups), 0,
@ -418,6 +421,17 @@ class TestMailgateway(TestMail):
# Test: one new message # Test: one new message
self.assertEqual(len(frog_group.message_ids), 4, 'message_process: group should contain 4 messages after reply') self.assertEqual(len(frog_group.message_ids), 4, 'message_process: group should contain 4 messages after reply')
# 6.1 compat mode should not work if hostname does not match!
tmp_msg_id = self.mail_message.create(cr, uid, {'message_id': False, 'model': 'mail.group', 'res_id': frog_group.id})
self.assertRaises(ValueError,
format_and_process,
MAIL_TEMPLATE, email_from='other5@gmail.com',
msg_id='<1.3.JavaMail.new@agrolait.com>',
to='noone@example.com>', subject='spam',
extra='In-Reply-To: <12321321-openerp-%d-mail.group@neighbor.com>' % frog_group.id)
self.mail_message.unlink(cr, uid, [tmp_msg_id])
# Do: due to some issue, same email goes back into the mailgateway # Do: due to some issue, same email goes back into the mailgateway
frog_groups = format_and_process(MAIL_TEMPLATE, email_from='other4@gmail.com', frog_groups = format_and_process(MAIL_TEMPLATE, email_from='other4@gmail.com',
msg_id='<1198923581.41972151344608186760.JavaMail.diff1@agrolait.com>', msg_id='<1198923581.41972151344608186760.JavaMail.diff1@agrolait.com>',
@ -445,7 +459,7 @@ class TestMailgateway(TestMail):
# Do: post a new message, with a known partner -> duplicate emails -> partner # Do: post a new message, with a known partner -> duplicate emails -> partner
format_and_process(MAIL_TEMPLATE, email_from='Lombrik Lubrik <test_raoul@email.com>', format_and_process(MAIL_TEMPLATE, email_from='Lombrik Lubrik <test_raoul@email.com>',
to='erroneous@example.com>', subject='Re: news (2)', subject='Re: news (2)',
msg_id='<1198923581.41972151344608186760.JavaMail.new1@agrolait.com>', msg_id='<1198923581.41972151344608186760.JavaMail.new1@agrolait.com>',
extra='In-Reply-To: <1198923581.41972151344608186799.JavaMail.diff1@agrolait.com>') extra='In-Reply-To: <1198923581.41972151344608186799.JavaMail.diff1@agrolait.com>')
frog_groups = self.mail_group.search(cr, uid, [('name', '=', 'Frogs')]) frog_groups = self.mail_group.search(cr, uid, [('name', '=', 'Frogs')])
@ -456,10 +470,9 @@ class TestMailgateway(TestMail):
# Do: post a new message, with a known partner -> duplicate emails -> user # Do: post a new message, with a known partner -> duplicate emails -> user
frog_group.message_unsubscribe([extra_partner_id]) frog_group.message_unsubscribe([extra_partner_id])
raoul_email = self.user_raoul.email
self.res_users.write(cr, uid, self.user_raoul_id, {'email': 'test_raoul@email.com'}) self.res_users.write(cr, uid, self.user_raoul_id, {'email': 'test_raoul@email.com'})
format_and_process(MAIL_TEMPLATE, email_from='Lombrik Lubrik <test_raoul@email.com>', format_and_process(MAIL_TEMPLATE, email_from='Lombrik Lubrik <test_raoul@email.com>',
to='erroneous@example.com>', subject='Re: news (3)', to='groups@example.com', subject='Re: news (3)',
msg_id='<1198923581.41972151344608186760.JavaMail.new2@agrolait.com>', msg_id='<1198923581.41972151344608186760.JavaMail.new2@agrolait.com>',
extra='In-Reply-To: <1198923581.41972151344608186799.JavaMail.diff1@agrolait.com>') extra='In-Reply-To: <1198923581.41972151344608186799.JavaMail.diff1@agrolait.com>')
frog_groups = self.mail_group.search(cr, uid, [('name', '=', 'Frogs')]) frog_groups = self.mail_group.search(cr, uid, [('name', '=', 'Frogs')])
@ -474,7 +487,7 @@ class TestMailgateway(TestMail):
raoul_email = self.user_raoul.email raoul_email = self.user_raoul.email
self.res_users.write(cr, uid, self.user_raoul_id, {'email': 'test_raoul@email.com'}) self.res_users.write(cr, uid, self.user_raoul_id, {'email': 'test_raoul@email.com'})
format_and_process(MAIL_TEMPLATE, email_from='Lombrik Lubrik <test_raoul@email.com>', format_and_process(MAIL_TEMPLATE, email_from='Lombrik Lubrik <test_raoul@email.com>',
to='erroneous@example.com>', subject='Re: news (3)', to='groups@example.com', subject='Re: news (3)',
msg_id='<1198923581.41972151344608186760.JavaMail.new3@agrolait.com>', msg_id='<1198923581.41972151344608186760.JavaMail.new3@agrolait.com>',
extra='In-Reply-To: <1198923581.41972151344608186799.JavaMail.diff1@agrolait.com>') extra='In-Reply-To: <1198923581.41972151344608186799.JavaMail.diff1@agrolait.com>')
frog_groups = self.mail_group.search(cr, uid, [('name', '=', 'Frogs')]) frog_groups = self.mail_group.search(cr, uid, [('name', '=', 'Frogs')])

View File

@ -29,7 +29,7 @@ from openerp.osv import osv
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
class MailThread(osv.Model): class MailThread(osv.AbstractModel):
""" Update MailThread to add the feature of bounced emails and replied emails """ Update MailThread to add the feature of bounced emails and replied emails
in message_process. """ in message_process. """
_name = 'mail.thread' _name = 'mail.thread'

View File

@ -12,8 +12,7 @@
<field name="name" invisible="1"/> <field name="name" invisible="1"/>
<field name="model" invisible="1"/> <field name="model" invisible="1"/>
<h3 colspan="2">Body</h3> <h3 colspan="2">Body</h3>
<field name="body_html" nolabel="1" colspan="2" <field name="body_html" nolabel="1" colspan="2" widget='text' />
placeholder="Rich-text/HTML content of the message (placeholders may be used here)"/>
<field name="attachment_ids" nolabel="1" colspan="2" <field name="attachment_ids" nolabel="1" colspan="2"
widget="many2many_binary"/> widget="many2many_binary"/>
</group> </group>

View File

@ -133,10 +133,7 @@ class purchase_order(osv.osv):
def _invoiced(self, cursor, user, ids, name, arg, context=None): def _invoiced(self, cursor, user, ids, name, arg, context=None):
res = {} res = {}
for purchase in self.browse(cursor, user, ids, context=context): for purchase in self.browse(cursor, user, ids, context=context):
invoiced = False res[purchase.id] = all(line.invoiced for line in purchase.order_line)
if purchase.invoiced_rate == 100.00:
invoiced = True
res[purchase.id] = invoiced
return res return res
def _get_journal(self, cr, uid, context=None): def _get_journal(self, cr, uid, context=None):
@ -542,7 +539,7 @@ class purchase_order(osv.osv):
inv_line_id = inv_line_obj.create(cr, uid, inv_line_data, context=context) inv_line_id = inv_line_obj.create(cr, uid, inv_line_data, context=context)
inv_lines.append(inv_line_id) inv_lines.append(inv_line_id)
po_line.write({'invoiced': True, 'invoice_lines': [(4, inv_line_id)]}, context=context) po_line.write({'invoice_lines': [(4, inv_line_id)]}, context=context)
# get invoice data and create invoice # get invoice data and create invoice
inv_data = { inv_data = {
@ -1290,9 +1287,15 @@ class account_invoice(osv.Model):
else: else:
user_id = uid user_id = uid
po_ids = purchase_order_obj.search(cr, user_id, [('invoice_ids', 'in', ids)], context=context) po_ids = purchase_order_obj.search(cr, user_id, [('invoice_ids', 'in', ids)], context=context)
for po_id in po_ids: for order in purchase_order_obj.browse(cr, uid, po_ids, context=context):
purchase_order_obj.message_post(cr, user_id, po_id, body=_("Invoice received"), context=context) purchase_order_obj.message_post(cr, user_id, order.id, body=_("Invoice received"), context=context)
workflow.trg_write(uid, 'purchase.order', po_id, cr) invoiced = []
for po_line in order.order_line:
if any(line.invoice_id.state not in ['draft', 'cancel'] for line in po_line.invoice_lines):
invoiced.append(po_line.id)
if invoiced:
self.pool['purchase.order.line'].write(cr, uid, invoiced, {'invoiced': True})
workflow.trg_write(uid, 'purchase.order', order.id, cr)
return res return res
def confirm_paid(self, cr, uid, ids, context=None): def confirm_paid(self, cr, uid, ids, context=None):

View File

@ -110,7 +110,6 @@ class stock_picking(osv.osv):
invoice_line_obj = self.pool.get('account.invoice.line') invoice_line_obj = self.pool.get('account.invoice.line')
purchase_line_obj = self.pool.get('purchase.order.line') purchase_line_obj = self.pool.get('purchase.order.line')
purchase_line_obj.write(cursor, user, [move_line.purchase_line_id.id], { purchase_line_obj.write(cursor, user, [move_line.purchase_line_id.id], {
'invoiced': True,
'invoice_lines': [(4, invoice_line_id)], 'invoice_lines': [(4, invoice_line_id)],
}) })
return super(stock_picking, self)._invoice_line_hook(cursor, user, move_line, invoice_line_id) return super(stock_picking, self)._invoice_line_hook(cursor, user, move_line, invoice_line_id)

View File

@ -383,6 +383,10 @@ class Contact(orm.AbstractModel):
_name = 'website.qweb.field.contact' _name = 'website.qweb.field.contact'
_inherit = ['ir.qweb.field.contact', 'website.qweb.field.many2one'] _inherit = ['ir.qweb.field.contact', 'website.qweb.field.many2one']
class QwebView(orm.AbstractModel):
_name = 'website.qweb.field.qweb'
_inherit = ['ir.qweb.field.qweb']
def html_to_text(element): def html_to_text(element):
""" Converts HTML content with HTML-specified line breaks (br, p, div, ...) """ Converts HTML content with HTML-specified line breaks (br, p, div, ...)

View File

@ -128,8 +128,6 @@ class view(osv.osv):
if isinstance(id_or_xml_id, list): if isinstance(id_or_xml_id, list):
id_or_xml_id = id_or_xml_id[0] id_or_xml_id = id_or_xml_id[0]
if isinstance(id_or_xml_id, (int, long)):
id_or_xml_id = self.get_view_xmlid(cr, uid, id_or_xml_id)
if not context: if not context:
context = {} context = {}

View File

@ -221,10 +221,13 @@ class website(osv.osv):
) )
def get_template(self, cr, uid, ids, template, context=None): def get_template(self, cr, uid, ids, template, context=None):
if '.' not in template: if isinstance(template, (int, long)):
template = 'website.%s' % template view_id = template
module, xmlid = template.split('.', 1) else:
model, view_id = request.registry["ir.model.data"].get_object_reference(cr, uid, module, xmlid) if '.' not in template:
template = 'website.%s' % template
module, xmlid = template.split('.', 1)
model, view_id = request.registry["ir.model.data"].get_object_reference(cr, uid, module, xmlid)
return self.pool["ir.ui.view"].browse(cr, uid, view_id, context=context) return self.pool["ir.ui.view"].browse(cr, uid, view_id, context=context)
def _render(self, cr, uid, ids, template, values=None, context=None): def _render(self, cr, uid, ids, template, values=None, context=None):

View File

@ -906,6 +906,7 @@
var self = this; var self = this;
var bg = self.$target.css("background-image"); var bg = self.$target.css("background-image");
this.$el.find('li').removeClass("active"); this.$el.find('li').removeClass("active");
this.$el.find('li').removeClass("btn-primary");
var $active = this.$el.find('li[data-value]') var $active = this.$el.find('li[data-value]')
.filter(function () { .filter(function () {
var $li = $(this); var $li = $(this);
@ -918,8 +919,13 @@
this.$el.find('li[data-value].oe_custom_bg') : this.$el.find('li[data-value].oe_custom_bg') :
this.$el.find('li[data-value=""]'); this.$el.find('li[data-value=""]');
} }
$active.addClass("active");
this.$el.find('li:has(li[data-value].active)').addClass("active"); //don't set active on an OpenDialog link, else it not possible to click on it again after.
// TODO in Saas-4 - Once bootstrap is in less
// - add a class active-style to get the same display but without the active behaviour used by bootstrap in JS.
var classStr = _.string.contains($active[0].className, "oe_custom_bg") ? "btn-primary" : "active";
$active.addClass(classStr);
this.$el.find('li:has(li[data-value].active)').addClass(classStr);
} }
}); });

View File

@ -43,6 +43,7 @@
t-att-data-view-xmlid="xmlid if editable else None" t-att-data-view-xmlid="xmlid if editable else None"
t-att-data-main-object="repr(main_object) if editable else None"> t-att-data-main-object="repr(main_object) if editable else None">
<head> <head>
<script type="text/javascript" src="/web/static/js/watch.js"></script>
<t t-if="main_object and 'website_meta_title' in main_object"> <t t-if="main_object and 'website_meta_title' in main_object">
<t t-set="title" t-value="main_object.website_meta_title"/> <t t-set="title" t-value="main_object.website_meta_title"/>
</t> </t>
@ -74,6 +75,7 @@
// Bootstrap and jQuery UI conflicts // Bootstrap and jQuery UI conflicts
$.fn.bstooltip = $.fn.tooltip; $.fn.bstooltip = $.fn.tooltip;
$.fn.bsbutton = $.fn.button; $.fn.bsbutton = $.fn.button;
</script> </script>
<script type="text/javascript" src="/web/static/lib/qweb/qweb2.js"></script> <script type="text/javascript" src="/web/static/lib/qweb/qweb2.js"></script>

View File

@ -348,7 +348,7 @@ class WebsiteForum(http.Controller):
return {'error': 'own_post'} return {'error': 'own_post'}
user = request.registry['res.users'].browse(request.cr, SUPERUSER_ID, request.uid, context=request.context) user = request.registry['res.users'].browse(request.cr, SUPERUSER_ID, request.uid, context=request.context)
if user.karma <= 5: if user.karma <= 5:
return {'error': 'not_enough_karma', 'karma': 5} return {'error': 'not_enough_karma', 'karma': 1}
return request.registry['forum.post'].vote(request.cr, request.uid, [post.id], upvote=True, context=request.context) return request.registry['forum.post'].vote(request.cr, request.uid, [post.id], upvote=True, context=request.context)
@http.route('/forum/<model("forum.forum"):forum>/post/<model("forum.post"):post>/downvote', type='json', auth="public", multilang=True, website=True) @http.route('/forum/<model("forum.forum"):forum>/post/<model("forum.post"):post>/downvote', type='json', auth="public", multilang=True, website=True)

View File

@ -4,7 +4,7 @@
<!-- QUALITY (VOTES) --> <!-- QUALITY (VOTES) -->
<!-- Teacher: at least 3 upvotes --> <!-- Teacher: at least 3 upvotes -->
<!-- <record id="badge_a_1" model="gamification.badge"> <record id="badge_a_1" model="gamification.badge">
<field name="name">Teacher</field> <field name="name">Teacher</field>
<field name="description">Received at least 3 upvote for an answer for the first time</field> <field name="description">Received at least 3 upvote for an answer for the first time</field>
<field name="level">bronze</field> <field name="level">bronze</field>
@ -15,8 +15,11 @@
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')" /> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid', '=', user.id), ('parent_id', '!=', False), ('vote_count', '>=', 3)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="domain">[('parent_id', '!=', False), ('vote_count', '>=', 3)]</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_teacher"> <record model="gamification.challenge" id="challenge_teacher">
<field name="name">Teacher</field> <field name="name">Teacher</field>
@ -24,6 +27,7 @@
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_a_1')" /> <field name="reward_id" eval="ref('badge_a_1')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')"/> <field name="autojoin_group_id" eval="ref('base.group_user')"/>
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -32,21 +36,24 @@
<field name="definition_id" eval="ref('definition_teacher')"/> <field name="definition_id" eval="ref('definition_teacher')"/>
<field name="challenge_id" eval="ref('challenge_teacher')"/> <field name="challenge_id" eval="ref('challenge_teacher')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> --> </record>
<!-- Nice: at least 4 upvotes --> <!-- Nice: at least 4 upvotes -->
<!-- <record id="badge_a_2" model="gamification.badge"> <record id="badge_a_2" model="gamification.badge">
<field name="name">Nice Answer</field> <field name="name">Nice Answer</field>
<field name="description">Answer voted up 4 times</field> <field name="description">Answer voted up 4 times</field>
<field name="level">bronze</field> <field name="level">bronze</field>
</record> </record>
<record model="gamification.goal.definition" id="definition_nice_answer"> <record model="gamification.goal.definition" id="definition_nice_answer">
<field name="name">Nice Answer</field> <field name="name">Nice Answer (4)</field>
<field name="description">Answer voted up 4 times</field> <field name="description">Answer voted up 4 times</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')" /> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid', '=', user.id), ('parent_id', '!=', False), ('vote_count', '>=', 4)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="domain">[('parent_id', '!=', False), ('vote_count', '>=', 4)]</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_nice_answer"> <record model="gamification.challenge" id="challenge_nice_answer">
<field name="name">Nice Answer</field> <field name="name">Nice Answer</field>
@ -54,6 +61,7 @@
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_a_2')" /> <field name="reward_id" eval="ref('badge_a_2')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')"/> <field name="autojoin_group_id" eval="ref('base.group_user')"/>
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -62,21 +70,24 @@
<field name="definition_id" eval="ref('definition_nice_answer')"/> <field name="definition_id" eval="ref('definition_nice_answer')"/>
<field name="challenge_id" eval="ref('challenge_nice_answer')"/> <field name="challenge_id" eval="ref('challenge_nice_answer')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> --> </record>
<!-- Good: at least 6 upvotes --> <!-- Good: at least 6 upvotes -->
<!-- <record id="badge_a_3" model="gamification.badge"> <record id="badge_a_3" model="gamification.badge">
<field name="name">Good Answer</field> <field name="name">Good Answer</field>
<field name="description">Answer voted up 6 times</field> <field name="description">Answer voted up 6 times</field>
<field name="level">silver</field> <field name="level">silver</field>
</record> </record>
<record model="gamification.goal.definition" id="definition_good_answer"> <record model="gamification.goal.definition" id="definition_good_answer">
<field name="name">Good Answer</field> <field name="name">Good Answer (6)</field>
<field name="description">Answer voted up 6 times</field> <field name="description">Answer voted up 6 times</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')" /> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid', '=', user.id), ('parent_id', '!=', False), ('vote_count', '>=', 6)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="domain">[('parent_id', '!=', False), ('vote_count', '>=', 6)]</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_good_answer"> <record model="gamification.challenge" id="challenge_good_answer">
<field name="name">Good Answer</field> <field name="name">Good Answer</field>
@ -84,6 +95,7 @@
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_a_3')" /> <field name="reward_id" eval="ref('badge_a_3')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')"/> <field name="autojoin_group_id" eval="ref('base.group_user')"/>
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -92,21 +104,24 @@
<field name="definition_id" eval="ref('definition_good_answer')"/> <field name="definition_id" eval="ref('definition_good_answer')"/>
<field name="challenge_id" eval="ref('challenge_good_answer')"/> <field name="challenge_id" eval="ref('challenge_good_answer')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> --> </record>
<!-- Great: at least 15 upvotes --> <!-- Great: at least 15 upvotes -->
<!-- <record id="badge_a_4" model="gamification.badge"> <record id="badge_a_4" model="gamification.badge">
<field name="name">Great Answer</field> <field name="name">Great Answer</field>
<field name="description">Answer voted up 15 times</field> <field name="description">Answer voted up 15 times</field>
<field name="level">gold</field> <field name="level">gold</field>
</record> </record>
<record model="gamification.goal.definition" id="definition_great_answer"> <record model="gamification.goal.definition" id="definition_great_answer">
<field name="name">Great Answer</field> <field name="name">Great Answer (15)</field>
<field name="description">Answer voted up 15 times</field> <field name="description">Answer voted up 15 times</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')" /> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid', '=', user.id), ('parent_id', '!=', False), ('vote_count', '>=', 15)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="domain">[('parent_id', '!=', False), ('vote_count', '>=', 15)]</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_great_answer"> <record model="gamification.challenge" id="challenge_great_answer">
<field name="name">Great Answer</field> <field name="name">Great Answer</field>
@ -114,6 +129,7 @@
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_a_4')" /> <field name="reward_id" eval="ref('badge_a_4')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')"/> <field name="autojoin_group_id" eval="ref('base.group_user')"/>
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -122,11 +138,11 @@
<field name="definition_id" eval="ref('definition_great_answer')"/> <field name="definition_id" eval="ref('definition_great_answer')"/>
<field name="challenge_id" eval="ref('challenge_great_answer')"/> <field name="challenge_id" eval="ref('challenge_great_answer')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> --> </record>
<!-- ACCEPTANCE --> <!-- ACCEPTANCE -->
<!-- Enlightened: at least 3 upvotes for an accepted answer --> <!-- Enlightened: at least 3 upvotes for an accepted answer -->
<!-- <record id="badge_a_5" model="gamification.badge"> <record id="badge_a_5" model="gamification.badge">
<field name="name">Enlightened</field> <field name="name">Enlightened</field>
<field name="description">Answer was accepted with 3 or more votes</field> <field name="description">Answer was accepted with 3 or more votes</field>
<field name="level">silver</field> <field name="level">silver</field>
@ -137,8 +153,11 @@
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')"/> <field name="model_id" eval="ref('website_forum.model_forum_post')"/>
<field name="domain">[('create_uid', '=', user.id), ('parent_id', '!=', False), ('vote_count', '>=', 3), ('is_correct', '=', True)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="domain">[('parent_id', '!=', False), ('vote_count', '>=', 3), ('is_correct', '=', True)]</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_enlightened"> <record model="gamification.challenge" id="challenge_enlightened">
<field name="name">Enlightened</field> <field name="name">Enlightened</field>
@ -146,6 +165,7 @@
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_a_5')" /> <field name="reward_id" eval="ref('badge_a_5')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')"/> <field name="autojoin_group_id" eval="ref('base.group_user')"/>
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -154,28 +174,32 @@
<field name="definition_id" eval="ref('definition_enlightened')"/> <field name="definition_id" eval="ref('definition_enlightened')"/>
<field name="challenge_id" eval="ref('challenge_enlightened')"/> <field name="challenge_id" eval="ref('challenge_enlightened')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> --> </record>
<!-- Guru: at least 15 upvotes for an accepted answer --> <!-- Guru: at least 15 upvotes for an accepted answer -->
<!-- <record id="badge_a_6" model="gamification.badge"> <record id="badge_a_6" model="gamification.badge">
<field name="name">Guru</field> <field name="name">Guru</field>
<field name="description">Answer accepted with 15 or more votes</field> <field name="description">Answer accepted with 15 or more votes</field>
<field name="level">silver</field> <field name="level">silver</field>
</record> </record>
<record model="gamification.goal.definition" id="definition_guru"> <record model="gamification.goal.definition" id="definition_guru">
<field name="name">Guru</field> <field name="name">Guru (15)</field>
<field name="description">Answer accepted with 15 or more votes</field> <field name="description">Answer accepted with 15 or more votes</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')" /> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid', '=', user.id), ('parent_id', '!=', False), ('vote_count', '>=', 15), ('is_correct', '=', True)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="domain">[('parent_id', '!=', False), ('vote_count', '>=', 15), ('is_correct', '=', True)]</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_guru"> <record model="gamification.challenge" id="challenge_guru">
<field name="name">Great Answer</field> <field name="name">Guru</field>
<field name="period">once</field> <field name="period">once</field>
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_a_6')" /> <field name="reward_id" eval="ref('badge_a_6')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')" /> <field name="autojoin_group_id" eval="ref('base.group_user')" />
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -184,7 +208,7 @@
<field name="definition_id" eval="ref('definition_guru')" /> <field name="definition_id" eval="ref('definition_guru')" />
<field name="target_goal">1</field> <field name="target_goal">1</field>
<field name="challenge_id" eval="ref('challenge_guru')" /> <field name="challenge_id" eval="ref('challenge_guru')" />
</record> --> </record>
<!-- Necromancer: 30 days old question --> <!-- Necromancer: 30 days old question -->
<!-- <record id="badge_a_7" model="gamification.badge"> <!-- <record id="badge_a_7" model="gamification.badge">
@ -196,18 +220,16 @@
<field name="name">Necromancer</field> <field name="name">Necromancer</field>
<field name="description">Answered a question more than 30 days later with at least 2 votes</field> <field name="description">Answered a question more than 30 days later with at least 2 votes</field>
<field name="computation_mode">python</field> <field name="computation_mode">python</field>
<field name="compute_code">def get_posts(cr, uid, context=None): <field name="compute_code">
res = 1 result = 1
Post = self.pool['website.forum.post'] Post = self.pool['website.forum.post']
user_posts = Post.search(cr, uid, [('create_uid','=',object.user_id.id), ('parent_id', '!=', False), ('vote_count', '>=', 2)], context=context) user_posts = Post.search(cr, uid, [('create_uid','=',object.user_id.id), ('parent_id', '!=', False), ('vote_count', '>=', 2)], context=context)
for post in Post.browse(cr, uid, user_posts, context=context): for post in Post.browse(cr, uid, user_posts, context=context):
print post.parent_id.create_date print post.parent_id.create_date
question_date = datetime.strptime(post.parent_id.create_date, "%Y-%m-%d %H:%M:%S") question_date = datetime.strptime(post.parent_id.create_date, "%Y-%m-%d %H:%M:%S")
answer_date = datetime.strptime(post.create_date, "%Y-%m-%d %H:%M:%S") answer_date = datetime.strptime(post.create_date, "%Y-%m-%d %H:%M:%S")
if ((question_date - answer_date).days) >= 30: if ((question_date - answer_date).days) >= 30:
res += 1 result += 1
return res
result = get_posts(cr, uid, context=context)
</field> </field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="condition">higher</field> <field name="condition">higher</field>
@ -218,6 +240,7 @@ result = get_posts(cr, uid, context=context)
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_18')" /> <field name="reward_id" eval="ref('badge_18')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')"/> <field name="autojoin_group_id" eval="ref('base.group_user')"/>
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -229,7 +252,7 @@ result = get_posts(cr, uid, context=context)
</record> --> </record> -->
<!-- Sealf Leaner: own question, 3+ upvotes --> <!-- Sealf Leaner: own question, 3+ upvotes -->
<!-- <record id="badge_a_8" model="gamification.badge"> <record id="badge_a_8" model="gamification.badge">
<field name="name">Self-Learner</field> <field name="name">Self-Learner</field>
<field name="description">Answered own question with at least 4 up votes</field> <field name="description">Answered own question with at least 4 up votes</field>
<field name="level">gold</field> <field name="level">gold</field>
@ -240,8 +263,11 @@ result = get_posts(cr, uid, context=context)
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')" /> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid', '=', user.id), ('parent_id', '!=', False), ('parent_id.create_uid', '=', user.id), ('vote_count', '>=', 3)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="domain">[('self_reply', '=', True), ('vote_count', '>=', 4)]</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_self_learner"> <record model="gamification.challenge" id="challenge_self_learner">
<field name="name">Self-Learner</field> <field name="name">Self-Learner</field>
@ -249,6 +275,7 @@ result = get_posts(cr, uid, context=context)
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_a_8')" /> <field name="reward_id" eval="ref('badge_a_8')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')"/> <field name="autojoin_group_id" eval="ref('base.group_user')"/>
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -257,7 +284,7 @@ result = get_posts(cr, uid, context=context)
<field name="definition_id" eval="ref('definition_self_learner')"/> <field name="definition_id" eval="ref('definition_self_learner')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
<field name="challenge_id" eval="ref('challenge_self_learner')"/> <field name="challenge_id" eval="ref('challenge_self_learner')"/>
</record> --> </record>
</data> </data>
</openerp> </openerp>

View File

@ -3,38 +3,15 @@
<data> <data>
<!-- Cleanup: answer or question edition --> <!-- Cleanup: answer or question edition -->
<!-- Not rollback feature in forum -->
<!-- <record id="badge_3" model="gamification.badge"> <!-- <record id="badge_3" model="gamification.badge">
<field name="name">Cleanup</field> <field name="name">Cleanup</field>
<field name="description">First rollback</field> <field name="description">First rollback</field>
<field name="level">gold</field> <field name="level">gold</field>
</record>
<record model="gamification.goal.definition" id="definition_cleanup">
<field name="name">Cleanup</field>
<field name="description">Edit answer or question</field>
<field name="computation_mode">count</field>
<field name="display_mode">boolean</field>
<field name="model_id" eval="ref('mail.model_mail_message')"/>
<field name="domain" eval="[('author_id', '=', user.partner_id.id), ('model', '=', 'forum.post'), ('subtype_id', 'in', [ref('website_forum.mt_answer_edit'), ref('website_forum.mt_question_edit')])]"/>
<field name="condition">higher</field>
</record>
<record model="gamification.challenge" id="challenge_cleanup">
<field name="name">Cleanup</field>
<field name="period">once</field>
<field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_3')"/>
<field name="autojoin_group_id" eval="ref('base.group_user')"/>
<field name="state">inprogress</field>
<field name="category">forum</field>
</record>
<record model="gamification.challenge.line" id="line_cleanup">
<field name="definition_id" eval="ref('definition_cleanup')"/>
<field name="challenge_id" eval="ref('challenge_cleanup')"/>
<field name="target_goal">1</field>
</record> --> </record> -->
<!-- Critic: downvote based --> <!-- Critic: downvote based -->
<!-- <record id="badge_5" model="gamification.badge"> <record id="badge_5" model="gamification.badge">
<field name="name">Critic</field> <field name="name">Critic</field>
<field name="description">First downvote</field> <field name="description">First downvote</field>
<field name="level">bronze</field> <field name="level">bronze</field>
@ -45,8 +22,11 @@
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post_vote')"/> <field name="model_id" eval="ref('website_forum.model_forum_post_vote')"/>
<field name="domain">[('create_uid', '=', user.id), ('vote', '=', '-1')]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="domain">[('vote', '=', '-1')]</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_vote_user_id')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_critic"> <record model="gamification.challenge" id="challenge_critic">
<field name="name">Critic</field> <field name="name">Critic</field>
@ -54,6 +34,7 @@
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_5')" /> <field name="reward_id" eval="ref('badge_5')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')"/> <field name="autojoin_group_id" eval="ref('base.group_user')"/>
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -62,10 +43,10 @@
<field name="definition_id" eval="ref('definition_critic')"/> <field name="definition_id" eval="ref('definition_critic')"/>
<field name="challenge_id" eval="ref('challenge_critic')"/> <field name="challenge_id" eval="ref('challenge_critic')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> --> </record>
<!-- Disciplined: delete own post with >=3 upvotes --> <!-- Disciplined: delete own post with >=3 upvotes -->
<!-- <record id="badge_6" model="gamification.badge"> <record id="badge_6" model="gamification.badge">
<field name="name">Disciplined</field> <field name="name">Disciplined</field>
<field name="description">Deleted own post with 3 or more upvotes</field> <field name="description">Deleted own post with 3 or more upvotes</field>
<field name="level">bronze</field> <field name="level">bronze</field>
@ -76,8 +57,11 @@
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')" /> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid', '=', user.id), ('vote_count', '>=', 3), ('active', '=', False)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="domain">[('vote_count', '>=', 3), ('active', '=', False)]</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_disciplined"> <record model="gamification.challenge" id="challenge_disciplined">
<field name="name">Disciplined</field> <field name="name">Disciplined</field>
@ -85,6 +69,7 @@
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_6')" /> <field name="reward_id" eval="ref('badge_6')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')" /> <field name="autojoin_group_id" eval="ref('base.group_user')" />
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -93,10 +78,10 @@
<field name="definition_id" eval="ref('definition_disciplined')"/> <field name="definition_id" eval="ref('definition_disciplined')"/>
<field name="challenge_id" eval="ref('challenge_disciplined')"/> <field name="challenge_id" eval="ref('challenge_disciplined')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> --> </record>
<!-- Editor: first edit --> <!-- Editor: first edit -->
<!-- <record id="badge_7" model="gamification.badge"> <record id="badge_7" model="gamification.badge">
<field name="name">Editor</field> <field name="name">Editor</field>
<field name="description">First edit</field> <field name="description">First edit</field>
<field name="level">gold</field> <field name="level">gold</field>
@ -107,9 +92,11 @@
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('mail.model_mail_message')" /> <field name="model_id" eval="ref('mail.model_mail_message')" />
<field name="domain">[('create_uid','=',user.id), '|', ('name','!=',False), ('content','!=',False)]</field>
<field name="domain" eval="[('author_id', '=', user.partner_id.id), ('model', '=', 'forum.post'), ('subtype_id', 'in', [ref('website_forum.mt_answer_edit'), ref('website_forum.mt_question_edit')])]"/>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="domain" eval="[('model', '=', 'forum.post'), ('subtype_id', 'in', [ref('website_forum.mt_answer_edit'), ref('website_forum.mt_question_edit')])]"/>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('mail.field_mail_message_author_id')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_editor"> <record model="gamification.challenge" id="challenge_editor">
<field name="name">Editor</field> <field name="name">Editor</field>
@ -117,6 +104,7 @@
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_7')" /> <field name="reward_id" eval="ref('badge_7')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')" /> <field name="autojoin_group_id" eval="ref('base.group_user')" />
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -125,37 +113,38 @@
<field name="definition_id" eval="ref('definition_editor')"/> <field name="definition_id" eval="ref('definition_editor')"/>
<field name="challenge_id" eval="ref('challenge_editor')"/> <field name="challenge_id" eval="ref('challenge_editor')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> --> </record>
<!-- <record id="badge_22" model="gamification.badge"> <!-- <record id="badge_22" model="gamification.badge">
<field name="name">Organizer</field> <field name="name">Organizer</field>
<field name="description">First retag</field> <field name="description">First retag</field>
<field name="level">bronze</field> <field name="level">bronze</field>
</record> --> </record>
<record model="gamification.goal.definition" id="definition_notable_question">
<!-- <record model="gamification.goal.definition" id="definition_notable_question">
<field name="name">Organizer</field> <field name="name">Organizer</field>
<field name="description">Your First retag</field> <field name="description">Your First retag</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_website_forum_post_history')" /> <field name="model_id" eval="ref('website_forum.model_website_forum_post_history')" />
<field name="domain">[('create_uid','=',user.id), ('tags','!=',False)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
</record> --> <field name="domain">[('tags','!=',False)]</field>
<field name="batch_mode">True</field>
<!-- <record model="gamification.challenge" id="challenge_notable_question"> <field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record>
<record model="gamification.challenge" id="challenge_notable_question">
<field name="name">Organizer</field> <field name="name">Organizer</field>
<field name="period">once</field> <field name="period">once</field>
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_22')" /> <field name="reward_id" eval="ref('badge_22')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')" /> <field name="autojoin_group_id" eval="ref('base.group_user')" />
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
</record> --> </record>
<record model="gamification.challenge.line" id="line_notable_question">
<!-- <record model="gamification.challenge.line" id="line_notable_question">
<field name="definition_id" eval="ref('definition_notable_question')" /> <field name="definition_id" eval="ref('definition_notable_question')" />
<field name="target_goal">1</field> <field name="target_goal">1</field>
<field name="challenge_id" eval="ref('challenge_notable_question')" /> <field name="challenge_id" eval="ref('challenge_notable_question')" />
@ -166,32 +155,31 @@
<field name="name">Associate Editor</field> <field name="name">Associate Editor</field>
<field name="description">Edited 30 entries</field> <field name="description">Edited 30 entries</field>
<field name="level">silver</field> <field name="level">silver</field>
</record> --> </record>
<record model="gamification.goal.definition" id="definition_associate_editor">
<!-- <record model="gamification.goal.definition" id="definition_associate_editor">
<field name="name">Associate Editor</field> <field name="name">Associate Editor</field>
<field name="description">Edit 30 answer or question</field> <field name="description">Edit 30 answer or question</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_website_forum_post_history')" /> <field name="model_id" eval="ref('website_forum.model_website_forum_post_history')" />
<field name="domain">[('create_uid','=',user.id), '|', ('name','!=',False), ('content','!=',False)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
</record> --> <field name="domain">['|', ('name','!=',False), ('content','!=',False)]</field>
<field name="batch_mode">True</field>
<!-- <record model="gamification.challenge" id="challenge_associate_editor"> <field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record>
<record model="gamification.challenge" id="challenge_associate_editor">
<field name="name">Associate Editor</field> <field name="name">Associate Editor</field>
<field name="period">once</field> <field name="period">once</field>
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_29')" /> <field name="reward_id" eval="ref('badge_29')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')" /> <field name="autojoin_group_id" eval="ref('base.group_user')" />
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
</record> --> </record>
<record model="gamification.challenge.line" id="line_associate_editor">
<!-- <record model="gamification.challenge.line" id="line_associate_editor">
<field name="definition_id" eval="ref('definition_associate_editor')" /> <field name="definition_id" eval="ref('definition_associate_editor')" />
<field name="target_goal">30</field> <field name="target_goal">30</field>
<field name="challenge_id" eval="ref('challenge_associate_editor')" /> <field name="challenge_id" eval="ref('challenge_associate_editor')" />
@ -229,75 +217,76 @@ result = int(len(data) >= 15)</field>
<field name="definition_id" eval="ref('definition_enthusiast')"/> <field name="definition_id" eval="ref('definition_enthusiast')"/>
<field name="challenge_id" eval="ref('challenge_enthusiast')"/> <field name="challenge_id" eval="ref('challenge_enthusiast')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> </record> -->
<record id="badge_31" model="gamification.badge"> <record id="badge_31" model="gamification.badge">
<field name="name">Supporter</field> <field name="name">Supporter</field>
<field name="description">First upvote</field> <field name="description">First upvote</field>
<field name="level">gold</field> <field name="level">gold</field>
</record> --> </record>
<record model="gamification.goal.definition" id="definition_supporter">
<!-- <record model="gamification.goal.definition" id="definition_supporter">
<field name="name">Supporter</field> <field name="name">Supporter</field>
<field name="description">First upwnvote</field> <field name="description">First upvote</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post_vote')" /> <field name="model_id" eval="ref('website_forum.model_forum_post_vote')" />
<field name="domain">[('user_id','=',user.id), ('vote', '=', '1')]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="domain">[('vote', '=', '1')]</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_vote_user_id')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_supporter"> <record model="gamification.challenge" id="challenge_supporter">
<field name="name">Supporter</field> <field name="name">Supporter</field>
<field name="period">once</field> <field name="period">once</field>
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_31')" /> <field name="reward_id" eval="ref('badge_31')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')" /> <field name="autojoin_group_id" eval="ref('base.group_user')" />
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
</record> </record>
<record model="gamification.challenge.line" id="line_supporter"> <record model="gamification.challenge.line" id="line_supporter">
<field name="definition_id" eval="ref('definition_supporter')" /> <field name="definition_id" eval="ref('definition_supporter')" />
<field name="target_goal">1</field> <field name="target_goal">1</field>
<field name="challenge_id" eval="ref('challenge_supporter')" /> <field name="challenge_id" eval="ref('challenge_supporter')" />
</record> --> </record>
<!-- <record id="badge_23" model="gamification.badge"> <record id="badge_23" model="gamification.badge">
<field name="name">Peer Pressure</field> <field name="name">Peer Pressure</field>
<field name="description">Deleted own post with 3 or more downvotes</field> <field name="description">Deleted own post with 3 or more downvotes</field>
<field name="level">gold</field> <field name="level">gold</field>
</record> </record>
<record model="gamification.goal.definition" id="definition_peer_pressure"> <record model="gamification.goal.definition" id="definition_peer_pressure">
<field name="name">Peer Pressure</field> <field name="name">Peer Pressure</field>
<field name="description">Delete own post with 3 or more down votes</field> <field name="description">Delete own post with 3 or more down votes</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')" /> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid','=',user.id), ('vote_count', '&lt;=', -3), ('active', '=', False)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="domain">[('vote_count', '&lt;=', -3), ('active', '=', False)]</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_peer_pressure"> <record model="gamification.challenge" id="challenge_peer_pressure">
<field name="name">Peer Pressure</field> <field name="name">Peer Pressure</field>
<field name="period">once</field> <field name="period">once</field>
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_23')" /> <field name="reward_id" eval="ref('badge_23')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')" /> <field name="autojoin_group_id" eval="ref('base.group_user')" />
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
</record> </record>
<record model="gamification.challenge.line" id="line_peer_pressure"> <record model="gamification.challenge.line" id="line_peer_pressure">
<field name="definition_id" eval="ref('definition_peer_pressure')" /> <field name="definition_id" eval="ref('definition_peer_pressure')" />
<field name="target_goal">1</field> <field name="target_goal">1</field>
<field name="challenge_id" eval="ref('challenge_peer_pressure')" /> <field name="challenge_id" eval="ref('challenge_peer_pressure')" />
</record> --> </record>
</data> </data>
</openerp> </openerp>

View File

@ -3,7 +3,7 @@
<data> <data>
<!-- Biography: complet your profile --> <!-- Biography: complet your profile -->
<!-- <record id="badge_p_1" model="gamification.badge"> <record id="badge_p_1" model="gamification.badge">
<field name="name">Autobiographer</field> <field name="name">Autobiographer</field>
<field name="description">Completed own biography</field> <field name="description">Completed own biography</field>
<field name="level">bronze</field> <field name="level">bronze</field>
@ -14,11 +14,15 @@
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('base.model_res_users')" /> <field name="model_id" eval="ref('base.model_res_users')" />
<field name="domain">[('id','=',user.id),
('partner_id.country_id', '!=', False),
('partner_id.city', '!=', False),
('partner_id.email', '!=', False)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="domain">[
('partner_id.country_id', '!=', False),
('partner_id.city', '!=', False),
('partner_id.email', '!=', False)
]</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('base.field_res_users_id')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_configure_profile"> <record model="gamification.challenge" id="challenge_configure_profile">
<field name="name">Complete own biography</field> <field name="name">Complete own biography</field>
@ -26,6 +30,7 @@
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_p_1')"/> <field name="reward_id" eval="ref('badge_p_1')"/>
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')"/> <field name="autojoin_group_id" eval="ref('base.group_user')"/>
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -34,10 +39,10 @@
<field name="definition_id" eval="ref('definition_configure_profile')"/> <field name="definition_id" eval="ref('definition_configure_profile')"/>
<field name="challenge_id" eval="ref('challenge_configure_profile')"/> <field name="challenge_id" eval="ref('challenge_configure_profile')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> --> </record>
<!-- Commentator: at least 10 comments posted on posts --> <!-- Commentator: at least 10 comments posted on posts -->
<!-- <record id="badge_p_2" model="gamification.badge"> <record id="badge_p_2" model="gamification.badge">
<field name="name">Commentator</field> <field name="name">Commentator</field>
<field name="description">Posted 10 comments</field> <field name="description">Posted 10 comments</field>
<field name="level">bronze</field> <field name="level">bronze</field>
@ -48,8 +53,11 @@
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('mail.model_mail_message')"/> <field name="model_id" eval="ref('mail.model_mail_message')"/>
<field name="domain" eval="[('author_id', '=', user.partner_id.id), ('type', '=', 'comment'), ('subtype_id', '=', ref('mail.mt_comment')), ('model', '=', 'forum post')]"/>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="domain" eval="[('type', '=', 'comment'), ('subtype_id', '=', ref('mail.mt_comment')), ('model', '=', 'forum.post')]"/>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('mail.field_mail_message_author_id')" />
<field name="batch_user_expression">user.partner_id.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_commentator"> <record model="gamification.challenge" id="challenge_commentator">
<field name="name">Commentator</field> <field name="name">Commentator</field>
@ -57,6 +65,7 @@
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_p_2')"/> <field name="reward_id" eval="ref('badge_p_2')"/>
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')"/> <field name="autojoin_group_id" eval="ref('base.group_user')"/>
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -65,33 +74,24 @@
<field name="definition_id" eval="ref('definition_commentator')"/> <field name="definition_id" eval="ref('definition_commentator')"/>
<field name="challenge_id" eval="ref('challenge_commentator')"/> <field name="challenge_id" eval="ref('challenge_commentator')"/>
<field name="target_goal">10</field> <field name="target_goal">10</field>
</record> --> </record>
<!-- Pundit: 10 comments with at least score of 10 --> <!-- Pundit: 10 comments with at least score of 10 -->
<!-- <record id="badge_25" model="gamification.badge"> <record id="badge_25" model="gamification.badge">
<field name="name">Pundit</field> <field name="name">Pundit</field>
<field name="description">Left 10 comments with score of 10 or more</field> <field name="description">Left comments with score of 10 or more</field>
<field name="level">silver</field> <field name="level">silver</field>
</record> </record>
<record model="gamification.goal.definition" id="definition_pundit"> <record model="gamification.goal.definition" id="definition_pundit">
<field name="name">Pundit</field> <field name="name">Pundit</field>
<field name="description">Post 10 comments with score of 10 or more</field> <field name="description">Post 10 comments with score of 10 or more</field>
<field name="computation_mode">python</field>
<field name="compute_code">def get_count(cr, uid, context=None):
res = 1
Message = self.pool['mail.message']
Post = self.pool['website.forum.post']
user_message = Message.read_group(cr, uid,[('create_uid','=',object.user_id.id), ('type', '=', 'comment'), ('model', '=', 'website.forum.post')], ['res_id'], groupby=['res_id'], context=context)
for rec in user_message:
if rec.get('res_id_count') >= 10:
post = Post.browse(cr, uid, rec.get('res_id'), context=context)
if post.vote_count >= 10:
res += 1
return res
result = get_count(cr, uid, context=context)
</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')"/>
<field name="domain" eval="[('parent', '!=', False), ('vote_count' '>=', 10)]"/>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_pundit"> <record model="gamification.challenge" id="challenge_pundit">
<field name="name">Pundit</field> <field name="name">Pundit</field>
@ -99,18 +99,19 @@ result = get_count(cr, uid, context=context)
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_25')" /> <field name="reward_id" eval="ref('badge_25')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')" /> <field name="autojoin_group_id" eval="ref('base.group_user')" />
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
</record> </record>
<record model="gamification.challenge.line" id="line_pundit"> <record model="gamification.challenge.line" id="line_pundit">
<field name="definition_id" eval="ref('definition_pundit')" /> <field name="definition_id" eval="ref('definition_pundit')" />
<field name="target_goal">2</field> <field name="target_goal">10</field>
<field name="challenge_id" eval="ref('challenge_pundit')" /> <field name="challenge_id" eval="ref('challenge_pundit')" />
</record> --> </record>
<!-- Chief Commentator: 100 comments --> <!-- Chief Commentator: 100 comments -->
<!-- <record id="badge_p_4" model="gamification.badge"> <record id="badge_p_4" model="gamification.badge">
<field name="name">Chief Commentator</field> <field name="name">Chief Commentator</field>
<field name="description">Posted 100 comments</field> <field name="description">Posted 100 comments</field>
<field name="level">silver</field> <field name="level">silver</field>
@ -121,6 +122,7 @@ result = get_count(cr, uid, context=context)
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_p_4')"/> <field name="reward_id" eval="ref('badge_p_4')"/>
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')"/> <field name="autojoin_group_id" eval="ref('base.group_user')"/>
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -129,7 +131,7 @@ result = get_count(cr, uid, context=context)
<field name="definition_id" eval="ref('definition_commentator')"/> <field name="definition_id" eval="ref('definition_commentator')"/>
<field name="challenge_id" eval="ref('challenge_chief_commentator')"/> <field name="challenge_id" eval="ref('challenge_chief_commentator')"/>
<field name="target_goal">100</field> <field name="target_goal">100</field>
</record> --> </record>
<!-- Expert: tag-based activity --> <!-- Expert: tag-based activity -->
<!-- <record id="badge_10" model="gamification.badge"> <!-- <record id="badge_10" model="gamification.badge">
@ -171,38 +173,39 @@ result = get_counter(cr, uid, context=context)
<field name="challenge_id" eval="ref('challenge_expert')" /> <field name="challenge_id" eval="ref('challenge_expert')" />
</record> --> </record> -->
<!-- <record id="badge_32" model="gamification.badge"> <record id="badge_32" model="gamification.badge">
<field name="name">Taxonomist</field> <field name="name">Taxonomist</field>
<field name="description">Created a tag used by 15 questions</field> <field name="description">Created a tag used by 15 questions</field>
<field name="level">silver</field> <field name="level">silver</field>
</record> </record>
<record model="gamification.goal.definition" id="definition_taxonomist"> <record model="gamification.goal.definition" id="definition_taxonomist">
<field name="name">Taxonomist</field> <field name="name">Taxonomist</field>
<field name="description">Create a tag which can used in minimum 15 questions</field> <field name="description">Create a tag which can used in minimum 15 questions</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_website_forum_tag')" /> <field name="model_id" eval="ref('website_forum.model_forum_tag')" />
<field name="domain">[('create_uid','=',user.id), ('posts_count', '>=', 15)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="domain">[('posts_count', '>=', 15)]</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_tag_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_taxonomist"> <record model="gamification.challenge" id="challenge_taxonomist">
<field name="name">Taxonomist</field> <field name="name">Taxonomist</field>
<field name="period">once</field> <field name="period">once</field>
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_32')" /> <field name="reward_id" eval="ref('badge_32')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')" /> <field name="autojoin_group_id" eval="ref('base.group_user')" />
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
</record> </record>
<record model="gamification.challenge.line" id="line_taxonomist"> <record model="gamification.challenge.line" id="line_taxonomist">
<field name="definition_id" eval="ref('definition_taxonomist')" /> <field name="definition_id" eval="ref('definition_taxonomist')" />
<field name="target_goal">1</field>
<field name="challenge_id" eval="ref('challenge_taxonomist')" /> <field name="challenge_id" eval="ref('challenge_taxonomist')" />
</record> --> <field name="target_goal">1</field>
</record>
</data> </data>
</openerp> </openerp>

View File

@ -4,19 +4,22 @@
<!-- POPULARITY (VIEWS) --> <!-- POPULARITY (VIEWS) -->
<!-- Popular: 150 views --> <!-- Popular: 150 views -->
<!-- <record id="badge_q_1" model="gamification.badge"> <record id="badge_q_1" model="gamification.badge">
<field name="name">Popular Question</field> <field name="name">Popular Question</field>
<field name="description">Asked a question with at least 150 views</field> <field name="description">Asked a question with at least 150 views</field>
<field name="level">bronze</field> <field name="level">bronze</field>
</record> </record>
<record model="gamification.goal.definition" id="definition_popular_question"> <record model="gamification.goal.definition" id="definition_popular_question">
<field name="name">Popular Question</field> <field name="name">Popular Question (150)</field>
<field name="description">Asked a question with at least 150 views</field> <field name="description">Asked a question with at least 150 views</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')" /> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid', '=', user.id), ('parent_id', '=', False), ('views', '>=', 150)]</field> <field name="domain">[('parent_id', '=', False), ('views', '>=', 150)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_popular_question"> <record model="gamification.challenge" id="challenge_popular_question">
<field name="name">Popular Question</field> <field name="name">Popular Question</field>
@ -24,6 +27,7 @@
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_q_1')" /> <field name="reward_id" eval="ref('badge_q_1')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')" /> <field name="autojoin_group_id" eval="ref('base.group_user')" />
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -32,21 +36,25 @@
<field name="definition_id" eval="ref('definition_popular_question')"/> <field name="definition_id" eval="ref('definition_popular_question')"/>
<field name="challenge_id" eval="ref('challenge_popular_question')"/> <field name="challenge_id" eval="ref('challenge_popular_question')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> --> </record>
<!-- Notable: 250 views --> <!-- Notable: 250 views -->
<!-- <record id="badge_q_2" model="gamification.badge"> <record id="badge_q_2" model="gamification.badge">
<field name="name">Notable Question</field> <field name="name">Notable Question</field>
<field name="description">Asked a question with at least 250 views</field> <field name="description">Asked a question with at least 250 views</field>
<field name="level">silver</field> <field name="level">silver</field>
</record> </record>
<record model="gamification.goal.definition" id="definition_notable_question"> <record model="gamification.goal.definition" id="definition_notable_question">
<field name="name">Notable Question</field> <field name="name">Popular Question (250)</field>
<field name="description">Asked a question with at least 250 views</field> <field name="description">Asked a question with at least 250 views</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')" /> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid', '=', user.id), ('parent_id', '=', False), ('views', '>=', 250)]</field> <field name="domain">[('parent_id', '=', False), ('views', '>=', 250)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_notable_question"> <record model="gamification.challenge" id="challenge_notable_question">
<field name="name">Notable Question</field> <field name="name">Notable Question</field>
@ -54,6 +62,7 @@
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_q_2')" /> <field name="reward_id" eval="ref('badge_q_2')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')" /> <field name="autojoin_group_id" eval="ref('base.group_user')" />
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -62,21 +71,24 @@
<field name="definition_id" eval="ref('definition_notable_question')"/> <field name="definition_id" eval="ref('definition_notable_question')"/>
<field name="challenge_id" eval="ref('challenge_notable_question')"/> <field name="challenge_id" eval="ref('challenge_notable_question')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> --> </record>
<!-- Famous: 500 views --> <!-- Famous: 500 views -->
<!-- <record id="badge_q_3" model="gamification.badge"> <record id="badge_q_3" model="gamification.badge">
<field name="name">Famous Question</field> <field name="name">Famous Question</field>
<field name="description">Asked a question with at least 500 views</field> <field name="description">Asked a question with at least 500 views</field>
<field name="level">gold</field> <field name="level">gold</field>
</record> </record>
<record model="gamification.goal.definition" id="definition_famous_question"> <record model="gamification.goal.definition" id="definition_famous_question">
<field name="name">Famous Question</field> <field name="name">Popular Question (500)</field>
<field name="description">Asked a question with at least 500 views</field> <field name="description">Asked a question with at least 500 views</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')" /> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid', '=', user.id), ('parent_id', '=', False), ('views', '>=', 500)]</field> <field name="domain">[('parent_id', '=', False), ('views', '>=', 500)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_famous_question"> <record model="gamification.challenge" id="challenge_famous_question">
<field name="name">Famous Question</field> <field name="name">Famous Question</field>
@ -84,6 +96,7 @@
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_q_3')" /> <field name="reward_id" eval="ref('badge_q_3')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')"/> <field name="autojoin_group_id" eval="ref('base.group_user')"/>
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -92,115 +105,130 @@
<field name="definition_id" eval="ref('definition_famous_question')"/> <field name="definition_id" eval="ref('definition_famous_question')"/>
<field name="challenge_id" eval="ref('challenge_famous_question')"/> <field name="challenge_id" eval="ref('challenge_famous_question')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> --> </record>
<!-- FAVORITE --> <!-- FAVORITE -->
<!-- Credible: at least 1 user have it in favorite --> <!-- Credible: at least 1 user have it in favorite -->
<!-- <record id="badge_q_4" model="gamification.badge"> <record id="badge_q_4" model="gamification.badge">
<field name="name">Credible Question</field> <field name="name">Credible Question</field>
<field name="description">Question set as favorite by 1 user</field> <field name="description">Question set as favorite by 1 user</field>
<field name="level">bronze</field> <field name="level">bronze</field>
</record> </record>
<record model="gamification.goal.definition" id="definition_favorite_question"> <record model="gamification.goal.definition" id="definition_favorite_question_1">
<field name="name">Credible Question</field> <field name="name">Favourite Question (1)</field>
<field name="description">Question set as favorite by 1 user</field> <field name="description">Question set as favorite by 1 user</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')" /> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid', '=', user.id), ('parent_id', '=', False), ('favourite_count', '>=', 1)]</field> <field name="domain">[('parent_id', '=', False), ('favourite_count', '>=', 1)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_favorite_question"> <record model="gamification.challenge" id="challenge_favorite_question_1">
<field name="name">Credible Question</field> <field name="name">Credible Question</field>
<field name="period">once</field> <field name="period">once</field>
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_q_4')" /> <field name="reward_id" eval="ref('badge_q_4')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')" /> <field name="autojoin_group_id" eval="ref('base.group_user')" />
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
</record> </record>
<record model="gamification.challenge.line" id="line_favorite_question"> <record model="gamification.challenge.line" id="line_favorite_question_1">
<field name="definition_id" eval="ref('definition_favorite_question')"/> <field name="definition_id" eval="ref('definition_favorite_question_1')"/>
<field name="challenge_id" eval="ref('challenge_favorite_question')"/> <field name="challenge_id" eval="ref('challenge_favorite_question_1')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> --> </record>
<!-- Favorite: at least 5 users have it in favorite --> <!-- Favorite: at least 5 users have it in favorite -->
<!-- <record id="badge_q_5" model="gamification.badge"> <record id="badge_q_5" model="gamification.badge">
<field name="name">Favorite Question</field> <field name="name">Favorite Question</field>
<field name="description">Question set as favorite by 5 users</field> <field name="description">Question set as favorite by 5 users</field>
<field name="level">silver</field> <field name="level">silver</field>
</record> </record>
<record model="gamification.goal.definition" id="definition_favorite_question"> <record model="gamification.goal.definition" id="definition_favorite_question_5">
<field name="name">Favorite Question</field> <field name="name">Favourite Question (5)</field>
<field name="description">Question set as favorite by 5 users</field> <field name="description">Question set as favorite by 5 user</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')" /> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid', '=', user.id), ('parent_id', '=', False), ('favourite_count', '>=', 5)]</field> <field name="domain">[('parent_id', '=', False), ('favourite_count', '>=', 5)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_favorite_question"> <record model="gamification.challenge" id="challenge_favorite_question_5">
<field name="name">Favorite Question</field> <field name="name">Favorite Question</field>
<field name="period">once</field> <field name="period">once</field>
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_q_5')" /> <field name="reward_id" eval="ref('badge_q_5')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')" /> <field name="autojoin_group_id" eval="ref('base.group_user')" />
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
</record> </record>
<record model="gamification.challenge.line" id="line_favorite_question"> <record model="gamification.challenge.line" id="line_favorite_question_5">
<field name="definition_id" eval="ref('definition_favorite_question')"/> <field name="definition_id" eval="ref('definition_favorite_question_5')"/>
<field name="challenge_id" eval="ref('challenge_favorite_question')"/> <field name="challenge_id" eval="ref('challenge_favorite_question_5')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> --> </record>
<!-- Stellar: at least 25 users have it in favorite --> <!-- Stellar: at least 25 users have it in favorite -->
<!-- <record id="badge_q_6" model="gamification.badge"> <record id="badge_q_6" model="gamification.badge">
<field name="name">Stellar Question</field> <field name="name">Stellar Question</field>
<field name="description">Question set as favorite by 5 users</field> <field name="description">Question set as favorite by 25 users</field>
<field name="level">bronze</field> <field name="level">bronze</field>
</record> </record>
<record model="gamification.goal.definition" id="definition_stellar_question"> <record model="gamification.goal.definition" id="definition_stellar_question_25">
<field name="name">Stellar Question</field> <field name="name">Favourite Question (25)</field>
<field name="description">Question set as favorite by 5 users</field> <field name="description">Question set as favorite by 25 user</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')" /> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid', '=', user.id), ('parent_id', '=', False), ('favourite_count', '>=', 25)]</field> <field name="domain">[('parent_id', '=', False), ('favourite_count', '>=', 25)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_stellar_question"> <record model="gamification.challenge" id="challenge_stellar_question_25">
<field name="name">Stellar Question</field> <field name="name">Stellar Question</field>
<field name="period">once</field> <field name="period">once</field>
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_q_6')" /> <field name="reward_id" eval="ref('badge_q_6')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')" /> <field name="autojoin_group_id" eval="ref('base.group_user')" />
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
</record> </record>
<record model="gamification.challenge.line" id="line_stellar_question"> <record model="gamification.challenge.line" id="line_stellar_question_25">
<field name="definition_id" eval="ref('definition_stellar_question')"/> <field name="definition_id" eval="ref('definition_stellar_question_25')"/>
<field name="challenge_id" eval="ref('challenge_stellar_question')"/> <field name="challenge_id" eval="ref('challenge_stellar_question_25')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> --> </record>
<!-- QUALITY (VOTES) --> <!-- QUALITY (VOTES) -->
<!-- Student: at least 1 upvote --> <!-- Student: at least 1 upvote -->
<!-- <record id="badge_q_7" model="gamification.badge"> <record id="badge_q_7" model="gamification.badge">
<field name="name">Student</field> <field name="name">Student</field>
<field name="description">Asked first question with at least one up vote</field> <field name="description">Asked first question with at least one up vote</field>
<field name="level">gold</field> <field name="level">gold</field>
</record> </record>
<record model="gamification.goal.definition" id="definition_student"> <record model="gamification.goal.definition" id="definition_student">
<field name="name">Student</field> <field name="name">Upvoted question (1)</field>
<field name="description">Asked first question with at least one up vote</field> <field name="description">Asked first question with at least one up vote</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')" /> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid', '=', user.id), ('parent_id', '=', False), ('vote_count', '>=', 1)]</field> <field name="domain">[('parent_id', '=', False), ('vote_count', '>=', 1)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_student"> <record model="gamification.challenge" id="challenge_student">
<field name="name">Student</field> <field name="name">Student</field>
@ -208,6 +236,7 @@
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_q_7')"/> <field name="reward_id" eval="ref('badge_q_7')"/>
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')" /> <field name="autojoin_group_id" eval="ref('base.group_user')" />
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -216,21 +245,24 @@
<field name="definition_id" eval="ref('definition_student')"/> <field name="definition_id" eval="ref('definition_student')"/>
<field name="challenge_id" eval="ref('challenge_student')"/> <field name="challenge_id" eval="ref('challenge_student')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> --> </record>
<!-- Nice: at least 4 upvotes --> <!-- Nice: at least 4 upvotes -->
<!-- <record id="badge_q_8" model="gamification.badge"> <record id="badge_q_8" model="gamification.badge">
<field name="name">Nice Quesiotn</field> <field name="name">Nice Quesiotn</field>
<field name="description">Question voted up 4 times</field> <field name="description">Question voted up 4 times</field>
<field name="level">bronze</field> <field name="level">bronze</field>
</record> </record>
<record model="gamification.goal.definition" id="definition_nice_question"> <record model="gamification.goal.definition" id="definition_nice_question">
<field name="name">Nice Question</field> <field name="name">Upvoted question (4)</field>
<field name="description">Question voted up 4 times</field> <field name="description">Asked first question with at least 4 up votes</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')"/> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid', '=', user.id), ('parent_id', '=', False), ('vote_count', '>=', 4)]</field> <field name="domain">[('parent_id', '=', False), ('vote_count', '>=', 4)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_nice_question"> <record model="gamification.challenge" id="challenge_nice_question">
<field name="name">Nice Question</field> <field name="name">Nice Question</field>
@ -238,6 +270,7 @@
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_q_8')" /> <field name="reward_id" eval="ref('badge_q_8')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')"/> <field name="autojoin_group_id" eval="ref('base.group_user')"/>
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -246,21 +279,24 @@
<field name="definition_id" eval="ref('definition_nice_question')"/> <field name="definition_id" eval="ref('definition_nice_question')"/>
<field name="challenge_id" eval="ref('challenge_nice_question')"/> <field name="challenge_id" eval="ref('challenge_nice_question')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> --> </record>
<!-- Good: at least 6 upvotes --> <!-- Good: at least 6 upvotes -->
<!-- <record id="badge_q_9" model="gamification.badge"> <record id="badge_q_9" model="gamification.badge">
<field name="name">Good Question</field> <field name="name">Good Question</field>
<field name="description">Question voted up 6 times</field> <field name="description">Question voted up 6 times</field>
<field name="level">silver</field> <field name="level">silver</field>
</record> </record>
<record model="gamification.goal.definition" id="definition_good_question"> <record model="gamification.goal.definition" id="definition_good_question">
<field name="name">Good Question</field> <field name="name">Upvoted question (6)</field>
<field name="description">Question voted up 6 times</field> <field name="description">Asked first question with at least 6 up votes</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')" /> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid', '=', user.id), ('parent_id', '=', False), ('vote_count', '>=', 6)]</field> <field name="domain">[('parent_id', '=', False), ('vote_count', '>=', 6)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_good_question"> <record model="gamification.challenge" id="challenge_good_question">
<field name="name">Good Question</field> <field name="name">Good Question</field>
@ -268,6 +304,7 @@
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_q_9')" /> <field name="reward_id" eval="ref('badge_q_9')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')" /> <field name="autojoin_group_id" eval="ref('base.group_user')" />
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -276,21 +313,24 @@
<field name="definition_id" eval="ref('definition_good_question')"/> <field name="definition_id" eval="ref('definition_good_question')"/>
<field name="challenge_id" eval="ref('challenge_good_question')"/> <field name="challenge_id" eval="ref('challenge_good_question')"/>
<field name="target_goal">1</field> <field name="target_goal">1</field>
</record> --> </record>
<!-- Great: at least 15 upvotes --> <!-- Great: at least 15 upvotes -->
<!-- <record id="badge_q_10" model="gamification.badge"> <record id="badge_q_10" model="gamification.badge">
<field name="name">Great Question</field> <field name="name">Great Question</field>
<field name="description">Question voted up 15 times</field> <field name="description">Question voted up 15 times</field>
<field name="level">gold</field> <field name="level">gold</field>
</record> </record>
<record model="gamification.goal.definition" id="definition_great_question"> <record model="gamification.goal.definition" id="definition_great_question">
<field name="name">Great Question</field> <field name="name">Upvoted question (15)</field>
<field name="description">Question voted up 15 times</field> <field name="description">Asked first question with at least 15 up votes</field>
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')" /> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid', '=', user.id), ('parent_id', '=', False), ('vote_count', '>=', 15)]</field> <field name="domain">[('parent_id', '=', False), ('vote_count', '>=', 15)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_great_question"> <record model="gamification.challenge" id="challenge_great_question">
<field name="name">Great Question</field> <field name="name">Great Question</field>
@ -298,6 +338,7 @@
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_q_10')" /> <field name="reward_id" eval="ref('badge_q_10')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')" /> <field name="autojoin_group_id" eval="ref('base.group_user')" />
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -306,10 +347,10 @@
<field name="definition_id" eval="ref('definition_great_question')" /> <field name="definition_id" eval="ref('definition_great_question')" />
<field name="target_goal">1</field> <field name="target_goal">1</field>
<field name="challenge_id" eval="ref('challenge_great_question')" /> <field name="challenge_id" eval="ref('challenge_great_question')" />
</record> --> </record>
<!-- Question + Answer --> <!-- Question + Answer -->
<!-- <record id="badge_26" model="gamification.badge"> <record id="badge_26" model="gamification.badge">
<field name="name">Scholar</field> <field name="name">Scholar</field>
<field name="description">Asked a question and accepted an answer</field> <field name="description">Asked a question and accepted an answer</field>
<field name="level">gold</field> <field name="level">gold</field>
@ -320,8 +361,11 @@
<field name="computation_mode">count</field> <field name="computation_mode">count</field>
<field name="display_mode">boolean</field> <field name="display_mode">boolean</field>
<field name="model_id" eval="ref('website_forum.model_forum_post')" /> <field name="model_id" eval="ref('website_forum.model_forum_post')" />
<field name="domain">[('create_uid', '=', user.id), ('parent_id', '=', False), ('is_correct', '=', True)]</field> <field name="domain">[('parent_id', '=', False), ('is_correct', '=', True)]</field>
<field name="condition">higher</field> <field name="condition">higher</field>
<field name="batch_mode">True</field>
<field name="batch_distinctive_field" eval="ref('website_forum.field_forum_post_create_uid')" />
<field name="batch_user_expression">user.id</field>
</record> </record>
<record model="gamification.challenge" id="challenge_scholar"> <record model="gamification.challenge" id="challenge_scholar">
<field name="name">Scholar</field> <field name="name">Scholar</field>
@ -329,6 +373,7 @@
<field name="visibility_mode">personal</field> <field name="visibility_mode">personal</field>
<field name="report_message_frequency">never</field> <field name="report_message_frequency">never</field>
<field name="reward_id" eval="ref('badge_26')" /> <field name="reward_id" eval="ref('badge_26')" />
<field name="reward_realtime">True</field>
<field name="autojoin_group_id" eval="ref('base.group_user')" /> <field name="autojoin_group_id" eval="ref('base.group_user')" />
<field name="state">inprogress</field> <field name="state">inprogress</field>
<field name="category">forum</field> <field name="category">forum</field>
@ -337,7 +382,7 @@
<field name="definition_id" eval="ref('definition_scholar')" /> <field name="definition_id" eval="ref('definition_scholar')" />
<field name="target_goal">1</field> <field name="target_goal">1</field>
<field name="challenge_id" eval="ref('challenge_scholar')" /> <field name="challenge_id" eval="ref('challenge_scholar')" />
</record> --> </record>
</data> </data>
</openerp> </openerp>

View File

@ -97,6 +97,12 @@ class Post(osv.Model):
res[post.id] = any(answer.create_uid.id == uid for answer in post.child_ids) res[post.id] = any(answer.create_uid.id == uid for answer in post.child_ids)
return res return res
def _is_self_reply(self, cr, uid, ids, field_name, arg, context=None):
res = dict.fromkeys(ids, False)
for post in self.browse(cr, uid, ids, context=context):
res[post.id] = post.parent_id and post.parent_id.create_uid == post.create_uid or False
return res
_columns = { _columns = {
'name': fields.char('Title', size=128), 'name': fields.char('Title', size=128),
'forum_id': fields.many2one('forum.forum', 'Forum', required=True), 'forum_id': fields.many2one('forum.forum', 'Forum', required=True),
@ -137,6 +143,10 @@ class Post(osv.Model):
}), }),
# hierarchy # hierarchy
'parent_id': fields.many2one('forum.post', 'Question', ondelete='cascade'), 'parent_id': fields.many2one('forum.post', 'Question', ondelete='cascade'),
'self_reply': fields.function(_is_self_reply, 'Reply to own question', type='boolean',
store={
'forum.post': (lambda self, cr, uid, ids, c={}: ids, ['parent_id', 'create_uid'], 10),
}),
'child_ids': fields.one2many('forum.post', 'parent_id', 'Answers'), 'child_ids': fields.one2many('forum.post', 'parent_id', 'Answers'),
'child_count': fields.function( 'child_count': fields.function(
_get_child_count, string="Answers", type='integer', _get_child_count, string="Answers", type='integer',
@ -166,15 +176,14 @@ class Post(osv.Model):
context = {} context = {}
create_context = dict(context, mail_create_nolog=True) create_context = dict(context, mail_create_nolog=True)
post_id = super(Post, self).create(cr, uid, vals, context=create_context) post_id = super(Post, self).create(cr, uid, vals, context=create_context)
post = self.browse(cr, uid, post_id, context=context)
# post message + subtype depending on parent_id # post message + subtype depending on parent_id
if vals.get("parent_id"): if vals.get("parent_id"):
parent = self.browse(cr, SUPERUSER_ID, vals['parent_id'], context=context) parent = self.browse(cr, SUPERUSER_ID, vals['parent_id'], context=context)
body = _('<p><a href="forum/%s/question/%s">New Answer Posted</a></p>' % (slug(parent.forum_id), slug(parent))) body = _('<p><a href="forum/%s/question/%s">New Answer Posted</a></p>' % (slug(parent.forum_id), slug(parent)))
self.message_post(cr, uid, parent.id, subject=_('Re: %s') % parent.name, body=body, subtype='website_forum.mt_answer_new', context=context) self.message_post(cr, uid, parent.id, subject=_('Re: %s') % parent.name, body=body, subtype='website_forum.mt_answer_new', context=context)
else: else:
self.message_post(cr, uid, post.id, subject=post.name, body=_('New Question Created'), subtype='website_forum.mt_question_new', context=context) self.message_post(cr, uid, post_id, subject=vals.get('name', ''), body=_('New Question Created'), subtype='website_forum.mt_question_new', context=context)
self.pool['res.users'].write(cr, SUPERUSER_ID, [post.create_uid.id], {'karma': 2}, context=context) self.pool['res.users'].add_karma(cr, SUPERUSER_ID, [uid], 2, context=context)
return post_id return post_id
def write(self, cr, uid, ids, vals, context=None): def write(self, cr, uid, ids, vals, context=None):
@ -193,7 +202,7 @@ class Post(osv.Model):
if 'correct' in vals: if 'correct' in vals:
for post in self.browse(cr, uid, ids, context=context): for post in self.browse(cr, uid, ids, context=context):
karma_value = 15 if vals.get('correct') else -15 karma_value = 15 if vals.get('correct') else -15
self.pool['res.users'].write(cr, SUPERUSER_ID, [post.create_uid.id], {'karma': karma_value}, context=context) self.pool['res.users'].add_karma(cr, SUPERUSER_ID, [post.create_uid.id], {'karma': karma_value}, context=context)
return res return res
def vote(self, cr, uid, ids, upvote=True, context=None): def vote(self, cr, uid, ids, upvote=True, context=None):
@ -231,7 +240,7 @@ class Vote(osv.Model):
_description = 'Vote' _description = 'Vote'
_columns = { _columns = {
'post_id': fields.many2one('forum.post', 'Post', ondelete='cascade', required=True), 'post_id': fields.many2one('forum.post', 'Post', ondelete='cascade', required=True),
'user_id': fields.many2one('res.users', 'User'), 'user_id': fields.many2one('res.users', 'User', required=True),
'vote': fields.selection([('1', '1'), ('-1', '-1'), ('0', '0')], 'Vote', required=True), 'vote': fields.selection([('1', '1'), ('-1', '-1'), ('0', '0')], 'Vote', required=True),
'create_date': fields.datetime('Create Date', select=True, readonly=True), 'create_date': fields.datetime('Create Date', select=True, readonly=True),
} }
@ -240,23 +249,19 @@ class Vote(osv.Model):
'vote': lambda *args: '1', 'vote': lambda *args: '1',
} }
def update_karma(self, cr, uid, ids, new_vote='0', old_vote='0', context=None):
karma_value = (int(new_vote) - int(old_vote)) * 10
if karma_value:
for vote in self.browse(cr, uid, ids, context=context):
self.pool['res.users'].add_karma(cr, SUPERUSER_ID, [vote.post_id.create_uid.id], karma_value, context=context)
return True
def create(self, cr, uid, vals, context=None): def create(self, cr, uid, vals, context=None):
vote_id = super(Vote, self).create(cr, uid, vals, context=context) vote_id = super(Vote, self).create(cr, uid, vals, context=context)
self.update_karma(cr, uid, [vote_id], new_vote=vals.get('vote', '1'), context=context) karma_value = int(vals.get('vote', '1')) * 10
post = self.pool['forum.post'].browse(cr, uid, vals.get('post_id'), context=context)
self.pool['res.users'].add_karma(cr, SUPERUSER_ID, post.create_uid.id, karma_value, context=context)
return vote_id return vote_id
def write(self, cr, uid, ids, values, context=None): def write(self, cr, uid, ids, values, context=None):
res = super(Vote, self).write(cr, uid, ids, values, context=context)
if 'vote' in values: if 'vote' in values:
for vote in self.browse(cr, uid, ids, context=context): for vote in self.browse(cr, uid, ids, context=context):
self.update_karma(cr, uid, ids, new_vote=values['vote'], old_vote=vote.vote, context=context) karma_value = (int(values.get('vote')) - int(vote.vote)) * 10
self.pool['res.users'].add_karma(cr, SUPERUSER_ID, vote.post_id.create_uid.id, karma_value, context=context)
res = super(Vote, self).write(cr, uid, ids, values, context=context)
return res return res
@ -283,4 +288,5 @@ class Tags(osv.Model):
'forum.post': (_get_tag_from_post, ['tag_ids'], 10), 'forum.post': (_get_tag_from_post, ['tag_ids'], 10),
} }
), ),
'create_uid': fields.many2one('res.users', 'Created by', readonly=True),
} }

View File

@ -32,6 +32,16 @@ class Users(osv.Model):
} }
def add_karma(self, cr, uid, ids, karma, context=None): def add_karma(self, cr, uid, ids, karma, context=None):
if isinstance(ids, (int, long)):
ids = [ids]
for user in self.browse(cr, uid, ids, context=context): for user in self.browse(cr, uid, ids, context=context):
self.write(cr, uid, [user.id], {'karma': user.karma + karma}, context=context) self.write(cr, uid, [user.id], {'karma': user.karma + karma}, context=context)
return True return True
def get_serialised_gamification_summary(self, cr, uid, excluded_categories=None, context=None):
if isinstance(excluded_categories, list):
if 'forum' not in excluded_categories:
excluded_categories.append('forum')
else:
excluded_categories = ['forum']
return super(Users, self).get_serialised_gamification_summary(cr, uid, excluded_categories=excluded_categories, context=context)

View File

@ -129,7 +129,7 @@ class sale_quote(http.Controller):
order_line_obj.write(request.cr, SUPERUSER_ID, [line_id], {'product_uom_qty': (quantity)}, context=request.context) order_line_obj.write(request.cr, SUPERUSER_ID, [line_id], {'product_uom_qty': (quantity)}, context=request.context)
return [str(quantity), str(order.amount_total)] return [str(quantity), str(order.amount_total)]
@http.route(["/quote/template/<model('sale.quote.template'):quote>"], type='http', auth="user", website=True) @http.route(["/quote/template/<model('sale.quote.template'):quote>"], type='http', auth="user", website=True, multilang=True)
def template_view(self, quote, **post): def template_view(self, quote, **post):
values = { 'template': quote } values = { 'template': quote }
return request.website.render('website_quote.so_template', values) return request.website.render('website_quote.so_template', values)

View File

@ -133,7 +133,12 @@ class sale_order(osv.osv):
def onchange_template_id(self, cr, uid, ids, template_id, partner=False, fiscal_position=False, context=None): def onchange_template_id(self, cr, uid, ids, template_id, partner=False, fiscal_position=False, context=None):
if not template_id: if not template_id:
return True return True
lines = []
if context is None:
context = {}
context = dict(context, lang=self.pool.get('res.partner').browse(cr, uid, partner, context).lang)
lines = [(5,)]
quote_template = self.pool.get('sale.quote.template').browse(cr, uid, template_id, context=context) quote_template = self.pool.get('sale.quote.template').browse(cr, uid, template_id, context=context)
for line in quote_template.quote_line: for line in quote_template.quote_line:
res = self.pool.get('sale.order.line').product_id_change(cr, uid, False, res = self.pool.get('sale.order.line').product_id_change(cr, uid, False,

View File

@ -411,8 +411,10 @@ class Ecommerce(http.Controller):
quantity = request.registry['website']._ecommerce_add_product_to_cart(request.cr, request.uid, quantity = request.registry['website']._ecommerce_add_product_to_cart(request.cr, request.uid,
product_id=product_id, order_line_id=order_line_id, set_number=set_number, product_id=product_id, order_line_id=order_line_id, set_number=set_number,
context=request.context) context=request.context)
return quantity order = self.get_order()
return [quantity,
order.get_number_of_products()]
@http.route(['/shop/checkout'], type='http', auth="public", website=True, multilang=True) @http.route(['/shop/checkout'], type='http', auth="public", website=True, multilang=True)
def checkout(self, **post): def checkout(self, **post):
cr, uid, context, registry = request.cr, request.uid, request.context, request.registry cr, uid, context, registry = request.cr, request.uid, request.context, request.registry
@ -514,14 +516,7 @@ class Ecommerce(http.Controller):
if error: if error:
return request.website.render("website_sale.checkout", values) return request.website.render("website_sale.checkout", values)
company_name = checkout['company']
company_id = None
if post['company']:
company_ids = orm_partner.search(cr, SUPERUSER_ID, [("name", "ilike", company_name), ('is_company', '=', True)], context=context)
company_id = (company_ids and company_ids[0]) or orm_partner.create(cr, SUPERUSER_ID, {'name': company_name, 'is_company': True}, context)
billing_info = dict((k, v) for k,v in checkout.items() if "shipping_" not in k and k != "company") billing_info = dict((k, v) for k,v in checkout.items() if "shipping_" not in k and k != "company")
billing_info['parent_id'] = company_id
partner_id = None partner_id = None
public_id = request.registry['website'].get_public_user(cr, uid, context) public_id = request.registry['website'].get_public_user(cr, uid, context)
@ -542,7 +537,8 @@ class Ecommerce(http.Controller):
shipping_info = { shipping_info = {
'phone': post['shipping_phone'], 'phone': post['shipping_phone'],
'zip': post['shipping_zip'], 'zip': post['shipping_zip'],
'street': post['shipping_street'], 'street': checkout['company'],
'street2': post['shipping_street'],
'city': post['shipping_city'], 'city': post['shipping_city'],
'name': post['shipping_name'], 'name': post['shipping_name'],
'email': post['email'], 'email': post['email'],