diff options
| author | Rafi Zadanly <zadanlyr@gmail.com> | 2024-02-29 14:21:05 +0700 |
|---|---|---|
| committer | Rafi Zadanly <zadanlyr@gmail.com> | 2024-02-29 14:21:05 +0700 |
| commit | 0b5b43646b92298dddcdb7eec1a590d90cadd1e8 (patch) | |
| tree | 2b34e0e79bc2612183831a35f96fb7550d17f99b /indoteknik_custom/models/web_logging | |
| parent | ee48a727e2617d8e094847dfb5bf9d5279db165a (diff) | |
Update feature user activity log with utm source
Diffstat (limited to 'indoteknik_custom/models/web_logging')
| -rw-r--r-- | indoteknik_custom/models/web_logging/__init__.py | 2 | ||||
| -rw-r--r-- | indoteknik_custom/models/web_logging/user_activity_log.py | 219 | ||||
| -rw-r--r-- | indoteknik_custom/models/web_logging/web_utm_source.py | 17 |
3 files changed, 238 insertions, 0 deletions
diff --git a/indoteknik_custom/models/web_logging/__init__.py b/indoteknik_custom/models/web_logging/__init__.py new file mode 100644 index 00000000..9c686e54 --- /dev/null +++ b/indoteknik_custom/models/web_logging/__init__.py @@ -0,0 +1,2 @@ +from . import web_utm_source +from . import user_activity_log
\ No newline at end of file diff --git a/indoteknik_custom/models/web_logging/user_activity_log.py b/indoteknik_custom/models/web_logging/user_activity_log.py new file mode 100644 index 00000000..f48e9352 --- /dev/null +++ b/indoteknik_custom/models/web_logging/user_activity_log.py @@ -0,0 +1,219 @@ +import json +import logging +import re +from datetime import datetime, timedelta + +import requests +from odoo import fields, models, api +from odoo.http import request +from urllib.parse import urlparse, parse_qs + +_logger = logging.getLogger(__name__) + + +class UserActivityLog(models.Model): + _name = 'user.activity.log' + _rec_name = 'page_title' + + page_title = fields.Char(string="Judul Halaman") + url = fields.Char(string="URL") + res_user_id = fields.Many2one("res.users", string="User") + email = fields.Char(string="Email") + update_product = fields.Boolean(string="Update Product") + product_id = fields.Many2one('product.template', string='Product') + utm_source_id = fields.Many2one('web.utm.source', string='UTM Source') + + ip_address = fields.Char('IP Address') + ip_address_lookup = fields.Text('IP Address Lookup') + ip_location_city = fields.Text('IP Location City') + ip_location_country = fields.Text('IP Location Country') + ip_location_country_code = fields.Text('IP Location Country Code') + ip_location_map = fields.Html('Embedded Map', compute='_compute_ip_location_map', sanitize=False) + + + # @api.constrains('url') + # def _constrains_url(self): + # for rec in self: + # rec.fill_utm_source() + @api.model + def create(self, vals): + result = super(UserActivityLog, self).create(vals) + result.fill_utm_source() + return result + + def fill_utm_source(self): + for rec in self: + if not rec.url: + rec.utm_source_id = False + continue + + parsed_url = urlparse(rec.url) + params = parse_qs(parsed_url.query) + utm_source_value = params.get('utm_source') + + if not utm_source_value: continue + + utm_source = self.env['web.utm.source'].find_or_create_key(utm_source_value[0]) + rec.utm_source_id = utm_source.id or False + + def _parse_json(self, json_string, key): + result = '' + if json_string: + json_object = json.loads(json_string) + if key in json_object: + result = json_object[key] + return result + + def _compute_ip_location_map(self): + self.ip_location_map = "" + ip_location_lat = self._parse_json(self.ip_address_lookup, 'lat') + ip_location_lon = self._parse_json(self.ip_address_lookup, 'lon') + url = 'https://maps.google.com/maps?q=%s,%s&hl=id&z=15&output=embed' % (ip_location_lat, ip_location_lon) + if ip_location_lat and ip_location_lon: + self.ip_location_map = "<iframe width='100%' height='500' frameborder='1' scrolling='no' src='"+ url +"'></iframe>" + + def _parse_ip_location(self): + domain = [ + ('ip_address_lookup', '!=', False), + ('ip_location_city', '=', False), + ('ip_location_country', '=', False), + ('ip_location_country_code', '=', False), + ] + logs = self.search(domain, limit=200, order='create_date asc') + for log in logs: + log.ip_location_city = self._parse_json(log.ip_address_lookup, 'city') + log.ip_location_country = self._parse_json(log.ip_address_lookup, 'country') + log.ip_location_country_code = self._parse_json(log.ip_address_lookup, 'countryCode') + + def _load_ip_address_lookup(self): + domain = [ + ('ip_address', '!=', False), + ('ip_address_lookup', '=', False), + ] + logs = self.search(domain, limit=45, order='create_date asc') + for log in logs: + try: + ipinfo = requests.get('http://ip-api.com/json/%s' % log.ip_address).json() + del ipinfo['status'] + log.ip_address_lookup = json.dumps(ipinfo, indent=4, sort_keys=True) + except: + log.ip_address_lookup = '' + self._parse_ip_location() + + def record_activity(self): + try: + httprequest = request.httprequest + if httprequest.remote_addr != '127.0.0.1': + self.env['user.activity.log'].sudo().create([{ + 'page_title': request.env['ir.config_parameter'].get_param('web.base.url'), + 'url': httprequest.base_url, + 'ip_address': httprequest.remote_addr + }]) + return True + except: + return False + + def compile_product(self): + logs = self.env['user.activity.log'].search([ + ('email', '!=', False), + ('product_id', '=', False), + ('url', 'ilike', 'https://indoteknik.co%/shop/product/%'), + ('url', 'not ilike', 'shopping') + ], limit=1000, order='create_date desc') + for log in logs: + _logger.info(log.url) + strip_index = i = 0 + for c in log.url: + if c == '-': + strip_index = i + i += 1 + product_id = log.url[strip_index + 1:len(log.url)] + if '#' in product_id: + continue + if any(ch.isalpha() for ch in product_id): + continue + product = self.env['product.template'].search([ + ('id', '=', product_id) + ]) + log.product_id = product + + def clean_activity_log(self): + current_time = datetime.now() + delta_time = current_time - timedelta(days=180) + + delta_time = delta_time.strftime('%Y-%m-%d %H:%M:%S') + self.env['user.activity.log'].search([ + ('create_date', '<', delta_time), + ('email', '=', 'False'), + ]).unlink() + + def reset_rank_search_weekly(self): + templates = self.env['product.template'].search([ + ('type', '=', 'product'), + ('active', '=', True), + ('search_rank_weekly', '>', 0), + ]) + for template in templates: + template.search_rank_weekly = 0 + template.solr_flag = 2 + + def update_rank_search_weekly(self): + current_time = datetime.now() + delta_time = current_time - timedelta(days=7) + + delta_time = delta_time.strftime('%Y-%m-%d %H:%M:%S') + + activity_logs = self.env['user.activity.log'].search([ + ('url', 'ilike', 'https://indoteknik.com%/shop/product/%'), + ('create_date', '>', delta_time), + ('url', 'not ilike', 'shopping'), + ], limit=2000, order='create_date DESC') + + for activity_log in activity_logs: + _logger.info(activity_log.url) + strip_index = i = 0 + for c in activity_log.url: + if c == '-': + strip_index = i + i += 1 + _logger.info(activity_log.url[strip_index + 1:len(activity_log.url)]) + product_id = activity_log.url[strip_index + 1:len(activity_log.url)] + if '#' in product_id: + continue + if any(ch.isalpha() for ch in product_id): + continue + template = self.env['product.template'].search([ + ('id', '=', int(product_id)) + ], limit=1) + if template: + template.search_rank_weekly += 1 + template.solr_flag = 2 + + def update_rank_search(self): + activity_logs = self.env['user.activity.log'].search([ + ('url', 'ilike', '%/shop/product/%'), + ('update_product', '!=', True), + ], limit=1000, order='create_date DESC') + + for activity_log in activity_logs: + _logger.info(activity_log.url) + strip_index = i = 0 + for c in activity_log.url: + if c == '-': + strip_index = i + i += 1 + _logger.info(activity_log.url[strip_index + 1:len(activity_log.url)]) + product_id = activity_log.url[strip_index + 1:len(activity_log.url)] + if '#' in product_id: + continue + if any(ch.isalpha() for ch in product_id): + continue + template = self.env['product.template'].search([ + ('id', '=', int(product_id)) + ], limit=1) + if template: + template.search_rank += 1 + activity_log.update_product = True + + + diff --git a/indoteknik_custom/models/web_logging/web_utm_source.py b/indoteknik_custom/models/web_logging/web_utm_source.py new file mode 100644 index 00000000..baeb0e9b --- /dev/null +++ b/indoteknik_custom/models/web_logging/web_utm_source.py @@ -0,0 +1,17 @@ +from odoo import fields, models + + +class UserActivityLog(models.Model): + _name = 'web.utm.source' + + name = fields.Char(string='Name') + key = fields.Char(string='Key', unique=True) + + def find_or_create_key(self, key): + utm_source = self.search([('key', '=', key)], limit=1) + if not utm_source: + utm_source = self.create({ + 'name': key, + 'key': key + }) + return utm_source
\ No newline at end of file |
