You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							162 lines
						
					
					
						
							7.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							162 lines
						
					
					
						
							7.9 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								#############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
							 | 
						|
								#    Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
							 | 
						|
								#
							 | 
						|
								#    You can modify it under the terms of the GNU LESSER
							 | 
						|
								#    GENERAL PUBLIC LICENSE (LGPL v3), Version 3.
							 | 
						|
								#
							 | 
						|
								#    This program is distributed in the hope that it will be useful,
							 | 
						|
								#    but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						|
								#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						|
								#    GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details.
							 | 
						|
								#
							 | 
						|
								#    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE
							 | 
						|
								#    (LGPL v3) along with this program.
							 | 
						|
								#    If not, see <http://www.gnu.org/licenses/>.
							 | 
						|
								#
							 | 
						|
								#############################################################################
							 | 
						|
								import ast
							 | 
						|
								from odoo import fields, models
							 | 
						|
								from odoo.exceptions import UserError
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class AlertMessage(models.Model):
							 | 
						|
								    """ Model for creating smart alert"""
							 | 
						|
								    _name = 'alert.message'
							 | 
						|
								    _description = 'Alert Message'
							 | 
						|
								
							 | 
						|
								    name = fields.Char('name', required=True, help='Name')
							 | 
						|
								    document_type_id = fields.Many2one('ir.model',
							 | 
						|
								                                       string='Document Type',
							 | 
						|
								                                       help='Select the type of the Document',
							 | 
						|
								                                       required=False)
							 | 
						|
								    group_id = fields.Many2one('res.groups', string='Group',
							 | 
						|
								                               help='Select the group which alert wanted to visible')
							 | 
						|
								    alert_messages = fields.Char('Alert Message', required=True,
							 | 
						|
								                                 help='Alert message that will show in the view.')
							 | 
						|
								    type = fields.Selection([('alert-primary', 'Alert Primary'),
							 | 
						|
								                             ('alert-secondary', 'Alert Secondary'),
							 | 
						|
								                             ('alert-success', 'Alert Success'),
							 | 
						|
								                             ('alert-danger', 'Alert Danger'),
							 | 
						|
								                             ('alert-warning', 'Alert Warning'),
							 | 
						|
								                             ('alert-info', 'Alert Info')],
							 | 
						|
								                            string='Type',
							 | 
						|
								                            required=True, help='Type of alert message')
							 | 
						|
								    model_name = fields.Char(related="document_type_id.model",
							 | 
						|
								                             string='Model Name', help='Model Name')
							 | 
						|
								    field_filter = fields.Char(string='Filter',
							 | 
						|
								                               help='Set conditions for smart alerts',
							 | 
						|
								                               default="[]")
							 | 
						|
								    view_id = fields.Many2one('ir.ui.view', string='View',
							 | 
						|
								                              help='Select the view for smart alerts',
							 | 
						|
								                              required=True,
							 | 
						|
								                              domain='[("model", "=", model_name), '
							 | 
						|
								                                     '("type", "=", "form")]')
							 | 
						|
								    new_view_id = fields.Many2one('ir.ui.view',
							 | 
						|
								                                  string="Created New view Id",
							 | 
						|
								                                  help='It will automatically create a view'
							 | 
						|
								                                       ' record while saving the form',
							 | 
						|
								                                  readonly=True)
							 | 
						|
								    state = fields.Selection(
							 | 
						|
								        [('draft', 'Draft'), ('done', 'Done'), ('cancelled', 'Cancelled')],
							 | 
						|
								        string='State', help='Different Stages', default="draft")
							 | 
						|
								
							 | 
						|
								    def action_apply(self):
							 | 
						|
								        """creating a view according to the record"""
							 | 
						|
								        model = self.document_type_id
							 | 
						|
								        model_view = self.view_id
							 | 
						|
								        class_name = 'alert ' + self.type
							 | 
						|
								        xml_id = ''
							 | 
						|
								        if self.group_id.id:
							 | 
						|
								            xml_ids = self.group_id.get_external_id()
							 | 
						|
								            xml_id = xml_ids.get(self.group_id.id)
							 | 
						|
								        filter = ast.literal_eval(self.field_filter)
							 | 
						|
								        for i in range(len(filter)):
							 | 
						|
								            if filter[i] == '&':
							 | 
						|
								                filter[i] = '|'
							 | 
						|
								            elif filter[i] == '|':
							 | 
						|
								                filter[i] = '&'
							 | 
						|
								            else:
							 | 
						|
								                if filter[i][1] == '=':
							 | 
						|
								                    filter_list = list(filter[i])
							 | 
						|
								                    filter_list[1] = '!='
							 | 
						|
								                    filter = f" {filter_list[0]} {filter_list[1]} '{filter_list[2]}'"
							 | 
						|
								                elif filter[i][1] == '!=':
							 | 
						|
								                    filter_list = list(filter[i])
							 | 
						|
								                    filter_list[1] = '=='
							 | 
						|
								                    filter = f" {filter_list[0]} {filter_list[1]} '{filter_list[2]}'"
							 | 
						|
								                elif filter[i][1] == '>':
							 | 
						|
								                    filter_list = list(filter[i])
							 | 
						|
								                    filter_list[1] = '<'
							 | 
						|
								                    filter = f" {filter_list[0]} {filter_list[1]} {filter_list[2]}"
							 | 
						|
								                elif filter[i][1] == '<':
							 | 
						|
								                    filter_list = list(filter[i])
							 | 
						|
								                    filter_list[1] = '>'
							 | 
						|
								                    filter = f" {filter_list[0]} {filter_list[1]} {filter_list[2]}"
							 | 
						|
								                elif filter[i][1] == '>=':
							 | 
						|
								                    filter_list = list(filter[i])
							 | 
						|
								                    filter_list[1] = '<='
							 | 
						|
								                    filter = f" {filter_list[0]} {filter_list[1]} {filter_list[2]}"
							 | 
						|
								                elif filter[i][1] == '<=':
							 | 
						|
								                    filter_list = list(filter[i])
							 | 
						|
								                    filter_list[1] = '>='
							 | 
						|
								                    filter = f" {filter_list[0]} {filter_list[1]} {filter_list[2]}"
							 | 
						|
								                elif filter[i][1] == 'ilike':
							 | 
						|
								                    filter_list = list(filter[i])
							 | 
						|
								                    filter_list[1] = 'not in'
							 | 
						|
								                    filter = f" {filter_list[0]} {filter_list[1]} ['{filter_list[2]}']"
							 | 
						|
								                elif filter[i][1] == 'not ilike':
							 | 
						|
								                    filter_list = list(filter[i])
							 | 
						|
								                    filter_list[1] = 'in'
							 | 
						|
								                    filter = f" {filter_list[0]} {filter_list[1]} ['{filter_list[2]}']"
							 | 
						|
								                elif filter[i][1] == 'in':
							 | 
						|
								                    filter_list = list(filter[i])
							 | 
						|
								                    filter_list[1] = 'not in'
							 | 
						|
								                    filter = f" {filter_list[0]} {filter_list[1]} {filter_list[2]}"
							 | 
						|
								                elif filter[i][1] == 'not in':
							 | 
						|
								                    filter_list = list(filter[i])
							 | 
						|
								                    filter_list[1] = 'in'
							 | 
						|
								                    filter = f" {filter_list[0]} {filter_list[1]} {filter_list[2]}"
							 | 
						|
								
							 | 
						|
								        invisible_filter = str(filter).replace("'", '"')
							 | 
						|
								        if xml_id:
							 | 
						|
								            if invisible_filter != '[]':
							 | 
						|
								                arch = '<xpath expr="//sheet" position="before">' + '<div role="alert" class="' + class_name + '" ' + ' groups="' + xml_id + '"' + """ invisible=' """ + invisible_filter + "'" + '>' + self.alert_messages + '</div></xpath>'
							 | 
						|
								            else:
							 | 
						|
								                arch = '<xpath expr="//sheet" position="before">' + '<div role="alert" class="' + class_name + '" ' + ' groups="' + xml_id + '"' + '>' + self.alert_messages + '</div></xpath>'
							 | 
						|
								        else:
							 | 
						|
								            if invisible_filter != '[]':
							 | 
						|
								                arch = '<xpath expr="//sheet" position="before">' + '<div role="alert" class="' + class_name + '" ' + """ invisible='""" + invisible_filter + "'" + '>' + self.alert_messages + '</div></xpath>'
							 | 
						|
								            else:
							 | 
						|
								                arch = '<xpath expr="//sheet" position="before">' + '<div role="alert" class="' + class_name + '" ' + '>' + self.alert_messages + '</div></xpath>'
							 | 
						|
								
							 | 
						|
								        if model_view:
							 | 
						|
								            view_data = {
							 | 
						|
								                'name': self.type + '.alert.' + model_view.name + '.' + str(
							 | 
						|
								                    self.id),
							 | 
						|
								                'type': 'form',
							 | 
						|
								                'model': model.model,
							 | 
						|
								                'priority': 1,
							 | 
						|
								                'inherit_id': model_view.id,
							 | 
						|
								                'mode': 'extension',
							 | 
						|
								                'arch_base': arch.encode('utf-8')
							 | 
						|
								            }
							 | 
						|
								            try:
							 | 
						|
								                view = self.env["ir.ui.view"].create(view_data)
							 | 
						|
								            except:
							 | 
						|
								                raise UserError("Can't create a view based on this domain")
							 | 
						|
								            self.new_view_id = view
							 | 
						|
								            self.state = 'done'
							 | 
						|
								
							 | 
						|
								    def action_cancel(self):
							 | 
						|
								        """cancel the alert message"""
							 | 
						|
								        self.state = 'cancelled'
							 | 
						|
								        self.new_view_id.unlink()
							 | 
						|
								
							 | 
						|
								    def reset_draft(self):
							 | 
						|
								        """reset the record into the draft state"""
							 | 
						|
								        self.state = 'draft'
							 | 
						|
								
							 |