Plone 4 - CSV importieren

| abgelegt unter: , ,
Mitunter müssen in eine Plone-Seite große Mengen Daten eingespielt werden und manuelles Einpflegen kommt nicht in Frage. Zeit für einen kleinen Importer.

An dieser Stelle überspringen wir die Erstellung einer CSV-Datei. Die zu importierende Datei lädt man via ZMI in den Root-Ordner der Plone-Seite hoch, in die man importieren möchte. Hierzu einfach unter http://domain.de/meine-seite/manage_main via select type to add-Reiter ein File hinzufügen. Es wird ein Dialog angezeigt, in dem man die ID und den Titel des Dokumentes angeben, und eine Datei zum hochladen auswählen kann.

Nun geht es an den Importer. Hierzu benötigt man einen ((BrowserView|PloneBrowserView)), um den Import anzustoßen. In diesem View kann auch der benötigte Code problemlos untergebracht werden. Zum beispiel in einer eigenen Methode namens runImport.

def runImport(self):
    # Öffnen der Datei und auslesen des Inhaltes in 
    # eine Liste.
    letters = str(portal['letters.csv'].data).split('\n')

    index = imported_count = 0

    # Alle Listeneinträge durch iterieren
    for letter in letters:

        # Falls einmal eine Zeile nicht korrekt zugewiesen 
        # werden kann.
        try:
            nr, date, receiver, type, letterid, content = letter.split(',')
        except ValueError:
            continue

        # Der Übersichtlichkeit halber werden alle Attribute
        # des neuen Inhaltes in einem Wörterbuch gesammelt.
        properties = {
            'letter_nr':  nr,
            'letter_date': DateTime(int(date)),
            'letter_receiver': receiver,
            'letter_id': letterid,
            'letter_type': type,
            'letter_content': content,
            'letter_date': DateTime(int(date)),
            }

        try:
            ut = self.context.plone_utils
            # Brief-ID normalisieren (Sonderzeichen entfernen).
            id = ut.normalizeString(letterid)
            # "container" ist ein Ordner Objekt. Z.B. zu erreichen über
            # portal.restrictedTraverse("/mein/Ordner")
            container.invokeFactory(type_name="Letter",id=id,**properties)
            imported_count += 1
        except StandardError, e:
            continue

        index += 1

    return ('%d/%d Zeilen importiert' % (imported_count, index))

Die importierten Briefe werden in "/mein/Ordner" abgelegt.