Nutzen der COM-Schnittstelle von Zope aus

"Iffland Stefan" <[email protected]>
Newsgroups gmane.comp.web.zope.german
Message-ID <[email protected]>
Hallo zusammen,

 

ich habe mein Problem unter http://www.python-forum.de/topic-20807.html?sid=495671c5e331f0c2b566b681e04b0959 schon einmal

etwas detailiert gepostet. (mit Code-Beispiel)

 

Meine erste Nachricht an die Liste. Hoffe, dass ich hier ein paar Anregungen bekomme.

 

Also es geht um eine etwas veraltete webbasierte Unternehmensanwendung, die mit Hilfe von Zope realisiert wurde. Die Anwendung

wurde mittlerweile von Zope 2.4.2 auf Zope 2.11.4 migriert und läuft wieder. Verwendet werden neben den Standard-Produkten

NFGnav, ZPyODBCDA und experimentell COMObject. Die Anwendung wird zum Erfassen von Abwesenheiten (Urlaub, Gleitzeit, etc.)

und einer ggf. notwendigen Genehmigung durch Vorgesetzte verwendet. In der Hauptsache bildet die Anwendung also eine

An-/Abwesenheitsübersicht ab. Die Mitarbeiterdatensätze und Abwesenheitsdatensätze werden in einer SQL-Server DB gespeichert.

 

Da sich der Python-Kern der Installerversion von Zope 2.11.4 schlecht erweitern lässt und zum Beispiel PythonWin nicht nutzbar ist um

die COM-Schnittstellen zu generieren, bin ich nach langen Versuchen nun bei Zope 2.12.1 angekommen. Dieser läuft zunächst nur auf

meinem Entwicklungsrechner (Windows XP), aber auch dort läuft die Applikation soweit. Was ich nun abbilden muss: Wenn ein Mitarbeiter

im Portal eine Abwesenheit erfasst, soll an seine Kollegen statt einer Email-Benachrichtigung eine Besprechungsanfrage für Outlook

versendet werden. Das möchte ich über die COM-Schnittstelle realisieren. Zope wird dazu als Windows-Dienst eingerichtet und mit

einem bestimmten Benutzer gestartet. Auf diese Weise wird sichergestellt, dass Outlook auch mit den Einstellungen dieses Benutzers

gestartet wird. Der Dummy-User hat also irgendwann einen Kalender mit sämtlichen Abwesenheiten aller MA und man könnte so auch

wieder über COM existierende Einträge überarbeiten und löschen. Soweit die Theorie. ;-)

 

Von der Python-Konsole aus funktioniert folgendes Skript ohne Probleme, allerdings nur, wenn Outlook bereits geöffnet ist.

 

def besprechung(subject, start_year, start_month, start_day, start_hour="0", start_minute="0", debug=False):

    import win32com.client

    import pythoncom

 

    pythoncom.CoInitialize()

    o = win32com.client.gencache.EnsureDispatch("Outlook.Application")

    

    appointment = o.CreateItem(win32com.client.constants.olAppointmentItem)

    try:

        appointment.Start = start_year + "-" + start_month + "-" + start_day + " " + start_hour + ":" + start_minute

        appointment.AllDayEvent = True

        appointment.MeetingStatus = win32com.client.constants.olMeeting

        appointment.Subject = "Urlaubsportal: " + subject

        appointment.ReminderSet = False

        appointment.ResponseRequested = False

        myRequiredAttendee = appointment.Recipients.Add("USERXY")

        myRequiredAttendee.Type = win32com.client.constants.olRequired # 1 = erforderlich

        #myOptionalAttendee = appointment.Recipients.Add("Bachmann Eric")

        #myOptionalAttendee.Type = 2 # 2 = optional

        appointment.Send()

        appointment.Save()

        print "Keine Fehler"

    finally:

        appId = appointment.EntryID

        del o

        try:

            pythoncom.CoUninitialize()

        except:

            pass

        if debug:

            return "Objekt geloescht! EntryID:" + appId

        

    return appId

 

 

print besprechung(subject="Max Muster hat frei", start_year="2009", start_month="11", start_day="12", debug=True)

 

Python scheint also nicht in der Lage zu sein, eine Outlook-Instanz zu starten. Wenn das Skript auf einem Server laufen soll, kann ich jedoch nicht sicherstellen,

dass Outlook immer schon geöffnet ist. Andererseits, wenn ich das Skript - leicht modifiziert - in Zope als External Method einbinde und starte, wenn Outlook

läuft, dann bekomme ich eine Windows-Fehlermeldung (Fehler beim Speicherzugriff) und darf Zope neu starten.

 

Rufe ich die externe Methode auf, wenn Outlook geschlossen ist, scheitert Zope beim Hinzufügen der Empfänger (Zeile 22). Nun bin ich für jeden Hinweis

dankbar, was ich beachten muss und wo der Fehler liegen könnte. Ich bin neu in Python und entsprechend dürftig ist mein Wissen teils noch.

 

Vielen Dank und Viele Grüße

Stefan

 

Stefan Iffland

Telefon +49 (7243) 570-1681 
E-Mail [email protected]



_______________________________________________
zope mailing list
[email protected]
https://mail.dzug.org/mailman/listinfo/zope
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.