Skip to content

Commit

Permalink
You can now write directly in the "number_of_days" field
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexis de Lattre committed Jun 2, 2015
1 parent f7ab04a commit d8c938f
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 32 deletions.
86 changes: 55 additions & 31 deletions sale_start_end_dates/sale.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

from openerp import models, fields, api, _
from openerp.exceptions import ValidationError
from dateutil.relativedelta import relativedelta


class SaleOrder(models.Model):
Expand Down Expand Up @@ -78,15 +79,13 @@ def _compute_number_of_days(self):
end_date = fields.Date(
string='End Date', readonly=True,
states={'draft': [('readonly', False)]})
number_of_days = fields.Integer(
compute='_compute_number_of_days', string='Number of Days',
readonly=True)
number_of_days = fields.Integer(string='Number of Days')
must_have_dates = fields.Boolean(
string='Must Have Start and End Dates', readonly=True,
states={'draft': [('readonly', False)]})

@api.one
@api.constrains('start_date', 'end_date')
@api.constrains('start_date', 'end_date', 'number_of_days')
def _check_start_end_dates(self):
if self.product_id and self.must_have_dates:
if not self.end_date:
Expand All @@ -99,13 +98,32 @@ def _check_start_end_dates(self):
_("Missing Start Date for sale order line with "
"Product '%s'.")
% (self.product_id.name))
if not self.number_of_days:
raise ValidationError(
_("Missing number of days for sale order line with "
"Product '%s'.")
% (self.product_id.name))
if self.start_date > self.end_date:
raise ValidationError(
_("Start Date should be before or be the same as "
"End Date for sale order line with Product '%s'.")
% (self.product_id.name))

# TODO check must_have_dates on SO validation ? or in constraint ?
if self.number_of_days < 0:
raise ValidationError(
_("On sale order line with Product '%s', the "
"number of days is negative ; this is not allowed.")
% (self.product_id.name))
days_delta = (
fields.Date.from_string(self.end_date) -
fields.Date.from_string(self.start_date)).days + 1
if self.number_of_days != days_delta:
raise ValidationError(
_("On the sale order line with Product '%s', "
"there are %d days between the Start Date (%s) and "
"the End Date (%s), but the number of days field "
"has a value of %d days.")
% (self.product_id.name, days_delta, self.start_date,
self.end_date, self.number_of_days))

@api.model
def _prepare_order_line_invoice_line(self, line, account_id=False):
Expand All @@ -118,36 +136,42 @@ def _prepare_order_line_invoice_line(self, line, account_id=False):
})
return res

# Disable this method, because I can't put both an on_change in the
# XML and an @api.onchange on the same fields :-(
# And I prefer to use @api.onchange on higher-level modules
# @api.multi
# def start_end_dates_change(self, start_date, end_date):
# res = {}
# if start_date and end_date:
# if end_date < start_date:
# # We could have put a raise here
# # but a warning is fine because we have the constraint
# res['warning'] = {
# 'title': _('Warning:'),
# 'message': _("Start Date should be before or be the "
# "same as End Date."),
# }
# return res

@api.onchange('end_date')
def end_date_change(self):
if (
self.start_date and self.end_date and
self.start_date > self.end_date):
self.start_date = self.end_date
if self.end_date:
if self.start_date and self.start_date > self.end_date:
self.start_date = self.end_date
if self.start_date:
number_of_days = (
fields.Date.from_string(self.end_date) -
fields.Date.from_string(self.start_date)).days + 1
if self.number_of_days != number_of_days:
self.number_of_days = number_of_days

@api.onchange('start_date')
def start_date_change(self):
if (
self.start_date and self.end_date and
self.start_date > self.end_date):
self.end_date = self.start_date
if self.start_date:
if self.end_date and self.start_date > self.end_date:
self.end_date = self.start_date
if self.end_date:
number_of_days = (
fields.Date.from_string(self.end_date) -
fields.Date.from_string(self.start_date)).days + 1
if self.number_of_days != number_of_days:
self.number_of_days = number_of_days

@api.onchange('number_of_days')
def number_of_days_change(self):
if self.number_of_days:
if self.start_date:
end_date_dt = fields.Date.from_string(self.start_date) +\
relativedelta(days=self.number_of_days - 1)
end_date = fields.Date.to_string(end_date_dt)
if self.end_date != end_date:
self.end_date = end_date
elif self.end_date:
self.start_date = fields.Date.from_string(self.end_date) -\
relativedelta(days=self.number_of_days - 1)

@api.multi
def product_id_change(
Expand Down
2 changes: 1 addition & 1 deletion sale_start_end_dates/sale_view.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<field name="end_date"
attrs="{'invisible': [('must_have_dates', '=', False)], 'required': [('must_have_dates', '=', True)]}"/>
<field name="number_of_days"
attrs="{'invisible': [('must_have_dates', '=', False)]}"/>
attrs="{'invisible': [('must_have_dates', '=', False)], 'required': [('must_have_dates', '=', True)]}"/>
<field name="must_have_dates" invisible="1"/>
</xpath>
<xpath expr="//field[@name='order_line']/tree/field[@name='name']" position="after">
Expand Down

0 comments on commit d8c938f

Please sign in to comment.