from zLOG import LOG, DEBUG, INFO
import re

def update(self):

    _log = []
    def pr(bla, _log=_log):
        if bla == 'flush':
            return '\n'.join(_log)
        _log.append(bla)
        if (bla):
            LOG('csvupdate:', INFO, bla)

    pr("Directories update - started")
    pr("")

    portal = self.portal_url.getPortalObject()

    csv_dir_name = 'csv'
    csv_dir = getattr(portal,csv_dir_name)

    members_file = 'Utilisateurs.csv'

    try:
        members_data = str(portal.restrictedTraverse("%s/%s" % (csv_dir_name, members_file)))
    except KeyError:
        members_data = ""
        pr(" Warning: file %s not found. Directory members was not updated." % members_file)

    if members_data:
        members = []
        pr("Updating Members directory")
        member_schema_fields = ['id', 'password', 'givenName', 'sn', 'email', 'groups', 'roles']
        lines = members_data.splitlines()
       
        CSV_SEPARATOR = ';'

        for line in lines:
            # Some items might contain the csv separator...
            # Try to handle this gracefully, detecting separator
            # followed by a space.
           
            member_items = line.split(CSV_SEPARATOR)

            if member_items and not (len(member_items) == 1):
                member_data = {}
                for field in member_schema_fields:
                    try:
                        raw_field = member_items.pop(0).strip()
                    except IndexError:
                        raw_field = ''
                        member_data['bad_entry'] = 1
                    # Many fields are enclosed in double quotes 
                    if raw_field and raw_field[0] == '"' and raw_field[-1] == '"':
                        raw_field = raw_field[1:-1]
                    member_data[field] = raw_field

                member_data['confirm'] = member_data['password']
                member_data['roles'] = member_data['roles'].capitalize()
                if member_data['roles'] == 'Manager':
                    member_data['roles'] = ('Manager', 'Member')
                else:
                    member_data['roles'] = ('Member',)
                member_data['groups'] = tuple(member_data['groups'].split(','))

                if not member_data.has_key('bad_entry'):
                    # declare user as member of the portal
                    members.append(member_data)
                else:
                    pr("** Bad entry detected **")
                    pr("A data field might contain the csv separator not followed by a space.")
                    pr("The id of this entry was %s."%member_data['id'])
                    pr("The entry will NOT be added to the members directory.")


        # create members in member directory
        directory = portal.portal_directories.members
        for member in members:
            m_id = member.get('id')
            pr('Directories update: checking entry '+m_id)
            if not directory.hasEntry(m_id):
                # member login does not exist, create
                pr('Directories update:  creating entry '+m_id)
                for gr in member['groups']:
                    if not portal.portal_directories.groups.hasEntry(gr):
                         portal.portal_directories.groups.createEntry({'group':gr})
                directory.createEntry(member)
            else:
                # member login already exists
                pr('Directories update:  entry '+m_id+' exists')
    
    pr("")
    pr("Directories update - end")

    return pr("flush")
