[zopeorg-checkins] CVS: Products/ZopeOrg-NV - ZopeOrgMemberDataTool.py:1.4 ZopeOrgMembershipTool.py:1.6 __init__.py:1.32

Jens Vagelpohl jens at zope.com
Fri Aug 8 10:35:45 EDT 2003


Update of /cvs-zopeorg/Products/ZopeOrg-NV
In directory cvs.zope.org:/tmp/cvs-serv572

Modified Files:
	__init__.py 
Added Files:
	ZopeOrgMemberDataTool.py ZopeOrgMembershipTool.py 
Log Message:
- new day, new CMF tools



=== Products/ZopeOrg-NV/ZopeOrgMemberDataTool.py 1.3 => 1.4 ===
+#####################################################################
+#
+# ZopeOrgMemberDataTool       LDAP-enabled CMF Memberdata Tool
+#
+# This software is governed by a license. See
+# LICENSE.txt for the terms of this license.
+#
+#####################################################################
+__version__='$Revision$'[11:-2]
+
+
+from Products.CMFCore.utils import getToolByName
+from Products.CMFLDAP.LDAPMemberDataTool import LDAPMemberDataTool
+from Products.CMFLDAP.LDAPMemberDataTool import LDAPMemberData
+from Globals import Acquisition, InitializeClass, DTMLFile
+from Acquisition import aq_base
+from ZPublisher.Converters import type_converters
+from AccessControl import ClassSecurityInfo
+from time import strftime, localtime, time
+import string, re
+
+_marker=[]
+
+
+class ZopeOrgMemberData( LDAPMemberData ):
+    security = ClassSecurityInfo()
+
+    def __init__( self, tool, id ):
+        self.id = id
+        # Make a temporary reference to the tool.
+        # The reference will be removed by notifyModified().
+        self._tool = tool
+
+
+    def getProperty( self, id, default=_marker ):
+        """ Need to "defuse" the exception-happy standard implementation"""
+        try:
+            inherited_method = ZopeOrgMemberData.inheritedAttribute( 'getProperty' )
+            prop_val = apply( inherited_method, ( self, id, default ) )
+        except:
+            prop_val = ''
+
+        return prop_val
+
+
+    security.declarePrivate('setLastLogin')
+    def setLastLogin( self ):
+        """ Reset my last login times """
+        user_obj = self.getUser()
+        user_dn = user_obj.getUserDN()
+        acl_manager = self.acl_users
+
+        last_login = user_obj.getProperty('lastLogin') or '20000101000000Z'
+        acl_manager.manage_setUserProperty( user_dn = user_dn
+                                          , prop_name = 'prevLogin'
+                                          , prop_value = last_login
+                                          )
+
+        new_login = strftime('%Y%m%d%H%M%SZ', localtime(time())) 
+        acl_manager.manage_setUserProperty( user_dn = user_dn
+                                          , prop_name = 'lastLogin'
+                                          , prop_value = new_login
+                                          )
+        acl_manager._expireUser(user_obj)
+
+
+    security.declarePrivate('setStartupPage')
+    def setStartupPage( self, target_obj ):
+        """ Set the member's default startup page """
+        url_tool = getToolByName( self, 'portal_url' )
+        startup_page = url_tool.getRelativeContentURL( target_obj )
+        user_obj = self.getUser()
+        user_dn = user_obj.getUserDN()
+        acl_manager = self.acl_users
+
+        acl_manager.manage_setUserProperty( user_dn = user_dn
+                                          , prop_name = 'startupPage'
+                                          , prop_value = startup_page
+                                          )
+        acl_manager._expireUser(user_obj)
+
+
+    security.declarePublic( 'getStartupPage' ) 
+    def getStartupPage( self ):
+        """ return the member's startup page """
+        try:
+            s_url = self.getProperty( 'startupPage' )
+        except: # No startup page in record
+            return None
+
+        try:
+            self.unrestrictedTraverse( s_url )
+        except:
+            s_url = None
+
+        return s_url
+
+
+InitializeClass( ZopeOrgMemberData )
+
+class ZopeOrgMemberDataTool( LDAPMemberDataTool ):
+    '''This tool wraps user objects, making them act as Member objects.
+    '''
+    security = ClassSecurityInfo()
+    meta_type = 'Zope.Org Member Data Tool'
+    title = 'Zope.Org Member Data Tool'
+    manage_showContents = DTMLFile('dtml/memberdataContents', globals())
+
+
+    def __init__( self, id='portal_memberdata' ):
+        self.id = id
+        LDAPMemberDataTool.__init__( self, id )
+        self._setProperty('listed', '', 'boolean')
+        self._setProperty('formtooltips', '', 'boolean')
+
+    def wrapUser( self, u ):
+        """
+        If possible, returns the Member object that corresponds
+        to the given User object.
+        """
+        id = u.getUserName()
+        members = self._members
+
+        if not members.has_key( id ):
+            # Get a temporary member that might be
+            # registered later via registerMemberData().
+            temps = self._v_temps
+
+            if temps is not None and temps.has_key( id ):
+                m = temps[id]
+            else:
+                base = aq_base( self )
+                m = ZopeOrgMemberData( base, id )
+
+                if temps is None:
+                    self._v_temps = { id : m }
+                else:
+                    temps[id] = m
+        else:
+            m = members[id]
+
+        # Return a wrapper with self as containment and
+        # the user as context.
+        return m.__of__( self ).__of__( u )
+
+
+InitializeClass( ZopeOrgMemberDataTool )
+
+
+
+
+def manage_addZopeOrgMemberDataTool( self, REQUEST=None ):
+    """ Need factory method for some special processing """
+    id = 'portal_memberdata'
+ 
+    memdata_tool = ZopeOrgMemberDataTool( id )
+    self._setObject( id, memdata_tool )
+ 
+    if REQUEST is not None:
+        return self.manage_main(self, REQUEST)


=== Products/ZopeOrg-NV/ZopeOrgMembershipTool.py 1.5 => 1.6 ===
+#####################################################################
+#
+# LDAPMembershipTool       LDAP-enabled CMF Membership Tool
+#
+# This software is governed by a license. See
+# LICENSE.txt for the terms of this license.
+#
+#####################################################################
+__version__='$Revision$'[11:-2]
+
+import re, os.path
+from Products.CMFLDAP.LDAPMembershipTool import LDAPMembershipTool
+from Products.CMFCore.utils import _getAuthenticatedUser, _checkPermission, \
+     getToolByName
+from Products.CMFCore.CMFCorePermissions import ManagePortal, SetOwnProperties
+from Products.CMFCore.CMFCorePermissions import AccessContentsInformation
+from Products.CMFCore.CMFCorePermissions import AddPortalContent, View
+from ZopeOrgPermissions import AnointMaintainer, DemoteMaintainer
+from Products.CMFCore.ActionInformation import ActionInformation
+from Products.CMFCore.Expression import Expression
+from Products.CMFCore.PortalFolder import manage_addPortalFolder
+from Products.CMFDefault.SkinnedFolder import addSkinnedFolder
+from Products.CMFDefault import Document
+from Globals import InitializeClass, DTMLFile
+from Acquisition import aq_inner, aq_parent
+from AccessControl import ClassSecurityInfo
+from DateTime import DateTime
+
+
+class ZopeOrgMembershipTool( LDAPMembershipTool ):
+    """ LDAP-enabled CMF Membership Tool """
+    security = ClassSecurityInfo()
+    meta_type = 'Zope.Org Membership Tool'
+    title = 'Zope.Org Membership Tool'
+    manage_mapRoles = DTMLFile('dtml/membershipRolemapping', globals())
+
+
+    def __init__( self, id='portal_membership' ):
+        self.id = id
+
+
+    security.declarePublic( 'getSearchableAttributes' )
+    def getUserSearchableAttributes( self ):
+        """ get user attributes that are allowed for searching """
+        excluded = ( 'lastLogin', 'prevLogin', 'public'
+                   , 'startupPage', 'portalSkin', 'cn' )
+
+        attrs = list( self.acl_users.getLDAPSchema() )
+        deletables = []
+
+        for attr in attrs:
+            if attr[0] in excluded:
+                deletables.append( attr )
+
+        for deletable in deletables:
+            del attrs[attrs.index( deletable )]
+
+        attrs.sort( self._schemaSort )
+
+        return tuple( attrs )
+
+
+    security.declarePrivate( '_schemaSort' )
+    def _schemaSort( self, a, b ):
+        """ sorting for nice looks on personalize page """
+        return cmp( a[1], b[1] )
+
+
+    def getRoster( self, search_param="cn", search_term='' ):
+        """ get the membership roster """
+        isManager = _checkPermission('Manage portal', self)
+        uf = self.acl_users
+        results = uf.findUser( search_param=search_param
+                             , search_term=search_term
+                             )
+        
+        if not isManager:
+            results = filter( lambda x: int( x.get( 'public', 0 ) ) != 0
+                            , results 
+                            )
+
+        return results
+
+
+    def searchMembers( self, search_param, search_term ):
+        """ Search the membership """
+        uf = self.acl_users
+        results = uf.findUser( search_param=search_param
+                             , search_term=search_term
+                             )
+        return results
+
+
+    def getCandidateLocalRoles( self, obj ):
+        """ What local roles can I assign? """
+        member = self.getAuthenticatedMember()
+
+        if 'Manager' in member.getRoles():
+            return self.getPortalRoles()
+        else:
+            member_roles = list( member.getRolesInContext( obj ) )
+            for forbidden in ( 'Anonymous'
+                             , 'Maintainer'
+                             , 'Pending Maintainer'
+                             , 'Member'
+                             ):
+                if forbidden in member_roles:
+                    del member_roles[member_roles.index( forbidden )]
+
+            return member_roles
+
+
+    def createMemberarea( self, id ):
+        """ Create this member's home area """
+        mem_folder = getattr( aq_parent( aq_inner( self ) ), 'Members', None )
+        if mem_folder is not None:
+            user = self.acl_users.getUser( id )
+            # Create Member's home folder
+            # check to avoid collision with automatic member area creation
+            if user is not None and id not in mem_folder.objectIds():
+                f_title = "%s's Home" % id
+                addSkinnedFolder( mem_folder, id, f_title )
+                f = getattr( mem_folder, id ) 
+                f._setPortalTypeName( 'Member Folder' )
+
+                # Grant executable ownership to Member
+                try:
+                    f.changeOwnership( user.__of__( self.acl_users ) )
+                except AttributeError:
+                    pass  # Zope 2.1.x compatibility
+
+                # Set owner local role for member
+                f.manage_setLocalRoles(id, ['Owner'])
+
+
+    security.declareProtected(SetOwnProperties, 'getLastLogin')
+    def getLastLogin( self, member ):
+        """ Retrieve the last login time and return as DateTime object """
+        try:
+            ll = member.getProperty('lastLogin') or '20000101000000Z'
+        except:
+            ll = '20000101000000Z'
+        yr = ll[0:4]
+        mo = ll[4:6]
+        dy = ll[6:8]
+        hr = ll[8:10]
+        mn = ll[10:12]
+        sc = ll[12:14]
+
+        return DateTime('%s/%s/%s %s:%s:%s' % (yr, mo, dy, hr, mn, sc))
+
+
+    security.declareProtected(SetOwnProperties, 'setLastLogin')
+    def setLastLogin( self ):
+        """ Update the last login time """ 
+        member = self.getAuthenticatedMember()
+
+        if member is not None:
+            member.setLastLogin()
+
+
+    security.declareProtected(SetOwnProperties, 'setupMemberArea')
+    def setupMemberArea( self ):
+        """ Set up my member area """
+        member = self.getAuthenticatedMember()
+
+        if member is not None:
+            member_id = member.getUserName()
+            mem_folder = getattr( aq_parent( aq_inner( self ) ), 'Members' )
+            if not member_id in mem_folder.objectIds():
+                self.createMemberarea( member_id )
+
+
+    security.declareProtected(SetOwnProperties, 'setStartupPage')
+    def setStartupPage( self, target_obj ):
+        """ Set this member's preferred startup page """
+        member = self.getAuthenticatedMember()
+
+        if member is not None:
+            member.setStartupPage( target_obj )
+
+
+    def listActions( self, info=None ):
+        """ Lists actions available to the user. """
+        actions_list = None
+        base_list = LDAPMembershipTool.listActions( self, info ) or []
+
+        ##actions_list = [ ActionInformation(
+        ##                    id='Set Start Page',
+        ##                    action=Expression(
+        ##                        text='string: ${object_url}/setStartPage'),
+        ##                    condition=Expression('member'),
+        ##                    permissions=[],
+        ##                    category='user'), ] + base_list
+
+        return base_list
+
+
+InitializeClass( ZopeOrgMembershipTool )
+
+
+def manage_addZopeOrgMembershipTool( self, REQUEST=None ):
+    """ Need factory method for some special processing """
+    id = 'portal_membership'
+
+    mem_tool = ZopeOrgMembershipTool( id )
+    self._setObject( id, mem_tool )
+
+    if REQUEST is not None:
+        return self.manage_main(self, REQUEST)


=== Products/ZopeOrg-NV/__init__.py 1.31 => 1.32 ===
 from Products.CMFCore.utils import registerIcon, ToolInit, ContentInit
 from Products.CMFCore.CMFCorePermissions import AddPortalContent
 from Products.CMFCore import PortalFolder
+import ZopeOrgMembershipTool
+import ZopeOrgMemberDataTool
 import ZopeOrgWorkflow
 import ContentList
 import Acquisition
@@ -115,3 +117,11 @@
                             ),
        fti = ftis ,
        ).initialize(context)
+
+    ToolInit(
+        'Zope.Org Tools',
+        tools = ( ZopeOrgMemberDataTool.ZopeOrgMemberDataTool
+                , ZopeOrgMembershipTool.ZopeOrgMembershipTool
+                ),
+        product_name='ZopeOrg',
+        icon='tool.gif' ).initialize( context )





More information about the zopeorg-checkins mailing list