summaryrefslogtreecommitdiff
path: root/addons/gamification/models/gamification_karma_tracking.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/gamification/models/gamification_karma_tracking.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/gamification/models/gamification_karma_tracking.py')
-rw-r--r--addons/gamification/models/gamification_karma_tracking.py69
1 files changed, 69 insertions, 0 deletions
diff --git a/addons/gamification/models/gamification_karma_tracking.py b/addons/gamification/models/gamification_karma_tracking.py
new file mode 100644
index 00000000..f7b184ad
--- /dev/null
+++ b/addons/gamification/models/gamification_karma_tracking.py
@@ -0,0 +1,69 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+import calendar
+
+from dateutil.relativedelta import relativedelta
+
+from odoo import api, fields, models
+
+
+class KarmaTracking(models.Model):
+ _name = 'gamification.karma.tracking'
+ _description = 'Track Karma Changes'
+ _rec_name = 'user_id'
+ _order = 'tracking_date DESC'
+
+ user_id = fields.Many2one('res.users', 'User', index=True, readonly=True, required=True, ondelete='cascade')
+ old_value = fields.Integer('Old Karma Value', required=True, readonly=True)
+ new_value = fields.Integer('New Karma Value', required=True, readonly=True)
+ consolidated = fields.Boolean('Consolidated')
+ tracking_date = fields.Date(default=fields.Date.context_today)
+
+ @api.model
+ def _consolidate_last_month(self):
+ """ Consolidate last month. Used by a cron to cleanup tracking records. """
+ previous_month_start = fields.Date.today() + relativedelta(months=-1, day=1)
+ return self._process_consolidate(previous_month_start)
+
+ def _process_consolidate(self, from_date):
+ """ Consolidate trackings into a single record for a given month, starting
+ at a from_date (included). End date is set to last day of current month
+ using a smart calendar.monthrange construction. """
+ end_date = from_date + relativedelta(day=calendar.monthrange(from_date.year, from_date.month)[1])
+ select_query = """
+SELECT user_id,
+(
+ SELECT old_value from gamification_karma_tracking old_tracking
+ WHERE old_tracking.user_id = gamification_karma_tracking.user_id
+ AND tracking_date::timestamp BETWEEN %(from_date)s AND %(to_date)s
+ AND consolidated IS NOT TRUE
+ ORDER BY tracking_date ASC LIMIT 1
+), (
+ SELECT new_value from gamification_karma_tracking new_tracking
+ WHERE new_tracking.user_id = gamification_karma_tracking.user_id
+ AND tracking_date::timestamp BETWEEN %(from_date)s AND %(to_date)s
+ AND consolidated IS NOT TRUE
+ ORDER BY tracking_date DESC LIMIT 1
+)
+FROM gamification_karma_tracking
+WHERE tracking_date::timestamp BETWEEN %(from_date)s AND %(to_date)s
+AND consolidated IS NOT TRUE
+GROUP BY user_id """
+ self.env.cr.execute(select_query, {
+ 'from_date': from_date,
+ 'to_date': end_date,
+ })
+ results = self.env.cr.dictfetchall()
+ if results:
+ for result in results:
+ result['consolidated'] = True
+ result['tracking_date'] = fields.Date.to_string(from_date)
+ self.create(results)
+
+ self.search([
+ ('tracking_date', '>=', from_date),
+ ('tracking_date', '<=', end_date),
+ ('consolidated', '!=', True)]
+ ).unlink()
+ return True