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.
		
		
		
		
		
			
		
			
				
					
					
						
							218 lines
						
					
					
						
							8.7 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							218 lines
						
					
					
						
							8.7 KiB
						
					
					
				
								# -*- coding: utf-8 -*-
							 | 
						|
								#############################################################################
							 | 
						|
								#
							 | 
						|
								#    Cybrosys Technologies Pvt. Ltd.
							 | 
						|
								#
							 | 
						|
								#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
							 | 
						|
								#    Author: Mohammed Irfan T (<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 api, fields, models, _
							 | 
						|
								from odoo.exceptions import UserError
							 | 
						|
								
							 | 
						|
								OBJECT_VALS = {
							 | 
						|
								    '=': '!=',
							 | 
						|
								    '!=': '=',
							 | 
						|
								    '>': '<',
							 | 
						|
								    '<': '>',
							 | 
						|
								    '>=': '<=;',
							 | 
						|
								    '<=': '>=;',
							 | 
						|
								    'ilike': 'not in',
							 | 
						|
								    'not ilike': 'in',
							 | 
						|
								    'in': 'not in',
							 | 
						|
								    'not in': 'in'
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								class AlertMessage(models.Model):
							 | 
						|
								    """
							 | 
						|
								        This class used to create the smart alert warnings
							 | 
						|
								    """
							 | 
						|
								    _name = 'alert.message'
							 | 
						|
								    _description = 'Alert Message'
							 | 
						|
								
							 | 
						|
								    name = fields.Char(string='Name', required=True,
							 | 
						|
								                       help="Name for the smart alert warning")
							 | 
						|
								    document_type_id = fields.Many2one('ir.model', required=True,
							 | 
						|
								                                       help="Choose the model in which where "
							 | 
						|
								                                            "you need to show the warning",
							 | 
						|
								                                       string="Document Type",
							 | 
						|
								                                       ondelete='cascade')
							 | 
						|
								    group_id = fields.Many2one('res.groups',
							 | 
						|
								                               help="Choose which user groups need to see "
							 | 
						|
								                                    "the warnings", string="Group")
							 | 
						|
								    alert_messages = fields.Char(string='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')],
							 | 
						|
								                            required=True, help='Type of alert message',
							 | 
						|
								                            string="Type")
							 | 
						|
								    model_name = fields.Char(string="Model Name", help="name of selected "
							 | 
						|
								                                                       "model",
							 | 
						|
								                             related="document_type_id.model")
							 | 
						|
								    field_filter = fields.Char(default="[]",
							 | 
						|
								                               help="Add any filtration if you need to show"
							 | 
						|
								                                    " the warning messages",
							 | 
						|
								                               string="Field Filter")
							 | 
						|
								    view_id = fields.Many2one('ir.ui.view', required=True,
							 | 
						|
								                              domain='[("model", "=", model_name), '
							 | 
						|
								                                     '("type", "=", "form"), '
							 | 
						|
								                                     '("is_alert_boolean", "=", False)]',
							 | 
						|
								                              help="Choose the view in which the alert need "
							 | 
						|
								                                   "to show", string='View')
							 | 
						|
								    new_view_id = fields.Many2one('ir.ui.view',
							 | 
						|
								                                  string="Created New view Id",
							 | 
						|
								                                  readonly=True,
							 | 
						|
								                                  help="To generate the view id of newly "
							 | 
						|
								                                       "created record")
							 | 
						|
								    state = fields.Selection(
							 | 
						|
								        [('draft', 'Draft'), ('done', 'Done')],
							 | 
						|
								        default="draft", help="Stages of the record", string="State")
							 | 
						|
								    is_edit_mode = fields.Boolean(string="Is Edit",
							 | 
						|
								                                  help="To check is it is in edit mode")
							 | 
						|
								
							 | 
						|
								    @api.model
							 | 
						|
								    def create(self, vals):
							 | 
						|
								        """
							 | 
						|
								            Create a new record with the provided values and set 'is_edit_mode'
							 | 
						|
								             to True by default.
							 | 
						|
								
							 | 
						|
								            :param vals: A dictionary of field values for the new record.
							 | 
						|
								            :return: The newly created record.
							 | 
						|
								        """
							 | 
						|
								        res = super().create(vals)
							 | 
						|
								        res.is_edit_mode = True
							 | 
						|
								        return res
							 | 
						|
								
							 | 
						|
								    def create_record(self):
							 | 
						|
								        """
							 | 
						|
								            This method is responsible for creating a new record and related
							 | 
						|
								            view based on provided parameters and conditions.
							 | 
						|
								
							 | 
						|
								            It performs the following actions:
							 | 
						|
								            - Deletes the existing new_view_id if it exists.
							 | 
						|
								            - Retrieves model and model_view based on document_type_id and
							 | 
						|
								            view_id.
							 | 
						|
								            - Constructs an XML snippet (arch) for the view with dynamic
							 | 
						|
								            attributes.
							 | 
						|
								            - Attempts to create the new view and updates related fields.
							 | 
						|
								
							 | 
						|
								            :return: The ID of the newly created view.
							 | 
						|
								        """
							 | 
						|
								        if self.new_view_id:
							 | 
						|
								            self.new_view_id.unlink()
							 | 
						|
								        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:
							 | 
						|
								                filter_list = list(filter[i])
							 | 
						|
								                filter_list[1] = OBJECT_VALS[filter[i][1]]
							 | 
						|
								                filter[i] = tuple(filter_list)
							 | 
						|
								
							 | 
						|
								        invisible_filter = str(filter).replace("'", '"')
							 | 
						|
								        arch = '<xpath expr="//sheet" position="before">'
							 | 
						|
								        arch += '<div role="alert" class="' + class_name + '" '
							 | 
						|
								        if xml_id:
							 | 
						|
								            arch += ' groups="' + xml_id + '"'
							 | 
						|
								        if invisible_filter != '[]':
							 | 
						|
								            arch += """ attrs='{"invisible": """ + invisible_filter + "}'"
							 | 
						|
								        arch += '>' + self.alert_messages + '</div></xpath>'
							 | 
						|
								        if model_view:
							 | 
						|
								            view_data = {
							 | 
						|
								                'name': self.type + '.alert.' + model_view.name + '.' + str(
							 | 
						|
								                    self.id),
							 | 
						|
								                'type': 'form',
							 | 
						|
								                'model': self.document_type_id.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)
							 | 
						|
								                self.new_view_id = view.id
							 | 
						|
								                view.is_alert_boolean = True
							 | 
						|
								            except:
							 | 
						|
								                raise UserError(_("Can't create a view based on this domain"))
							 | 
						|
								            self.state = 'done'
							 | 
						|
								            return view.id
							 | 
						|
								
							 | 
						|
								    @api.onchange('type', 'alert_messages', 'group_id', 'document_type_id',
							 | 
						|
								                  'view_id', 'field_filter')
							 | 
						|
								    def _onchange_type(self):
							 | 
						|
								        """
							 | 
						|
								            Update certain fields when specific fields are changed.
							 | 
						|
								            This method is automatically triggered when any of the specified
							 | 
						|
								            fields ('type','alert_messages', 'group_id', 'document_type_id',
							 | 
						|
								            'view_id', 'field_filter') are changed. It updates the
							 | 
						|
								            corresponding fields in the original record and sets 'is_edit_mode'
							 | 
						|
								            to True.
							 | 
						|
								            Note: This method is meant to be used as an onchange handler in
							 | 
						|
								            the Odoo framework.
							 | 
						|
								            :return: None
							 | 
						|
								        """
							 | 
						|
								        self._origin.write({
							 | 
						|
								            'type': self.type,
							 | 
						|
								            'alert_messages': self.alert_messages,
							 | 
						|
								            'group_id': self.group_id.id,
							 | 
						|
								            'document_type_id': self.document_type_id.id,
							 | 
						|
								            'view_id': self.view_id.id,
							 | 
						|
								            'field_filter': self.field_filter
							 | 
						|
								        })
							 | 
						|
								        self._origin.is_edit_mode = True
							 | 
						|
								
							 | 
						|
								    def write(self, vals):
							 | 
						|
								        """
							 | 
						|
								            Override the default write method to update records and perform
							 | 
						|
								            additional actions.
							 | 
						|
								        """
							 | 
						|
								        super().write(vals)
							 | 
						|
								        for rec in self:
							 | 
						|
								            if rec.is_edit_mode:
							 | 
						|
								                if rec.state == 'draft':
							 | 
						|
								                    rec.state = 'done'
							 | 
						|
								                rec.is_edit_mode = False
							 | 
						|
								                rec.create_record()
							 | 
						|
								
							 | 
						|
								    def action_reset_draft(self):
							 | 
						|
								        """Reset the record into the draft state"""
							 | 
						|
								        self.state = 'draft'
							 | 
						|
								        self.new_view_id.unlink()
							 | 
						|
								
							 | 
						|
								    def action_done(self):
							 | 
						|
								        """To change the state of the record to done"""
							 | 
						|
								        self.state = 'done'
							 | 
						|
								        self.create_record()
							 | 
						|
								
							 | 
						|
								    def unlink(self):
							 | 
						|
								        """To unlink the alert record on deleting the record"""
							 | 
						|
								        self.new_view_id.unlink()
							 | 
						|
								        res = super().unlink()
							 | 
						|
								        return res
							 | 
						|
								
							 |