[IMP] hr_attendance: Adapt module with new hr.employee.public model

This commit is contained in:
RomainLibert
2019-05-31 10:21:20 +02:00
committed by Yannick Tivisse
parent d09d5c2e8a
commit 1594f82780
4 changed files with 37 additions and 45 deletions
+26 -25
View File
@@ -1,13 +1,14 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields, api, exceptions, _, SUPERUSER_ID
from datetime import datetime
from dateutil.relativedelta import relativedelta
from odoo import models, fields, api, exceptions, _, SUPERUSER_ID
class HrEmployee(models.Model):
_inherit = "hr.employee"
_description = "Employee"
class HrEmployeeBase(models.AbstractModel):
_inherit = "hr.employee.base"
attendance_ids = fields.One2many('hr.attendance', 'employee_id', help='list of attendances for the employee')
last_attendance_id = fields.Many2one('hr.attendance', compute='_compute_last_attendance_id', store=True)
@@ -44,35 +45,37 @@ class HrEmployee(models.Model):
""" Receive a barcode scanned from the Kiosk Mode and change the attendances of corresponding employee.
Returns either an action or a warning.
"""
employee = self.search([('barcode', '=', barcode)], limit=1)
return employee and employee.attendance_action('hr_attendance.hr_attendance_action_kiosk_mode') or \
{'warning': _('No employee corresponding to barcode %(barcode)s') % {'barcode': barcode}}
employee = self.sudo().search([('barcode', '=', barcode)], limit=1)
if employee:
return employee._attendance_action('hr_attendance.hr_attendance_action_kiosk_mode')
return {'warning': _('No employee corresponding to barcode %(barcode)s') % {'barcode': barcode}}
@api.multi
def attendance_manual(self, next_action, entered_pin=None):
self.ensure_one()
if not (entered_pin is None) or self.env['res.users'].browse(SUPERUSER_ID).has_group('hr_attendance.group_hr_attendance_use_pin') and (self.user_id and self.user_id.id != self._uid or not self.user_id):
if not (entered_pin is None) or self.env.user.has_group('hr_attendance.group_hr_attendance_use_pin') and (self.user_id and self.user_id == self.env.user):
if entered_pin != self.pin:
return {'warning': _('Wrong PIN')}
return self.attendance_action(next_action)
return self._attendance_action(next_action)
@api.multi
def attendance_action(self, next_action):
def _attendance_action(self, next_action):
""" Changes the attendance of the employee.
Returns an action to the check in/out message,
next_action defines which menu the check in/out message should return to. ("My Attendances" or "Kiosk Mode")
"""
self.ensure_one()
employee = self.sudo()
action_message = self.env.ref('hr_attendance.hr_attendance_action_greeting_message').read()[0]
action_message['previous_attendance_change_date'] = self.last_attendance_id and (self.last_attendance_id.check_out or self.last_attendance_id.check_in) or False
action_message['employee_name'] = self.name
action_message['barcode'] = self.barcode
action_message['previous_attendance_change_date'] = employee.last_attendance_id and (employee.last_attendance_id.check_out or employee.last_attendance_id.check_in) or False
action_message['employee_name'] = employee.name
action_message['barcode'] = employee.barcode
action_message['next_action'] = next_action
if self.user_id:
modified_attendance = self.sudo(self.user_id.id).attendance_action_change()
if employee.user_id:
modified_attendance = employee.sudo(employee.user_id.id).attendance_action_change()
else:
modified_attendance = self.sudo().attendance_action_change()
modified_attendance = employee.attendance_action_change()
action_message['attendance'] = modified_attendance.read()[0]
return {'action': action_message}
@@ -82,8 +85,7 @@ class HrEmployee(models.Model):
Check In: create a new attendance record
Check Out: modify check_out field of appropriate attendance record
"""
if len(self) > 1:
raise exceptions.UserError(_('Cannot perform check in or check out on multiple employees.'))
self.ensure_one()
action_date = fields.Datetime.now()
if self.attendance_state != 'checked_in':
@@ -92,11 +94,10 @@ class HrEmployee(models.Model):
'check_in': action_date,
}
return self.env['hr.attendance'].create(vals)
attendance = self.env['hr.attendance'].search([('employee_id', '=', self.id), ('check_out', '=', False)], limit=1)
if attendance:
attendance.check_out = action_date
else:
attendance = self.env['hr.attendance'].search([('employee_id', '=', self.id), ('check_out', '=', False)], limit=1)
if attendance:
attendance.check_out = action_date
else:
raise exceptions.UserError(_('Cannot perform check out on %(empl_name)s, could not find corresponding check in. '
'Your attendances have probably been modified manually by human resources.') % {'empl_name': self.name, })
return attendance
raise exceptions.UserError(_('Cannot perform check out on %(empl_name)s, could not find corresponding check in. '
'Your attendances have probably been modified manually by human resources.') % {'empl_name': self.sudo().name, })
return attendance
+2 -3
View File
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import models, fields, api, _
from odoo import models, fields
class User(models.Model):
@@ -19,7 +19,6 @@ class User(models.Model):
'hours_last_month',
'attendance_state',
]
init_res = super(User, self).__init__(pool, cr)
super(User, self).__init__(pool, cr)
# duplicate list to avoid modifying the original reference
type(self).SELF_READABLE_FIELDS = type(self).SELF_READABLE_FIELDS + attendance_readable_fields
return init_res
@@ -1,8 +1,9 @@
# -*- coding: utf-8 -*-
from odoo.tests.common import TransactionCase
import time
from odoo.tests.common import TransactionCase
class TestHrAttendance(TransactionCase):
"""Tests for attendance date ranges validity"""
@@ -12,6 +13,10 @@ class TestHrAttendance(TransactionCase):
self.attendance = self.env['hr.attendance']
self.test_employee = self.browse_ref('hr.employee_qdp')
# demo data contains set up for self.test_employee
self.open_attendance = self.attendance.create({
'employee_id': self.test_employee.id,
'check_in': time.strftime('%Y-%m-10 10:00'),
})
def test_attendance_in_before_out(self):
# Make sure check_out is before check_in
@@ -24,10 +29,6 @@ class TestHrAttendance(TransactionCase):
def test_attendance_no_check_out(self):
# Make sure no second attandance without check_out can be created
self.attendance.create({
'employee_id': self.test_employee.id,
'check_in': time.strftime('%Y-%m-10 10:00'),
})
with self.assertRaises(Exception):
self.attendance.create({
'employee_id': self.test_employee.id,
@@ -68,10 +69,6 @@ class TestHrAttendance(TransactionCase):
})
def test_attendance_5(self):
self.attendance.create({
'employee_id': self.test_employee.id,
'check_in': time.strftime('%Y-%m-10 10:00'),
})
with self.assertRaises(Exception):
self.attendance.create({
'employee_id': self.test_employee.id,
@@ -86,11 +83,7 @@ class TestHrAttendance(TransactionCase):
'check_in': time.strftime('%Y-%m-10 11:00'),
'check_out': time.strftime('%Y-%m-10 12:00'),
})
open_attendance = self.attendance.create({
'employee_id': self.test_employee.id,
'check_in': time.strftime('%Y-%m-10 10:00'),
})
with self.assertRaises(Exception):
open_attendance.write({
self.open_attendance.write({
'check_out': time.strftime('%Y-%m-10 11:30'),
})
@@ -2,9 +2,8 @@
# Part of Odoo. See LICENSE file for full copyright and licensing details.
import logging
from odoo import fields, models, _
from odoo.exceptions import UserError
from odoo.fields import Datetime
from odoo import models
_logger = logging.getLogger(__name__)