Merge lp:~openerp-dev/openobject-addons/saas-4-gamification-fixes-mat into lp:~openerp/openobject-addons/saas-4
- saas-4-gamification-fixes-mat
- Merge into saas-4
Proposed by
Martin Trigaux (OpenERP)
Status: | Merged |
---|---|
Merged at revision: | 9362 |
Proposed branch: | lp:~openerp-dev/openobject-addons/saas-4-gamification-fixes-mat |
Merge into: | lp:~openerp/openobject-addons/saas-4 |
Diff against target: |
360 lines (+98/-79) 9 files modified
gamification/data/goal_base.xml (+2/-2) gamification/models/challenge.py (+89/-70) gamification/models/res_users.py (+0/-1) gamification/views/challenge.xml (+1/-0) gamification_sale_crm/sale_crm_goals.xml (+2/-2) website_forum/data/badges_answer.xml (+1/-1) website_forum/data/badges_moderation.xml (+1/-1) website_forum/data/badges_participation.xml (+1/-1) website_forum/data/badges_question.xml (+1/-1) |
To merge this branch: | bzr merge lp:~openerp-dev/openobject-addons/saas-4-gamification-fixes-mat |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
OpenERP Core Team | Pending | ||
Review via email: mp+216452@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'gamification/data/goal_base.xml' | |||
2 | --- gamification/data/goal_base.xml 2014-04-16 15:10:26 +0000 | |||
3 | +++ gamification/data/goal_base.xml 2014-04-22 07:53:23 +0000 | |||
4 | @@ -164,7 +164,7 @@ | |||
5 | 164 | <field name="period">once</field> | 164 | <field name="period">once</field> |
6 | 165 | <field name="visibility_mode">personal</field> | 165 | <field name="visibility_mode">personal</field> |
7 | 166 | <field name="report_message_frequency">never</field> | 166 | <field name="report_message_frequency">never</field> |
9 | 167 | <field name="user_domain">[('groups_id', 'in', ref('base.group_user'))]</field> | 167 | <field name="user_domain" eval="[('groups_id', '=', ref('base.group_user'))]" /> |
10 | 168 | <field name="state">inprogress</field> | 168 | <field name="state">inprogress</field> |
11 | 169 | <field name="category">other</field> | 169 | <field name="category">other</field> |
12 | 170 | </record> | 170 | </record> |
13 | @@ -174,7 +174,7 @@ | |||
14 | 174 | <field name="period">once</field> | 174 | <field name="period">once</field> |
15 | 175 | <field name="visibility_mode">personal</field> | 175 | <field name="visibility_mode">personal</field> |
16 | 176 | <field name="report_message_frequency">never</field> | 176 | <field name="report_message_frequency">never</field> |
18 | 177 | <field name="user_domain">[('groups_id', 'in', ref('base.user_root'))]</field> | 177 | <field name="user_domain" eval="[('groups_id', '=', ref('base.group_erp_manager'))]" /> |
19 | 178 | <field name="state">inprogress</field> | 178 | <field name="state">inprogress</field> |
20 | 179 | <field name="category">other</field> | 179 | <field name="category">other</field> |
21 | 180 | </record> | 180 | </record> |
22 | 181 | 181 | ||
23 | === modified file 'gamification/models/challenge.py' | |||
24 | --- gamification/models/challenge.py 2014-04-18 09:05:20 +0000 | |||
25 | +++ gamification/models/challenge.py 2014-04-22 07:53:23 +0000 | |||
26 | @@ -21,14 +21,13 @@ | |||
27 | 21 | 21 | ||
28 | 22 | from openerp import SUPERUSER_ID | 22 | from openerp import SUPERUSER_ID |
29 | 23 | from openerp.osv import fields, osv | 23 | from openerp.osv import fields, osv |
31 | 24 | from openerp.tools import DEFAULT_SERVER_DATE_FORMAT as DF | 24 | from openerp.tools import ustr, DEFAULT_SERVER_DATE_FORMAT as DF |
32 | 25 | from openerp.tools.safe_eval import safe_eval as eval | 25 | from openerp.tools.safe_eval import safe_eval as eval |
33 | 26 | from openerp.tools.translate import _ | 26 | from openerp.tools.translate import _ |
34 | 27 | 27 | ||
35 | 28 | from datetime import date, datetime, timedelta | 28 | from datetime import date, datetime, timedelta |
36 | 29 | import calendar | 29 | import calendar |
37 | 30 | import logging | 30 | import logging |
38 | 31 | import functools | ||
39 | 32 | _logger = logging.getLogger(__name__) | 31 | _logger = logging.getLogger(__name__) |
40 | 33 | 32 | ||
41 | 34 | # display top 3 in ranking, could be db variable | 33 | # display top 3 in ranking, could be db variable |
42 | @@ -117,12 +116,6 @@ | |||
43 | 117 | except ValueError: | 116 | except ValueError: |
44 | 118 | return False | 117 | return False |
45 | 119 | 118 | ||
46 | 120 | def _get_challenger_users(self, cr, uid, domain, context=None): | ||
47 | 121 | ref = functools.partial(self.pool['ir.model.data'].xmlid_to_res_id, cr, uid) | ||
48 | 122 | user_domain = eval(domain, {'ref': ref}) | ||
49 | 123 | return self.pool['res.users'].search(cr, uid, user_domain, context=context) | ||
50 | 124 | |||
51 | 125 | |||
52 | 126 | _order = 'end_date, start_date, name, id' | 119 | _order = 'end_date, start_date, name, id' |
53 | 127 | _columns = { | 120 | _columns = { |
54 | 128 | 'name': fields.char('Challenge Name', required=True, translate=True), | 121 | 'name': fields.char('Challenge Name', required=True, translate=True), |
55 | @@ -218,7 +211,6 @@ | |||
56 | 218 | def create(self, cr, uid, vals, context=None): | 211 | def create(self, cr, uid, vals, context=None): |
57 | 219 | """Overwrite the create method to add the user of groups""" | 212 | """Overwrite the create method to add the user of groups""" |
58 | 220 | 213 | ||
59 | 221 | # add users when change the group auto-subscription | ||
60 | 222 | if vals.get('user_domain'): | 214 | if vals.get('user_domain'): |
61 | 223 | user_ids = self._get_challenger_users(cr, uid, vals.get('user_domain'), context=context) | 215 | user_ids = self._get_challenger_users(cr, uid, vals.get('user_domain'), context=context) |
62 | 224 | 216 | ||
63 | @@ -240,14 +232,18 @@ | |||
64 | 240 | if isinstance(ids, (int,long)): | 232 | if isinstance(ids, (int,long)): |
65 | 241 | ids = [ids] | 233 | ids = [ids] |
66 | 242 | 234 | ||
67 | 235 | if vals.get('user_domain'): | ||
68 | 236 | user_ids = self._get_challenger_users(cr, uid, vals.get('user_domain'), context=context) | ||
69 | 237 | |||
70 | 238 | if not vals.get('user_ids'): | ||
71 | 239 | vals['user_ids'] = [] | ||
72 | 240 | vals['user_ids'] += [(4, user_id) for user_id in user_ids] | ||
73 | 241 | |||
74 | 242 | write_res = super(gamification_challenge, self).write(cr, uid, ids, vals, context=context) | ||
75 | 243 | |||
76 | 243 | if vals.get('state') == 'inprogress': | 244 | if vals.get('state') == 'inprogress': |
84 | 244 | for challenge in self.browse(cr, uid, ids, context=context): | 245 | self._recompute_challenge_users(cr, uid, ids, context=context) |
85 | 245 | user_ids = self._get_challenger_users(cr, uid, challenge.user_domain, context=context) | 246 | self._generate_goals_from_challenge(cr, uid, ids, context=context) |
79 | 246 | write_op = [(4, user_id) for user_id in user_ids] | ||
80 | 247 | self.write(cr, uid, [challenge.id], {'user_ids': write_op}, context=context) | ||
81 | 248 | self.message_subscribe_users(cr, uid, [challenge.id], user_ids, context=context) | ||
82 | 249 | |||
83 | 250 | self.generate_goals_from_challenge(cr, uid, ids, context=context) | ||
86 | 251 | 247 | ||
87 | 252 | elif vals.get('state') == 'done': | 248 | elif vals.get('state') == 'done': |
88 | 253 | self.check_challenge_reward(cr, uid, ids, force=True, context=context) | 249 | self.check_challenge_reward(cr, uid, ids, force=True, context=context) |
89 | @@ -256,9 +252,6 @@ | |||
90 | 256 | # resetting progress | 252 | # resetting progress |
91 | 257 | if self.pool.get('gamification.goal').search(cr, uid, [('challenge_id', 'in', ids), ('state', '=', 'inprogress')], context=context): | 253 | if self.pool.get('gamification.goal').search(cr, uid, [('challenge_id', 'in', ids), ('state', '=', 'inprogress')], context=context): |
92 | 258 | raise osv.except_osv("Error", "You can not reset a challenge with unfinished goals.") | 254 | raise osv.except_osv("Error", "You can not reset a challenge with unfinished goals.") |
93 | 259 | |||
94 | 260 | write_res = super(gamification_challenge, self).write(cr, uid, ids, vals, context=context) | ||
95 | 261 | |||
96 | 262 | 255 | ||
97 | 263 | return write_res | 256 | return write_res |
98 | 264 | 257 | ||
99 | @@ -314,18 +307,10 @@ | |||
100 | 314 | # update every running goal already generated linked to selected challenges | 307 | # update every running goal already generated linked to selected challenges |
101 | 315 | goal_obj.update(cr, uid, goal_ids, context=context) | 308 | goal_obj.update(cr, uid, goal_ids, context=context) |
102 | 316 | 309 | ||
103 | 310 | self._recompute_challenge_users(cr, uid, ids, context=context) | ||
104 | 311 | self._generate_goals_from_challenge(cr, uid, ids, context=context) | ||
105 | 312 | |||
106 | 317 | for challenge in self.browse(cr, uid, ids, context=context): | 313 | for challenge in self.browse(cr, uid, ids, context=context): |
107 | 318 | # in case of new users matching the domain | ||
108 | 319 | old_user_ids = [user.id for user in challenge.user_ids] | ||
109 | 320 | new_user_ids = self._get_challenger_users(cr, uid, challenge.user_domain, context=context) | ||
110 | 321 | to_remove_ids = list(set(old_user_ids) - set(new_user_ids)) | ||
111 | 322 | to_add_ids = list(set(new_user_ids) - set(old_user_ids)) | ||
112 | 323 | |||
113 | 324 | write_op = [(3, user_id) for user_id in to_remove_ids] | ||
114 | 325 | write_op += [(4, user_id) for user_id in to_add_ids] | ||
115 | 326 | self.write(cr, uid, [challenge.id], {'user_ids': write_op}, context=context) | ||
116 | 327 | |||
117 | 328 | self.generate_goals_from_challenge(cr, uid, [challenge.id], context=context) | ||
118 | 329 | 314 | ||
119 | 330 | # goals closed but still opened at the last report date | 315 | # goals closed but still opened at the last report date |
120 | 331 | closed_goals_to_report = goal_obj.search(cr, uid, [ | 316 | closed_goals_to_report = goal_obj.search(cr, uid, [ |
121 | @@ -345,11 +330,36 @@ | |||
122 | 345 | return True | 330 | return True |
123 | 346 | 331 | ||
124 | 347 | def quick_update(self, cr, uid, challenge_id, context=None): | 332 | def quick_update(self, cr, uid, challenge_id, context=None): |
126 | 348 | """Update all the goals of a challenge, no generation of new goals""" | 333 | """Update all the goals of a specific challenge, no generation of new goals""" |
127 | 349 | goal_ids = self.pool.get('gamification.goal').search(cr, uid, [('challenge_id', '=', challenge_id)], context=context) | 334 | goal_ids = self.pool.get('gamification.goal').search(cr, uid, [('challenge_id', '=', challenge_id)], context=context) |
128 | 350 | self.pool.get('gamification.goal').update(cr, uid, goal_ids, context=context) | 335 | self.pool.get('gamification.goal').update(cr, uid, goal_ids, context=context) |
129 | 351 | return True | 336 | return True |
130 | 352 | 337 | ||
131 | 338 | def _get_challenger_users(self, cr, uid, domain, context=None): | ||
132 | 339 | user_domain = eval(ustr(domain)) | ||
133 | 340 | return self.pool['res.users'].search(cr, uid, user_domain, context=context) | ||
134 | 341 | |||
135 | 342 | def _recompute_challenge_users(self, cr, uid, challenge_ids, context=None): | ||
136 | 343 | """Recompute the domain to add new users and remove the one no longer matching the domain""" | ||
137 | 344 | for challenge in self.browse(cr, uid, challenge_ids, context=context): | ||
138 | 345 | if challenge.user_domain: | ||
139 | 346 | |||
140 | 347 | old_user_ids = [user.id for user in challenge.user_ids] | ||
141 | 348 | new_user_ids = self._get_challenger_users(cr, uid, challenge.user_domain, context=context) | ||
142 | 349 | to_remove_ids = list(set(old_user_ids) - set(new_user_ids)) | ||
143 | 350 | to_add_ids = list(set(new_user_ids) - set(old_user_ids)) | ||
144 | 351 | |||
145 | 352 | write_op = [(3, user_id) for user_id in to_remove_ids] | ||
146 | 353 | write_op += [(4, user_id) for user_id in to_add_ids] | ||
147 | 354 | self.write(cr, uid, [challenge.id], {'user_ids': write_op}, context=context) | ||
148 | 355 | |||
149 | 356 | if to_remove_ids: | ||
150 | 357 | self.message_unsubscribe_users(cr, uid, [challenge.id], to_remove_ids, context=None) | ||
151 | 358 | if to_add_ids: | ||
152 | 359 | self.message_subscribe_users(cr, uid, [challenge.id], new_user_ids, context=context) | ||
153 | 360 | |||
154 | 361 | return True | ||
155 | 362 | |||
156 | 353 | 363 | ||
157 | 354 | def action_check(self, cr, uid, ids, context=None): | 364 | def action_check(self, cr, uid, ids, context=None): |
158 | 355 | """Check a challenge | 365 | """Check a challenge |
159 | @@ -370,6 +380,10 @@ | |||
160 | 370 | ##### Automatic actions ##### | 380 | ##### Automatic actions ##### |
161 | 371 | 381 | ||
162 | 372 | def generate_goals_from_challenge(self, cr, uid, ids, context=None): | 382 | def generate_goals_from_challenge(self, cr, uid, ids, context=None): |
163 | 383 | _logger.warning("Deprecated, use private method _generate_goals_from_challenge(...) instead.") | ||
164 | 384 | return self._generate_goals_from_challenge(cr, uid, ids, context=context) | ||
165 | 385 | |||
166 | 386 | def _generate_goals_from_challenge(self, cr, uid, ids, context=None): | ||
167 | 373 | """Generate the goals for each line and user. | 387 | """Generate the goals for each line and user. |
168 | 374 | 388 | ||
169 | 375 | If goals already exist for this line and user, the line is skipped. This | 389 | If goals already exist for this line and user, the line is skipped. This |
170 | @@ -388,44 +402,49 @@ | |||
171 | 388 | end_date = challenge.end_date | 402 | end_date = challenge.end_date |
172 | 389 | 403 | ||
173 | 390 | for line in challenge.line_ids: | 404 | for line in challenge.line_ids: |
212 | 391 | # FIXME: allow to restrict to a subset of users | 405 | |
213 | 392 | for user in challenge.user_ids: | 406 | # there is potentially a lot of users |
214 | 393 | 407 | # detect the ones with no goal linked to this line | |
215 | 394 | domain = [('line_id', '=', line.id), ('user_id', '=', user.id)] | 408 | date_clause = "" |
216 | 395 | if start_date: | 409 | query_params = [line.id] |
217 | 396 | domain.append(('start_date', '=', start_date)) | 410 | if start_date: |
218 | 397 | 411 | date_clause += "AND g.start_date = %s" | |
219 | 398 | # goal already existing for this line ? | 412 | query_params.append(start_date) |
220 | 399 | if len(goal_obj.search(cr, uid, domain, context=context)) > 0: | 413 | if end_date: |
221 | 400 | 414 | date_clause += "AND g.end_date = %s" | |
222 | 401 | # resume canceled goals | 415 | query_params.append(end_date) |
223 | 402 | domain.append(('state', '=', 'canceled')) | 416 | |
224 | 403 | canceled_goal_ids = goal_obj.search(cr, uid, domain, context=context) | 417 | query = """SELECT u.id AS user_id |
225 | 404 | if canceled_goal_ids: | 418 | FROM res_users u |
226 | 405 | goal_obj.write(cr, uid, canceled_goal_ids, {'state': 'inprogress'}, context=context) | 419 | LEFT JOIN gamification_goal g |
227 | 406 | to_update.extend(canceled_goal_ids) | 420 | ON (u.id = g.user_id) |
228 | 407 | 421 | WHERE line_id = %s | |
229 | 408 | # skip to next user | 422 | {date_clause} |
230 | 409 | continue | 423 | """.format(date_clause=date_clause) |
231 | 410 | 424 | ||
232 | 411 | values = { | 425 | cr.execute(query, query_params) |
233 | 412 | 'definition_id': line.definition_id.id, | 426 | user_with_goal_ids = cr.dictfetchall() |
234 | 413 | 'line_id': line.id, | 427 | user_without_goal_ids = list(set([user.id for user in challenge.user_ids]) - set([user['user_id'] for user in user_with_goal_ids])) |
235 | 414 | 'user_id': user.id, | 428 | |
236 | 415 | 'target_goal': line.target_goal, | 429 | values = { |
237 | 416 | 'state': 'inprogress', | 430 | 'definition_id': line.definition_id.id, |
238 | 417 | } | 431 | 'line_id': line.id, |
239 | 418 | 432 | 'target_goal': line.target_goal, | |
240 | 419 | if start_date: | 433 | 'state': 'inprogress', |
241 | 420 | values['start_date'] = start_date | 434 | } |
242 | 421 | if end_date: | 435 | |
243 | 422 | values['end_date'] = end_date | 436 | if start_date: |
244 | 423 | 437 | values['start_date'] = start_date | |
245 | 424 | if challenge.remind_update_delay: | 438 | if end_date: |
246 | 425 | values['remind_update_delay'] = challenge.remind_update_delay | 439 | values['end_date'] = end_date |
247 | 426 | 440 | ||
248 | 427 | new_goal_id = goal_obj.create(cr, uid, values, context=context) | 441 | if challenge.remind_update_delay: |
249 | 428 | to_update.append(new_goal_id) | 442 | values['remind_update_delay'] = challenge.remind_update_delay |
250 | 443 | |||
251 | 444 | for user_id in user_without_goal_ids: | ||
252 | 445 | values.update({'user_id': user_id}) | ||
253 | 446 | goal_id = goal_obj.create(cr, uid, values, context=context) | ||
254 | 447 | to_update.append(goal_id) | ||
255 | 429 | 448 | ||
256 | 430 | goal_obj.update(cr, uid, to_update, context=context) | 449 | goal_obj.update(cr, uid, to_update, context=context) |
257 | 431 | 450 | ||
258 | @@ -638,7 +657,7 @@ | |||
259 | 638 | message = "%s has joined the challenge" % user.name | 657 | message = "%s has joined the challenge" % user.name |
260 | 639 | self.message_post(cr, SUPERUSER_ID, challenge_ids, body=message, context=context) | 658 | self.message_post(cr, SUPERUSER_ID, challenge_ids, body=message, context=context) |
261 | 640 | self.write(cr, SUPERUSER_ID, challenge_ids, {'invited_user_ids': [(3, user_id)], 'user_ids': [(4, user_id)]}, context=context) | 659 | self.write(cr, SUPERUSER_ID, challenge_ids, {'invited_user_ids': [(3, user_id)], 'user_ids': [(4, user_id)]}, context=context) |
263 | 641 | return self.generate_goals_from_challenge(cr, SUPERUSER_ID, challenge_ids, context=context) | 660 | return self._generate_goals_from_challenge(cr, SUPERUSER_ID, challenge_ids, context=context) |
264 | 642 | 661 | ||
265 | 643 | # TODO in trunk, remove unused parameter user_id | 662 | # TODO in trunk, remove unused parameter user_id |
266 | 644 | def discard_challenge(self, cr, uid, challenge_ids, context=None, user_id=None): | 663 | def discard_challenge(self, cr, uid, challenge_ids, context=None, user_id=None): |
267 | 645 | 664 | ||
268 | === modified file 'gamification/models/res_users.py' | |||
269 | --- gamification/models/res_users.py 2014-04-16 15:10:26 +0000 | |||
270 | +++ gamification/models/res_users.py 2014-04-22 07:53:23 +0000 | |||
271 | @@ -19,7 +19,6 @@ | |||
272 | 19 | # | 19 | # |
273 | 20 | ############################################################################## | 20 | ############################################################################## |
274 | 21 | 21 | ||
275 | 22 | from openerp import SUPERUSER_ID | ||
276 | 23 | from openerp.osv import osv | 22 | from openerp.osv import osv |
277 | 24 | from challenge import MAX_VISIBILITY_RANKING | 23 | from challenge import MAX_VISIBILITY_RANKING |
278 | 25 | 24 | ||
279 | 26 | 25 | ||
280 | === modified file 'gamification/views/challenge.xml' | |||
281 | --- gamification/views/challenge.xml 2014-04-16 15:22:08 +0000 | |||
282 | +++ gamification/views/challenge.xml 2014-04-22 07:53:23 +0000 | |||
283 | @@ -48,6 +48,7 @@ | |||
284 | 48 | <label for="user_domain" class="oe_edit_only" string="Assign Challenge To"/> | 48 | <label for="user_domain" class="oe_edit_only" string="Assign Challenge To"/> |
285 | 49 | <div> | 49 | <div> |
286 | 50 | <field name="user_domain" widget="char_domain" options="{'model': 'res.users'}" /> | 50 | <field name="user_domain" widget="char_domain" options="{'model': 'res.users'}" /> |
287 | 51 | <field name="user_ids" groups="base.group_no_one" widget="many2many_tags" /> | ||
288 | 51 | </div> | 52 | </div> |
289 | 52 | </div> | 53 | </div> |
290 | 53 | 54 | ||
291 | 54 | 55 | ||
292 | === modified file 'gamification_sale_crm/sale_crm_goals.xml' | |||
293 | --- gamification_sale_crm/sale_crm_goals.xml 2014-04-16 15:34:28 +0000 | |||
294 | +++ gamification_sale_crm/sale_crm_goals.xml 2014-04-22 07:53:23 +0000 | |||
295 | @@ -130,7 +130,7 @@ | |||
296 | 130 | <field name="name">Monthly Sales Targets</field> | 130 | <field name="name">Monthly Sales Targets</field> |
297 | 131 | <field name="period">monthly</field> | 131 | <field name="period">monthly</field> |
298 | 132 | <field name="visibility_mode">ranking</field> | 132 | <field name="visibility_mode">ranking</field> |
300 | 133 | <field name="user_domain">[('groups_id', 'in', ref('base.group_sale_salesman'))]</field> | 133 | <field name="user_domain" eval="[('groups_id', 'in', ref('base.group_sale_salesman'))]" /> |
301 | 134 | <field name="report_message_frequency">weekly</field> | 134 | <field name="report_message_frequency">weekly</field> |
302 | 135 | </record> | 135 | </record> |
303 | 136 | 136 | ||
304 | @@ -138,7 +138,7 @@ | |||
305 | 138 | <field name="name">Lead Acquisition</field> | 138 | <field name="name">Lead Acquisition</field> |
306 | 139 | <field name="period">monthly</field> | 139 | <field name="period">monthly</field> |
307 | 140 | <field name="visibility_mode">ranking</field> | 140 | <field name="visibility_mode">ranking</field> |
309 | 141 | <field name="user_domain">[('groups_id', 'in', ref('base.group_sale_salesman'))]</field> | 141 | <field name="user_domain" eval="[('groups_id', 'in', ref('base.group_sale_salesman'))]" />" |
310 | 142 | <field name="report_message_frequency">weekly</field> | 142 | <field name="report_message_frequency">weekly</field> |
311 | 143 | </record> | 143 | </record> |
312 | 144 | 144 | ||
313 | 145 | 145 | ||
314 | === modified file 'website_forum/data/badges_answer.xml' | |||
315 | --- website_forum/data/badges_answer.xml 2014-04-16 15:10:26 +0000 | |||
316 | +++ website_forum/data/badges_answer.xml 2014-04-22 07:53:23 +0000 | |||
317 | @@ -1,6 +1,6 @@ | |||
318 | 1 | <?xml version="1.0" encoding="utf-8"?> | 1 | <?xml version="1.0" encoding="utf-8"?> |
319 | 2 | <openerp> | 2 | <openerp> |
321 | 3 | <data> | 3 | <data noupdate="1"> |
322 | 4 | 4 | ||
323 | 5 | <!-- QUALITY (VOTES) --> | 5 | <!-- QUALITY (VOTES) --> |
324 | 6 | <!-- Teacher: at least 3 upvotes --> | 6 | <!-- Teacher: at least 3 upvotes --> |
325 | 7 | 7 | ||
326 | === modified file 'website_forum/data/badges_moderation.xml' | |||
327 | --- website_forum/data/badges_moderation.xml 2014-04-16 15:14:10 +0000 | |||
328 | +++ website_forum/data/badges_moderation.xml 2014-04-22 07:53:23 +0000 | |||
329 | @@ -1,6 +1,6 @@ | |||
330 | 1 | <?xml version="1.0" encoding="utf-8"?> | 1 | <?xml version="1.0" encoding="utf-8"?> |
331 | 2 | <openerp> | 2 | <openerp> |
333 | 3 | <data> | 3 | <data noupdate="1"> |
334 | 4 | 4 | ||
335 | 5 | <!-- Cleanup: answer or question edition --> | 5 | <!-- Cleanup: answer or question edition --> |
336 | 6 | <!-- Not rollback feature in forum --> | 6 | <!-- Not rollback feature in forum --> |
337 | 7 | 7 | ||
338 | === modified file 'website_forum/data/badges_participation.xml' | |||
339 | --- website_forum/data/badges_participation.xml 2014-04-16 15:22:08 +0000 | |||
340 | +++ website_forum/data/badges_participation.xml 2014-04-22 07:53:23 +0000 | |||
341 | @@ -1,6 +1,6 @@ | |||
342 | 1 | <?xml version="1.0" encoding="utf-8"?> | 1 | <?xml version="1.0" encoding="utf-8"?> |
343 | 2 | <openerp> | 2 | <openerp> |
345 | 3 | <data> | 3 | <data noupdate="1"> |
346 | 4 | 4 | ||
347 | 5 | <!-- Biography: complet your profile --> | 5 | <!-- Biography: complet your profile --> |
348 | 6 | <record id="badge_p_1" model="gamification.badge"> | 6 | <record id="badge_p_1" model="gamification.badge"> |
349 | 7 | 7 | ||
350 | === modified file 'website_forum/data/badges_question.xml' | |||
351 | --- website_forum/data/badges_question.xml 2014-04-16 15:14:10 +0000 | |||
352 | +++ website_forum/data/badges_question.xml 2014-04-22 07:53:23 +0000 | |||
353 | @@ -1,6 +1,6 @@ | |||
354 | 1 | <!-- <?xml version="1.0" encoding="utf-8"?> --> | 1 | <!-- <?xml version="1.0" encoding="utf-8"?> --> |
355 | 2 | <openerp> | 2 | <openerp> |
357 | 3 | <data> | 3 | <data noupdate="1"> |
358 | 4 | 4 | ||
359 | 5 | <!-- POPULARITY (VIEWS) --> | 5 | <!-- POPULARITY (VIEWS) --> |
360 | 6 | <!-- Popular: 150 views --> | 6 | <!-- Popular: 150 views --> |