Ожидаемый синглтон: line.employee.mission (57, 58, 59) !! (Оду 11) - PullRequest
0 голосов
/ 26 апреля 2019

У меня проблема с моим кодом, я хочу проверить, сотрудник уже пойман в выбранные даты! но сотрудник находится в поле One2Many, вот мой код:

Моя ошибка:

Ожидаемый синглтон: line.employee.mission (57, 58, 59)

В Py файле:

    class HrMission(models.Model):
        _name = 'hr.employee.mission'
        _description = 'Mission object'
        _inherit = 'mail.thread'

        line_mission = fields.One2many('line.employee.mission','line_mission', string='Employee', help="Employee sent on mission", copy=True,auto_join=True)

    @api.multi
    @api.constrains('mission_start_date', 'mission_end_date')
    def _check_date(self):
        for mission in self:
            domain = [
                ('mission_start_date', '<=', mission.mission_end_date),
                ('mission_end_date', '>=', mission.mission_start_date),
                ('line_mission', '=', mission.line_mission.id),
                ('id', '!=', mission.id),
            ]
            nmissions = self.search_count(domain)
            if nmissions:
                raise exceptions.ValidationError('Vous ne pouvez pas avoir 2 missions qui se chevauchent le même jour!')

    class LineEmployee(models.Model):
        _name = 'line.employee.mission'
        _description = 'Lignes des employés pour les mission'

        line_mission = fields.Many2one('hr.employee.mission', string='Line mission Reference', required=True, ondelete='cascade', index=True, copy=False)
        employee_id = fields.Many2one('hr.employee', string='Employee', help="Employee sent on mission",
                                      required=True)
        job_id = fields.Many2one(related='employee_id.job_id', string='Fonction', help="Fonction employee", required=True)
        department_id = fields.Many2one(related='employee_id.department_id', string='Département',required=True)

В файле XML:

<page name="Employés" string="Employés">
                                    <field name='line_mission'>
                                            <tree string='Employés' editable="top">
                                                <field name='employee_id'/>
                                                <field name='job_id'/>
                                                <field name='department_id'/>
                                            </tree>
                                    </field>
                            </page>

1 Ответ

1 голос
/ 27 апреля 2019

Вы не опубликовали полное сообщение об ошибке, но, глядя на ваш код, я предполагаю, что это вызывает ошибку:

 ('line_mission', '=', mission.line_mission.id),

Вы определили line_mission как One2many, поэтому в любое время набор записей One2many имеет болееодна запись, доступ к «.id» даст вам эту единственную ошибку.

Я предполагаю, что вам нужно знать, есть ли какие-либо другие записи hr.employee.mission с перекрытием даты и где сотрудник находится на одномlines.

Вы можете использовать один SQL-запрос с соединениями, но если бы я делал это в поиске, я бы, вероятно, сделал бы два поиска, чтобы Odoo не создал потенциально большой список родительской записи.

# find any other missions that overlap our dates.
overlapping_missions = self.search([
    ('mission_start_date', '<=', mission.mission_end_date),
    ('mission_end_date', '>=', mission.mission_start_date),
    ('id', '!=', mission.id)])
if overlapping_missions:
    # Are there any lines for these overlapping missions that have any 
    # of the same employees as we have for this mission (note list comprehension).
    duplicates = self.env['line.employee.mission'].search_count([
        ('line_mission', 'in', overlapping_parents.ids),
        ('employee_id', 'in', [l.employee_id.id for l in mission.line_mission])
    ])
    if duplicates:
       raise ValidationError(...)

Я дома, поэтому не проверял это, но это должно быть примерно правильно.

...