Work in progress: Python3 fixes for loops.organize

This commit is contained in:
Helmut Merz 2024-09-25 17:05:57 +02:00
parent 509000a996
commit 04a9d9ced0
12 changed files with 109 additions and 252 deletions

View file

@ -1,29 +1,12 @@
#
# Copyright (c) 2016 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# loops.expert.browser.report
"""
View classes for reporting.
""" View classes for reporting.
"""
from logging import getLogger
from urllib import urlencode
from urllib.parse import urlencode
from zope import interface, component
from zope.app.pagetemplate import ViewPageTemplateFile
from zope.browserpage import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy
from zope.traversing.api import getName, getParent

View file

@ -150,8 +150,8 @@ For testing, we first have to provide the needed utilities and settings
>>> auth = PrincipalRegistry()
>>> component.provideUtility(auth, IAuthentication)
>>> from zope.app.principalannotation.interfaces import IPrincipalAnnotationUtility
>>> from zope.app.principalannotation import PrincipalAnnotationUtility
>>> from zope.principalannotation.interfaces import IPrincipalAnnotationUtility
>>> from zope.principalannotation.utility import PrincipalAnnotationUtility
>>> principalAnnotations = PrincipalAnnotationUtility()
>>> component.provideUtility(principalAnnotations, IPrincipalAnnotationUtility)

View file

@ -32,7 +32,7 @@ ZCML setup):
>>> from loops.concept import Concept
>>> from loops.setup import addAndConfigureObject
>>> johnC = addAndConfigureObject(concepts, Concept, 'john', title=u'John',
>>> johnC = addAndConfigureObject(concepts, Concept, 'john', title='John',
... conceptType=person)
@ -45,10 +45,10 @@ The classes used in this package are just adapters to IConcept.
>>> john = IPerson(johnC)
>>> john.title
u'John'
>>> john.firstName = u'John'
'John'
>>> john.firstName = 'John'
>>> johnC._firstName
u'John'
'John'
>>> john.lastName is None
True
>>> john.someOtherAttribute
@ -76,7 +76,7 @@ For testing, we first have to provide the needed utilities and settings
>>> auth = setupData.auth
>>> principalAnnotations = setupData.principalAnnotations
>>> principal = auth.definePrincipal('users.john', u'John', login='john')
>>> principal = auth.definePrincipal('users.john', 'John', login='john')
>>> john.userId = 'users.john'
>>> annotations = principalAnnotations.getAnnotationsById('users.john')
@ -86,7 +86,7 @@ For testing, we first have to provide the needed utilities and settings
Change a userId assignment:
>>> principal = auth.definePrincipal('users.johnny', u'Johnny', login='johnny')
>>> principal = auth.definePrincipal('users.johnny', 'Johnny', login='johnny')
>>> john.userId = 'users.johnny'
>>> annotations = principalAnnotations.getAnnotationsById('users.johnny')
@ -127,13 +127,13 @@ principal annotation:
If we try to assign a userId of a principal that already has a person
concept assigned we should get an error:
>>> johnC = concepts['john'] = Concept(u'John')
>>> johnC = concepts['john'] = Concept('John')
>>> johnC.conceptType = person
>>> john = IPerson(johnC)
>>> john.userId = 'users.john'
>>> john.email = 'john@loopz.org'
>>> marthaC = concepts['martha'] = Concept(u'Martha')
>>> marthaC = concepts['martha'] = Concept('Martha')
>>> marthaC.conceptType = person
>>> martha = IPerson(marthaC)
@ -150,15 +150,15 @@ The member registration needs the whole pluggable authentication stuff
with a principal folder:
>>> from zope.app.appsetup.bootstrap import ensureUtility
>>> from zope.app.authentication.authentication import PluggableAuthentication
>>> from zope.app.security.interfaces import IAuthentication
>>> from zope.pluggableauth import PluggableAuthentication
>>> from zope.authentication.interfaces import IAuthentication
>>> ensureUtility(site, IAuthentication, '', PluggableAuthentication,
... copy_to_zlog=False)
<...PluggableAuthentication...>
>>> pau = component.getUtility(IAuthentication, context=site)
>>> from zope.app.authentication.principalfolder import PrincipalFolder
>>> from zope.app.authentication.interfaces import IAuthenticatorPlugin
>>> from zope.pluggableauth.plugins.principalfolder import PrincipalFolder
>>> from zope.pluggableauth.interfaces import IAuthenticatorPlugin
>>> pFolder = PrincipalFolder('loops.')
>>> pau['loops'] = pFolder
>>> pau.authenticatorPlugins = ('loops',)
@ -179,12 +179,12 @@ sure that a principal object can be served by a corresponding factory):
>>> from zope.app.authentication.principalfolder import FoundPrincipalFactory
>>> component.provideAdapter(FoundPrincipalFactory)
>>> data = {'loginName': u'newuser',
... 'password': u'quack',
... 'passwordConfirm': u'quack',
... 'lastName': u'Sawyer',
... 'firstName': u'Tom',
... 'email': u'tommy@sawyer.com',
>>> data = {'loginName': 'newuser',
... 'password': 'quack',
... 'passwordConfirm': 'quack',
... 'lastName': 'Sawyer',
... 'firstName': 'Tom',
... 'email': 'tommy@sawyer.com',
... 'form.action': 'update',}
and register it.
@ -200,19 +200,19 @@ and register it.
>>> person = concepts['person.newuser']
>>> pa = adapted(person)
>>> pa.lastName, pa.userId
(u'Sawyer', u'loops.newuser')
('Sawyer', 'loops.newuser')
Now we can also retrieve it from the authentication utility:
>>> pau.getPrincipal('loops.newuser').title
u'Tom Sawyer'
'Tom Sawyer'
Change Password
---------------
>>> data = {'oldPassword': u'tiger',
... 'password': u'lion',
... 'passwordConfirm': u'lion',
>>> data = {'oldPassword': 'tiger',
... 'password': 'lion',
... 'passwordConfirm': 'lion',
... 'action': 'update'}
>>> request = TestRequest(form=data)
@ -235,7 +235,7 @@ Invalidates the user account by generating a new password. A mail ist sent to
the email address of the person with a link for re-activating the account
and enter a new password.
>>> data = {'loginName': u'dummy',
>>> data = {'loginName': 'dummy',
... 'action': 'update'}
>>> request = TestRequest(form=data)
@ -257,14 +257,14 @@ store a persistent (internal) principal object.
>>> pau['persons'] = pbAuth
>>> pau.authenticatorPlugins = ('loops', 'persons',)
>>> eddieC = addAndConfigureObject(concepts, Concept, 'eddie', title=u'Eddie',
>>> eddieC = addAndConfigureObject(concepts, Concept, 'eddie', title='Eddie',
... conceptType=person)
>>> eddie = adapted(eddieC)
>>> eddie.userId = 'persons.eddie'
>>> pbAuth.setPassword('eddie', 'secret')
>>> pbAuth.authenticateCredentials(dict(login='eddie', password='secret'))
PrincipalInfo(u'persons.eddie')
PrincipalInfo('persons.eddie')
Security
@ -275,7 +275,7 @@ Automatic security settings on persons
>>> from zope.traversing.api import getName
>>> list(sorted(getName(c) for c in concepts['person'].getChildren()))
[u'jim', u'john', u'martha', u'person.newuser']
['jim', 'john', 'martha', 'person.newuser']
Person objects that have a user assigned to them receive this user
(principal) as their owner.
@ -284,7 +284,7 @@ Person objects that have a user assigned to them receive this user
>>> IPrincipalRoleMap(concepts['john']).getPrincipalsAndRoles()
[('loops.Person', 'users.john', PermissionSetting: Allow)]
>>> IPrincipalRoleMap(concepts['person.newuser']).getPrincipalsAndRoles()
[('loops.Person', u'loops.newuser', PermissionSetting: Allow)]
[('loops.Person', 'loops.newuser', PermissionSetting: Allow)]
The person ``martha`` hasn't got a user id, so there is no role assigned
to it.
@ -299,7 +299,7 @@ We also need an interaction with a participation based on the principal
whose permissions we want to check.
>>> from zope.app.authentication.principalfolder import Principal
>>> pJohn = Principal('users.john', 'xxx', u'John')
>>> pJohn = Principal('users.john', 'xxx', 'John')
>>> from loops.tests.auth import login
>>> login(pJohn)
@ -335,7 +335,7 @@ So let's try with another user with another role setting.
>>> principalRoles.assignRoleToPrincipal('loops.Staff', 'users.martha')
>>> principalRoles.assignRoleToPrincipal('zope.Member', 'users.martha')
>>> pMartha = Principal('users.martha', 'xxx', u'Martha')
>>> pMartha = Principal('users.martha', 'xxx', 'Martha')
>>> login(pMartha)
>>> canAccess(john, 'title')
@ -364,14 +364,14 @@ Task view with edit action
--------------------------
>>> from loops.organize.interfaces import ITask
>>> task = addAndConfigureObject(concepts, Concept, 'task', title=u'Task',
>>> task = addAndConfigureObject(concepts, Concept, 'task', title='Task',
... conceptType=type, typeInterface=ITask)
>>> from loops.organize.task import Task
>>> component.provideAdapter(Task)
>>> task01 = addAndConfigureObject(concepts, Concept, 'task01',
... title=u'Task #1', conceptType=task)
... title='Task #1', conceptType=task)
>>> from loops.organize.browser.task import TaskView
>>> view = TaskView(task01, TestRequest())
@ -389,21 +389,22 @@ but has to be entered as a type option.
Events listing
--------------
>>> event = addAndConfigureObject(concepts, Concept, 'event', title=u'Event',
>>> event = addAndConfigureObject(concepts, Concept, 'event', title='Event',
... conceptType=type, typeInterface=ITask)
>>> event01 = addAndConfigureObject(concepts, Concept, 'event01',
... title=u'Event #1', conceptType=event,
... title='Event #1', conceptType=event,
... )
>>> from loops.organize.browser.event import Events
>>> events = addAndConfigureObject(concepts, Concept, 'events', title=u'Events',
>>> events = addAndConfigureObject(concepts, Concept, 'events', title='Events',
... conceptType=concepts['query'])
>>> listing = Events(events, TestRequest())
>>> listing.getActions('portlet')
[<loops.browser.action.DialogAction ...>]
>>> from loops.config.base import QueryOptions
>>> component.provideAdapter(QueryOptions)
>>> from cybertools.meta.interfaces import IOptions
>>> component.provideAdapter(QueryOptions, provides=IOptions)
>>> list(listing.events())
[<loops.browser.concept.ConceptRelationView ...>]
@ -422,12 +423,15 @@ Send Email to Members
>>> from loops.organize.browser.party import SendEmailForm
>>> form = SendEmailForm(menu, TestRequest())
>>> form.members
[{'object': <...Person...>, 'email': 'john@loopz.org', 'title': u'John'},
{'object': <...Person...>, 'email': u'tommy@sawyer.com', 'title': u'Tom Sawyer'}]
[{'title': 'John', ...}, {'title': 'Tom Sawyer', ...}]
[{'object': <...Person...>, 'email': 'john@loopz.org', 'title': 'John'},
{'object': <...Person...>, 'email': 'tommy@sawyer.com', 'title': 'Tom Sawyer'}]
>>> form.subject
u"loops Notification from '$site'"
"loops Notification from '$site'"
>>> form.mailBody
u'\n\nEvent #1\nhttp://127.0.0.1/loops/views/menu/.118\n\n'
'\n\nEvent #1\nhttp://127.0.0.1/loops/views/menu/.118\n\n'
Show Presence of Other Users
@ -453,7 +457,7 @@ may be chosen from an arbitrary list.)
>>> from loops.organize.interfaces import IHasRole
>>> predicate = concepts['predicate']
>>> hasRole = addAndConfigureObject(concepts, Concept, 'hasrole',
... title=u'has Role',
... title='has Role',
... conceptType=predicate, predicateInterface=IHasRole)
Let's now assign john to task01 and have a look at the relation created.

View file

@ -1,36 +1,17 @@
#
# Copyright (c) 2009 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# loops.organize.auth
"""
Specialized authentication components.
$Id$
""" Specialized authentication components.
"""
from persistent import Persistent
from zope.app.container.contained import Contained
from zope.authentication.interfaces import IAuthentication
from zope.container.contained import Contained
from zope import component
from zope.interface import Interface, implements
from zope.app.authentication.interfaces import IAuthenticatorPlugin
from zope.app.authentication.principalfolder import IInternalPrincipal
from zope.app.authentication.principalfolder import PrincipalInfo
from zope.app.principalannotation.interfaces import IPrincipalAnnotationUtility
from zope.app.security.interfaces import IAuthentication
from zope.interface import Interface, implementer
from zope.pluggableauth.factories import PrincipalInfo
from zope.pluggableauth.interfaces import IAuthenticatorPlugin
from zope.pluggableauth.plugins.principalfolder import IInternalPrincipal
from zope.principalannotation.interfaces import IPrincipalAnnotationUtility
from zope import schema
from zope.traversing.api import getParent
@ -52,15 +33,14 @@ class IPersonBasedAuthenticator(Interface):
readonly=True)
@implementer(IAuthenticatorPlugin, IPersonBasedAuthenticator)
class PersonBasedAuthenticator(Persistent, Contained):
implements(IAuthenticatorPlugin, IPersonBasedAuthenticator)
passwordKey = 'loops.organize.password'
ignoreCase = True
def __init__(self, prefix=''):
self.prefix = unicode(prefix)
self.prefix = prefix
def authenticateCredentials(self, credentials):
if not isinstance(credentials, dict):

View file

@ -1,31 +1,14 @@
#
# Copyright (c) 2012 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# loops.organize.browser.event
"""
Definition of view classes and other browser related stuff for tasks.
""" Definition of view classes and other browser related stuff for tasks.
"""
import calendar
from datetime import date, datetime, timedelta
from urllib import urlencode
from zope.app.container.interfaces import INameChooser
from zope.app.pagetemplate import ViewPageTemplateFile
from urllib.parse import urlencode
from zope.browserpage import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy
from zope.container.interfaces import INameChooser
from zope import interface, component
from zope.traversing.api import getName

View file

@ -1,36 +1,19 @@
#
# Copyright (c) 2015 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# loops.organize.browser.member
"""
Definition of view classes and other browser related stuff for
""" Definition of view classes and other browser related stuff for
members (persons).
"""
from datetime import datetime
from email.MIMEText import MIMEText
from email.mime.text import MIMEText
from zope import interface, component
from zope.app.authentication.principalfolder import InternalPrincipal
from zope.app.authentication.principalfolder import PrincipalInfo
from zope.app.form.browser.textwidgets import PasswordWidget as BasePasswordWidget
from zope.app.pagetemplate import ViewPageTemplateFile
from zope.app.principalannotation import annotations
from zope.browserpage import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy
from zope.i18nmessageid import MessageFactory
from zope.principalannotation.utility import annotations
from zope.security import checkPermission
from zope.sendmail.interfaces import IMailDelivery
from zope.traversing.browser import absoluteURL
@ -249,7 +232,7 @@ class SecureMemberRegistration(BaseMemberRegistration, CreateForm):
result = regMan.register(login, pw,
form.get('lastName'), form.get('firstName'),
email=email,)
except ValueError, e:
except ValueError:
fi = formState.fieldInstances['loginName']
fi.setError('duplicate_loginname', self.formErrors)
formState.severity = max(formState.severity, fi.severity)
@ -505,7 +488,7 @@ class FixPersonRoles(object):
for p in concepts['person'].getChildren([concepts['hasType']]):
person = adapted(p)
userId = person.userId
print '***', userId
print('***', userId)
person.userId = userId
return 'blubb'

View file

@ -1,29 +1,12 @@
#
# Copyright (c) 2016 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# loops.organize.browser.party
"""
Definition of view classes and other browser related stuff (e.g. actions) for
""" Definition of view classes and other browser related stuff (e.g. actions) for
loops.organize.party.
"""
from email.MIMEText import MIMEText
from email.mime.text import MIMEText
from zope import interface, component
from zope.app.pagetemplate import ViewPageTemplateFile
from zope.browserpage import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy
from zope.dublincore.interfaces import IZopeDublinCore
from zope.sendmail.interfaces import IMailDelivery

View file

@ -1,40 +1,22 @@
#
# Copyright (c) 2015 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# loops.organize.member
"""
Member registration adapter(s).
""" Member registration adapter(s).
"""
from zope import interface, component, schema
from zope.app.component import queryNextUtility
from zope.app.container.interfaces import INameChooser
from zope.authentication.interfaces import IAuthentication, PrincipalLookupError
from zope.cachedescriptors.property import Lazy
from zope.component import adapts, queryNextUtility
from zope.container.interfaces import INameChooser
from zope.cachedescriptors.property import Lazy
from zope.component import adapts
from zope.interface import implements
from zope.app.authentication.interfaces import IPluggableAuthentication
from zope.app.authentication.interfaces import IAuthenticatorPlugin
from zope.app.authentication.principalfolder import IInternalPrincipal
from zope.app.authentication.principalfolder import InternalPrincipal
from zope.lifecycleevent import ObjectCreatedEvent, ObjectModifiedEvent
from zope.app.security.interfaces import IAuthentication, PrincipalLookupError
from zope.event import notify
from zope.i18nmessageid import MessageFactory
from zope.cachedescriptors.property import Lazy
from zope.interface import implementer
from zope.lifecycleevent import ObjectCreatedEvent, ObjectModifiedEvent
from zope.pluggableauth.interfaces import IPluggableAuthentication
from zope.pluggableauth.interfaces import IAuthenticatorPlugin
from zope.pluggableauth.plugins.principalfolder import IInternalPrincipal
from zope.pluggableauth.plugins.principalfolder import InternalPrincipal
from cybertools.meta.interfaces import IOptions
from cybertools.typology.interfaces import IType
@ -49,9 +31,9 @@ from loops.type import getOptionsDict
from loops.util import _
@implementer(IMemberRegistrationManager)
class MemberRegistrationManager(object):
implements(IMemberRegistrationManager)
adapts(ILoops)
person_typeName = 'person'

View file

@ -1,30 +1,11 @@
#
# Copyright (c) 2009 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# loops.organize.presence
"""
Utility for collecting information about logged-in/active users.
""" Utility for collecting information about logged-in/active users.
Author: Hannes Plattner.
$Id$
"""
from zope.interface import implements
from zope.interface import implementer
from zope.cachedescriptors.property import Lazy
from cybertools.meta.interfaces import IOptions
@ -34,10 +15,9 @@ from loops.organize.party import getPersonForUser
from loops.organize import util
@implementer(IPresence)
class Presence(object):
implements(IPresence)
def __init__(self, min_until_logout=10, presentUsers=None):
self.min_until_logout = min_until_logout
self.presentUsers = presentUsers or {}

View file

@ -1,29 +1,7 @@
#
# Copyright (c) 2006 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# loops.organize.setup
""" Automatic setup of a loops site for the organize package.
"""
Automatic setup of a loops site for the organize package.
$Id$
"""
from zope.component import adapts
from zope.interface import implements, Interface
from loops.concept import Concept
from loops.interfaces import ITypeConcept

View file

@ -4,17 +4,17 @@ from zope.interface.verify import verifyClass
from zope import component
from zope.app.appsetup.bootstrap import ensureUtility
from zope.app.authentication.authentication import PluggableAuthentication
from zope.app.authentication.interfaces import IAuthenticatorPlugin
from zope.app.authentication.principalfolder import FoundPrincipalFactory
from zope.app.authentication.principalfolder import InternalPrincipal
from zope.app.authentication.principalfolder import Principal
from zope.app.authentication.principalfolder import PrincipalFolder
from zope.app.principalannotation import PrincipalAnnotationUtility
from zope.app.principalannotation import annotations
from zope.app.principalannotation.interfaces import IPrincipalAnnotationUtility
from zope.app.security.interfaces import IAuthentication
from zope.app.security.principalregistry import PrincipalRegistry
from zope.authentication.interfaces import IAuthentication
from zope.pluggableauth import PluggableAuthentication
from zope.pluggableauth.interfaces import IAuthenticatorPlugin
from zope.pluggableauth.factories import FoundPrincipalFactory
from zope.pluggableauth.factories import Principal
from zope.pluggableauth.plugins.principalfolder import InternalPrincipal
from zope.pluggableauth.plugins.principalfolder import PrincipalFolder
from zope.principalannotation.utility import PrincipalAnnotationUtility
from zope.principalannotation.utility import annotations
from zope.principalannotation.interfaces import IPrincipalAnnotationUtility
from zope.principalregistry.principalregistry import PrincipalRegistry
from zope.securitypolicy.interfaces import IRolePermissionManager
from zope.securitypolicy.interfaces import IPrincipalRoleManager

View file

@ -16,6 +16,7 @@ dependencies = [
"py-scopes",
"markdown",
"python-dotenv",
"zope.app.appsetup",
"zope.app.authentication",
"zope.app.exception",
"zope.app.renderer",