Die API-Funktionen für das Workflow-Interface sind im Python-Modul _workflowmanager.py definiert, während die Funktionen für das Management der Objektzustände allesamt über _versionmanager.py programmiert sind. Beispiele für entsprechende Funktionen sind:
- VersionItem.getObjStateNames(self, REQUEST): liefert für ein Objekt den entsprechenden Basiszustand (new, modified oder deleted)
- VersionItem.getWfStates(self, REQUEST): liefert für den PAGE-Container den aktuellen Workflow-Zustand
- VersionManagerContainer.manage_wfTransition(self, lang, manage_lang, custom, REQUEST, RESPONSE): führt Übergang durch
- VersionManagerContainer.manage_wfTransitionFinalize( self, lang, manage_lang, custom, REQUEST, RESPONSE=None): schließt Workflow ab
Innerhalb der Übergangs-Methoden werden also primär die Objekt-Zustände verändert. Am Beispiel des Workflow-Übergangs „Zurücknehmen“ werden typische Merkmale des Programmcodes deutlich, z.B.:
- Aufruf der API-Funktion rollbackObj() zur Wiederherstellung des letzten Freigabe-Status als aktuelle Arbeitsversion
- Assemblierung eines e-Mail-Textes und Erzeugung von Request-Variablen für die API-Funktion sendMail(), sowie Versenden dieser eMail
- Erzeugung einer ZMI-System-Nachricht
- Redirect auf das ZMI des aktuellen Knotes über eine parametrisierte URL, erzeugt mit der API-Funktion url_append_params()
<!-- ##### Notification #### --> <!-- Recipient --> <dtml-call "REQUEST.set('s_name',getObjProperty('work_uid',REQUEST))"> <dtml-call "REQUEST.set('s_mto',getRecipientWf(REQUEST))"> <!-- Subject --> <dtml-call "REQUEST.set('s_msubject','[ZMS::%s]: Your changes were rolled back'%getDocumentElement().getTitle(REQUEST))"> <!-- Body --> <dtml-call "REQUEST.set('l_mbody',[])"> <dtml-call "l_mbody.append('Your changes were rolled back.\n')"> <dtml-call "l_mbody.append('\nWith best regards\n')"> <dtml-call "l_mbody.append('%s\n'%AUTHENTICATED_USER.getId())"> <dtml-call "l_mbody.append('------------------------\n')"> <dtml-call "l_mbody.append('Message generated by ZMS\n')"> <!-- Send notification via MailHost --> <dtml-call "sendMail(s_mto, s_msubject, ''.join(l_mbody), REQUEST)"> <!-- ##### Rollback #### --> <dtml-call "rollbackObj(REQUEST)"> <!-- Return with message --> <dtml-call "REQUEST.set('s_message','Changes were rolled back.')"> <dtml-return "RESPONSE.redirect(url_append_params('manage_wfTransitionFinalize',{'lang':lang, 'manage_lang':manage_lang, 'custom': custom, 'manage_tabs_message':s_message}))">
Der folgende Code-Auschnitt aus der default-Methode für Freigabe beantragen (TR_REQUEST) zeigt wie per in-Schleife alle Detailinformationen der Content-Objekte der PAGE ermittelt und für den eMail-Body assembliert werden. Das Ausgabeergebnis erzeugt in der weiter unten stehenden Infomail die Sektion „Ereignisse“.
<dtml-call "REQUEST.set('res',[this()])"> <dtml-call "res.extend(getChildNodes(REQUEST))"> <dtml-in res> <dtml-if "isObjModified(REQUEST)"> <dtml-call "REQUEST.set('s_mbody',[])"> <dtml-call "s_mbody.append('- %s'%(display_type(REQUEST)))"> <dtml-call "s_mbody.append(' [')"> <dtml-call "REQUEST.set('s_mstate',[])"> <dtml-in "['STATE_NEW','STATE_MODIFIED','STATE_DELETED']"> <dtml-let state=sequence-item> <dtml-if "inObjStates([state],REQUEST)"> <dtml-if s_mstate> <dtml-call "s_mstate.append(',')"> </dtml-if> <dtml-call "s_mstate.append(getLangStr(state,manage_lang))"> </dtml-if> </dtml-let> </dtml-in> <dtml-call "s_mbody.extend(s_mstate)"> <dtml-call "s_mbody.append('] ')"> <dtml-call "s_mbody.append('%s %s '%(getLangStr('ON',manage_lang),getLangFmtDate(getObjProperty('change_dt',REQUEST),manage_lang,'DATE_FMT')))"> <dtml-call "s_mbody.append('%s %s '%(getLangStr('AT',manage_lang),getLangFmtDate(getObjProperty('change_dt',REQUEST),manage_lang,'TIME_FMT')))"> <dtml-call "s_mbody.append('%s %s '%(getLangStr('BY',manage_lang),AUTHENTICATED_USER.getId()))"> <dtml-call "l_mbody.append(''.join(s_mbody)+'\n')"> </dtml-if> </dtml-in>
Beispiel für den Text einer Infomail, die per TR_REQUEST erzeugt (Code für „Ereignisse“ siehe oben) und versendet wurde
SYSTEMINFO ----------------------- stefanie.wagner beantragt Freigabe ----------------------- Dokumentpfad: Pascoe Natural Medicine >> BASENFAMILIE >> consumer information >> HEALTHY LIFESTYLE RECIPES & FOOD CHART >> MAIN COURSE ----------------------- Url: <a href="http://123.456.789.123:8080/sites/bt/content/e434/e471/manage?lang=eng">http://123.456.789.123:8080/sites/bt/content/e434/e471/manage?lang=eng</a> ----------------------- Ereignisse: - Dokument [,Geändert] am 10.02.2006 um 09:31:05 von stefanie.wagner - Abbildung [,Geändert] am 10.02.2006 um 09:30:58 von stefanie.wagner - Textabschnitt [,Geändert] am 10.02.2006 um 08:58:12 von stefanie.wagner - Textabschnitt [,Geändert] am 10.02.2006 um 09:30:43 von stefanie.wagner - Textabschnitt [,Geändert] am 10.02.2006 um 09:30:36 von stefanie.wagner KOMMENTAR: ======================== englische Texte eingeg. w.s. Bitte darauf achten, dass inaktiv gestellte Seiten nach der Freigabe nicht aktiv sind. ======================== ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :: Hinweis: Dies ist eine automatische ZMS-Systemnachricht :: :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::