diff --git a/addons/account/models/company.py b/addons/account/models/company.py
index 7feb13d6af4..0b96bb0b362 100644
--- a/addons/account/models/company.py
+++ b/addons/account/models/company.py
@@ -134,7 +134,11 @@ Best Regards,'''))
last_month = self.fiscalyear_last_month
last_day = self.fiscalyear_last_day
if (date.month < last_month or (date.month == last_month and date.day <= last_day)):
- date = date.replace(month=last_month, day=last_day)
+ # FORWARD-PORT UP TO v11
+ if last_month == 2 and last_day == 29 and date.year % 4 != 0:
+ date = date.replace(month=last_month, day=28)
+ else:
+ date = date.replace(month=last_month, day=last_day)
else:
if last_month == 2 and last_day == 29 and (date.year + 1) % 4 != 0:
date = date.replace(month=last_month, day=28, year=date.year + 1)
diff --git a/addons/hr_holidays/views/hr_holidays_views.xml b/addons/hr_holidays/views/hr_holidays_views.xml
index 38e78fdb698..78b43a52f78 100644
--- a/addons/hr_holidays/views/hr_holidays_views.xml
+++ b/addons/hr_holidays/views/hr_holidays_views.xml
@@ -272,7 +272,7 @@
hr.holidays.tree
hr.holidays
-
diff --git a/addons/purchase/models/purchase.py b/addons/purchase/models/purchase.py
index 4e86471a892..53eeaffa2e3 100644
--- a/addons/purchase/models/purchase.py
+++ b/addons/purchase/models/purchase.py
@@ -307,6 +307,7 @@ class PurchaseOrder(models.Model):
'default_template_id': template_id,
'default_composition_mode': 'comment',
'custom_layout': "purchase.mail_template_data_notification_email_purchase_order",
+ 'purchase_mark_rfq_sent': True,
'force_email': True
})
return {
@@ -1122,7 +1123,7 @@ class MailComposeMessage(models.TransientModel):
@api.multi
def mail_purchase_order_on_send(self):
- if not self.filtered('subtype_id.internal'):
+ if self._context.get('purchase_mark_rfq_sent'):
order = self.env['purchase.order'].browse(self._context['default_res_id'])
if order.state == 'draft':
order.state = 'sent'
diff --git a/doc/cla/corporate/brainbeanapps.md b/doc/cla/corporate/brainbeanapps.md
new file mode 100644
index 00000000000..8909224f807
--- /dev/null
+++ b/doc/cla/corporate/brainbeanapps.md
@@ -0,0 +1,15 @@
+Estonia, 23 OCT 2018
+
+Brainbean Apps OU agrees to the terms of the Odoo Corporate Contributor License
+Agreement v1.0.
+
+I declare that I am authorized and able to make this agreement and sign this
+declaration.
+
+Signed,
+
+Oleksii Pelykh https://github.com/alexey-pelykh
+
+List of contributors:
+
+Alexey Pelykh https://github.com/alexey-pelykh
diff --git a/doc/cla/corporate/planetatic.md b/doc/cla/corporate/planetatic.md
new file mode 100644
index 00000000000..c44ee26dae8
--- /dev/null
+++ b/doc/cla/corporate/planetatic.md
@@ -0,0 +1,18 @@
+Spain, 2019-01-07
+
+Penedestic Solucions, SLP agrees to the terms of the Odoo Corporate Contributor License
+Agreement v1.0.
+
+I declare that I am authorized and able to make this agreement and sign this
+declaration.
+
+Signed,
+
+Francisco Fernández ffernandez@planetatic.com https://github.com/FFernandez-PlanetaTIC
+
+List of contributors:
+
+Àngel Manonelles amanonelles@planetatic.com https://github.com/AManonelles-PlanetaTIC
+Francisco Fernández ffernandez@planetatic.com https://github.com/FFernandez-PlanetaTIC
+Lluís Rovira Olivé lrovira@planetatic.com https://github.com/LRovira-PlanetaTIC
+Marc Poch mpoch@planetatic.com https://github.com/MPoch-PlanetaTIC
diff --git a/odoo/addons/base/tests/test_api.py b/odoo/addons/base/tests/test_api.py
index 90a2987b8da..be1ee457380 100644
--- a/odoo/addons/base/tests/test_api.py
+++ b/odoo/addons/base/tests/test_api.py
@@ -367,6 +367,31 @@ class TestAPI(common.TransactionCase):
same_prefetch(empty, empty.bank_ids)
same_prefetch(empty, empty.category_id)
+ @mute_logger('odoo.models')
+ def test_60_prefetch_read(self):
+ """ Check that reading a field computes it on self only. """
+ Partner = self.env['res.partner']
+ field = type(Partner).company_type
+ self.assertTrue(field.compute and not field.store)
+
+ partner1 = Partner.create({'name': 'Foo'})
+ partner2 = Partner.create({'name': 'Bar', 'parent_id': partner1.id})
+ self.assertEqual(partner1.child_ids, partner2)
+
+ # reading partner1 should not prefetch 'company_type' on partner2
+ self.env.clear()
+ partner1 = partner1.with_prefetch()
+ partner1.read(['company_type'])
+ self.assertIn('company_type', partner1._cache)
+ self.assertNotIn('company_type', partner2._cache)
+
+ # reading partner1 should not prefetch 'company_type' on partner2
+ self.env.clear()
+ partner1 = partner1.with_prefetch()
+ partner1.read(['child_ids', 'company_type'])
+ self.assertIn('company_type', partner1._cache)
+ self.assertNotIn('company_type', partner2._cache)
+
@mute_logger('odoo.models')
def test_70_one(self):
""" Check method one(). """
diff --git a/odoo/models.py b/odoo/models.py
index dda229cd226..ac5d344b58b 100644
--- a/odoo/models.py
+++ b/odoo/models.py
@@ -2592,17 +2592,19 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
# retrieve results from records; this takes values from the cache and
# computes remaining fields
- result = []
- name_fields = [(name, self._fields[name]) for name in (stored + inherited + computed)]
+ data = {record: {'id': record.id} for record in self}
+ missing = set()
use_name_get = (load == '_classic_read')
- for record in self:
- try:
- values = {'id': record.id}
- for name, field in name_fields:
- values[name] = field.convert_to_read(record[name], record, use_name_get)
- result.append(values)
- except MissingError:
- pass
+ for name in (stored + inherited + computed):
+ convert = self._fields[name].convert_to_read
+ # read every field with prefetching limited to self; this avoids
+ # computing fields on a larger recordset than self
+ for record in self.with_prefetch():
+ try:
+ data[record][name] = convert(record[name], record, use_name_get)
+ except MissingError:
+ missing.add(record)
+ result = [data[record] for record in self if record not in missing]
return result