# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. import datetime from dateutil.relativedelta import relativedelta from odoo import api, fields, models DEFAULT_REVEAL_VIEW_WEEKS_VALID = 5 class CRMRevealView(models.Model): _name = 'crm.reveal.view' _description = 'CRM Reveal View' _rec_name = 'reveal_ip' _order = 'id desc' reveal_ip = fields.Char(string='IP Address') reveal_rule_id = fields.Many2one('crm.reveal.rule', string='Lead Generation Rule', index='btree_not_null') reveal_state = fields.Selection([('to_process', 'To Process'), ('not_found', 'Not Found')], default='to_process', string="State", index=True) create_date = fields.Datetime(index=True) def init(self): self._cr.execute('SELECT indexname FROM pg_indexes WHERE indexname = %s', ('crm_reveal_view_ip_rule_id',)) if not self._cr.fetchone(): self._cr.execute('CREATE UNIQUE INDEX crm_reveal_view_ip_rule_id ON crm_reveal_view (reveal_rule_id,reveal_ip)') self._cr.execute('SELECT indexname FROM pg_indexes WHERE indexname = %s', ('crm_reveal_view_state_create_date',)) if not self._cr.fetchone(): self._cr.execute('CREATE INDEX crm_reveal_view_state_create_date ON crm_reveal_view (reveal_state,create_date)') @api.model def _clean_reveal_views(self): """ Remove old views (> 1 month) """ weeks_valid = self.env['ir.config_parameter'].sudo().get_param('reveal.view_weeks_valid', DEFAULT_REVEAL_VIEW_WEEKS_VALID) try: weeks_valid = int(weeks_valid) except ValueError: weeks_valid = DEFAULT_REVEAL_VIEW_WEEKS_VALID domain = [] domain.append(('reveal_state', '=', 'not_found')) domain.append(('create_date', '<', fields.Datetime.to_string(datetime.date.today() - relativedelta(weeks=weeks_valid)))) self.search(domain).unlink() def _create_reveal_view(self, website_id, url, ip_address, country_code, state_code, rules_excluded): # we are avoiding reveal if reveal_view already created for this IP rules = self.env['crm.reveal.rule']._match_url(website_id, url, country_code, state_code, rules_excluded) if rules: query = """ INSERT INTO crm_reveal_view (reveal_ip, reveal_rule_id, reveal_state, create_date) VALUES (%s, %s, 'to_process', now() at time zone 'UTC') ON CONFLICT DO NOTHING; """ * len(rules) params = [] for rule in rules: params += [ip_address, rule['id']] rules_excluded.append(str(rule['id'])) self.env.cr.execute(query, params) return rules_excluded return False