Skip to content

Commit

Permalink
Merge 062fd03 into f7ab7af
Browse files Browse the repository at this point in the history
  • Loading branch information
sgeulette committed Sep 1, 2022
2 parents f7ab7af + 062fd03 commit bea693c
Show file tree
Hide file tree
Showing 5 changed files with 77 additions and 1 deletion.
3 changes: 3 additions & 0 deletions CHANGES.rst
Expand Up @@ -4,6 +4,9 @@ Changelog
0.63 (unreleased)
-----------------

- Invalidated '_users_groups_value' volatile after a call of `GroupAwareRoleManager.assignRolesToPrincipal`,
`ZODBRoleManager.assignRoleToPrincipal` and `ZODBRoleManager.removeRoleFromPrincipal`
[sgeulette]
- Removed duplicated classifiers.
[sgeulette]

Expand Down
4 changes: 4 additions & 0 deletions base.cfg
Expand Up @@ -31,6 +31,10 @@ eggs =
${buildout:eggs}
${buildout:package-name} ${buildout:package-extras}
defaults = ['-s', '${buildout:package-name}', '--auto-color', '--auto-progress']
environment = testenv

[testenv]
decorate_acl_methods = true

[code-analysis]
recipe = plone.recipe.codeanalysis
Expand Down
21 changes: 21 additions & 0 deletions src/imio/helpers/configure.zcml
Expand Up @@ -61,6 +61,27 @@
replacement=".patches.ssl_makeMailer"
preserveOriginal="true" />

<monkey:patch
description="Invalidate '_users_groups_value' volatile after new role set"
class="Products.PlonePAS.plugins.role.GroupAwareRoleManager"
original="assignRolesToPrincipal"
replacement=".patches.assignRolesToPrincipal"
preserveOriginal="true" />

<monkey:patch
description="Invalidate '_users_groups_value' volatile after new role set"
class="Products.PluggableAuthService.plugins.ZODBRoleManager.ZODBRoleManager"
original="assignRoleToPrincipal"
replacement=".patches.assignRoleToPrincipal"
preserveOriginal="true" />

<monkey:patch
description="Invalidate '_users_groups_value' volatile after new role set"
class="Products.PluggableAuthService.plugins.ZODBRoleManager.ZODBRoleManager"
original="removeRoleFromPrincipal"
replacement=".patches.removeRoleFromPrincipal"
preserveOriginal="true" />

<utility component=".vocabularies.SortedUsersFactory"
name="imio.helpers.SortedUsers" />

Expand Down
22 changes: 21 additions & 1 deletion src/imio/helpers/patches.py
@@ -1,5 +1,7 @@
# -*- coding: utf-8 -*-

from imio.helpers.cache import invalidate_cachekey_volatile_for
from Products.PlonePAS.plugins.role import GroupAwareRoleManager
from Products.PluggableAuthService.plugins.ZODBRoleManager import ZODBRoleManager
from smtplib import SMTP_SSL
from zope.sendmail.mailer import SMTPMailer

Expand Down Expand Up @@ -29,3 +31,21 @@ def ssl_makeMailer(self):
if self.smtp_port in (465, '465'):
mailer.smtp = SMTP_SSL
return mailer


def assignRolesToPrincipal(self, roles, principal_id, REQUEST=None): # noqa
GroupAwareRoleManager._old_assignRolesToPrincipal(self, roles, principal_id, REQUEST)
# we need to invalidate cachekey
invalidate_cachekey_volatile_for('_users_groups_value')


def assignRoleToPrincipal(self, role_id, principal_id):
ZODBRoleManager._old_assignRoleToPrincipal(self, role_id, principal_id)
# we need to invalidate cachekey
invalidate_cachekey_volatile_for('_users_groups_value')


def removeRoleFromPrincipal(self, role_id, principal_id):
ZODBRoleManager._old_removeRoleFromPrincipal(self, role_id, principal_id)
# we need to invalidate cachekey
invalidate_cachekey_volatile_for('_users_groups_value')
28 changes: 28 additions & 0 deletions src/imio/helpers/tests/test_cache.py
Expand Up @@ -23,6 +23,7 @@
from zope.component import queryUtility
from zope.schema.interfaces import IVocabularyFactory

import os
import time


Expand Down Expand Up @@ -289,3 +290,30 @@ def test_volatile_cache_with_parameters(self):
'c',
volatile_with_parameters_cached(self.portal, 'b'),
)


class TestCachedMethods(IntegrationTestCase):
"""
Test methods that have been dynamically cached in __init__.
"""

def setUp(self):
super(TestCachedMethods, self).setUp()
self.prm = self.portal['acl_users']['portal_role_manager']
self.user = api.user.create('a@b.be', 'user1', '12345', properties={'fullname': 'Stéphan Smith'})

def test_getRolesForPrincipal(self):
self.assertIn(os.getenv('decorate_acl_methods', 'Nope'), ('True', 'true'))
self.assertTupleEqual(self.prm.getRolesForPrincipal(self.user),
('Member',))
self.prm.assignRolesToPrincipal(('Member', 'Reviewer',), 'user1')
self.assertTupleEqual(self.prm.getRolesForPrincipal(self.user),
('Member', 'Reviewer'))
self.prm.assignRoleToPrincipal('Contributor', 'user1')
self.assertTupleEqual(self.prm.getRolesForPrincipal(self.user),
('Member', 'Reviewer', 'Contributor'))
self.prm.removeRoleFromPrincipal('Reviewer', 'user1')
self.assertTupleEqual(self.prm.getRolesForPrincipal(self.user),
('Member', 'Contributor'))

# TODO Add tests for other cached methods

0 comments on commit bea693c

Please sign in to comment.