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