Changeset 646

Show
Ignore:
Timestamp:
11/23/06 02:49:32
Author:
piv
Message:

CMFMember compatibility, tests modified, added registry mechanism

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • qMemberdataExport/trunk/Extensions/Install.py

    r645 r646  
    3131        script = getattr(self, PYTHON_SCRIPT) 
    3232        if script: 
    33             script.ZPythonScript_edit('', 'return context.%s(context)' % EXTERNAL_METHOD) 
     33            script.ZPythonScript_edit(params='start=0,batch=400,exclude_props=None,include_props=None', 
     34                                      body='return context.%s(context, start, batch, exclude_props, include_props)' % EXTERNAL_METHOD) 
    3435            out.write('%s python script added to portal\n' % PYTHON_SCRIPT) 
    3536        else: out.write('installation procedure could not create python script\n') 
     
    4546 
    4647    # add python script 
    47     addPythonScript(self, out) 
     48#    addPythonScript(self, out) 
    4849 
    4950    return out.getvalue() 
  • qMemberdataExport/trunk/Extensions/getMemberData.py

    r645 r646  
    1 def getMemberData(context): 
     1def getMemberData(self, start=0, batch=400, exclude_props=None, include_props=None): 
    22 
    33    import csv 
    44    from cStringIO import StringIO 
    55    from DateTime import DateTime 
    6     from Products.CMFCore.utils import getToolByName 
     6    from Products.qMemberdataExport import getRegisteredMemberdataHandlers as registry 
     7    from Products.qMemberdataExport.config import EXCLUDE_PROPS, CLEAR_CACHE_COUNTER 
    78 
    8     mdtool = getToolByName(context, 'portal_memberdata') 
    9     mtool = getToolByName(context, 'portal_membership') 
     9    if exclude_props is None: exclude_props = EXCLUDE_PROPS 
    1010 
    11     props = ['id',] + mdtool.propertyIds() 
    12     members = mtool.listMembers() 
     11    memberdatahandler = False 
     12 
     13    for handler in registry(): 
     14        try: 
     15            memberdatahandler = handler(self) 
     16            break 
     17        except: 
     18            pass 
     19 
     20    if not memberdatahandler: return None 
     21 
     22    members = memberdatahandler.getAllMembers() 
     23 
     24    if batch > len(members) - start: batch = len(members) - start 
     25 
     26    members_list = [] 
     27    counter = 0 
     28 
     29    for member in members[start:start+batch]: 
     30        counter += 1 
     31        if counter % CLEAR_CACHE_COUNTER == 0:  
     32            self._p_jar.sync() 
     33        members_list.append(memberdatahandler.getMemberProperties(member, exclude_props, include_props)) 
    1334 
    1435    res = StringIO() 
    15     writer = csv.DictWriter(res, fieldnames = props, quoting=csv.QUOTE_ALL) 
     36    writer = csv.DictWriter(res, fieldnames = memberdatahandler.fieldnames, quoting=csv.QUOTE_ALL) 
    1637 
    1738    # writing header row 
    18     writer.writer.writerow(props) 
     39    writer.writer.writerow(memberdatahandler.fieldnames) 
     40    # writing body of csv file 
     41    writer.writerows(members_list) 
    1942 
    20     for member in members: 
    21         properties = {} 
    22         for propid in props: 
    23             properties[propid] = member.getProperty(propid, '') 
    24         writer.writerow(properties) 
    25  
    26     context.REQUEST.RESPONSE.setHeader('Content-Type', 'text/csv') 
    27     context.REQUEST.RESPONSE.setHeader('Content-Disposition', 'attachment; filename= memberdata-%s.csv' % DateTime().strftime("%Y-%m-%d-%H-%M-%S")) 
     43    # setting headers for attaching file 
     44    self.REQUEST.RESPONSE.setHeader('Content-Type', 'text/csv') 
     45    self.REQUEST.RESPONSE.setHeader('Content-Disposition', 'attachment; filename=memberdata-%s.csv' % DateTime().strftime("%Y-%m-%d-%H-%M-%S")) 
    2846 
    2947    return res.getvalue() 
  • qMemberdataExport/trunk/__init__.py

    r645 r646  
    1 from Products.qMemberdataExport.config import  GLOBALS 
     1#from AccessControl import allow_module 
    22 
     3#allow_module('Products.qMemberdataExport.MemberdataHandlers') 
     4 
     5from MemberdataHandlers import getRegisteredMemberdataHandlers 
     6 
     7# import BaseMemberdataHandler first for registering it as last (default) in list of all registered handlers 
     8 
     9from BaseMemberdataHandler import BaseMemberdataHandler 
     10from CMFMemberdataHandler import CMFMemberdataHandler 
  • qMemberdataExport/trunk/config.py

    r645 r646  
    55EXTERNAL_METHOD = 'export_memberdata_as_csv' 
    66PYTHON_SCRIPT   = 'exportMemberData' 
     7 
     8CLEAR_CACHE_COUNTER = 100 
     9EXCLUDE_PROPS = ['portrait', 'password', 'mail_me', 
     10                 'confirm_password','login_time','last_login_time', 
     11                 'listed','fc_internal_data', 'roles', 'groups', 
     12                 'domains', 'review_state'] 
  • qMemberdataExport/trunk/tests/commonTestingStuff.py

    r645 r646  
    55from Products.PloneTestCase import PloneTestCase 
    66 
    7 from Products.qMemberdataExport.config import * 
     7from Products.qMemberdataExport.config import PYTHON_SCRIPT, EXTERNAL_METHOD 
    88 
    99PRODUCTS=('qMemberdataExport',) 
     
    3030    import csv 
    3131    from cStringIO import StringIO 
     32    from Products.qMemberdataExport import getRegisteredMemberdataHandlers as registry 
    3233 
    33     props = ['id',] + getToolByName(self.portal, 'portal_memberdata').propertyIds() 
     34    datahandler = False 
     35     
     36    for handler in registry(): 
     37        try: 
     38            datahandler = handler(self.portal) 
     39            break 
     40        except: 
     41            pass 
     42    if datahandler: 
     43        props = datahandler.listAllMemberProperties(exclude_props=EXCLUDE_PROPS, include_props=INCLUDE_PROPS) 
     44    else: 
     45        props = [p for p in ['id',]+getToolByName(self.portal, 'portal_memberdata').propertyIds() if p not in EXCLUDE_PROPS] 
    3446    reader = csv.DictReader(StringIO(data), fieldnames = props, quoting=csv.QUOTE_ALL) 
    3547    i = 0 
     
    3951        if i != 0 and row['id'] != 'test_user_1_': 
    4052            for field in row.keys(): 
    41                 if field in PROPERTIES_TO_COMPARE: properties[field] = row[field] 
     53                properties[field] = row[field] 
    4254            res.append(properties) 
    4355        i += 1 
    4456    self.failUnless(i-2 == len(PORTAL_MEMBERS), 'CSV output does not matcht to amount of portal members') 
    4557    members = [memb.copy() for memb in PORTAL_MEMBERS] 
    46     for memb in members: del memb['roles'] 
     58    for memb in members: 
     59        del memb['roles'] 
     60        del memb['last_login_time'] 
    4761    return (members, res) 
    4862 
     
    5569 
    5670# testing stuff for adding members to portal 
    57  
    58 PROPERTIES_TO_COMPARE = ['id', 'fullname', 'email', 'last_login_time'] 
    59  
    6071PORTAL_MEMBERS = [{ 
    6172                   'id'              : 'Fred', 
     
    8394                   'last_login_time' :  '2003/12/31'}, 
    8495                 ] 
     96 
     97EXCLUDE_PROPS = ['portrait', 'password', 'mail_me', 
     98                 'confirm_password','login_time', 'last_login_time', 
     99                 'listed','fc_internal_data', 'review_state', ] 
     100 
     101INCLUDE_PROPS = ['id', 'fullname', 'email', 'roles', 'domains', 'groups'] 
  • qMemberdataExport/trunk/tests/runtests.sh

    r645 r646  
    55 
    66# full path to the python interpretor 
    7 export PYTHON="/home/piv/python-2.4.3/bin/python" 
     7export PYTHON="/path/to/your/python" 
    88 
    99# path to ZOPE_HOME/lib/python 
    10 export SOFTWARE_HOME="/data/piv/work/zope-2.9.5/lib/python
     10export SOFTWARE_HOME="/path/to/your/software/home
    1111 
    1212 
    1313# path to your instance. Don't set it if you aren't having  instance 
    14 export INSTANCE_HOME="/home/piv/zinstances/something/" 
     14export INSTANCE_HOME="path/to/your/instance/home/" 
    1515 
    1616${PYTHON} runalltests.py 
  • qMemberdataExport/trunk/tests/testExternalMethod.py

    r645 r646  
    2424        """ Test external script for good csv output stream """ 
    2525 
    26         forCompare = parseCSV(self, self.method(self.portal)) 
     26        forCompare = parseCSV(self, self.method(self.portal, exclude_props=EXCLUDE_PROPS, include_props=INCLUDE_PROPS)) 
    2727        self.failUnless(forCompare[0] == forCompare[1], 'Bad output from external method script') 
    2828 
  • qMemberdataExport/trunk/tests/testFunctional.py

    r645 r646  
    2121        for m in PORTAL_MEMBERS: 
    2222            addMember(self, m['id'], m['fullname'], m['email'], m['roles'], m['last_login_time']) 
    23         self.response = self.sendRequest('%s/%s' % (self.portal.id, PYTHON_SCRIPT), {}, "GET") 
     23        self.response = self.sendRequest('%s/%s' % (self.portal.id, PYTHON_SCRIPT), {'exclude_props':[], 'include_props':INCLUDE_PROPS}, "GET") 
    2424 
    2525    def sendRequest(self, path, params={}, method="POST"): 
  • qMemberdataExport/trunk/tests/testInstallation.py

    r645 r646  
    2626                        '%s python script does not exist in portal' % PYTHON_SCRIPT) 
    2727 
     28    def testMemberdataHandlersRegistry(self): 
     29        """ Test registration of memberdata handlers """ 
     30        from Products.qMemberdataExport import getRegisteredMemberdataHandlers as registry 
     31        self.failUnless(len(registry()) == 2, 'Bad registry data') 
     32 
    2833#tests.append(TestInstallation) 
    2934