summaryrefslogtreecommitdiff
path: root/addons/hr_holidays
diff options
context:
space:
mode:
authorRaphael Collet <rco@openerp.com>2014-07-06 16:44:26 +0200
committerAntony Lesuisse <al@openerp.com>2014-07-06 17:05:41 +0200
commitcbe2dbb672a6c55d86f2e515f9d1cdfee426ef80 (patch)
treed6ff62b719fce32392397783c961b734b1e4c50e /addons/hr_holidays
parentd78192c489d3be66cd6487b39f5ce7ba4733a187 (diff)
[MERGE] new v8 api by rco
A squashed merge is required as the conversion of the apiculture branch from bzr to git was not correctly done. The git history contains irrelevant blobs and commits. This branch brings a lot of changes and fixes, too many to list exhaustively. - New orm api, objects are now used instead of ids - Environements to encapsulates cr uid context while maintaining backward compatibility - Field compute attribute is a new object oriented way to define function fields - Shared browse record cache - New onchange protocol - Optional copy flag on fields - Documentation update - Dead code cleanup - Lots of fixes
Diffstat (limited to 'addons/hr_holidays')
-rw-r--r--addons/hr_holidays/hr_holidays.py55
-rw-r--r--addons/hr_holidays/report/holidays_summary_report.py20
-rw-r--r--addons/hr_holidays/test/test_hr_holiday.yml2
-rw-r--r--addons/hr_holidays/tests/test_holidays_flow.py25
-rw-r--r--addons/hr_holidays/wizard/hr_holidays_summary_department.py2
-rw-r--r--addons/hr_holidays/wizard/hr_holidays_summary_employees.py2
6 files changed, 49 insertions, 57 deletions
diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py
index d38cb705339..21cbe50dee2 100644
--- a/addons/hr_holidays/hr_holidays.py
+++ b/addons/hr_holidays/hr_holidays.py
@@ -148,12 +148,17 @@ class hr_holidays(osv.osv):
result[holiday.id] = True
return result
- def _check_date(self, cr, uid, ids):
- for holiday in self.browse(cr, uid, ids):
- holiday_ids = self.search(cr, uid, [('date_from', '<=', holiday.date_to), ('date_to', '>=', holiday.date_from),
- ('employee_id', '=', holiday.employee_id.id), ('id', '<>', holiday.id),
- ('state', 'not in', ['cancel', 'refuse'])])
- if holiday_ids:
+ def _check_date(self, cr, uid, ids, context=None):
+ for holiday in self.browse(cr, uid, ids, context=context):
+ domain = [
+ ('date_from', '<=', holiday.date_to),
+ ('date_to', '>=', holiday.date_from),
+ ('employee_id', '=', holiday.employee_id.id),
+ ('id', '!=', holiday.id),
+ ('state', 'not in', ['cancel', 'refuse']),
+ ]
+ nholidays = self.search_count(cr, uid, domain, context=context)
+ if nholidays:
return False
return True
@@ -162,19 +167,20 @@ class hr_holidays(osv.osv):
_columns = {
'name': fields.char('Description', size=64),
'state': fields.selection([('draft', 'To Submit'), ('cancel', 'Cancelled'),('confirm', 'To Approve'), ('refuse', 'Refused'), ('validate1', 'Second Approval'), ('validate', 'Approved')],
- 'Status', readonly=True, track_visibility='onchange',
+ 'Status', readonly=True, track_visibility='onchange', copy=False,
help='The status is set to \'To Submit\', when a holiday request is created.\
\nThe status is \'To Approve\', when holiday request is confirmed by user.\
\nThe status is \'Refused\', when holiday request is refused by manager.\
\nThe status is \'Approved\', when holiday request is approved by manager.'),
'user_id':fields.related('employee_id', 'user_id', type='many2one', relation='res.users', string='User', store=True),
- 'date_from': fields.datetime('Start Date', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}, select=True),
- 'date_to': fields.datetime('End Date', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}),
+ 'date_from': fields.datetime('Start Date', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}, select=True, copy=False),
+ 'date_to': fields.datetime('End Date', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}, copy=False),
'holiday_status_id': fields.many2one("hr.holidays.status", "Leave Type", required=True,readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}),
'employee_id': fields.many2one('hr.employee', "Employee", select=True, invisible=False, readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}),
- 'manager_id': fields.many2one('hr.employee', 'First Approval', invisible=False, readonly=True, help='This area is automatically filled by the user who validate the leave'),
+ 'manager_id': fields.many2one('hr.employee', 'First Approval', invisible=False, readonly=True, copy=False,
+ help='This area is automatically filled by the user who validate the leave'),
'notes': fields.text('Reasons',readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}),
- 'number_of_days_temp': fields.float('Allocation', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}),
+ 'number_of_days_temp': fields.float('Allocation', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}, copy=False),
'number_of_days': fields.function(_compute_number_of_days, string='Number of Days', store=True),
'meeting_id': fields.many2one('calendar.event', 'Meeting'),
'type': fields.selection([('remove','Leave Request'),('add','Allocation Request')], 'Request Type', required=True, readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}, help="Choose 'Leave Request' if someone wants to take an off-day. \nChoose 'Allocation Request' if you want to increase the number of leaves available for someone", select=True),
@@ -183,7 +189,8 @@ class hr_holidays(osv.osv):
'department_id':fields.related('employee_id', 'department_id', string='Department', type='many2one', relation='hr.department', readonly=True, store=True),
'category_id': fields.many2one('hr.employee.category', "Employee Tag", help='Category of Employee', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}),
'holiday_type': fields.selection([('employee','By Employee'),('category','By Employee Tag')], 'Allocation Mode', readonly=True, states={'draft':[('readonly',False)], 'confirm':[('readonly',False)]}, help='By Employee: Allocation/Request for individual Employee, By Employee Tag: Allocation/Request for group of employees in category', required=True),
- 'manager_id2': fields.many2one('hr.employee', 'Second Approval', readonly=True, help='This area is automaticly filled by the user who validate the leave with second level (If Leave type need second validation)'),
+ 'manager_id2': fields.many2one('hr.employee', 'Second Approval', readonly=True, copy=False,
+ help='This area is automaticly filled by the user who validate the leave with second level (If Leave type need second validation)'),
'double_validation': fields.related('holiday_status_id', 'double_validation', type='boolean', relation='hr.holidays.status', string='Apply Double Validation'),
'can_reset': fields.function(
_get_can_reset,
@@ -207,16 +214,6 @@ class hr_holidays(osv.osv):
('date_check2', "CHECK ( (type='add') OR (date_from <= date_to))", "The start date must be anterior to the end date."),
('date_check', "CHECK ( number_of_days_temp >= 0 )", "The number of days must be greater than 0."),
]
-
- def copy(self, cr, uid, id, default=None, context=None):
- if default is None:
- default = {}
- if context is None:
- context = {}
- default = default.copy()
- default['date_from'] = False
- default['date_to'] = False
- return super(hr_holidays, self).copy(cr, uid, id, default, context=context)
def _create_resource_leave(self, cr, uid, leaves, context=None):
'''This method will create entry in resource calendar leave object at the time of holidays validated '''
@@ -404,9 +401,8 @@ class hr_holidays(osv.osv):
leave_ids.append(self.create(cr, uid, vals, context=None))
for leave_id in leave_ids:
# TODO is it necessary to interleave the calls?
- self.signal_confirm(cr, uid, [leave_id])
- self.signal_validate(cr, uid, [leave_id])
- self.signal_second_validate(cr, uid, [leave_id])
+ for sig in ('confirm', 'validate', 'second_validate'):
+ self.signal_workflow(cr, uid, [leave_id], sig)
return True
def holidays_confirm(self, cr, uid, ids, context=None):
@@ -432,10 +428,10 @@ class hr_holidays(osv.osv):
for record in self.browse(cr, uid, ids):
# Delete the meeting
if record.meeting_id:
- meeting_obj.unlink(cr, uid, [record.meeting_id.id])
+ record.meeting_id.unlink()
# If a category that created several holidays, cancel all related
- self.signal_refuse(cr, uid, map(attrgetter('id'), record.linked_request_ids or []))
+ self.signal_workflow(cr, uid, map(attrgetter('id'), record.linked_request_ids or []), 'refuse')
self._remove_resource_leave(cr, uid, ids, context=context)
return True
@@ -507,9 +503,8 @@ class hr_employee(osv.osv):
leave_id = holiday_obj.create(cr, uid, {'name': _('Leave Request for %s') % employee.name, 'employee_id': employee.id, 'holiday_status_id': status_id, 'type': 'remove', 'holiday_type': 'employee', 'number_of_days_temp': abs(diff)}, context=context)
else:
return False
- holiday_obj.signal_confirm(cr, uid, [leave_id])
- holiday_obj.signal_validate(cr, uid, [leave_id])
- holiday_obj.signal_second_validate(cr, uid, [leave_id])
+ for sig in ('confirm', 'validate', 'second_validate'):
+ holiday_obj.signal_workflow(cr, uid, [leave_id], sig)
return True
def _get_remaining_days(self, cr, uid, ids, name, args, context=None):
diff --git a/addons/hr_holidays/report/holidays_summary_report.py b/addons/hr_holidays/report/holidays_summary_report.py
index adf09a63c85..a5889360774 100644
--- a/addons/hr_holidays/report/holidays_summary_report.py
+++ b/addons/hr_holidays/report/holidays_summary_report.py
@@ -50,8 +50,8 @@ def emp_create_xml(self, cr, uid, dept, holiday_type, row_id, empid, name, som,
if dept==0:
count=0
registry = openerp.registry(cr.dbname)
- p_id = registry['hr.holidays'].search(cr, uid, [('employee_id','in',[empid,False]), ('type', '=', 'remove')])
- ids_date = registry['hr.holidays'].read(cr, uid, p_id, ['date_from','date_to','holiday_status_id','state'])
+ holidays_ids = registry['hr.holidays'].search(cr, uid, [('employee_id','in',[empid,False]), ('type', '=', 'remove')])
+ ids_date = registry['hr.holidays'].read(cr, uid, holidays_ids, ['date_from','date_to','holiday_status_id','state'])
for index in range(1,61):
diff=index-1
@@ -213,18 +213,14 @@ class report_custom(report_rml):
emp_xml=''
row_id=1
- if data['model']=='hr.employee':
- for id in data['form']['emp']:
- items = obj_emp.read(cr, uid, id, ['id','name'])
-
- emp_xml += emp_create_xml(self, cr, uid, 0, holiday_type, row_id, items['id'], items['name'], som, eom)
- row_id = row_id +1
+ if data['model'] == 'hr.employee':
+ for items in obj_emp.read(cr, uid, data['form']['emp'], ['id', 'name']):
+ emp_xml += emp_create_xml(self, cr, uid, 0, holiday_type, row_id, items['id'], items['name'], som, eom)
+ row_id = row_id +1
elif data['model']=='ir.ui.menu':
- for id in data['form']['depts']:
- dept = obj_dept.browse(cr, uid, id, context=context)
- cr.execute("""SELECT id FROM hr_employee \
- WHERE department_id = %s""", (id,))
+ for dept in obj_dept.browse(cr, uid, data['form']['depts'], context=context):
+ cr.execute("SELECT id FROM hr_employee WHERE department_id = %s", (dept.id,))
emp_ids = [x[0] for x in cr.fetchall()]
if emp_ids==[]:
continue
diff --git a/addons/hr_holidays/test/test_hr_holiday.yml b/addons/hr_holidays/test/test_hr_holiday.yml
index 7bedd3302e8..1c00692c1f7 100644
--- a/addons/hr_holidays/test/test_hr_holiday.yml
+++ b/addons/hr_holidays/test/test_hr_holiday.yml
@@ -19,7 +19,7 @@
-
!python {model: hr.holidays}: |
self.holidays_reset(cr, uid, [ref('hr_holidays_employee1_cl')])
- self.signal_confirm(cr, uid, [ref('hr_holidays_employee1_cl')])
+ self.signal_workflow(cr, uid, [ref('hr_holidays_employee1_cl')], 'confirm')
-
I validate the holiday request by clicking on "To Approve" button.
-
diff --git a/addons/hr_holidays/tests/test_holidays_flow.py b/addons/hr_holidays/tests/test_holidays_flow.py
index ce7da7647d0..96ab20f6ae5 100644
--- a/addons/hr_holidays/tests/test_holidays_flow.py
+++ b/addons/hr_holidays/tests/test_holidays_flow.py
@@ -27,10 +27,9 @@ from openerp.exceptions import AccessError
from openerp.osv.orm import except_orm
from openerp.tools import mute_logger
-
class TestHolidaysFlow(TestHrHolidaysBase):
- @mute_logger('openerp.addons.base.ir.ir_model', 'openerp.osv.orm')
+ @mute_logger('openerp.addons.base.ir.ir_model', 'openerp.models')
def test_00_leave_request_flow(self):
""" Testing leave request flow """
cr, uid = self.cr, self.uid
@@ -82,6 +81,8 @@ class TestHolidaysFlow(TestHrHolidaysBase):
'date_to': datetime.today(),
'number_of_days_temp': 1,
})
+ ids = self.hr_holidays.search(cr, uid, [('name', '=', 'Hol10')])
+ self.hr_holidays.unlink(cr, uid, ids)
# Employee creates a leave request in a no-limit category
hol1_id = self.hr_holidays.create(cr, self.user_employee_id, {
@@ -96,12 +97,12 @@ class TestHolidaysFlow(TestHrHolidaysBase):
self.assertEqual(hol1.state, 'confirm', 'hr_holidays: newly created leave request should be in confirm state')
# Employee validates its leave request -> should not work
- self.hr_holidays.signal_validate(cr, self.user_employee_id, [hol1_id])
+ self.hr_holidays.signal_workflow(cr, self.user_employee_id, [hol1_id], 'validate')
hol1.refresh()
self.assertEqual(hol1.state, 'confirm', 'hr_holidays: employee should not be able to validate its own leave request')
# HrUser validates the employee leave request
- self.hr_holidays.signal_validate(cr, self.user_hrmanager_id, [hol1_id])
+ self.hr_holidays.signal_workflow(cr, self.user_hrmanager_id, [hol1_id], 'validate')
hol1.refresh()
self.assertEqual(hol1.state, 'validate', 'hr_holidays: validates leave request should be in validate state')
@@ -143,8 +144,8 @@ class TestHolidaysFlow(TestHrHolidaysBase):
'number_of_days_temp': 2,
})
# HrUser validates the allocation request
- self.hr_holidays.signal_validate(cr, self.user_hruser_id, [aloc1_id])
- self.hr_holidays.signal_second_validate(cr, self.user_hruser_id, [aloc1_id])
+ self.hr_holidays.signal_workflow(cr, self.user_hruser_id, [aloc1_id], 'validate')
+ self.hr_holidays.signal_workflow(cr, self.user_hruser_id, [aloc1_id], 'second_validate')
# Checks Employee has effectively some days left
hol_status_2 = self.hr_holidays_status.browse(cr, self.user_employee_id, self.holidays_status_2)
_check_holidays_status(hol_status_2, 2.0, 0.0, 2.0, 2.0)
@@ -164,13 +165,13 @@ class TestHolidaysFlow(TestHrHolidaysBase):
_check_holidays_status(hol_status_2, 2.0, 0.0, 2.0, 1.0)
# HrUser validates the first step
- self.hr_holidays.signal_validate(cr, self.user_hruser_id, [hol2_id])
+ self.hr_holidays.signal_workflow(cr, self.user_hruser_id, [hol2_id], 'validate')
hol2.refresh()
self.assertEqual(hol2.state, 'validate1',
'hr_holidays: first validation should lead to validate1 state')
# HrUser validates the second step
- self.hr_holidays.signal_second_validate(cr, self.user_hruser_id, [hol2_id])
+ self.hr_holidays.signal_workflow(cr, self.user_hruser_id, [hol2_id], 'second_validate')
hol2.refresh()
self.assertEqual(hol2.state, 'validate',
'hr_holidays: second validation should lead to validate state')
@@ -179,7 +180,7 @@ class TestHolidaysFlow(TestHrHolidaysBase):
_check_holidays_status(hol_status_2, 2.0, 1.0, 1.0, 1.0)
# HrManager finds an error: he refuses the leave request
- self.hr_holidays.signal_refuse(cr, self.user_hrmanager_id, [hol2_id])
+ self.hr_holidays.signal_workflow(cr, self.user_hrmanager_id, [hol2_id], 'refuse')
hol2.refresh()
self.assertEqual(hol2.state, 'refuse',
'hr_holidays: refuse should lead to refuse state')
@@ -188,12 +189,12 @@ class TestHolidaysFlow(TestHrHolidaysBase):
_check_holidays_status(hol_status_2, 2.0, 0.0, 2.0, 2.0)
# Annoyed, HrUser tries to fix its error and tries to reset the leave request -> does not work, only HrManager
- self.hr_holidays.signal_reset(cr, self.user_hruser_id, [hol2_id])
+ self.hr_holidays.signal_workflow(cr, self.user_hruser_id, [hol2_id], 'reset')
self.assertEqual(hol2.state, 'refuse',
'hr_holidays: hr_user should not be able to reset a refused leave request')
# HrManager resets the request
- self.hr_holidays.signal_reset(cr, self.user_hrmanager_id, [hol2_id])
+ self.hr_holidays.signal_workflow(cr, self.user_hrmanager_id, [hol2_id], 'reset')
hol2.refresh()
self.assertEqual(hol2.state, 'draft',
'hr_holidays: resetting should lead to draft state')
@@ -205,4 +206,4 @@ class TestHolidaysFlow(TestHrHolidaysBase):
'number_of_days_temp': 4,
})
with self.assertRaises(except_orm):
- self.hr_holidays.signal_confirm(cr, self.user_hrmanager_id, [hol2_id])
+ self.hr_holidays.signal_workflow(cr, self.user_hrmanager_id, [hol2_id], 'confirm')
diff --git a/addons/hr_holidays/wizard/hr_holidays_summary_department.py b/addons/hr_holidays/wizard/hr_holidays_summary_department.py
index 8a204389572..ff7bacc3e13 100644
--- a/addons/hr_holidays/wizard/hr_holidays_summary_department.py
+++ b/addons/hr_holidays/wizard/hr_holidays_summary_department.py
@@ -39,7 +39,7 @@ class hr_holidays_summary_dept(osv.osv_memory):
}
def print_report(self, cr, uid, ids, context=None):
- data = self.read(cr, uid, ids, [], context=context)[0]
+ data = self.read(cr, uid, ids, context=context)[0]
if not data['depts']:
raise osv.except_osv(_('Error!'), _('You have to select at least one Department. And try again.'))
datas = {
diff --git a/addons/hr_holidays/wizard/hr_holidays_summary_employees.py b/addons/hr_holidays/wizard/hr_holidays_summary_employees.py
index 1ec08eb2c86..324a7f94240 100644
--- a/addons/hr_holidays/wizard/hr_holidays_summary_employees.py
+++ b/addons/hr_holidays/wizard/hr_holidays_summary_employees.py
@@ -37,7 +37,7 @@ class hr_holidays_summary_employee(osv.osv_memory):
}
def print_report(self, cr, uid, ids, context=None):
- data = self.read(cr, uid, ids, [], context=context)[0]
+ data = self.read(cr, uid, ids, context=context)[0]
data['emp'] = context['active_ids']
datas = {
'ids': [],