There were inconsistencies in the calls to `_render`. * the view context could contain information that misled developers. Indeed, the context and value of the view are not supposed to be found in the rendering. Thus by calling `ir.qweb` with the name of the template, we ensure that there is no unwanted information and in addition the cache key is that of the name of the template which saves a query. * the context used for rendering was modified by a method on `ir.ui.view`, except this is not information used by this model. There is now a `_prepare_environment` method residing on `ir.qweb`. This method allows to modify the value dictionary as well as the context in which the rendering will be done. This preparation of the data as well as my security check is done only once per rendering. This also saves some queries * Freeze options for rendering were inconsistent. It could be that options on which rendering depends were not part of the cache key. Thus, depending on the user who generated the generation of the rendering function, there was or was not information in the template. For example for automatic branding. This is no longer possible, because it is the context that is used. The options serving as a cache key are only recorded for information (for the profiling system for example). A simplification of the `ir.qweb.field` models could be made. The report rendering and call `ir.qweb` instead of `ir.ui.view`. Part-of: odoo/odoo#85110
475 lines
21 KiB
Python
475 lines
21 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from datetime import timedelta
|
|
from freezegun import freeze_time
|
|
|
|
from odoo.addons.test_event_full.tests.common import TestEventFullCommon
|
|
from odoo.addons.website.tests.test_performance import UtilPerf
|
|
from odoo.tests.common import users, warmup, Form
|
|
from odoo.tests import tagged
|
|
|
|
|
|
@tagged('event_performance', 'post_install', '-at_install')
|
|
class EventPerformanceCase(TestEventFullCommon):
|
|
|
|
def setUp(self):
|
|
super(EventPerformanceCase, self).setUp()
|
|
# patch registry to simulate a ready environment
|
|
self.patch(self.env.registry, 'ready', True)
|
|
self._flush_tracking()
|
|
|
|
def _flush_tracking(self):
|
|
""" Force the creation of tracking values notably, and ensure tests are
|
|
reproducible. """
|
|
self.env['base'].flush()
|
|
self.cr.flush()
|
|
|
|
|
|
@tagged('event_performance', 'post_install', '-at_install')
|
|
class TestEventPerformance(EventPerformanceCase):
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_event_create_batch_notype(self):
|
|
""" Test multiple event creation (import) """
|
|
batch_size = 20
|
|
|
|
# simple without type involved
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=343): # 337 (sometimes +6)
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
event_values = [
|
|
dict(self.event_base_vals,
|
|
website_menu=False)
|
|
for x in range(batch_size)
|
|
]
|
|
self.env['event.event'].create(event_values)
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_event_create_batch_notype_website(self):
|
|
""" Test multiple event creation (import) """
|
|
batch_size = 20
|
|
|
|
# simple without type involved + website
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=5484): # tef only: 5069 (5065) - com runbot: 5059 - ent runbot 5484
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
event_values = [
|
|
dict(self.event_base_vals,
|
|
website_menu=True
|
|
)
|
|
for x in range(batch_size)
|
|
]
|
|
self.env['event.event'].create(event_values)
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_event_create_batch_wtype(self):
|
|
""" Test multiple event creation (import) """
|
|
batch_size = 20
|
|
event_type = self.env['event.type'].browse(self.test_event_type.ids)
|
|
|
|
# complex with type
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=449): # 443 (sometimes +6)
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
event_values = [
|
|
dict(self.event_base_vals,
|
|
event_type_id=event_type.id,
|
|
website_menu=False,
|
|
)
|
|
for x in range(batch_size)
|
|
]
|
|
self.env['event.event'].create(event_values)
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_event_create_batch_wtype_website(self):
|
|
""" Test multiple event creation (import) """
|
|
batch_size = 20
|
|
event_type = self.env['event.type'].browse(self.test_event_type.ids)
|
|
|
|
# complex with type + website
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=5597): # tef only: 5178 - com runbot: 5172 - ent runbot 5597
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
event_values = [
|
|
dict(self.event_base_vals,
|
|
event_type_id=event_type.id,
|
|
)
|
|
for x in range(batch_size)
|
|
]
|
|
self.env['event.event'].create(event_values)
|
|
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_event_create_form_notype(self):
|
|
""" Test a single event creation using Form """
|
|
has_social = 'social_menu' in self.env['event.event'] # otherwise view may crash in enterprise
|
|
|
|
# no type, no website
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=234): # tef only: 184 - com runbot: 184
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
with Form(self.env['event.event']) as event_form:
|
|
event_form.name = 'Test Event'
|
|
event_form.date_begin = self.reference_now + timedelta(days=1)
|
|
event_form.date_end = self.reference_now + timedelta(days=5)
|
|
event_form.website_menu = False
|
|
if has_social:
|
|
event_form.social_menu = False
|
|
_event = event_form.save()
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_event_create_form_notype_website(self):
|
|
""" Test a single event creation using Form """
|
|
has_social = 'social_menu' in self.env['event.event'] # otherwise view may crash in enterprise
|
|
|
|
# no type, website
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=691): # tef only: 637 - com runbot: 587 - ent runbot: 691
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
with Form(self.env['event.event']) as event_form:
|
|
event_form.name = 'Test Event'
|
|
event_form.date_begin = self.reference_now + timedelta(days=1)
|
|
event_form.date_end = self.reference_now + timedelta(days=5)
|
|
event_form.website_menu = True
|
|
if has_social:
|
|
event_form.social_menu = False
|
|
_event = event_form.save()
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_event_create_form_type_website(self):
|
|
""" Test a single event creation using Form """
|
|
event_type = self.env['event.type'].browse(self.test_event_type.ids)
|
|
has_social = 'social_menu' in self.env['event.event'] # otherwise view may crash in enterprise
|
|
|
|
# type and website
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=724): # tef only: 673 - com runbot: 624 - ent runbot: 724
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
with Form(self.env['event.event']) as event_form:
|
|
event_form.name = 'Test Event'
|
|
event_form.date_begin = self.reference_now + timedelta(days=1)
|
|
event_form.date_end = self.reference_now + timedelta(days=5)
|
|
event_form.event_type_id = event_type
|
|
if has_social:
|
|
event_form.social_menu = False
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_event_create_single_notype(self):
|
|
""" Test a single event creation """
|
|
# simple without type involved
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=39): # 33 (sometimes +6)
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
event_values = dict(
|
|
self.event_base_vals,
|
|
website_menu=False
|
|
)
|
|
self.env['event.event'].create([event_values])
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_event_create_single_notype_website(self):
|
|
""" Test a single event creation """
|
|
# simple without type involved + website
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=373): # tef only: 358 (353) - com runbot: 284 - ent runbot 373
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
event_values = dict(
|
|
self.event_base_vals,
|
|
website_menu=True
|
|
)
|
|
self.env['event.event'].create([event_values])
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_event_create_single_wtype(self):
|
|
""" Test a single event creation """
|
|
event_type = self.env['event.type'].browse(self.test_event_type.ids)
|
|
|
|
# complex with type
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=69): # 62 (sometimes +6)
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
event_values = dict(
|
|
self.event_base_vals,
|
|
event_type_id=event_type.id,
|
|
website_menu=False
|
|
)
|
|
self.env['event.event'].create([event_values])
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_event_create_single_wtype_website(self):
|
|
""" Test a single event creation """
|
|
event_type = self.env['event.type'].browse(self.test_event_type.ids)
|
|
|
|
# complex with type + website
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=409): # tef only: 395 (389) - com runbot: 383 - ent runbot 409
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
event_values = dict(
|
|
self.event_base_vals,
|
|
event_type_id=event_type.id,
|
|
)
|
|
self.env['event.event'].create([event_values])
|
|
|
|
|
|
@tagged('event_performance', 'registration_performance', 'post_install', '-at_install')
|
|
class TestRegistrationPerformance(EventPerformanceCase):
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_registration_create_batch(self):
|
|
""" Test multiple registrations creation (batch of 10 without partner
|
|
and batch of 10 with partner)
|
|
|
|
# TODO: with self.profile(collectors=['sql']) as _profile:
|
|
"""
|
|
event = self.env['event.event'].browse(self.test_event.ids)
|
|
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=716): # tef only: 674 - com runbot 713 - ent runbot 716
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
registration_values = [
|
|
dict(reg_data,
|
|
event_id=event.id)
|
|
for reg_data in self.customer_data
|
|
]
|
|
registration_values += [
|
|
{'event_id': event.id,
|
|
'partner_id': partner.id,
|
|
} for partner in self.partners
|
|
]
|
|
_registrations = self.env['event.registration'].create(registration_values)
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_registration_create_batch_nolead(self):
|
|
""" Test multiple registrations creation (batch of 10 without partner
|
|
and batch of 10 with partner)
|
|
|
|
# TODO: with self.profile(collectors=['sql']) as _profile:
|
|
"""
|
|
event = self.env['event.event'].browse(self.test_event.ids)
|
|
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=245): # tef only: 201 - com runbot 240 - ent runbot 245
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
registration_values = [
|
|
dict(reg_data,
|
|
event_id=event.id)
|
|
for reg_data in self.customer_data
|
|
]
|
|
registration_values += [
|
|
{'event_id': event.id,
|
|
'partner_id': partner.id,
|
|
} for partner in self.partners
|
|
]
|
|
_registrations = self.env['event.registration'].with_context(event_lead_rule_skip=True).create(registration_values)
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_registration_create_batch_website(self):
|
|
""" Test multiple registrations creation (batch of 10 without partner
|
|
and batch of 10 with partner) with some additional informations (register
|
|
form like) """
|
|
event = self.env['event.event'].browse(self.test_event.ids)
|
|
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=727): # tef only: 685 - com runbot 724 - ent runbot: 727
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
registration_values = [
|
|
dict(reg_data,
|
|
event_id=event.id)
|
|
for reg_data in self.website_customer_data
|
|
]
|
|
registration_values += [
|
|
{'event_id': event.id,
|
|
'partner_id': partner.id,
|
|
'registration_answer_ids': self.website_customer_data[0]['registration_answer_ids'],
|
|
} for partner in self.partners
|
|
]
|
|
_registrations = self.env['event.registration'].create(registration_values)
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_registration_create_form_customer(self):
|
|
""" Test a single registration creation using Form """
|
|
event = self.env['event.event'].browse(self.test_event.ids)
|
|
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=227): # tef only: 210 - com runbot: 213 - ent runbot: 227
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
with Form(self.env['event.registration']) as reg_form:
|
|
reg_form.event_id = event
|
|
reg_form.email = 'email.00@test.example.com'
|
|
reg_form.mobile = '0456999999'
|
|
reg_form.name = 'My Customer'
|
|
reg_form.phone = '0456000000'
|
|
_registration = reg_form.save()
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_registration_create_form_partner(self):
|
|
""" Test a single registration creation using Form """
|
|
event = self.env['event.event'].browse(self.test_event.ids)
|
|
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=229): # tef only: 213 - com runbot: 214 - ent runbot: 229
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
with Form(self.env['event.registration']) as reg_form:
|
|
reg_form.event_id = event
|
|
reg_form.partner_id = self.partners[0]
|
|
_registration = reg_form.save()
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_registration_create_form_partner_nolead(self):
|
|
""" Test a single registration creation using Form """
|
|
event = self.env['event.event'].browse(self.test_event.ids)
|
|
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=142): # tef only: 124 - com runbot 126
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
with Form(self.env['event.registration'].with_context(event_lead_rule_skip=True)) as reg_form:
|
|
reg_form.event_id = event
|
|
reg_form.partner_id = self.partners[0]
|
|
_registration = reg_form.save()
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_registration_create_single_customer(self):
|
|
""" Test a single registration creation """
|
|
event = self.env['event.event'].browse(self.test_event.ids)
|
|
|
|
# simple customer data
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=139): # tef only: 135 - com runbot: 137 - ent runbot: 139
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
registration_values = dict(
|
|
self.customer_data[0],
|
|
event_id=event.id)
|
|
_registration = self.env['event.registration'].create([registration_values])
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_registration_create_single_partner(self):
|
|
""" Test a single registration creation """
|
|
event = self.env['event.event'].browse(self.test_event.ids)
|
|
|
|
# partner-based customer
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=145): # tef only: 143 - com runbot: 144 - ent runbot: 145
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
registration_values = {
|
|
'event_id': event.id,
|
|
'partner_id': self.partners[0].id,
|
|
}
|
|
_registration = self.env['event.registration'].create([registration_values])
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_registration_create_single_partner_nolead(self):
|
|
""" Test a single registration creation """
|
|
event = self.env['event.event'].browse(self.test_event.ids)
|
|
|
|
# partner-based customer
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=147): # tef only: 56 - com runbot: 58 - ent runbot: 147
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
registration_values = {
|
|
'event_id': event.id,
|
|
'partner_id': self.partners[0].id,
|
|
}
|
|
_registration = self.env['event.registration'].with_context(event_lead_rule_skip=True).create([registration_values])
|
|
|
|
@users('event_user')
|
|
@warmup
|
|
def test_registration_create_single_website(self):
|
|
""" Test a single registration creation """
|
|
event = self.env['event.event'].browse(self.test_event.ids)
|
|
|
|
# website customer data
|
|
with freeze_time(self.reference_now), self.assertQueryCount(event_user=147): # tef only: 142 - com runbot: 143 - ent runbot: 147
|
|
self.env.cr._now = self.reference_now # force create_date to check schedulers
|
|
registration_values = dict(
|
|
self.website_customer_data[0],
|
|
event_id=event.id)
|
|
_registration = self.env['event.registration'].create([registration_values])
|
|
|
|
|
|
@tagged('event_performance', 'event_online', 'post_install', '-at_install')
|
|
class TestOnlineEventPerformance(EventPerformanceCase, UtilPerf):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
super(TestOnlineEventPerformance, cls).setUpClass()
|
|
# if website_livechat is installed, disable it
|
|
if 'channel_id' in cls.env['website']:
|
|
cls.env['website'].search([]).channel_id = False
|
|
|
|
cash_journal = cls.env['account.journal'].create({
|
|
'name': 'Cash - Test',
|
|
'type': 'cash',
|
|
'code': 'CASH - Test'
|
|
})
|
|
cls.env['payment.acquirer'].search([('provider', '=', 'test')]).write({
|
|
'journal_id': cash_journal.id,
|
|
'state': 'test'
|
|
})
|
|
|
|
# clean even page to make it reproducible
|
|
cls.env['event.event'].search([('name', '!=', 'Test Event')]).write({'active': False})
|
|
# create noise for events
|
|
cls.noise_events = cls.env['event.event'].create([
|
|
{'name': 'Event %02d' % idx,
|
|
'date_begin': cls.reference_now + timedelta(days=(-2 + int(idx/10))),
|
|
'date_end': cls.reference_now + timedelta(days=5),
|
|
'is_published': True,
|
|
}
|
|
for idx in range(0, 50)
|
|
])
|
|
|
|
def _test_url_open(self, url):
|
|
url += ('?' not in url and '?' or '') + '&nocache'
|
|
return self.url_open(url)
|
|
|
|
@warmup
|
|
def test_event_page_event_manager(self):
|
|
# website customer data
|
|
with freeze_time(self.reference_now):
|
|
self.authenticate('user_eventmanager', 'user_eventmanager')
|
|
with self.assertQueryCount(default=69): # tef only: 68 (+1 ent)
|
|
self._test_url_open('/event/%i' % self.test_event.id)
|
|
|
|
@warmup
|
|
def test_event_page_public(self):
|
|
# website customer data
|
|
with freeze_time(self.reference_now):
|
|
self.authenticate(None, None)
|
|
with self.assertQueryCount(default=47): # tef only: 47
|
|
self._test_url_open('/event/%i' % self.test_event.id)
|
|
|
|
@warmup
|
|
def test_events_browse_event_manager(self):
|
|
# website customer data
|
|
with freeze_time(self.reference_now):
|
|
self.authenticate('user_eventmanager', 'user_eventmanager')
|
|
with self.assertQueryCount(default=53): # tef only: 52 (+1 ent)
|
|
self._test_url_open('/event')
|
|
|
|
@warmup
|
|
def test_events_browse_public(self):
|
|
# website customer data
|
|
with freeze_time(self.reference_now):
|
|
self.authenticate(None, None)
|
|
with self.assertQueryCount(default=34): # tef only: 34
|
|
self._test_url_open('/event')
|
|
|
|
# @warmup
|
|
# def test_register_public(self):
|
|
# with freeze_time(self.reference_now + timedelta(hours=3)): # be sure sales has started
|
|
# self.assertTrue(self.test_event.event_registrations_started)
|
|
# self.authenticate(None, None)
|
|
# with self.assertQueryCount(default=99999): # tef only: 1110
|
|
# self.browser_js(
|
|
# '/event/%i/register' % self.test_event.id,
|
|
# 'odoo.__DEBUG__.services["web_tour.tour"].run("wevent_performance_register")',
|
|
# 'odoo.__DEBUG__.services["web_tour.tour"].tours.wevent_performance_register.ready',
|
|
# login=None,
|
|
# timeout=200,
|
|
# )
|
|
|
|
# # minimal checkup, to be improved in future tests independently from performance
|
|
# self.assertEqual(len(self.test_event.registration_ids), 3)
|
|
# self.assertEqual(len(self.test_event.registration_ids.visitor_id), 1)
|