Skip to content

Commit

Permalink
Merge pull request #22 from gbastien/master
Browse files Browse the repository at this point in the history
Add new event to be able to notify group creation.
  • Loading branch information
gbastien committed Oct 2, 2018
2 parents 6298aad + bc14e7a commit 67ecbdd
Show file tree
Hide file tree
Showing 7 changed files with 83 additions and 2 deletions.
5 changes: 3 additions & 2 deletions CHANGES.rst
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
Change Log
==========

2.0 (unreleased)
----------------
2.0b2 (unreleased)
------------------
- Add new event to be able to notify group creation.


2.0b1 (2018-05-18)
Expand Down
10 changes: 10 additions & 0 deletions Products/PluggableAuthService/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
import IPrincipalCreatedEvent
from Products.PluggableAuthService.interfaces.events \
import IPrincipalDeletedEvent
from Products.PluggableAuthService.interfaces.events \
import IGroupCreatedEvent
from Products.PluggableAuthService.interfaces.events \
import IGroupDeletedEvent
from Products.PluggableAuthService.interfaces.events \
Expand All @@ -48,6 +50,14 @@ class PrincipalDeleted(PASEvent):
pass


@implementer(IGroupCreatedEvent)
class GroupCreated(PASEvent):

def __init__(self, group, plugin):
super(GroupCreated, self).__init__(group)
self.plugin = plugin


@implementer(IGroupDeletedEvent)
class GroupDeleted(PASEvent):
pass
Expand Down
5 changes: 5 additions & 0 deletions Products/PluggableAuthService/interfaces/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ class IPropertiesUpdatedEvent(IPASEvent):
properties = Attribute('List of modified property ids')


class IGroupCreatedEvent(IPASEvent):
"""A group has been created.
"""


class IGroupDeletedEvent(IPASEvent):
"""A group has been removed.
"""
4 changes: 4 additions & 0 deletions Products/PluggableAuthService/plugins/DynamicGroupsPlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,13 @@
from OFS.PropertyManager import PropertyManager
from OFS.SimpleItem import SimpleItem

from zope.event import notify
from zope.interface import Interface

from Products.PageTemplates.PageTemplateFile import PageTemplateFile
from Products.PageTemplates.Expressions import getEngine

from Products.PluggableAuthService.events import GroupCreated
from Products.PluggableAuthService.interfaces.plugins \
import IGroupsPlugin
from Products.PluggableAuthService.interfaces.plugins \
Expand Down Expand Up @@ -331,6 +333,8 @@ def addGroup(self, group_id, predicate, title='', description='',
view_name = createViewName('enumerateGroups')
self.ZCacheable_invalidate(view_name=view_name)

notify(GroupCreated(group_id, self))

@security.private
def updateGroup(self, group_id, predicate, title=None, description=None,
active=None):
Expand Down
4 changes: 4 additions & 0 deletions Products/PluggableAuthService/plugins/ZODBGroupManager.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,13 @@
from Acquisition import aq_parent
from BTrees.OOBTree import OOBTree

from zope.event import notify
from zope.interface import Interface

from Products.PageTemplates.PageTemplateFile import PageTemplateFile

from Products.PluggableAuthService.events import GroupCreated

from Products.PluggableAuthService.interfaces.plugins \
import IGroupEnumerationPlugin
from Products.PluggableAuthService.interfaces.plugins \
Expand Down Expand Up @@ -180,6 +183,7 @@ def addGroup(self, group_id, title=None, description=None):

self._groups[group_id] = {'id': group_id, 'title': title,
'description': description}
notify(GroupCreated(group_id, self))

@security.private
def updateGroup(self, group_id, title=None, description=None):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,12 @@
import unittest

from zExceptions import Forbidden
from zope.component import adapter
from zope.component import globalSiteManager
from zope.component import provideHandler

from Products.PluggableAuthService.interfaces.events import \
IGroupCreatedEvent
from Products.PluggableAuthService.tests.conformance \
import IGroupEnumerationPlugin_conformance
from Products.PluggableAuthService.tests.conformance \
Expand All @@ -33,10 +38,25 @@ def getId(self):
return self._id


@adapter(IGroupCreatedEvent)
def groupCreatedHandler(event):
plugin = event.plugin
if not hasattr(plugin, 'events'):
plugin.events = []

plugin.events.append(event)


class ZODBGroupManagerTests(unittest.TestCase,
IGroupEnumerationPlugin_conformance,
IGroupsPlugin_conformance):

def setUp(self):
provideHandler(groupCreatedHandler)

def tearDown(self):
globalSiteManager.unregisterHandler(groupCreatedHandler)

def _getTargetClass(self):

from Products.PluggableAuthService.plugins.ZODBGroupManager \
Expand Down Expand Up @@ -78,6 +98,19 @@ def test_addGroup(self):
info = info_list[0]
self.assertEqual(info['id'], 'group')

def test_addGroup_CreatedEvent(self):

zgm = self._makeOne()
req, res = makeRequestAndResponse()
zgm.addGroup('group', 'group_title', 'group_desc')
self.assertEqual(len(zgm.events), 1)

event = zgm.events[0]
self.assertTrue(IGroupCreatedEvent.providedBy(event))
self.assertEqual(event.principal, 'group')
self.assertEqual(event.object, 'group')
self.assertEqual(event.plugin, zgm)

def test_addGroup_exists(self):
zgm = self._makeOne()

Expand Down
24 changes: 24 additions & 0 deletions Products/PluggableAuthService/tests/test_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,30 @@ class DummyPrincipal(object):
pass


class GroupCreatedTests(unittest.TestCase, ConformsToIPASEvent):

def _getTargetClass(self):
from Products.PluggableAuthService.events import GroupCreated
return GroupCreated

def _makeOne(self, Group=None):
if Group is None:
Group = DummyGroup()
return self._getTargetClass()(Group, None)

def test_class_conforms_to_IGroupCreatedEvent(self):
from zope.interface.verify import verifyClass
from Products.PluggableAuthService.interfaces.events \
import IGroupCreatedEvent
verifyClass(IGroupCreatedEvent, self._getTargetClass())

def test_instance_conforms_to_IGroupCreatedEvent(self):
from zope.interface.verify import verifyObject
from Products.PluggableAuthService.interfaces.events \
import IGroupCreatedEvent
verifyObject(IGroupCreatedEvent, self._makeOne())


class GroupDeletedTests(unittest.TestCase, ConformsToIPASEvent):

def _getTargetClass(self):
Expand Down

0 comments on commit 67ecbdd

Please sign in to comment.