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")