Skip to content

Commit

Permalink
Migrate to Plone 6 / Python 3
Browse files Browse the repository at this point in the history
  • Loading branch information
laulaz committed Oct 1, 2024
1 parent a63e107 commit 65697e9
Show file tree
Hide file tree
Showing 9 changed files with 65 additions and 62 deletions.
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
'collective.contact.core',
'collective.eeafaceted.z3ctable',
'collective.elephantvocabulary',
'plone.formwidget.masterselect ~= 1.7',
'plone.formwidget.masterselect',
'imio.helpers > 0.61'
],
extras_require={
Expand Down
14 changes: 7 additions & 7 deletions src/collective/contact/plonegroup/browser/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from collective.contact.plonegroup.utils import get_own_organization_path
from collective.contact.plonegroup.utils import get_plone_group_id
from collective.elephantvocabulary import wrap_vocabulary
from collective.z3cform.datagridfield import DataGridFieldFactory
from collective.z3cform.datagridfield.datagridfield import DataGridFieldFactory
from collective.z3cform.datagridfield.registry import DictRow
from imio.helpers.cache import get_cachekey_volatile
from imio.helpers.cache import invalidate_cachekey_volatile_for
Expand All @@ -38,7 +38,7 @@
from zope.container.interfaces import IContainerModifiedEvent
from zope.container.interfaces import IObjectRemovedEvent
from zope.event import notify
from zope.interface import implements
from zope.interface import implementer
from zope.interface import Interface
from zope.interface import Invalid
from zope.interface import invariant
Expand Down Expand Up @@ -91,11 +91,11 @@ def voc_cache_key(method, self, context):
return get_cachekey_volatile("%s.%s" % (self.__class__.__module__, self.__class__.__name__))


@implementer(IVocabularyFactory)
class BaseOrganizationServicesVocabulary(object):
"""
Base vocabulary returning organizations from a particular root level.
"""
implements(IVocabularyFactory)
valid_states = ('active',)

def listSubOrganizations(self, terms, folder, parent_label=''):
Expand Down Expand Up @@ -242,7 +242,7 @@ def validateSettings(data):
'fct_orgs': dic['fct_orgs'],
'enabled': dic['enabled']}
for dic in data.functions}
for new_function, new_function_infos in new_functions.items():
for new_function, new_function_infos in list(new_functions.items()):
if new_function_infos['fct_orgs'] and \
old_functions[new_function]['fct_orgs'] != new_function_infos['fct_orgs']:
# check that Plone group is empty for not selected fct_orgs
Expand Down Expand Up @@ -402,7 +402,7 @@ def detectContactPlonegroupChange(event):
if plone_group and not plone_group.getMemberIds():
api.group.delete(plone_group_id)
# we detect existing functions for which 'fct_orgs' changed
for new_id, new_function_infos in new_functions.items():
for new_id, new_function_infos in list(new_functions.items()):
new_title = new_function_infos['fct_title']
new_orgs = new_function_infos['fct_orgs']
enabled = new_function_infos['enabled']
Expand Down Expand Up @@ -581,8 +581,8 @@ def SelectedOrganizationsElephantVocabulary__call__(self, context):
if uid in terms:
ordered_terms.append(terms[uid])
del terms[uid]
extra_uids = terms.keys()
extra_terms = terms.values()
extra_uids = list(terms.keys())
extra_terms = list(terms.values())
# ordered_vocab = SearchableSimpleVocabulary(ordered_terms + extra_terms) # bug in widget, trac #15186
ordered_vocab = SimpleVocabulary(ordered_terms + extra_terms)
wrapped_vocab = wrap_vocabulary(ordered_vocab, hidden_terms=extra_uids)(context)
Expand Down
20 changes: 11 additions & 9 deletions src/collective/contact/plonegroup/browser/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
from collective.contact.plonegroup.interfaces import IOrganizationField
from collective.contact.plonegroup.utils import get_organization
from collective.contact.plonegroup.utils import get_plone_group_id
from collective.z3cform.datagridfield import DataGridField
from collective.z3cform.datagridfield import DictRow
from collective.z3cform.datagridfield.datagridfield import DataGridFieldWidget
from collective.z3cform.datagridfield.row import DictRow
from imio.helpers.security import fplog
from operator import methodcaller
from plone import api
Expand All @@ -26,38 +26,40 @@
from zExceptions import Redirect
from zope import schema
from zope.component import getUtility
from zope.interface import implements
from zope.interface import implementer
from zope.interface import Interface
from zope.schema._bootstrapinterfaces import RequiredMissing
from zope.schema.interfaces import IVocabularyFactory


@implementer(IDGFListField)
class DGFListField(schema.List):
implements(IDGFListField)
""""""


def dgf_list_widget(field, request):
return FieldWidget(field, DataGridField(request))
return FieldWidget(field, DataGridFieldWidget(request))


@implementer(IGroupField)
class GroupField(schema.Choice):
implements(IGroupField)

def __init__(self, *args, **kwargs):
kwargs['vocabulary'] = u''
super(GroupField, self).__init__(*args, **kwargs)


@implementer(IOrganizationField)
class OrganizationField(schema.Choice):
implements(IOrganizationField)

def __init__(self, *args, **kwargs):
kwargs['vocabulary'] = u''
super(OrganizationField, self).__init__(*args, **kwargs)


@implementer(IDGFVocabularyField)
class DGFVocabularyField(schema.Choice):
implements(IDGFVocabularyField)
""""""


class IGroupsUsers(Interface):
Expand Down Expand Up @@ -164,7 +166,7 @@ def get_manageable_functions(self):
for fct in get_registry_functions(as_copy=False):
if fct['fct_management']:
self.functions[fct['fct_id']] = fct['fct_title']
return self.functions.keys()
return list(self.functions.keys())

def get_user_manageable_functions(self):
""" get user manageable functions """
Expand Down
27 changes: 15 additions & 12 deletions src/collective/contact/plonegroup/subscribers.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
from collective.contact.plonegroup.config import get_registry_organizations
from collective.contact.plonegroup.interfaces import IPloneGroupContactChecks
from collective.contact.plonegroup.utils import get_all_suffixes
from config import PLONEGROUP_ORG
from interfaces import INotPloneGroupContact
from interfaces import IPloneGroupContact
from .config import PLONEGROUP_ORG
from .interfaces import INotPloneGroupContact
from .interfaces import IPloneGroupContact
from plone import api
from plone.app.linkintegrity.handlers import referencedObjectRemoved as baseReferencedObjectRemoved
from plone.app.linkintegrity.interfaces import ILinkIntegrityInfo
# from plone.app.linkintegrity.handlers import referencedObjectRemoved as baseReferencedObjectRemoved # MIGRATION-PLONE6
# from plone.app.linkintegrity.interfaces import ILinkIntegrityInfo # MIGRATION-PLONE6
from plone.behavior.interfaces import IBehavior
from plone.dexterity.interfaces import IDexterityContent
from plone.dexterity.interfaces import IDexterityFTI
Expand All @@ -22,7 +22,7 @@
from zope.component import getMultiAdapter
from zope.component import getUtility
from zope.interface import alsoProvides
from zope.interface import implements
from zope.interface import implementer
from zope.interface import Interface
from zope.interface import noLongerProvides
from zope.lifecycleevent.interfaces import IObjectRemovedEvent
Expand All @@ -39,8 +39,8 @@ class IReferenceable(Interface):
pass


@implementer(IPloneGroupContactChecks)
class PloneGroupContactChecksAdapter(object):
implements(IPloneGroupContactChecks)
adapts(IPloneGroupContact)

def __init__(self, context):
Expand Down Expand Up @@ -75,7 +75,8 @@ def search_value_in_objects(s_obj, ref, p_types=[], type_fields={}):
# When deleting site, the portal is no more found...
return

storage = ILinkIntegrityInfo(request)
# storage = ILinkIntegrityInfo(request) # MIGRATION-PLONE6
storage = None

def list_fields(ptype, filter_interfaces=(IText, ICollection, IChoice)):
""" return for the portal_type the selected fields """
Expand All @@ -98,14 +99,14 @@ def list_fields(ptype, filter_interfaces=(IText, ICollection, IChoice)):
return type_fields[ptype]

def check_value(val):
if isinstance(val, basestring) and val == ref:
if isinstance(val, str) and val == ref:
return True
return False

def check_attribute(val):
""" check the attribute value and walk in it """
if isinstance(val, dict):
for v in val.values():
for v in list(val.values()):
res = check_attribute(v)
if res:
return res
Expand Down Expand Up @@ -151,7 +152,8 @@ def plonegroupOrganizationRemoved(del_obj, event):

def referencedObjectRemoved(obj, event):
if not IReferenceable.providedBy(obj):
baseReferencedObjectRemoved(obj, event)
pass
# baseReferencedObjectRemoved(obj, event) # MIGRATION-PLONE6


def plonegroup_contact_transition(contact, event):
Expand All @@ -167,7 +169,8 @@ def plonegroup_contact_transition(contact, event):
elif pp.site_properties.enable_link_integrity_checks:
adapted = IPloneGroupContactChecks(contact)
adapted.check_items_on_transition()
storage = ILinkIntegrityInfo(contact.REQUEST)
# storage = ILinkIntegrityInfo(contact.REQUEST) # MIGRATION-PLONE6
storage = None
breaches = storage.getIntegrityBreaches()
if contact in breaches:
errors.append(_("This contact is used in following content: ${items}",
Expand Down
2 changes: 1 addition & 1 deletion src/collective/contact/plonegroup/subscribers.zcml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

<subscriber
for=".interfaces.IPloneGroupContact
zope.app.container.interfaces.IObjectMovedEvent"
zope.lifecycleevent.interfaces.IObjectMovedEvent"
handler=".browser.settings.adaptPloneGroupDefinition"
/>

Expand Down
10 changes: 5 additions & 5 deletions src/collective/contact/plonegroup/tests/test_behaviors.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,18 +66,18 @@ def test_PrimaryOrganizationsVocabulary(self):
api.group.create(groupname='{}_director'.format(self.directory['department3'].UID()))
api.group.add_user(groupname='{}_director'.format(self.directory['department3'].UID()), username=TEST_USER_ID)
voc_dic = voc(self, userid=TEST_USER_ID).by_token
self.assertSetEqual(set([voc_dic[key].title for key in voc_dic.keys()]), {'Department 1', 'Department 2'})
self.assertSetEqual(set([voc_dic[key].title for key in list(voc_dic.keys())]), {'Department 1', 'Department 2'})
# not all suffixes
voc_dic = voc(self, userid=TEST_USER_ID, suffixes=['director']).by_token
self.assertSetEqual(set([voc_dic[key].title for key in voc_dic.keys()]), {'Department 1'})
self.assertSetEqual(set([voc_dic[key].title for key in list(voc_dic.keys())]), {'Department 1'})
voc_dic = voc(self, userid=TEST_USER_ID, suffixes=['worker']).by_token
self.assertSetEqual(set([voc_dic[key].title for key in voc_dic.keys()]), {'Department 2'})
self.assertSetEqual(set([voc_dic[key].title for key in list(voc_dic.keys())]), {'Department 2'})
# other base vocabulary
voc_dic = voc(self, userid=TEST_USER_ID, suffixes=['director'],
base_voc='collective.contact.plonegroup.every_organizations').by_token
self.assertSetEqual(set([voc_dic[key].title for key in voc_dic.keys()]),
self.assertSetEqual(set([voc_dic[key].title for key in list(voc_dic.keys())]),
{'Department 3', u'My organization - Department 1'})
# other base vocabulary and all suffixes
voc_dic = voc(self, userid=TEST_USER_ID, base_voc='collective.contact.plonegroup.every_organizations').by_token
self.assertSetEqual(set([voc_dic[key].title for key in voc_dic.keys()]),
self.assertSetEqual(set([voc_dic[key].title for key in list(voc_dic.keys())]),
{'Department 3', u'My organization - Department 1', u'My organization - Department 2'})
38 changes: 19 additions & 19 deletions src/collective/contact/plonegroup/tests/test_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ def test_OwnOrganizationServicesVocabulary(self):
""" Test vocabulary """
services = getUtility(IVocabularyFactory, name=u'collective.contact.plonegroup.organization_services')
voc_dic = services(self).by_token
voc_list = [voc_dic[key].title for key in voc_dic.keys()]
voc_list = [voc_dic[key].title for key in list(voc_dic.keys())]
self.assertSetEqual(set(voc_list), set(['Department 1 - Service 1', 'Department 1', 'Department 2']))
self.assertNotIn('Inactive department', voc_list)
# When multiple own organizations
Expand All @@ -67,7 +67,7 @@ def test_OwnOrganizationServicesVocabulary(self):
'organization', PLONEGROUP_ORG, title='Duplicated organization')
services = getUtility(IVocabularyFactory, name=u'collective.contact.plonegroup.organization_services')
voc_dic = services(self).by_token
voc_list = [voc_dic[key].title for key in voc_dic.keys()]
voc_list = [voc_dic[key].title for key in list(voc_dic.keys())]
self.assertEqual(len(voc_list), 1)
self.assertEqual(
translate(voc_list[0]),
Expand All @@ -77,7 +77,7 @@ def test_OwnOrganizationServicesVocabulary(self):
self.portal[DEFAULT_DIRECTORY_ID].manage_delObjects(ids=[PLONEGROUP_ORG])
services = getUtility(IVocabularyFactory, name=u'collective.contact.plonegroup.organization_services')
voc_dic = services(self).by_token
voc_list = [voc_dic[key].title for key in voc_dic.keys()]
voc_list = [voc_dic[key].title for key in list(voc_dic.keys())]
self.assertEqual(len(voc_list), 1)
self.assertEqual(
translate(voc_list[0]),
Expand All @@ -91,9 +91,9 @@ def test_detectContactPlonegroupChange(self):
self.assertIn('%s_director' % uid, group_ids)
self.assertIn('%s_worker' % uid, group_ids)
d1_d_group = api.group.get(groupname='%s_director' % organizations[0])
self.assertEquals(d1_d_group.getProperty('title'), 'Department 1 (Director)')
self.assertEqual(d1_d_group.getProperty('title'), 'Department 1 (Director)')
d1s1_d_group = api.group.get(groupname='%s_director' % organizations[1])
self.assertEquals(d1s1_d_group.getProperty('title'), 'Department 1 - Service 1 (Director)')
self.assertEqual(d1s1_d_group.getProperty('title'), 'Department 1 - Service 1 (Director)')
# Changing function title
set_registry_functions([{'fct_title': u'Directors',
'fct_id': u'director',
Expand All @@ -106,9 +106,9 @@ def test_detectContactPlonegroupChange(self):
'fct_management': False,
'enabled': True}])
d1_d_group = api.group.get(groupname='%s_director' % organizations[0])
self.assertEquals(d1_d_group.getProperty('title'), 'Department 1 (Directors)')
self.assertEqual(d1_d_group.getProperty('title'), 'Department 1 (Directors)')
d1s1_d_group = api.group.get(groupname='%s_director' % organizations[1])
self.assertEquals(d1s1_d_group.getProperty('title'), 'Department 1 - Service 1 (Directors)')
self.assertEqual(d1s1_d_group.getProperty('title'), 'Department 1 - Service 1 (Directors)')
# Adding new organization
own_orga = get_own_organization()
own_orga['department2'].invokeFactory('organization', 'service2', title='Service 2')
Expand All @@ -127,7 +127,7 @@ def test_detectContactPlonegroupChange(self):
'enabled': True}]
set_registry_functions(newValue)
group_ids = [group.id for group in api.group.get_groups() if '_' in group.id]
self.assertEquals(len(group_ids), 12)
self.assertEqual(len(group_ids), 12)
for uid in get_registry_organizations():
self.assertIn('%s_director' % uid, group_ids)
self.assertIn('%s_chief' % uid, group_ids)
Expand Down Expand Up @@ -200,15 +200,15 @@ def test_detectContactPlonegroupChangeSelectOrgs(self):
self.assertTrue(api.group.get(dep2_plone_group_id))
# Changing function title
dep1_plone_group = api.group.get(dep1_plone_group_id)
self.assertEquals(dep1_plone_group.getProperty('title'), 'Department 1 (Director)')
self.assertEqual(dep1_plone_group.getProperty('title'), 'Department 1 (Director)')
dep2_plone_group = api.group.get(dep2_plone_group_id)
self.assertEquals(dep2_plone_group.getProperty('title'), 'Department 2 (Director)')
self.assertEqual(dep2_plone_group.getProperty('title'), 'Department 2 (Director)')
functions[0]['fct_title'] = u'New title'
set_registry_functions(functions)
dep1_plone_group = api.group.get(dep1_plone_group_id)
self.assertEquals(dep1_plone_group.getProperty('title'), 'Department 1 (New title)')
self.assertEqual(dep1_plone_group.getProperty('title'), 'Department 1 (New title)')
dep2_plone_group = api.group.get(dep2_plone_group_id)
self.assertEquals(dep2_plone_group.getProperty('title'), 'Department 2 (New title)')
self.assertEqual(dep2_plone_group.getProperty('title'), 'Department 2 (New title)')

def test_validateSettingsRemoveFunction(self):
"""A function may only be removed if every linked Plone groups are empty."""
Expand Down Expand Up @@ -305,15 +305,15 @@ def test_adaptPloneGroupDefinition(self):
own_orga['department1'].title = 'Department 1 changed'
event.notify(ObjectModifiedEvent(own_orga['department1']))
d1_d_group = api.group.get(groupname='%s_director' % organizations[0])
self.assertEquals(d1_d_group.getProperty('title'), 'Department 1 changed (Director)')
self.assertEqual(d1_d_group.getProperty('title'), 'Department 1 changed (Director)')
d1s1_d_group = api.group.get(groupname='%s_director' % organizations[1])
self.assertEquals(d1s1_d_group.getProperty('title'), 'Department 1 changed - Service 1 (Director)')
self.assertEqual(d1s1_d_group.getProperty('title'), 'Department 1 changed - Service 1 (Director)')
# an organization is moved (service1 in department2)
clipboard = own_orga['department1'].manage_cutObjects(['service1'])
own_orga['department2'].manage_pasteObjects(clipboard)
# the event IObjectMovedEvent is triggered
d1s1_d_group = api.group.get(groupname='%s_director' % organizations[1])
self.assertEquals(d1s1_d_group.getProperty('title'), 'Department 2 - Service 1 (Director)')
self.assertEqual(d1s1_d_group.getProperty('title'), 'Department 2 - Service 1 (Director)')
# a configured organization is deleted. Exception raised
self.assertRaises(Redirect, own_orga['department2'].manage_delObjects, ids=['service1'])
# THIS IS A KNOWN ERROR: the organization is deleted despite the exception !!!!!!!
Expand Down Expand Up @@ -372,14 +372,14 @@ def test_selectedOrganizationsPloneGroupsVocabulary(self):
""" Test plone groups vocabulary """
groups = settings.selectedOrganizationsPloneGroupsVocabulary()
voc_dic = groups.by_token
voc_list = [voc_dic[key].title for key in voc_dic.keys()]
self.assertEquals(set(voc_list), set(['Department 1 - Service 1 (Director)', 'Department 2 (Worker)',
voc_list = [voc_dic[key].title for key in list(voc_dic.keys())]
self.assertEqual(set(voc_list), set(['Department 1 - Service 1 (Director)', 'Department 2 (Worker)',
'Department 1 - Service 1 (Worker)', 'Department 1 (Worker)',
'Department 2 (Director)', 'Department 1 (Director)']))
groups = settings.selectedOrganizationsPloneGroupsVocabulary(functions=['worker'], group_title=False)
voc_dic = groups.by_token
voc_list = [voc_dic[key].title for key in voc_dic.keys()]
self.assertEquals(set(voc_list), set(['Department 2', 'Department 1', 'Department 1 - Service 1']))
voc_list = [voc_dic[key].title for key in list(voc_dic.keys())]
self.assertEqual(set(voc_list), set(['Department 2', 'Department 1', 'Department 1 - Service 1']))

def test_selectedOrganizationsVocabulary(self):
""" Test registry vocabulary """
Expand Down
Loading

0 comments on commit 65697e9

Please sign in to comment.