summaryrefslogtreecommitdiff
path: root/addons/purchase/models/purchase.py
diff options
context:
space:
mode:
Diffstat (limited to 'addons/purchase/models/purchase.py')
-rw-r--r--addons/purchase/models/purchase.py61
1 files changed, 38 insertions, 23 deletions
diff --git a/addons/purchase/models/purchase.py b/addons/purchase/models/purchase.py
index d2a43bea5bd..dc233ce9498 100644
--- a/addons/purchase/models/purchase.py
+++ b/addons/purchase/models/purchase.py
@@ -711,30 +711,39 @@ class PurchaseOrder(models.Model):
order.message_post(body="The order receipt has been acknowledged by %s." % order.partner_id.name)
def _update_date_planned_for_lines(self, updated_dates):
- if updated_dates:
- note = self._compose_note(updated_dates)
- self.activity_schedule(
- 'mail.mail_activity_data_warning',
- summary="Date Updated",
- note=note,
- user_id=self.user_id.id
- )
+ # create or update the activity
+ activity = self.env['mail.activity'].search([
+ ('summary', '=', _('Date Updated')),
+ ('res_model_id', '=', 'purchase.order'),
+ ('res_id', '=', self.id),
+ ('user_id', '=', self.user_id.id)], limit=1)
+ if activity:
+ self._update_update_date_activity(updated_dates, activity)
+ else:
+ self._create_update_date_activity(updated_dates)
- for line, date in updated_dates:
- line._update_date_planned(date)
+ # update the date on PO line
+ for line, date in updated_dates:
+ line._update_date_planned(date)
- def _compose_note(self, updated_dates):
- """Helper method for creating log note when user update scheduled date
- on portal website."""
- note = _('<p> %s modified receipt dates for the following products:</p>', self.partner_id.name)
+ def _create_update_date_activity(self, updated_dates):
+ note = _('<p> %s modified receipt dates for the following products:</p>') % self.partner_id.name
for line, date in updated_dates:
- note += _(
- '<p> &nbsp; - %(product_name)s from %(date_start)s to %(date_end)s </p>',
- product_name=line.product_id.display_name,
- date_start=line.date_planned,
- date_end=date
- )
- return note
+ note += _('<p> &nbsp; - %s from %s to %s </p>') % (line.product_id.display_name, line.date_planned.date(), date.date())
+ activity = self.activity_schedule(
+ 'mail.mail_activity_data_warning',
+ summary=_("Date Updated"),
+ user_id=self.user_id.id
+ )
+ # add the note after we post the activity because the note can be soon
+ # changed when updating the date of the next PO line. So instead of
+ # sending a mail with incomplete note, we send one with no note.
+ activity.note = note
+ return activity
+
+ def _update_update_date_activity(self, updated_dates, activity):
+ for line, date in updated_dates:
+ activity.note += _('<p> &nbsp; - %s from %s to %s </p>') % (line.product_id.display_name, line.date_planned.date(), date.date())
class PurchaseOrderLine(models.Model):
@@ -936,7 +945,7 @@ class PurchaseOrderLine(models.Model):
date_planned = date_order + relativedelta(days=seller.delay if seller else 0)
else:
date_planned = datetime.today() + relativedelta(days=seller.delay if seller else 0)
- return timezone(self.order_id.user_id.tz or 'UTC').localize(datetime.combine(date_planned.date(), time.max)).astimezone(UTC).replace(tzinfo=None, microsecond=0, second=0)
+ return self._convert_to_last_minute_of_day(date_planned)
@api.depends('product_id', 'date_order')
def _compute_analytic_id_and_tag_ids(self):
@@ -957,7 +966,7 @@ class PurchaseOrderLine(models.Model):
return
# Reset date, price and quantity since _onchange_quantity will provide default values
- self.date_planned = self.order_id.date_planned or timezone(self.order_id.user_id.tz or 'UTC').localize(datetime.combine(datetime.today(), time.max)).astimezone(UTC).replace(tzinfo=None, microsecond=0, second=0)
+ self.date_planned = self.order_id.date_planned or self._convert_to_last_minute_of_day(datetime.today())
self.price_unit = self.product_qty = 0.0
self._product_id_change()
@@ -1147,5 +1156,11 @@ class PurchaseOrderLine(models.Model):
'order_id': po.id,
}
+ def _convert_to_last_minute_of_day(self, date):
+ """Return a datetime which is the last minute of the input date(time)
+ according to order user's time zone, convert to UTC time.
+ """
+ return timezone(self.order_id.user_id.tz or 'UTC').localize(datetime.combine(date, time.max)).astimezone(UTC).replace(tzinfo=None, microsecond=0, second=0)
+
def _update_date_planned(self, updated_date):
self.date_planned = updated_date