In the web client, in a real use case, it's not possible to write on fields which are invisible, as it's not possible to write on fields which are readonly. This is a first step in the goal to change the behavior of the `groups=` attribute in the back-end views, to remove them for the view instead of making them invisible. This is mainly to reduce the diff of the revision that will introduce the mentioned above behavior change. As nodes with `groups=` will be removed from the view when the user doesn't have the group, it's no longer possible to set a value on a field having a `groups=` the user doesn't have in the `Form` test class, as the field will no longer be at all in the view. However, these unit tests shouldn't have been able to set values on invisible fields in the first place. This revision therefore aims to correct the unit tests setting value on fields which were invisible because the user executing the test was not part of the required group(s) for these fields to be visible in the view. closes odoo/odoo#94337 Related: odoo/enterprise#28936 Signed-off-by: Denis Ledoux (dle) <dle@odoo.com>
296 lines
13 KiB
Python
296 lines
13 KiB
Python
# -*- coding: utf-8 -*-
|
|
from datetime import date, datetime
|
|
|
|
from odoo.tests.common import Form
|
|
|
|
from odoo.addons.hr_holidays.tests.common import TestHrHolidaysCommon
|
|
from odoo.exceptions import ValidationError
|
|
|
|
|
|
class TestAutomaticLeaveDates(TestHrHolidaysCommon):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(TestAutomaticLeaveDates, cls).setUpClass()
|
|
|
|
cls.leave_type = cls.env['hr.leave.type'].create({
|
|
'name': 'Automatic Test',
|
|
'time_type': 'leave',
|
|
'requires_allocation': 'no',
|
|
# Required for `request_unit_half` to be visible in the view
|
|
'request_unit': 'half_day',
|
|
})
|
|
|
|
def test_no_attendances(self):
|
|
calendar = self.env['resource.calendar'].create({
|
|
'name': 'No Attendances',
|
|
'attendance_ids': [(5, 0, 0)],
|
|
})
|
|
employee = self.employee_emp
|
|
employee.resource_calendar_id = calendar
|
|
|
|
with Form(self.env['hr.leave'].with_context(default_employee_id=employee.id)) as leave_form:
|
|
leave_form.holiday_status_id = self.leave_type
|
|
leave_form.request_date_from = date(2019, 9, 2)
|
|
leave_form.request_date_to = date(2019, 9, 2)
|
|
leave_form.request_unit_half = True
|
|
leave_form.request_date_from_period = 'am'
|
|
|
|
self.assertEqual(leave_form.number_of_days_display, 0)
|
|
self.assertEqual(leave_form.number_of_hours_text, '0 Hours')
|
|
|
|
def test_single_attendance_on_morning_and_afternoon(self):
|
|
calendar = self.env['resource.calendar'].create({
|
|
'name': 'simple morning + afternoon',
|
|
'attendance_ids': [(5, 0, 0),
|
|
(0, 0, {
|
|
'name': 'monday morning',
|
|
'hour_from': 8,
|
|
'hour_to': 12,
|
|
'day_period': 'morning',
|
|
'dayofweek': '0',
|
|
}),
|
|
(0, 0, {
|
|
'name': 'monday afternoon',
|
|
'hour_from': 13,
|
|
'hour_to': 17,
|
|
'day_period': 'afternoon',
|
|
'dayofweek': '0',
|
|
})]
|
|
})
|
|
|
|
employee = self.employee_emp
|
|
employee.resource_calendar_id = calendar
|
|
|
|
with Form(self.env['hr.leave'].with_context(default_employee_id=employee.id)) as leave_form:
|
|
leave_form.holiday_status_id = self.leave_type
|
|
leave_form.request_date_from = date(2019, 9, 2)
|
|
leave_form.request_date_to = date(2019, 9, 2)
|
|
leave_form.request_unit_half = True
|
|
leave_form.request_date_from_period = 'am'
|
|
|
|
self.assertEqual(leave_form.number_of_days_display, .5)
|
|
self.assertEqual(leave_form.number_of_hours_text, '4 Hours')
|
|
|
|
leave_form.request_date_from_period = 'pm'
|
|
|
|
self.assertEqual(leave_form.number_of_days_display, .5)
|
|
self.assertEqual(leave_form.number_of_hours_text, '4 Hours')
|
|
|
|
def test_multiple_attendance_on_morning(self):
|
|
calendar = self.env['resource.calendar'].create({
|
|
'name': 'multi morning',
|
|
'attendance_ids': [(5, 0, 0),
|
|
(0, 0, {
|
|
'name': 'monday morning 1',
|
|
'hour_from': 8,
|
|
'hour_to': 10,
|
|
'day_period': 'morning',
|
|
'dayofweek': '0',
|
|
}),
|
|
(0, 0, {
|
|
'name': 'monday morning 2',
|
|
'hour_from': 10.25,
|
|
'hour_to': 12.25,
|
|
'day_period': 'morning',
|
|
'dayofweek': '0',
|
|
}),
|
|
(0, 0, {
|
|
'name': 'monday afternoon',
|
|
'hour_from': 13,
|
|
'hour_to': 17,
|
|
'day_period': 'afternoon',
|
|
'dayofweek': '0',
|
|
})]
|
|
})
|
|
employee = self.employee_emp
|
|
employee.resource_calendar_id = calendar
|
|
|
|
with Form(self.env['hr.leave'].with_context(default_employee_id=employee.id)) as leave_form:
|
|
leave_form.holiday_status_id = self.leave_type
|
|
leave_form.request_date_from = date(2019, 9, 2)
|
|
leave_form.request_date_to = date(2019, 9, 2)
|
|
leave_form.request_unit_half = True
|
|
leave_form.request_date_from_period = 'am'
|
|
|
|
self.assertEqual(leave_form.number_of_days_display, .5)
|
|
self.assertEqual(leave_form.number_of_hours_text, '4 Hours')
|
|
|
|
leave_form.request_date_from_period = 'pm'
|
|
|
|
self.assertEqual(leave_form.number_of_days_display, .5)
|
|
self.assertEqual(leave_form.number_of_hours_text, '4 Hours')
|
|
|
|
def test_attendance_on_morning(self):
|
|
calendar = self.env['resource.calendar'].create({
|
|
'name': 'Morning only',
|
|
'attendance_ids': [(5, 0, 0),
|
|
(0, 0, {
|
|
'name': 'Monday All day',
|
|
'hour_from': 8,
|
|
'hour_to': 16,
|
|
'day_period': 'morning',
|
|
'dayofweek': '0',
|
|
})],
|
|
})
|
|
employee = self.employee_emp
|
|
employee.resource_calendar_id = calendar
|
|
with Form(self.env['hr.leave'].with_context(default_employee_id=employee.id)) as leave_form:
|
|
leave_form.holiday_status_id = self.leave_type
|
|
leave_form.request_date_from = date(2019, 9, 2)
|
|
leave_form.request_date_to = date(2019, 9, 2)
|
|
leave_form.request_unit_half = True
|
|
# Ask for morning
|
|
leave_form.request_date_from_period = 'am'
|
|
|
|
self.assertEqual(leave_form.number_of_days_display, 0.5)
|
|
self.assertEqual(leave_form.number_of_hours_text, '8 Hours')
|
|
|
|
# Ask for afternoon
|
|
leave_form.request_date_from_period = 'pm'
|
|
|
|
self.assertEqual(leave_form.number_of_days_display, 0.5)
|
|
self.assertEqual(leave_form.number_of_hours_text, '8 Hours')
|
|
|
|
def test_attendance_next_day(self):
|
|
self.env.user.tz = 'Europe/Brussels'
|
|
calendar = self.env['resource.calendar'].create({
|
|
'name': 'auto next day',
|
|
'attendance_ids': [(5, 0, 0),
|
|
(0, 0, {
|
|
'name': 'tuesday morning',
|
|
'hour_from': 8,
|
|
'hour_to': 12,
|
|
'day_period': 'morning',
|
|
'dayofweek': '1',
|
|
})]
|
|
})
|
|
employee = self.employee_emp
|
|
employee.resource_calendar_id = calendar
|
|
|
|
with Form(self.env['hr.leave'].with_context(default_employee_id=employee.id)) as leave_form:
|
|
leave_form.holiday_status_id = self.leave_type
|
|
# does not work on mondays
|
|
leave_form.request_date_from = date(2019, 9, 2)
|
|
leave_form.request_date_to = date(2019, 9, 2)
|
|
leave_form.request_unit_half = True
|
|
leave_form.request_date_from_period = 'am'
|
|
|
|
|
|
self.assertEqual(leave_form.number_of_days_display, 0)
|
|
self.assertEqual(leave_form.number_of_hours_text, '0 Hours')
|
|
self.assertEqual(leave_form.date_from, datetime(2019, 9, 2, 6, 0, 0))
|
|
self.assertEqual(leave_form.date_to, datetime(2019, 9, 2, 10, 0, 0))
|
|
|
|
def test_attendance_previous_day(self):
|
|
self.env.user.tz = 'Europe/Brussels'
|
|
calendar = self.env['resource.calendar'].create({
|
|
'name': 'auto next day',
|
|
'attendance_ids': [(5, 0, 0),
|
|
(0, 0, {
|
|
'name': 'monday morning',
|
|
'hour_from': 8,
|
|
'hour_to': 12,
|
|
'day_period': 'morning',
|
|
'dayofweek': '0',
|
|
})]
|
|
})
|
|
employee = self.employee_emp
|
|
employee.resource_calendar_id = calendar
|
|
|
|
with Form(self.env['hr.leave'].with_context(default_employee_id=employee.id)) as leave_form:
|
|
leave_form.holiday_status_id = self.leave_type
|
|
# does not work on tuesdays
|
|
leave_form.request_date_from = date(2019, 9, 3)
|
|
leave_form.request_date_to = date(2019, 9, 3)
|
|
leave_form.request_unit_half = True
|
|
leave_form.request_date_from_period = 'am'
|
|
|
|
|
|
self.assertEqual(leave_form.number_of_days_display, 0)
|
|
self.assertEqual(leave_form.number_of_hours_text, '0 Hours')
|
|
self.assertEqual(leave_form.date_from, datetime(2019, 9, 3, 6, 0, 0))
|
|
self.assertEqual(leave_form.date_to, datetime(2019, 9, 3, 10, 0, 0))
|
|
|
|
def test_2weeks_calendar(self):
|
|
self.env.user.tz = 'Europe/Brussels'
|
|
calendar = self.env['resource.calendar'].create({
|
|
'name': 'auto next day',
|
|
'two_weeks_calendar': True,
|
|
'attendance_ids': [(5, 0, 0),
|
|
(0, 0, {
|
|
'name': 'monday morning odd week',
|
|
'hour_from': 8,
|
|
'hour_to': 12,
|
|
'day_period': 'morning',
|
|
'dayofweek': '0',
|
|
'week_type': '0',
|
|
}),
|
|
(0, 0, {
|
|
'name': 'monday morning even week',
|
|
'hour_from': 10,
|
|
'hour_to': 12,
|
|
'day_period': 'morning',
|
|
'dayofweek': '0',
|
|
'week_type': '1',
|
|
})]
|
|
})
|
|
employee = self.employee_emp
|
|
employee.resource_calendar_id = calendar
|
|
|
|
with Form(self.env['hr.leave'].with_context(default_employee_id=employee.id)) as leave_form:
|
|
leave_form.holiday_status_id = self.leave_type
|
|
# even week, works 2 hours
|
|
leave_form.request_date_from = date(2019, 9, 2)
|
|
leave_form.request_date_to = date(2019, 9, 2)
|
|
leave_form.request_unit_half = True
|
|
leave_form.request_date_from_period = 'am'
|
|
|
|
self.assertEqual(leave_form.number_of_days_display, 0.5)
|
|
self.assertEqual(leave_form.number_of_hours_text, '2 Hours')
|
|
self.assertEqual(leave_form.date_from, datetime(2019, 9, 2, 8, 0, 0))
|
|
self.assertEqual(leave_form.date_to, datetime(2019, 9, 2, 10, 0, 0))
|
|
|
|
with Form(self.env['hr.leave'].with_context(default_employee_id=employee.id)) as leave_form:
|
|
leave_form.holiday_status_id = self.leave_type
|
|
# odd week, works 4 hours
|
|
leave_form.request_date_from = date(2019, 9, 9)
|
|
leave_form.request_date_to = date(2019, 9, 9)
|
|
leave_form.request_unit_half = True
|
|
leave_form.request_date_from_period = 'am'
|
|
|
|
self.assertEqual(leave_form.number_of_days_display, 0.5)
|
|
self.assertEqual(leave_form.number_of_hours_text, '4 Hours')
|
|
self.assertEqual(leave_form.date_from, datetime(2019, 9, 9, 6, 0, 0))
|
|
self.assertEqual(leave_form.date_to, datetime(2019, 9, 9, 10, 0, 0))
|
|
|
|
def test_2weeks_calendar_next_week(self):
|
|
self.env.user.tz = 'Europe/Brussels'
|
|
calendar = self.env['resource.calendar'].create({
|
|
'name': 'auto next day',
|
|
'two_weeks_calendar': True,
|
|
'attendance_ids': [(5, 0, 0),
|
|
(0, 0, {
|
|
'name': 'monday morning odd week',
|
|
'hour_from': 8,
|
|
'hour_to': 12,
|
|
'day_period': 'morning',
|
|
'dayofweek': '0',
|
|
'week_type': '0',
|
|
})]
|
|
})
|
|
employee = self.employee_emp
|
|
employee.resource_calendar_id = calendar
|
|
|
|
with Form(self.env['hr.leave'].with_context(default_employee_id=employee.id)) as leave_form:
|
|
leave_form.holiday_status_id = self.leave_type
|
|
# even week, does not work
|
|
leave_form.request_date_from = date(2019, 9, 2)
|
|
leave_form.request_date_to = date(2019, 9, 2)
|
|
leave_form.request_unit_half = True
|
|
leave_form.request_date_from_period = 'am'
|
|
|
|
self.assertEqual(leave_form.number_of_days_display, 0)
|
|
self.assertEqual(leave_form.number_of_hours_text, '0 Hours')
|
|
self.assertEqual(leave_form.date_from, datetime(2019, 9, 2, 6, 0, 0))
|
|
self.assertEqual(leave_form.date_to, datetime(2019, 9, 2, 10, 0, 0))
|