#!/usr/bin/python import string, sys, time, codecs import xmlrpclib as xmlrpclib import strptime as strptime from ConfigParser import ConfigParser from exceptions import Exception from pprint import pprint from types import * from copy import copy class CP (ConfigParser): def __init__ (self, defaults = None): ConfigParser.__init__ (self, defaults) def optionxform (self, optionstr): return str (optionstr) def persons (): print "*" * 60 print "importing persons" print "*" * 60 file = codecs.open (parser.get ('options', 'person_file'), 'r', 'iso-8859-1') line = file.readline () print line if line != '': while line [-2] != '"' and line [-2] != ';': line = line + file.readline () entry = line [:-1] while entry != '': entry = getFields (entry) status = entry [string.atoi (parser.get ('person_attributes', 'entry_status')) - 1] if status == 'new': entry = createPersonEntry (entry) del entry ['entry_status'] person = insertPerson (entry) line = file.readline () [:-1] if line != '': while line [-2] != '"' and line [-2] != ';': line = line + file.readline () entry = line [:-1] def insertPerson (entry): print "|-> insertPerson (%s %s %s)" % (entry ['isAccount'], entry ['name'], entry ['firstname']) if entry ['isAccount'] != '1': try: person = server.person.insert (entry) except Exception,e : person = {} if not person: print "--- failed" else: print "+++ succeeded" else: person = {} print "is account: not inserted" return person def createPersonEntry (entry): new_entry = {} if len (entry) > 0: fields = parser.options ('person_attributes') for field in fields: insertEntries (new_entry, field, field, entry, 'person_attributes') postProcessPerson (new_entry) return new_entry def postProcessPerson (entry): attributes = ['id', 'phones', 'addresses', 'owner', 'salutation', 'extendedAttrs', 'birthday'] phoneTypes = ['01_tel', '02_tel', '03_tel_funk', '05_tel_private', '10_fax', '15_fax_private'] addressTypes = ['mailing', 'location', 'private'] salutation = { 'Ms.': ('01_dear_ms', 'female'), 'Ms': ('01_dear_ms', 'female'), 'Dear Ms.': ('01_dear_ms', 'female'), 'Mrs.': ('02_dear_mrs', 'female'), 'Mrs': ('02_dear_mrs', 'female'), 'Dear Mrs.': ('02_dear_mrs', 'female'), 'Mr.': ('03_dear_mr', 'female'), 'Mr': ('03_dear_mr', 'female'), 'Dear Mr.': ('03_dear_mr', 'male'), 'Dear Prof.': ('04_dear_prof', 'male'), 'Dear Dr.': ('04_dear_dr', 'male'), 'Hr.': ('06_geehrt_herr', 'male'), 'Herrn': ('06_geehrt_herr', 'male'), 'Herr': ('06_geehrt_herr', 'male'), 'Sehr geehrter Herr': ('06_geehrt_herr', 'male'), 'Fr.': ('07_geehrt_frau', 'female'), 'Frau': ('07_geehrt_frau', 'female'), 'Sehr geehrte Frau': ('07_geehrt_frau', 'female'), 'Sehr geehrter Herr Prof.': ('08_geehrt_herr_prof', 'male'), 'Sehr geehrter Herr Dr.': ('09_geehrt_herr_dr', 'male'), 'Sehr geehrte Frau Prof.': ('10_geehrt_frau_prof', 'female'), 'Sehr geehrte Frau Dr.': ('11_geehrt_frau_dr', 'female') } for key in entry.keys (): if attributes.count (key): if key == 'birthday': if entry [key] != '': entry [key] = xmlrpclib.DateTime (strptime.strptime (entry [key], '%d.%m.%Y')) else: del entry [key] elif key == 'id': entry [key] = id_pref + entry [key] elif key == 'phones': for subkey in entry [key].keys (): if phoneTypes.count (subkey): entry [key][subkey]['type'] = subkey elif key == 'addresses': for subkey in entry [key].keys (): if addressTypes.count (subkey): entry [key][subkey]['type'] = subkey elif key == 'owner': entry [key]['id'] = id_pref + entry [key]['id'] elif key == 'salutation': if salutation.has_key (entry [key]): values = salutation [entry [key]] entry ['salutation'] = values [0] entry ['gender'] = values [1] elif key == 'extendedAttrs': if entry [key].has_key ('lastChanged'): del entry [key]['lastChanged'] def getFields (line): if line [0] == ';': line = '""' + line if line [-1] == ';': line = line + '""' fields = line.split ('";"') fields [0] = fields [0][1:] fields [-1] = fields [-1][:-1] return fields def insertEntries (dict, field, field_part, entry, attr): split_field = field_part.split ('.', 1) if len (split_field) != 1: if not (dict.has_key (split_field [0])): dict [split_field [0]] = {} new_part = '' for part in split_field [1:]: new_part = new_part + part insertEntries (dict [split_field [0]], field, new_part, entry, attr) else: dict [field_part] = entry [string.atoi (parser.get (attr, field)) - 1] if __name__ == '__main__': print "|-> __main__" parser = CP () parser.read ('import.cfg') url = parser.get ('options', 'server') user = parser.get ('options', 'user') password = parser.get ('options', 'password') server = xmlrpclib.ServerProxy (url, login=user, password=password) dummy = server.person.getById ("10000") id_pref = dummy ['id'][:-5] persons ()