## Script (Python) "export_members"
##bind container=container
##bind context=context
##bind namespace=
##bind script=script
##bind subpath=traverse_subpath
##parameters=fieldlist='',fieldsep=',',fieldreq='',op='and',noheader=False
##title=generate a csv export of member data
##
REQUEST=context.REQUEST
from zLOG import LOG, INFO
from Products.CMFCore.utils import getToolByName

## see http://plone.org/documentation/how-to/export-member-data-to-csv

## fieldlist: 	which member properties to export
## fieldsep:	which character used to split/join lists (default: comma)
## fieldreq:	which field values must evaluate True (filter on field values)
## reqop:	evaluate required fields with AND or OR

## export_members?fieldsep=; will give fieldsep==''
if not fieldsep: fieldsep = ';'

if fieldlist != '':
    memberProperties = fieldlist.split(fieldsep)
else:
    memberProperties = ('id','email','fullname',
                        ## insert your additional memberdata here                        
                        'geslacht','bedrijfsnaam','functie','telefoon',
                        'nieuws_plus','nieuws_cm','nieuws_pd','nieuws_tt' # zie sr2:/root/bin/syncroute50plus
                        )
lines = []

## double negative so any non-default value triggers
if not noheader:
    lines.append(fieldsep.join(memberProperties))
    
membership = getToolByName(context,'portal_membership')

for memberId in membership.listMemberIds():
    member = membership.getMemberById(memberId)
    if fieldreq != '':
        requiredValues = [member.getProperty(x) for x in fieldreq.split(fieldsep)]
        if op == 'or':
            memberok = reduce(lambda x,y: x or y, requiredValues, False ) # any True succeeds
        else:
            memberok = reduce(lambda x,y: x and y, requiredValues, True ) # any False fails
        ## uncomment to debug
        #lines.append(str(op)+':'+','.join((str(x) for x in requiredValues)) + '=%s' % memberok)            
        if not memberok: continue
    ## replace all commas in values, create comma-separated-value string, append to output
    lines.append(fieldsep.join( (str(member.getProperty(x)).replace(fieldsep,' ') for x in memberProperties) ))

return '\n'.join(lines) + '\n'
