Odoo Call python function from Javascript

Write below function inside odoo javascript page.

  this._rpc({
                    model: 'hr.employee',
                    method: 'default_events',
                    args: [this.res_id],
                }, {
                    shadow: true,
                });  

Write below function inside Odoo python file

@api.model
def default_events(self,emp_id):
up_ev_data = []
events_obj= self.env['upcoming.events']
leave_obj= self.env['hr.leave']
leaveline= leave_obj.search([('employee_id','=',emp_id),('state','=','validate')])
if(emp_id):
self.env['upcoming.events'].search([('employee_id','=',emp_id)]).unlink()
for leave in leaveline:
vals={
'name' : leave.holiday_status_id.name,
'employee_id': leave.employee_id.id,
'date_start': leave.request_date_from,
'date_end': leave.request_date_to,
'state':'validate',
}
up_ev_data.append((0,0,vals))
events_obj.create(vals)
return up_ev_data Write below function inside odoo javascript page.

this._rpc({
model: 'hr.employee',
method: 'default_events',
args: [this.res_id],
}, {
shadow: true,
});
Write below function inside Odoo python file

addons\employee_events\static\src\js\event_list.js

odoo.define('employee_events.event_list', function (require) {
     "use strict";
var FieldOne2Many = require('web.relational_fields').FieldOne2Many;
var fieldRegistry = require('web.field_registry');
var ListRenderer = require('web.ListRenderer');
// Function ListRenderer_extnd    
var ListRenderer_extnd = ListRenderer.extend({
    _renderRow: function (record, index) {
        var $row = this._super.apply(this, arguments);
        // Change on2many row's background colour based on event_type condition            
        if(record.data["event_type"]=='leave')
        {           
            this.$el.find('> table').removeClass('table-striped');     
            $row.addClass('events_leave');   
        }
        if(record.data["event_type"]=='calendar')
        {           
            this.$el.find('> table').removeClass('table-striped');     
            $row.addClass('events_calender');   
        }
        if(record.data["event_type"]=='activity')
        {           
            this.$el.find('> table').removeClass('table-striped');     
            $row.addClass('events_activity');   
        }            
        return $row;
    },

});
// Extending javascript one2many Render function 
var EventListFieldOne2Many = FieldOne2Many.extend({        
    _getRenderer: function () {
        console.log("My Message inside");
        if (this.view.arch.tag === 'tree') {                
            //Calling python funtion default_events(hr.employee) using _rpc             
            this._rpc({
                model: 'hr.employee',
                method: 'default_events',
                args: [this.res_id],
            }, {
                shadow: true,
            });
            // Return ListRenderer_extnd
            return ListRenderer_extnd;
        }
        return this._super.apply(this, arguments);
    },
});
console.log("My Event List End!!!");
fieldRegistry.add('Event_List_FieldOne2Many', EventListFieldOne2Many);
});

odoo\addons\employee_events\models\hr_employee.py

import datetime
from odoo import api, fields, models, _

# inherit employee module
class Employee(models.Model):
    _inherit = 'hr.employee'  
         
    event_ids = fields.One2many('upcoming.events', 'employee_id', string='Upcoming Events',copy=True)
    # creating upcoming events from Leaves,Calender and Activity
    # Function from  event_list.js
    @api.model
    def default_events(self,emp_id):          
        up_ev_data = []
        events_obj= self.env['upcoming.events']
        cal_obj= self.env['calendar.event']
        emp_obj= self.env['hr.employee']
        act_obj= self.env['mail.activity']
        leave_obj= self.env['hr.leave']
        if(emp_id):
            # Clearing existing upcoming event lines 
            self.env['upcoming.events'].search([('employee_id','=',emp_id)]).unlink()
            # creating upcoming events from Leaves  
            leaveline= leave_obj.search([('employee_id','=',emp_id),('state','=','validate'),('request_date_to','>',datetime.datetime.utcnow().date())])            
            for leave in leaveline:                
                vals={
                    'name' : leave.holiday_status_id.name,
                    'employee_id': leave.employee_id.id, 
                    'date_start': leave.request_date_from,
                    'date_end': leave.request_date_to,
                    'state':'validate',
                    'event_type':'leave',          
                }               
                up_ev_data.append(vals) 
            # creating upcoming events from Calendar events              
            employee= emp_obj.search([('id','=',emp_id)])
            if(employee):                
                event_line=cal_obj.search([('partner_ids','in',employee.user_id.partner_id.id),('privacy','=','public'),('stop_date','>=',datetime.datetime.utcnow().date())]) 
                for event in event_line:
                    vals={
                        'name' : event.name,
                        'employee_id': emp_id, 
                        'date_start': event.start_date,
                        'date_end': event.stop_date,
                        'state':'validate',
                        'event_type':'calendar',            
                    }
                    up_ev_data.append(vals)                   
            # creating upcoming events from Activity
            if(employee):               
                act_line=act_obj.search([('res_id','=',employee.id),('res_model_id','=','hr.employee'),('date_deadline','>=',datetime.datetime.utcnow().date())]) 
                for act in act_line:
                    vals={
                        'name' : act.summary,
                        'employee_id': emp_id, 
                        'date_start': act.date_deadline,
                        'date_end': act.date_deadline,
                        'state':'validate',
                        'event_type':'activity',            
                    }
                    up_ev_data.append(vals)
            # Sort based on the date                
            up_ev_data_new=sorted(up_ev_data, key = lambda i: i['date_start'])   
            # Creating upcoming event lines   
            events_obj.create(up_ev_data_new)            
        return up_ev_data        
   
   

# upcoming.events module
class UpcomingEvents(models.Model):
    _name = 'upcoming.events'
    name = fields.Char('Events')
    employee_id = fields.Many2one('hr.employee', string='Employee')
    date_start = fields.Date('Start Date', default=fields.Date.today,
        help="Start date of the event.")
    date_end = fields.Date('End Date', default=fields.Date.today,
        help="End date of the event.")
    event_type=fields.Selection([
            ('leave', 'Leave'),
            ('calendar', 'Calendar'),
            ('activity', 'Activity'),           
        ], string='Type', default='calendar')
    state = fields.Selection([
            ('draft', 'New'),
            ('confirm', 'Waiting Approval'),
            ('refuse', 'Refused'),
            ('validate1', 'Waiting Second Approval'),
            ('validate', 'Approved'),
            ('cancel', 'Cancelled')
        ], string='Status', default='draft')

from odoo import api, fields, models, _
class Employee(models.Model):
     _inherit = 'hr.employee'  
event_ids = fields.One2many('upcoming.events', 'employee_id', string='Upcoming Events',copy=True)

@api.model
def default_events(self,emp_id):          
    up_ev_data = []
    events_obj= self.env['upcoming.events']
    leave_obj= self.env['hr.leave']
    leaveline= leave_obj.search([('employee_id','=',emp_id),('state','=','validate')])      

    if(emp_id):
        self.env['upcoming.events'].search([('employee_id','=',emp_id)]).unlink()
        for leave in leaveline:                
            vals={
                'name' : leave.holiday_status_id.name,
                'employee_id': leave.employee_id.id, 
                'date_start': leave.request_date_from,
                'date_end': leave.request_date_to,
                'state':'validate',            
            }                
            up_ev_data.append((0,0,vals))
            events_obj.create(vals)                
    return up_ev_data  

Start Odoo service on system startup

<!-- wp:paragraph -->
<p> sudo vim /etc/systemd/system/odoo.service</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>[Unit]<br>Description=Odoo<br>Documentation=<a href="http://www.odoo.com/" target="_blank" rel="noreferrer noopener">http://www.odoo.com/</a><br>[Service]<br># Ubuntu/Debian convention:<br>Type=simple<br>User=odoo<br>ExecStart=/opt/odoo/odoo-10.0/odoo-bin -c /etc/odoo.conf<br>[Install]<br>WantedBy=default.target</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><code>sudo mkdir /var/lib/odoo<br>sudo chown odoo:root /var/lib/odoo -R</code></p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>sudo systemctl enable odoo.service (Enable service)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>sudo systemctl start odoo.service (starts service)<br>sudo systemctl stop odoo.service (stops service)<br>sudo systemctl restart odoo.service (restarts Service)<br>sudo systemctl status odoo.service (status of service)<br>sudo systemctl enable odoo.service (starts service at boot)<br>sudo systemctl disable odoo.service (disables service at boot) </p>
<!-- /wp:paragraph -->

Add a .Net Windows Application in WINDOWS TASK SCHEDULER

  1. Open the Task Scheduler window
  2. Choose Create Basic Task on the right side.
  3. Type name & description in the boxes and 
    Click the Next button.
  4. Choose Daily and select the Next button.
  5. Enter the starting date and time, plus any additional time settings.
  6. Click the Next button.
  7. Choose Start a Program.
    Example, type C:\BlobtoImage\Blob_To_Images.exe in the Program/script box and Optional Argument in the Add Arguments (Optional) box and “C:\BlobtoImage\” in the Start In (Optional) text box.
  8. Click the Next button and then the Finish button.