Up-port from 7 to 8 new stuff for hr_holidays_usability

This commit is contained in:
Alexis de Lattre
2015-06-23 20:01:17 +02:00
parent 1ff2416435
commit 053911edca
4 changed files with 97 additions and 50 deletions

View File

@@ -50,12 +50,16 @@ class HrHolidays(models.Model):
# For allocation (type = add), we don't change anything:
# The user writes in the field number_of_days_temp and
# number_of_days = number_of_days_temp
# For leave (type = remove), we don't let users enter the number of days,
# we compute it for them
# IN 7.0: For leave (type = remove), we don't let users enter the number
# of days, we compute it for them
# -> new computed field "number_of_days_remove' that compute the number
# of days depending on the computation method defined on 'type'
# Redefine the field 'number_of_days' to take into accout
# 'number_of_days_remove' when type == remove (= number_of_days_remove * -1)
# IN 8.0: for leaves, use the on_change on the dates to set the
# number_of_days_temp. But we want to have this field readonly, so we also
# inherit write + create (even in v8, readonly fields are not written in DB)
# change date time fields by date + selection morning/noon
# How do we set the dates :
@@ -74,11 +78,7 @@ class HrHolidays(models.Model):
# 1 for 'unpaid leaves' + repos compensateur + congés conventionnels + maladie
# 1 or 2 for normal holidays
@api.one
@api.depends(
'vacation_date_from', 'vacation_time_from', 'vacation_date_to',
'vacation_time_to', 'number_of_days_temp', 'type', 'holiday_type',
'holiday_status_id.vacation_compute_method')
@api.model
def _compute_number_of_days(self):
# depend on the holiday_status_id
hhpo = self.env['hr.holidays.public']
@@ -89,7 +89,8 @@ class HrHolidays(models.Model):
self.vacation_date_from and
self.vacation_time_from and
self.vacation_date_to and
self.vacation_time_to):
self.vacation_time_to and
self.vacation_date_from <= self.vacation_date_to):
if self.holiday_status_id.vacation_compute_method == 'business':
business = True
else:
@@ -145,19 +146,7 @@ class HrHolidays(models.Model):
days -= 0.5
break
date_dt += relativedelta(days=1)
# PASTE
if self.type == 'remove':
# read number_of_days_remove instead of number_of_days_temp
number_of_days = days * -1
number_of_days_remove = days
else:
# for allocations, we read the native field number_of_days_temp
number_of_days = self.number_of_days_temp
number_of_days_remove = 0
self.number_of_days = number_of_days
self.number_of_days_remove = number_of_days_remove
return days
@api.one
@api.depends('holiday_type', 'employee_id', 'holiday_status_id')
@@ -169,8 +158,7 @@ class HrHolidays(models.Model):
self.holiday_type == 'employee' and
self.employee_id and
self.holiday_status_id):
days = self.holiday_status_id.get_days(
self.employee_id.id, False)
days = self.holiday_status_id.get_days(self.employee_id.id)
total_allocated_leaves =\
days[self.holiday_status_id.id]['max_leaves']
current_leaves_taken =\
@@ -205,11 +193,6 @@ class HrHolidays(models.Model):
default='evening',
help="For example, if you leave one full calendar week, "
"the end of vacation is Friday Evening")
number_of_days_remove = fields.Float(
compute='_compute_number_of_days',
string="Number of Days of Vacation", readonly=True)
# number_of_days is a native field that I inherit
number_of_days = fields.Float(compute='_compute_number_of_days')
current_leaves_taken = fields.Float(
compute='_compute_current_leaves', string='Current Leaves Taken',
readonly=True)
@@ -223,6 +206,7 @@ class HrHolidays(models.Model):
related='holiday_status_id.limit', string='Allow to Override Limit')
posted_date = fields.Date(
string='Posted Date', track_visibility='onchange')
number_of_days_temp = fields.Float(string="Number of days")
@api.one
@api.constrains(
@@ -306,9 +290,46 @@ class HrHolidays(models.Model):
datetime_dt.astimezone(pytz.utc))
self.date_to = datetime_str
@api.onchange(
'vacation_date_from', 'vacation_time_from', 'vacation_date_to',
'vacation_time_to', 'number_of_days_temp', 'type', 'holiday_type',
'holiday_status_id')
def leave_number_of_days_change(self):
if self.type == 'remove':
days = self._compute_number_of_days()
self.number_of_days_temp = days
# Neutralize the native on_change on dates
def onchange_date_from(self, cr, uid, ids, date_to, date_from):
return {}
def onchange_date_to(self, cr, uid, ids, date_to, date_from):
return {}
# in v8, no more need to inherit check_holidays() as I did in v8
# because it doesn't use number_of_days_temp
# I want to set number_of_days_temp as readonly in the view of leaves
# and, even in v8, we can't write on a readonly field
# So I inherit write and create
@api.model
def create(self, vals):
obj = super(HrHolidays, self).create(vals)
if obj.type == 'remove':
days = obj._compute_number_of_days()
obj.number_of_days_temp = days
return obj
@api.multi
def write(self, vals):
res = super(HrHolidays, self).write(vals)
for obj in self:
if obj.type == 'remove':
days = obj._compute_number_of_days()
if days != obj.number_of_days_temp:
obj.number_of_days_temp = days
return res
class ResCompany(models.Model):
_inherit = 'res.company'

View File

@@ -27,10 +27,7 @@ hr_holidays.edit_holiday_new is used for both leaves and allocation -->
<attribute name="invisible">1</attribute>
</xpath>
<field name="number_of_days_temp" position="attributes">
<attribute name="attrs">{'invisible': [('type', '=', 'remove')]}</attribute>
</field>
<field name="number_of_days_temp" position="after">
<field name="number_of_days_remove" class="oe_inline" attrs="{'invisible': [('type', '=', 'add')]}"/>
<attribute name="attrs">{'readonly': [('type', '=', 'remove')]}</attribute>
</field>
<field name="holiday_status_id" position="after">
<field name="vacation_date_from" attrs="{'required': [('type', '=', 'remove')], 'invisible': [('type', '=', 'add')]}"/>
@@ -69,12 +66,6 @@ hr_holidays.edit_holiday_new is used for both leaves and allocation -->
<field name="model">hr.holidays</field>
<field name="inherit_id" ref="hr_holidays.view_holiday"/>
<field name="arch" type="xml">
<field name="number_of_days" position="attributes">
<attribute name="invisible">1</attribute>
</field>
<field name="number_of_days" position="after">
<field name="number_of_days_remove" sum="Total Days of Vacation"/>
</field>
<field name="date_from" position="attributes">
<attribute name="invisible">1</attribute>
</field>
@@ -98,6 +89,29 @@ hr_holidays.edit_holiday_new is used for both leaves and allocation -->
</field>
</record>
<record id="view_hr_holidays_filter" model="ir.ui.view">
<field name="name">hr_holidays_usability.leave_request_tree</field>
<field name="model">hr.holidays</field>
<field name="inherit_id" ref="hr_holidays.view_hr_holidays_filter"/>
<field name="arch" type="xml">
<filter name="validated" position="after">
<filter name="posted" string="Posted" domain="[('posted_date', '!=', False)]"/>
</filter>
</field>
</record>
<record id="hr_holiday_graph" model="ir.ui.view">
<field name="name">hr_holidays_usability.hr_holiday_graph</field>
<field name="model">hr.holidays</field>
<field name="arch" type="xml">
<graph string="Leave Requests" type="pivot">
<field name="employee_id" type="row"/>
<field name="holiday_status_id" type="col"/>
<field name="number_of_days_temp" type="measure"/>
</graph>
</field>
</record>
<record id="edit_holiday_status_form" model="ir.ui.view">
<field name="name">hr_holidays_usability.hr.holidays.status.form</field>
<field name="model">hr.holidays.status</field>
@@ -122,7 +136,14 @@ hr_holidays.edit_holiday_new is used for both leaves and allocation -->
<!-- On the leave requests, put tree view by default instead of calendar -->
<record id="hr_holidays.action_open_ask_holidays_calendar" model="ir.actions.act_window.view">
<field name="sequence" eval="4"/>
</record>
<record id="action_open_ask_holidays_graph" model="ir.actions.act_window.view">
<field name="sequence" eval="5"/>
<field name="view_mode">graph</field>
<field name="view_id" ref="hr_holiday_graph"/>
<field name="act_window_id" ref="hr_holidays.open_ask_holidays"/>
</record>
<record id="resource_calendar_leaves_cal_first_action" model="ir.actions.act_window">

View File

@@ -28,11 +28,13 @@ class HrHolidaysMassAllocation(models.TransientModel):
_name = 'hr.holidays.mass.allocation'
_description = 'Wizard for mass allocation of holidays'
@api.model
def _get_all_employees(self):
return self.pool['hr.employee'].search([])
return self.env['hr.employee'].search([])
@api.model
def _get_default_holiday_status(self):
res = self._user.company_id.\
res = self.env.user.company_id.\
mass_allocation_default_holiday_status_id or False
return res

View File

@@ -50,7 +50,7 @@ class HrHolidaysPost(models.TransientModel):
@api.multi
def select_date(self):
self.ensure_one()
hols = self.pool['hr.holidays'].search([
hols = self.env['hr.holidays'].search([
('type', '=', 'remove'),
('holiday_type', '=', 'employee'),
('state', '=', 'validate'),
@@ -69,18 +69,21 @@ class HrHolidaysPost(models.TransientModel):
@api.multi
def run(self):
self.ensure_one()
# I have to make a copy of self.holidays_to_post_ids in a variable
# because, after the write, it doesn't have a value any more !!!
holidays_to_post = self.holidays_to_post_ids
today = fields.Date.context_today(self)
if not self.holidays_to_post_ids:
raise Warning(
_('No leave request to post.'))
self.holidays_to_post_ids.write({'posted_date': today})
# On v8, return a graph view !
action = self.env['ir.actions.act_window'].for_xml_id(
'hr_holidays', 'open_ask_holidays')
action.update({
'target': 'current',
'domain': [('id', 'in', self.holidays_to_post_ids.ids)],
'nodestroy': True,
'context': {'group_by': ['employee_id', 'holiday_status_id']},
})
view_id = self.env.ref('hr_holidays_usability.hr_holiday_graph').id
action = {
'name': _('Leave Requests'),
'res_model': 'hr.holidays',
'type': 'ir.actions.act_window',
'domain': [('id', 'in', holidays_to_post.ids)],
'view_mode': 'graph',
'view_id': view_id,
}
return action