source: products/qMemberdataExport/trunk/RememberMemberdataHandler.py @ 2111

Last change on this file since 2111 was 1, checked in by myroslav, 18 years ago

Building directory structure

  • Property svn:eol-style set to native
File size: 4.7 KB
Line 
1from types import UnicodeType
2from Acquisition import aq_inner
3
4from Products.CMFCore.utils import getToolByName
5
6from MemberdataHandlers import registerMemberdataHandler, IMemberdataHandler
7
8class RememberMemberdataHandler:
9    """
10        Manage remember's members
11    """
12
13    __implements__ = IMemberdataHandler
14
15    def __init__(self, context):
16        self.context = context
17        self.tool = getToolByName(self.context, 'portal_memberdata')
18        self.membrane_tool = getToolByName(self.context, 'membrane_tool', None)
19        self.fieldnames = []
20        # for compatibility with Plone 2.0 (import next only on instance init)
21        from Products.PluggableAuthService.interfaces.authservice import IPluggableAuthService
22        from Products.remember.interfaces import IRememberMembraneTool
23        self.compatible = IPluggableAuthService.providedBy(self.context.acl_users) and self.membrane_tool and IRememberMembraneTool.providedBy(self.membrane_tool)
24        self.is_compatible()
25
26    def is_compatible(self):
27        """
28            Take portal_memberdata tool and analyse possibility of working
29            with it.
30            If handler does not know how to work with given portal_memberdata,
31            it return 'False' on init, otherwise - 'True'.
32        """
33        if not self.compatible:
34            raise
35        return self.compatible
36
37    def listAllMemberProperties(self, exclude_props=[], include_props=None):
38        """
39            Return all properties from UserPropertySheets and from member's schema.
40            Exclude properties that given in exclude_props list.
41        """
42
43        if not self.is_compatible(): return []
44
45        for member in self.getAllMembers():
46            if hasattr(aq_inner(member), 'Schema') and callable(member.Schema):
47                schema = member.getSchema()
48                for field in schema.filterFields():
49                    fname = str(field.getName())
50                    if (fname not in exclude_props) and (include_props and fname in include_props or not include_props):
51                        if fname not in self.fieldnames:
52                            self.fieldnames.append(fname)
53
54        for member in self.getAllMembers():
55            for sheet in member.getOrderedPropertySheets():
56                for name in sheet.propertyIds():
57                    if (name not in exclude_props) and (include_props and name in include_props or not include_props):
58                        if name not in self.fieldnames:
59                            self.fieldnames.append(name)
60
61        return self.fieldnames
62
63    def getAllMembers(self):
64        """
65            Return all members contained in portal_memberdata tool
66        """
67        if not self.compatible: return []
68        return self.tool.contentValues()
69
70    def getMemberProperties(self, member, exclude_props=[], include_props=None):
71        """
72            Return all needed members' properties as dictionary
73            {property name : property value, ...},
74            exclude properties from exclue_props parameter.
75            Get properties:
76            1. from member's schema fields
77            2. from PAS, PlonePas (portal_memberdata), Membrane and any else registered UserPropertySheets for member
78
79        """
80
81        if not self.is_compatible: return {}
82        props = {}
83
84        # extract all info from member schema
85        if hasattr(aq_inner(member), 'Schema') and callable(member.Schema):
86            schema = member.Schema()
87            for field in schema.filterFields():
88                fname = str(field.getName())
89                if (fname not in exclude_props) and (include_props and fname in include_props or not include_props):
90                    if not props.has_key(fname):
91                        value = str(member.getProperty(fname, ''))
92                        if type(value) is UnicodeType:
93                            value = value.encode('UTF8')
94                        props[fname] = value
95                    if fname not in self.fieldnames:
96                        self.fieldnames.append(fname)
97
98        # extract all info from UserPropertySheets
99        user = member.getUser()
100        for sheet in user.getOrderedPropertySheets():
101            for field, value in sheet.propertyItems():
102                if type(value) is UnicodeType:
103                    value = value.encode('UTF8')
104                if (field not in exclude_props) and (include_props and field in include_props or not include_props):
105                    if not props.has_key(field):
106                        props[field] = value
107                    if field not in self.fieldnames:
108                        self.fieldnames.append(str(field))
109
110        return props
111
112registerMemberdataHandler(RememberMemberdataHandler)
Note: See TracBrowser for help on using the repository browser.