[FIX] core: support cr.execute_values

psycopg2.extras.execute_values was introduced in PR #101237
however it pypasses the override logic for cr.execute. As a result
1. --log-sql cannot log these queries
2. assertQueryCount cannot notice these queries
...

This commit create a new api cr.execute_values to support the same SQL feature
without losing the override logic for cr.execute

closes odoo/odoo#131190

Related: odoo/enterprise#47374
Signed-off-by: Rémy Voet (ryv) <ryv@odoo.com>
This commit is contained in:
Chong Wang (cwg)
2023-09-14 11:22:42 +00:00
parent 7ed1c1a074
commit 13957b6281
14 changed files with 83 additions and 73 deletions
@@ -24,7 +24,7 @@ class TestLeadConvertMass(crm_common.TestLeadConvertMassCommon):
with self.assertQueryCount(user_sales_manager=0):
test_leads = self.env['crm.lead'].browse(test_leads.ids)
with self.assertQueryCount(user_sales_manager=593): # crm 537 / com 541 / ent 536
with self.assertQueryCount(user_sales_manager=627): # crm 537 / com 541 / ent 536
test_leads._handle_salesmen_assignment(user_ids=user_ids, team_id=False)
self.assertEqual(test_leads.team_id, self.sales_team_convert | self.sales_team_1)
@@ -42,7 +42,7 @@ class TestLeadConvertMass(crm_common.TestLeadConvertMassCommon):
with self.assertQueryCount(user_sales_manager=0):
test_leads = self.env['crm.lead'].browse(test_leads.ids)
with self.assertQueryCount(user_sales_manager=548): # crm 521 / com 516 / ent 516
with self.assertQueryCount(user_sales_manager=580): # crm 521 / com 516 / ent 516
test_leads._handle_salesmen_assignment(user_ids=user_ids, team_id=team_id)
self.assertEqual(test_leads.team_id, self.sales_team_convert)
@@ -167,7 +167,7 @@ class TestLeadConvertMass(crm_common.TestLeadConvertMassCommon):
user_ids = self.assign_users.ids
# randomness: at least 1 query
with self.assertQueryCount(user_sales_manager=1712): # crm 1410 / com 1677 / ent 1685
with self.assertQueryCount(user_sales_manager=1797): # crm 1410 / com 1677 / ent 1685
mass_convert = self.env['crm.lead2opportunity.partner.mass'].with_context({
'active_model': 'crm.lead',
'active_ids': test_leads.ids,
@@ -106,7 +106,7 @@ class TestSyncOdoo2Google(TestSyncGoogle):
})
partner_model = self.env.ref('base.model_res_partner')
partner = self.env['res.partner'].search([], limit=1)
with self.assertQueryCount(__system__=72):
with self.assertQueryCount(__system__=84):
event = self.env['calendar.event'].create({
'name': "Event",
'start': datetime(2020, 1, 15, 8, 0),
@@ -327,7 +327,7 @@ class TestCompanyLeave(TransactionCase):
})
company_leave._compute_date_from_to()
with self.assertQueryCount(__system__=607, admin=867): # 770 community
with self.assertQueryCount(__system__=611, admin=867): # 770 community
# Original query count: 1987
# Without tracking/activity context keys: 5154
company_leave.action_validate()
@@ -32,7 +32,7 @@ class TestWorkEntryHolidaysPerformance(TestWorkEntryHolidaysBase):
self.richard_emp.generate_work_entries(date(2018, 1, 1), date(2018, 1, 2))
leave = self.create_leave(datetime(2018, 1, 1, 7, 0), datetime(2018, 1, 1, 18, 0))
with self.assertQueryCount(__system__=98, admin=102):
with self.assertQueryCount(__system__=99, admin=102):
leave.action_validate()
leave.action_refuse()
@@ -48,7 +48,7 @@ class TestWorkEntryHolidaysPerformance(TestWorkEntryHolidaysBase):
@users('__system__', 'admin')
@warmup
def test_performance_leave_create(self):
with self.assertQueryCount(__system__=44, admin=44):
with self.assertQueryCount(__system__=45, admin=45):
leave = self.create_leave(datetime(2018, 1, 1, 7, 0), datetime(2018, 1, 1, 18, 0))
leave.action_refuse()
@@ -57,7 +57,7 @@ class TestWorkEntryHolidaysPerformance(TestWorkEntryHolidaysBase):
def test_performance_leave_confirm(self):
leave = self.create_leave(datetime(2018, 1, 1, 7, 0), datetime(2018, 1, 1, 18, 0))
leave.action_draft()
with self.assertQueryCount(__system__=40, admin=40):
with self.assertQueryCount(__system__=41, admin=40):
leave.action_confirm()
leave.state = 'refuse'
+4 -4
View File
@@ -50,7 +50,7 @@ class TestPERF(common.TransactionCase):
@warmup
@prepare
def test_empty_sale_order_creation_perf(self):
with self.assertQueryCount(admin=32):
with self.assertQueryCount(admin=33):
self.env['sale.order'].create({
'partner_id': self.partners[0].id,
'user_id': self.salesmans[0].id,
@@ -65,7 +65,7 @@ class TestPERF(common.TransactionCase):
# + 1 warehouse fetch
# + 1 query to get analytic default account
# + 1 followers queries ?
with self.assertQueryCount(admin=36):
with self.assertQueryCount(admin=37):
self.env['sale.order'].create([{
'partner_id': self.partners[0].id,
'user_id': self.salesmans[0].id,
@@ -77,7 +77,7 @@ class TestPERF(common.TransactionCase):
def test_dummy_sales_orders_batch_creation_perf(self):
""" Dummy SOlines (notes/sections) should not add any custom queries other than their insert"""
# + 2 SOL (batched) insert
with self.assertQueryCount(admin=39):
with self.assertQueryCount(admin=40):
self.env['sale.order'].create([{
'partner_id': self.partners[0].id,
'user_id': self.salesmans[0].id,
@@ -96,7 +96,7 @@ class TestPERF(common.TransactionCase):
# + 2 SQL insert
# + 2 queries to get analytic default tags
# + 9 follower queries ?
with self.assertQueryCount(admin=48):
with self.assertQueryCount(admin=49):
self.env['sale.order'].create([{
'partner_id': self.partners[0].id,
'user_id': self.salesmans[0].id,
+38 -38
View File
@@ -225,19 +225,19 @@ class TestBaseMailPerformance(BaseMailPerformance):
@warmup
def test_create_mail_with_tracking(self):
""" Create records inheriting from 'mail.thread' (with field tracking). """
with self.assertQueryCount(admin=7, demo=7):
with self.assertQueryCount(admin=8, demo=8):
self.env['mail.performance.thread'].create({'name': 'X'})
@users('admin', 'employee')
@warmup
def test_create_mail_simple(self):
with self.assertQueryCount(admin=6, employee=6):
with self.assertQueryCount(admin=7, employee=7):
self.env['mail.test.simple'].create({'name': 'Test'})
@users('admin', 'employee')
@warmup
def test_create_mail_simple_multi(self):
with self.assertQueryCount(admin=6, employee=6):
with self.assertQueryCount(admin=7, employee=7):
self.env['mail.test.simple'].create([{'name': 'Test'}] * 5)
@users('admin', 'employee')
@@ -265,7 +265,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
def test_adv_activity(self):
model = self.env['mail.test.activity']
with self.assertQueryCount(admin=6, employee=6):
with self.assertQueryCount(admin=7, employee=7):
model.create({'name': 'Test'})
@users('admin', 'employee')
@@ -330,7 +330,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
record.write({'name': 'Dupe write'})
with self.assertQueryCount(admin=16, employee=16): # com+tm 15/15
with self.assertQueryCount(admin=17, employee=17): # com+tm 15/15
record.action_close('Dupe feedback', attachment_ids=attachments.ids)
# notifications
@@ -346,7 +346,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
def test_mail_composer(self):
test_record, _test_template = self._create_test_records()
customer_id = self.customer.id
with self.assertQueryCount(admin=4, employee=4):
with self.assertQueryCount(admin=5, employee=5):
composer = self.env['mail.compose.message'].with_context({
'default_composition_mode': 'comment',
'default_model': test_record._name,
@@ -356,7 +356,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
'partner_ids': [(4, customer_id)],
})
with self.assertQueryCount(admin=36, employee=36): # com 35/35
with self.assertQueryCount(admin=39, employee=39): # com 35/35
composer._action_send_mail()
@users('admin', 'employee')
@@ -366,7 +366,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
test_record, _test_template = self._create_test_records()
customer = self.env['res.partner'].browse(self.customer.ids)
attachments = self.env['ir.attachment'].with_user(self.env.user).create(self.test_attachments_vals)
with self.assertQueryCount(admin=4, employee=4):
with self.assertQueryCount(admin=6, employee=6):
composer = self.env['mail.compose.message'].with_context({
'default_composition_mode': 'comment',
'default_model': test_record._name,
@@ -377,7 +377,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
'partner_ids': [(4, customer.id)],
})
with self.assertQueryCount(admin=36, employee=36): # com 35/35
with self.assertQueryCount(admin=40, employee=40): # com 35/35
composer._action_send_mail()
@users('admin', 'employee')
@@ -401,7 +401,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
composer_form.attachment_ids.add(attachment)
composer = composer_form.save()
with self.assertQueryCount(admin=49, employee=49): # tm+com 46/46
with self.assertQueryCount(admin=53, employee=53): # tm+com 46/46
composer._action_send_mail()
# notifications
@@ -415,7 +415,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
def test_mail_composer_mass_w_template(self):
_partners, test_records, test_template = self._create_test_records_for_batch()
with self.assertQueryCount(admin=3, employee=3):
with self.assertQueryCount(admin=4, employee=4):
composer = self.env['mail.compose.message'].with_context({
'default_composition_mode': 'mass_mail',
'default_model': test_records._name,
@@ -423,7 +423,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
'default_template_id': test_template.id,
}).create({})
with self.assertQueryCount(admin=108, employee=111), self.mock_mail_gateway():
with self.assertQueryCount(admin=138, employee=131), self.mock_mail_gateway():
composer._action_send_mail()
self.assertEqual(len(self._new_mails), 10)
@@ -434,7 +434,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
def test_mail_composer_nodelete(self):
test_record, _test_template = self._create_test_records()
customer_id = self.customer.id
with self.assertQueryCount(admin=4, employee=4):
with self.assertQueryCount(admin=5, employee=5):
composer = self.env['mail.compose.message'].with_context({
'default_composition_mode': 'comment',
'default_model': test_record._name,
@@ -445,7 +445,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
'partner_ids': [(4, customer_id)],
})
with self.assertQueryCount(admin=36, employee=36): # com 35/35
with self.assertQueryCount(admin=39, employee=39): # com 35/35
composer._action_send_mail()
@users('admin', 'employee')
@@ -455,7 +455,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
test_record, test_template = self._create_test_records()
test_template.write({'attachment_ids': [(5, 0)]})
with self.assertQueryCount(admin=24, employee=24): # tm 15/15 / com 23/23
with self.assertQueryCount(admin=26, employee=26): # tm 15/15 / com 23/23
composer = self.env['mail.compose.message'].with_context({
'default_composition_mode': 'comment',
'default_model': test_record._name,
@@ -463,7 +463,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
'default_template_id': test_template.id,
}).create({})
with self.assertQueryCount(admin=37, employee=37): # com 36/36
with self.assertQueryCount(admin=40, employee=40): # com 36/36
composer._action_send_mail()
# notifications
@@ -479,7 +479,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
def test_mail_composer_w_template_attachments(self):
test_record, test_template = self._create_test_records()
with self.assertQueryCount(admin=24, employee=24): # tm 15/15 / com 23/23
with self.assertQueryCount(admin=27, employee=27): # tm 15/15 / com 23/23
composer = self.env['mail.compose.message'].with_context({
'default_composition_mode': 'comment',
'default_model': test_record._name,
@@ -487,7 +487,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
'default_template_id': test_template.id,
}).create({})
with self.assertQueryCount(admin=44, employee=44): # com 43/43
with self.assertQueryCount(admin=49, employee=49): # com 43/43
composer._action_send_mail()
# notifications
@@ -519,7 +519,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
)
composer = composer_form.save()
with self.assertQueryCount(admin=45, employee=45): # com 44/44
with self.assertQueryCount(admin=48, employee=48): # com 44/44
composer._action_send_mail()
# notifications
@@ -549,7 +549,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
)
composer = composer_form.save()
with self.assertQueryCount(admin=62, employee=62): # com 61/61
with self.assertQueryCount(admin=67, employee=67): # com 61/61
composer._action_send_mail()
# notifications
@@ -576,7 +576,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
# use another user already pre-defined with the email notification type,
# so the ormcache is preserved.
record = self.env['mail.test.track'].create({'name': 'Test'})
with self.assertQueryCount(admin=38, employee=38):
with self.assertQueryCount(admin=41, employee=41):
record.write({
'user_id': self.user_test_email.id,
})
@@ -585,7 +585,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
@warmup
def test_message_assignation_inbox(self):
record = self.env['mail.test.track'].create({'name': 'Test'})
with self.assertQueryCount(admin=20, employee=20): # com 19/9
with self.assertQueryCount(admin=22, employee=22): # com 19/9
record.write({
'user_id': self.user_test_inbox.id,
})
@@ -659,7 +659,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
def test_message_post_one_email_notification(self):
record = self.env['mail.test.simple'].create({'name': 'Test'})
with self.assertQueryCount(admin=31, employee=31): # com 30/30
with self.assertQueryCount(admin=33, employee=33): # com 30/30
record.message_post(
body=Markup('<p>Test Post Performances with an email ping</p>'),
partner_ids=self.customer.ids,
@@ -671,7 +671,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
def test_message_post_one_inbox_notification(self):
record = self.env['mail.test.simple'].create({'name': 'Test'})
with self.assertQueryCount(admin=19, employee=19): # com 18/18
with self.assertQueryCount(admin=20, employee=20): # com 18/18
record.message_post(
body=Markup('<p>Test Post Performances with an inbox ping</p>'),
partner_ids=self.user_test.partner_id.ids,
@@ -684,7 +684,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
def test_message_subscribe_default(self):
record = self.env['mail.test.simple'].create({'name': 'Test'})
with self.assertQueryCount(admin=5, employee=5):
with self.assertQueryCount(admin=6, employee=6):
record.message_subscribe(partner_ids=self.user_test.partner_id.ids)
with self.assertQueryCount(admin=3, employee=3):
@@ -697,7 +697,7 @@ class TestMailAPIPerformance(BaseMailPerformance):
record = self.env['mail.test.simple'].create({'name': 'Test'})
subtype_ids = (self.env.ref('test_mail.st_mail_test_simple_external') | self.env.ref('mail.mt_comment')).ids
with self.assertQueryCount(admin=4, employee=4):
with self.assertQueryCount(admin=5, employee=5):
record.message_subscribe(partner_ids=self.user_test.partner_id.ids, subtype_ids=subtype_ids)
with self.assertQueryCount(admin=2, employee=2):
@@ -962,7 +962,7 @@ class TestMailComplexPerformance(BaseMailPerformance):
record = self.container.with_user(self.env.user)
# about 20 (19?) queries per additional customer group
with self.assertQueryCount(admin=56, employee=55): # com 55/54
with self.assertQueryCount(admin=58, employee=57): # com 55/54
record.message_post(
body=Markup('<p>Test Post Performances</p>'),
message_type='comment',
@@ -980,7 +980,7 @@ class TestMailComplexPerformance(BaseMailPerformance):
template = self.env.ref('test_mail.mail_test_container_tpl')
# about 20 (19 ?) queries per additional customer group
with self.assertQueryCount(admin=63, employee=62): # com 62/61
with self.assertQueryCount(admin=67, employee=66): # com 62/61
record.message_post_with_source(
template,
message_type='comment',
@@ -996,7 +996,7 @@ class TestMailComplexPerformance(BaseMailPerformance):
def test_complex_message_post_view(self):
_partners, test_records, test_template = self._create_test_records_for_batch()
with self.assertQueryCount(admin=3, employee=3):
with self.assertQueryCount(admin=4, employee=4):
_composer = self.env['mail.compose.message'].with_context({
'default_composition_mode': 'mass_mail',
'default_model': test_records._name,
@@ -1031,7 +1031,7 @@ class TestMailComplexPerformance(BaseMailPerformance):
self.assertEqual(rec1.message_partner_ids, self.env.user.partner_id | self.user_portal.partner_id)
# subscribe new followers with forced given subtypes
with self.assertQueryCount(admin=3, employee=3):
with self.assertQueryCount(admin=4, employee=4):
rec.message_subscribe(
partner_ids=pids[:4],
subtype_ids=subtype_ids
@@ -1040,7 +1040,7 @@ class TestMailComplexPerformance(BaseMailPerformance):
self.assertEqual(rec1.message_partner_ids, self.env.user.partner_id | self.user_portal.partner_id | self.partners[:4])
# subscribe existing and new followers with force=False, meaning only some new followers will be added
with self.assertQueryCount(admin=4, employee=4):
with self.assertQueryCount(admin=5, employee=5):
rec.message_subscribe(
partner_ids=pids[:6],
subtype_ids=None
@@ -1049,7 +1049,7 @@ class TestMailComplexPerformance(BaseMailPerformance):
self.assertEqual(rec1.message_partner_ids, self.env.user.partner_id | self.user_portal.partner_id | self.partners[:6])
# subscribe existing and new followers with force=True, meaning all will have the same subtypes
with self.assertQueryCount(admin=3, employee=3):
with self.assertQueryCount(admin=4, employee=4):
rec.message_subscribe(
partner_ids=pids,
subtype_ids=subtype_ids
@@ -1070,7 +1070,7 @@ class TestMailComplexPerformance(BaseMailPerformance):
})
rec1 = rec.with_context(active_test=False) # to see inactive records
self.assertEqual(rec1.message_partner_ids, self.partners | self.env.user.partner_id)
with self.assertQueryCount(admin=38, employee=38):
with self.assertQueryCount(admin=41, employee=41):
rec.write({'user_id': self.user_portal.id})
self.assertEqual(rec1.message_partner_ids, self.partners | self.env.user.partner_id | self.user_portal.partner_id)
# write tracking message
@@ -1090,7 +1090,7 @@ class TestMailComplexPerformance(BaseMailPerformance):
customer_id = self.customer.id
user_id = self.user_portal.id
with self.assertQueryCount(admin=92, employee=92):
with self.assertQueryCount(admin=98, employee=98):
rec = self.env['mail.test.ticket'].create({
'name': 'Test',
'container_id': container_id,
@@ -1119,7 +1119,7 @@ class TestMailComplexPerformance(BaseMailPerformance):
rec1 = rec.with_context(active_test=False) # to see inactive records
self.assertEqual(rec1.message_partner_ids, self.user_portal.partner_id | self.env.user.partner_id)
self.assertEqual(len(rec1.message_ids), 1)
with self.assertQueryCount(admin=58, employee=58):
with self.assertQueryCount(admin=61, employee=61):
rec.write({
'name': 'Test2',
'container_id': self.container.id,
@@ -1156,7 +1156,7 @@ class TestMailComplexPerformance(BaseMailPerformance):
rec1 = rec.with_context(active_test=False) # to see inactive records
self.assertEqual(rec1.message_partner_ids, self.user_portal.partner_id | self.env.user.partner_id)
with self.assertQueryCount(admin=64, employee=64):
with self.assertQueryCount(admin=67, employee=67):
rec.write({
'name': 'Test2',
'container_id': container_id,
@@ -1189,7 +1189,7 @@ class TestMailComplexPerformance(BaseMailPerformance):
rec1 = rec.with_context(active_test=False) # to see inactive records
self.assertEqual(rec1.message_partner_ids, self.partners | self.env.user.partner_id | self.user_portal.partner_id)
with self.assertQueryCount(admin=32, employee=32):
with self.assertQueryCount(admin=33, employee=33):
rec.write({
'name': 'Test2',
'customer_id': customer_id,
@@ -1346,7 +1346,7 @@ class TestMailHeavyPerformancePost(BaseMailPerformance):
attachments = self.env['ir.attachment'].with_user(self.env.user).create(self.test_attachments_vals)
# enable_logging = self.cr._enable_logging() if self.warm else nullcontext()
# with self.assertQueryCount(employee=63), enable_logging:
with self.assertQueryCount(employee=61): # com 60
with self.assertQueryCount(employee=65): # com 60
record_container.with_context({}).message_post(
body=Markup('<p>Test body <img src="cid:cid1"> <img src="cid:cid2"></p>'),
subject='Test Subject',
@@ -91,7 +91,7 @@ class TestMailPerformance(FullBaseMailPerformance):
record_ticket = self.env['mail.test.ticket.mc'].browse(self.record_ticket.ids)
attachments = self.env['ir.attachment'].create(self.test_attachments_vals)
with self.assertQueryCount(employee=90): # test_mail_full: 88
with self.assertQueryCount(employee=95): # test_mail_full: 88
new_message = record_ticket.message_post(
attachment_ids=attachments.ids,
body=Markup('<p>Test Content</p>'),
+2 -2
View File
@@ -172,7 +172,7 @@ class TestRatingPerformance(TestRatingCommon):
@users('employee')
@warmup
def test_rating_last_value_perfs(self):
with self.assertQueryCount(employee=1413): # tmf 1313 / com 1313
with self.assertQueryCount(employee=1614): # tmf 1313 / com 1313
self.create_ratings('mail.test.rating.thread')
with self.assertQueryCount(employee=2001): # tmf 1901
@@ -184,7 +184,7 @@ class TestRatingPerformance(TestRatingCommon):
@users('employee')
@warmup
def test_rating_last_value_perfs_with_rating_mixin(self):
with self.assertQueryCount(employee=1519): # tmf 1419 / com 1419
with self.assertQueryCount(employee=1721): # tmf 1419 / com 1419
self.create_ratings('mail.test.rating')
with self.assertQueryCount(employee=2204): # tmf 2104
@@ -35,7 +35,7 @@ class TestSMSPerformance(BaseMailPerformance, sms_common.SMSCase):
def test_message_sms_record_1_partner(self):
record = self.test_record.with_user(self.env.user)
pids = self.customer.ids
with self.mockSMSGateway(sms_allow_unlink=True), self.assertQueryCount(employee=25):
with self.mockSMSGateway(sms_allow_unlink=True), self.assertQueryCount(employee=26):
messages = record._message_sms(
body='Performance Test',
partner_ids=pids,
@@ -50,7 +50,7 @@ class TestSMSPerformance(BaseMailPerformance, sms_common.SMSCase):
def test_message_sms_record_10_partners(self):
record = self.test_record.with_user(self.env.user)
pids = self.partners.ids
with self.mockSMSGateway(sms_allow_unlink=True), self.assertQueryCount(employee=25):
with self.mockSMSGateway(sms_allow_unlink=True), self.assertQueryCount(employee=26):
messages = record._message_sms(
body='Performance Test',
partner_ids=pids,
@@ -64,7 +64,7 @@ class TestSMSPerformance(BaseMailPerformance, sms_common.SMSCase):
@warmup
def test_message_sms_record_default(self):
record = self.test_record.with_user(self.env.user)
with self.mockSMSGateway(sms_allow_unlink=True), self.assertQueryCount(employee=27):
with self.mockSMSGateway(sms_allow_unlink=True), self.assertQueryCount(employee=28):
messages = record._message_sms(
body='Performance Test',
)
@@ -7,7 +7,6 @@ from odoo.addons.http_routing.models.ir_http import slug, unslug
from odoo.addons.website.models import ir_http
from odoo.tools.translate import html_translate
from odoo.osv import expression
from psycopg2.extras import execute_values
_logger = logging.getLogger(__name__)
@@ -373,7 +372,7 @@ class ProductTemplate(models.Model):
WHERE id = p.p_id
""".format(table=self._table)
values_args = [(prod_tmpl['id'], max_seq + i * 5) for i, prod_tmpl in enumerate(prod_tmpl_ids)]
execute_values(self.env.cr._obj, query, values_args)
self.env.cr.execute_values(query, values_args)
else:
super(ProductTemplate, self)._init_column(column_name)
+2 -2
View File
@@ -11,7 +11,7 @@ from collections.abc import Mapping
from operator import itemgetter
from psycopg2 import sql
from psycopg2.extras import Json, execute_values
from psycopg2.extras import Json
from psycopg2.sql import Identifier, SQL, Placeholder
from odoo import api, fields, models, tools, _, _lt, Command
@@ -84,7 +84,7 @@ def query_insert(cr, table, rows):
cols=SQL(",").join(map(Identifier, cols)),
)
params = [tuple(row[col] for col in cols) for row in rows]
execute_values(cr._obj, query, params)
cr.execute_values(query, params)
return [row[0] for row in cr.fetchall()]
@@ -383,12 +383,12 @@ class TestPerformance(SavepointCaseWithUserDemo):
rec1 = self.env['test_performance.base'].create({'name': 'X'})
# create N tags on rec1: O(1) queries
with self.assertQueryCount(3):
with self.assertQueryCount(4):
self.env.invalidate_all()
rec1.write({'tag_ids': [Command.create({'name': 0})]})
self.assertEqual(len(rec1.tag_ids), 1)
with self.assertQueryCount(3):
with self.assertQueryCount(4):
self.env.invalidate_all()
rec1.write({'tag_ids': [Command.create({'name': val}) for val in range(1, 12)]})
self.assertEqual(len(rec1.tag_ids), 12)
@@ -436,12 +436,12 @@ class TestPerformance(SavepointCaseWithUserDemo):
rec2 = self.env['test_performance.base'].create({'name': 'X'})
# link N tags from rec1 to rec2: O(1) queries
with self.assertQueryCount(2):
with self.assertQueryCount(3):
self.env.invalidate_all()
rec2.write({'tag_ids': [Command.link(tag.id) for tag in tags[0]]})
self.assertEqual(rec2.tag_ids, tags[0])
with self.assertQueryCount(2):
with self.assertQueryCount(3):
self.env.invalidate_all()
rec2.write({'tag_ids': [Command.link(tag.id) for tag in tags[1:]]})
self.assertEqual(rec2.tag_ids, tags)
@@ -464,7 +464,7 @@ class TestPerformance(SavepointCaseWithUserDemo):
self.assertFalse(rec2.tag_ids)
# set N tags in rec2: O(1) queries
with self.assertQueryCount(2):
with self.assertQueryCount(3):
self.env.invalidate_all()
rec2.write({'tag_ids': [Command.set(tags.ids)]})
self.assertEqual(rec2.tag_ids, tags)
@@ -474,12 +474,12 @@ class TestPerformance(SavepointCaseWithUserDemo):
rec2.write({'tag_ids': [Command.set(tags[:8].ids)]})
self.assertEqual(rec2.tag_ids, tags[:8])
with self.assertQueryCount(3):
with self.assertQueryCount(4):
self.env.invalidate_all()
rec2.write({'tag_ids': [Command.set(tags[4:].ids)]})
self.assertEqual(rec2.tag_ids, tags[4:])
with self.assertQueryCount(2):
with self.assertQueryCount(3):
self.env.invalidate_all()
rec2.write({'tag_ids': [Command.set(tags.ids)]})
self.assertEqual(rec2.tag_ids, tags)
@@ -514,7 +514,7 @@ class TestPerformance(SavepointCaseWithUserDemo):
self.env['test_performance.base'].create({'name': 'X'})
# create N tags: add O(1) queries
with self.assertQueryCount(3):
with self.assertQueryCount(4):
self.env['test_performance.base'].create({
'name': 'X',
'tag_ids': [Command.create({'name': val}) for val in range(10)],
@@ -523,7 +523,7 @@ class TestPerformance(SavepointCaseWithUserDemo):
# link N tags: add O(1) queries
tags = self.env['test_performance.tag'].create([{'name': val} for val in range(10)])
with self.assertQueryCount(2):
with self.assertQueryCount(3):
self.env['test_performance.base'].create({
'name': 'X',
'tag_ids': [Command.link(tag.id) for tag in tags],
@@ -535,7 +535,7 @@ class TestPerformance(SavepointCaseWithUserDemo):
'tag_ids': [Command.set([])],
})
with self.assertQueryCount(2):
with self.assertQueryCount(3):
self.env['test_performance.base'].create({
'name': 'X',
'tag_ids': [Command.set(tags.ids)],
+2 -2
View File
@@ -23,7 +23,7 @@ import warnings
import psycopg2
import pytz
from markupsafe import Markup
from psycopg2.extras import Json as PsycopgJson, execute_values
from psycopg2.extras import Json as PsycopgJson
from psycopg2.sql import SQL, Identifier
from difflib import get_close_matches, unified_diff
from hashlib import sha256
@@ -4871,7 +4871,7 @@ class Many2many(_RelationalMulti):
Identifier(self.column1),
Identifier(self.column2),
)
execute_values(cr._obj, query, pairs)
cr.execute_values(query, pairs)
# update the cache of inverse fields
y_to_xs = defaultdict(set)
+12 -1
View File
@@ -23,7 +23,7 @@ import psycopg2.extensions
import psycopg2.extras
from psycopg2.extensions import ISOLATION_LEVEL_REPEATABLE_READ
from psycopg2.pool import PoolError
from psycopg2.sql import SQL, Identifier
from psycopg2.sql import SQL, Identifier, Composable
from werkzeug import urls
import odoo
@@ -360,6 +360,17 @@ class Cursor(BaseCursor):
self.sql_from_log[res_from.group(1)][1] += delay
return res
def execute_values(self, query, argslist, template=None, page_size=100, fetch=False):
"""
A proxy for psycopg2.extras.execute_values which can log all queries like execute.
But this method cannot set log_exceptions=False like execute
"""
# Odoo Cursor only proxies all methods of psycopg2 Cursor. This is a patch for problems caused by passing
# self instead of self._obj to the first parameter of psycopg2.extras.execute_values.
if isinstance(query, Composable):
query = query.as_string(self._obj)
return psycopg2.extras.execute_values(self, query, argslist, template=template, page_size=page_size, fetch=fetch)
def split_for_in_conditions(self, ids, size=None):
"""Split a list of identifiers into one or more smaller tuples
safe for IN conditions, after uniquifying them."""