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.:

  1. Aufruf der API-Funktion rollbackObj() zur Wiederherstellung des letzten Freigabe-Status als aktuelle Arbeitsversion
  2. Assemblierung eines e-Mail-Textes und Erzeugung von Request-Variablen für die API-Funktion sendMail(), sowie Versenden dieser eMail
  3. Erzeugung einer ZMI-System-Nachricht
  4. 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 ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::