Search code examples
pythonodooodoo-10

[Odoo][v10] IndexError in cron in formview everything is ok


I have two that same methods, one working in form view for record and second is for cron.

When i run action in Form view everything is OK, i can get value :

self.deadline = deadlines[0][0] 

but when i run in cron:

emp.debug = deadlines[0][0]

i have IndexError: list index out of range but emp.debug = deadlines works

Full code:

class UserProfile(models.Model):
    _name = 'users.profile'

    user_id = fields.Many2one(related='project_id.user_id', string='User')
    partner_id = fields.Many2one('res.partner', 'Partner')
    follower_id = fields.Many2one('mail.followers', 'Follower')
    project_id = fields.Many2one('project.project', 'Project')
    # project_start_date  #   TODO    max date from deadlines
    project_active = fields.Boolean(related='project_id.active', string='Project active')
    project_percent = fields.Float(related='project_id.x_project_percent', string='Project percent')
    project_money = fields.Float(related='project_id.x_project_money_share')
    # project_money_paid = fields.Char(related='project_id.x_paid_debug')
    project_sale = fields.Many2one(related='project_id.x_sales_id', string='Sales')
    deadline = fields.Many2one('project.project.deadlines', 'Deadline')
    deadline_date = fields.Datetime(related='deadline.end_date')
    debug = fields.Text()

    def get_closest_date(self): # In form view
        find_deadlines = self.env["project.project.deadlines"].search([('project_id', '=', self.project_id.id)])
        deadlines = []
        for record in find_deadlines:
            datetime_without_tz = datetime.datetime.strptime(record.end_date, "%Y-%m-%d %H:%M:%S")
            record_id = record.id
            delta = datetime_without_tz - datetime.datetime.now()
            delta_in_seconds = int(delta.total_seconds())
            if delta_in_seconds > 0:
                deadlines.append((record_id, delta_in_seconds))
        deadlines.sort(key=itemgetter(1))
        self.deadline = deadlines[0][0] # No indexError i can get value
        self.debug = self.env["users.profile"].search([])[0].project_id.id

    @api.model
    def get_closest_date2(self):    # For cron
        emp_details_all = self.env["users.profile"].search([])
        for emp in emp_details_all:
            find_deadlines = self.env["project.project.deadlines"].search([('project_id', '=', emp.project_id.id)])
            deadlines = []
            for record in find_deadlines:
                datetime_without_tz = datetime.datetime.strptime(record.end_date, "%Y-%m-%d %H:%M:%S")
                record_id = record.id
                delta = datetime_without_tz - datetime.datetime.now()
                delta_in_seconds = int(delta.total_seconds())
                if delta_in_seconds > 0:
                    deadlines.append((record_id, delta_in_seconds))
            deadlines.sort(key=itemgetter(1))
            emp.debug = deadlines[0][0]     # IndexError

Solution

  • In the cron method you are looping over all users profiles so it seems like the error message IndexError is shown for a different record.

    Check the deadlines variable in get_closest_date2 method before trying to get some value.