Skip to content

Commit

Permalink
Optimized Meeting._update_using_groups_local_roles that may be call…
Browse files Browse the repository at this point in the history
…ed on every existing meetings when saving several organizations in parameter `MeetingConfig.usingGroups`. This leaded to several minutes to save the `MeetingConfig`. (#294)

See #PM-4287
  • Loading branch information
gbastien authored Feb 5, 2025
1 parent 9711399 commit d0d5960
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 3 deletions.
7 changes: 5 additions & 2 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,11 @@ Changelog
4.2.15 (unreleased)
-------------------

- Nothing changed yet.

- Optimized `Meeting._update_using_groups_local_roles` that may be called on
every existing meetings when saving several organizations in parameter
`MeetingConfig.usingGroups`.
This leaded to several minutes to save the `MeetingConfig`.
[gbastien]

4.2.14 (2025-02-03)
-------------------
Expand Down
3 changes: 2 additions & 1 deletion src/Products/PloneMeeting/content/meeting.py
Original file line number Diff line number Diff line change
Expand Up @@ -2276,7 +2276,8 @@ def _update_using_groups_local_roles(self):
tool = api.portal.get_tool('portal_plonemeeting')
cfg = tool.getMeetingConfig(self)
for org_uid in cfg.getUsingGroups():
for plone_group_id in get_plone_groups(org_uid, ids_only=True):
for plone_group_id in get_plone_groups(
org_uid, ids_only=True, verify_group_exist=False):
self.manage_addLocalRoles(plone_group_id, ('Reader', ))

security.declarePublic('wfConditions')
Expand Down
29 changes: 29 additions & 0 deletions src/Products/PloneMeeting/tests/testPerformances.py
Original file line number Diff line number Diff line change
Expand Up @@ -998,6 +998,35 @@ def _check_load_item_assembly_and_signatures(self, item, public=True, votes=1):
'item with "{1}" vote(s)'.format(public, votes))
item.restrictedTraverse('@@load_item_assembly_and_signatures')()

def test_pm_Speed_MeetingConfigEdit(self):
"""Check editing a MeetingConfig, especially when using
MeetingConfig.usingGroups as this will update every existing
meetings and add local roles of selected usingGroups."""
self.changeUser("siteadmin")
cfg = self.meetingConfig
# create 100 groups
org_uids = []
pm_logger.info('Creating 100 organizations...')
for i in range(100):
org = self.create('organization', id=i, title='Org %d' % i)
org_uid = org.UID()
self._select_organization(org_uid)
org_uids.append(org_uid)
pm_logger.info('Done.')
cfg.setUsingGroups(org_uids)
# create 250 meetings
pm_logger.info('Creating 100 meetings...')
for i in range(100):
self.create('Meeting', date=datetime.now() + timedelta(i + 1))
pm_logger.info('Done.')
self._check_meeting_config_edit()

@timecall
def _check_meeting_config_edit(self):
''' '''
pm_logger.info('Save MeetingConfig')
notify(ObjectEditedEvent(self.meetingConfig))


def test_suite():
from unittest import makeSuite
Expand Down

0 comments on commit d0d5960

Please sign in to comment.