|
/
Zope
/
gocept svn checkins
/
Archive
/
2007
/
2007-02
/
SVN: r4504 - in AlphaFlow/trunk: . Extensions tests
[
SVN: r4487 - in AlphaFlow/trunk/skins: alphaflow ... ]
[
SVN: r4506 - in AlphaFlow/trunk: . Extensions ... ]
SVN: r4504 - in AlphaFlow/trunk: . Extensions tests
Christian Theune <ct(at)gocept.com> |
2007-02-28 21:56:58 |
[ FULL ]
|
Author: ctheune
Date: Wed Feb 28 21:56:55 2007
New Revision: 4504
Removed:
AlphaFlow/trunk/tests/test_editor.py
Modified:
AlphaFlow/trunk/Extensions/Install.py
AlphaFlow/trunk/__init__.py
AlphaFlow/trunk/interfaces.py
AlphaFlow/trunk/process.py
AlphaFlow/trunk/processmanager.py
Log:
- removing more remainders from the editor
Modified: AlphaFlow/trunk/Extensions/Install.py
==============================================================================
--- AlphaFlow/trunk/Extensions/Install.py (original)
+++ AlphaFlow/trunk/Extensions/Install.py Wed Feb 28 21:56:55 2007
(at)(at) -305,9 +305,16 (at)(at)
def install(self):
-
out = StringIO()
+ # Integrate with GenericSetup
+ setup_tool = getToolByName(portal, 'portal_setup')
+ old_context = setup_tool.getImportContextID()
+ setup_tool.setImportContext('profile-Products.AlphaFlow:default')
+ setup_tool.runAllImportSteps()
+ setup_tool.setImportContext(old_context)
+
+ # XXX Run the remaining non-GenericSetup steps
print >>out, 'Installing types ...'
installTypes(self, out, listTypes(config.PROJECTNAME), config.PROJECTNAME)
(at)(at) -337,9 +344,6 (at)(at)
print >>out, "Configuring portal catalog index / event channel"
install_portal_catalog(self, out)
- print >>out, 'Installing skin layers ...'
- install_subskin(self, out, config.GLOBALS)
-
print >>out, "Adding portlet ..."
portlet = "here/portlet_worklist/macros/portlet"
if portlet not in self.right_slots:
(at)(at) -365,6 +369,13 (at)(at)
def uninstall(self):
out = StringIO()
+ # Uninstall via GenericSetup
+ setup_tool = getToolByName(portal, 'portal_setup')
+ setup_tool.setImportContext('profile-AlphaFlow:uninstall')
+ setup_tool.runAllImportSteps()
+ setup_tool.setImportContext('profile-CMFPlone:plone')
+
+ # Run the remaining other uninstall steps
print >>out, 'Uninstalling...'
qi = getToolByName(self, 'portal_quickinstaller')
Modified: AlphaFlow/trunk/__init__.py
==============================================================================
--- AlphaFlow/trunk/__init__.py (original)
+++ AlphaFlow/trunk/__init__.py Wed Feb 28 21:56:55 2007
(at)(at) -27,20 +27,19 (at)(at)
globals()),
}
-
+
def initialize_permissions(context):
registerPermission(config.CONTROL_PROCESS,
('Manager', 'Owner'))
-
def initialize_activities(context):
from activities import \
task, review, permission, version, expression, dcworkflow, \
recursion, notify, alarm, condition, routing, gates, ntask, \
decision, simpledecision, configuration, parent, switch, roleassign
-
+
def initialize_content(context):
from Products.AlphaFlow import instance
content_types, constructors, ftis = process_types(
(at)(at) -54,7 +53,7 (at)(at)
fti = ftis,
).initialize(context)
-
+
def initialize_index(context):
from Products.AlphaFlow import eventchannel
context.registerClass(
(at)(at) -64,7 +63,7 (at)(at)
icon='www/index.gif',
visibility=None
)
-
+
context.registerClass(
eventchannel.AllowedRolesAndUsersProxy,
permission = 'Add Pluggable Index',
(at)(at) -72,13 +71,11 (at)(at)
icon='www/index.gif',
visibility=None)
-
+
def initialize_tools(context):
from Products.AlphaFlow import processmanager, process
- from Products.AlphaFlow.editor import editor
tool = cmfcoreutils.ToolInit('workflow_manager',
tools=(processmanager.ProcessManager,
- editor.AlphaFlowEditor,
),
icon='tool.gif')
tool.initialize(context)
(at)(at) -89,22 +86,21 (at)(at)
container_filter=ProcessManagerFilter,
)
+
def initialize_activityicons(context):
currdir, subdir =
os.path.split(os.path.dirname(os.path.abspath(__file__)))
icondir = "%s/%s" %(currdir, config.ACTIVITY_ICONS_DIR)
icons = os.listdir(icondir)
-
+
for icon in icons:
iconpath = icondir+'/'+icon
-
if os.path.isfile(iconpath):
image = ImageFile(iconpath, globals())
misc_.update({icon[:-4]:image})
-
-
+
+
def initialize(context):
DirectoryView.registerDirectory(config.SKINS_DIR, config.GLOBALS)
- DirectoryView.registerDirectory('editor/views', globals())
initialize_permissions(context)
initialize_tools(context)
initialize_activities(context)
(at)(at) -112,11 +108,11 (at)(at)
initialize_content(context)
initialize_index(context)
+
def ProcessManagerFilter(objectManager):
- """Processes can only show up in Process Manager (and editor) objects."""
+ """Processes can only show up in Process Manager objects."""
meta_type = getattr(objectManager.getParentNode(), 'meta_type', '')
- if meta_type not in ["AlphaFlow Process Manager",
- "AlphaFlow Workflow Editor"]:
+ if meta_type not in ["AlphaFlow Process Manager"]:
return False
if objectManager.getId() != "processes":
(at)(at) -124,5 +120,6 (at)(at)
return True
-
-ModuleSecurityInfo("Products.AlphaFlow.utils").declarePublic("urlAppendToQueryString")
+
+ModuleSecurityInfo("Products.AlphaFlow.utils").declarePublic(
+ "urlAppendToQueryString")
Modified: AlphaFlow/trunk/interfaces.py
==============================================================================
--- AlphaFlow/trunk/interfaces.py (original)
+++ AlphaFlow/trunk/interfaces.py Wed Feb 28 21:56:55 2007
(at)(at) -11,7 +11,7 (at)(at)
# Sibling imports
from Products.AlphaFlow.interfaces_importexport import *
-
+
############
# management
(at)(at) -128,7 +128,7 (at)(at)
active_count -- Amount of active instances
fallout_count -- Ammount of instances fallen out
"""
-
+
def renderProcess(process_id, format='gif', kind=None, REQUEST=None):
"""Render a process definition given by its id as a graph.
(at)(at) -178,7 +178,6 (at)(at)
Returns rendered graph.
"""
-
def getInstance(self, instance_id):
"""Return the given instance object.
(at)(at) -195,10 +194,11 (at)(at)
def sanityCheck(REQUEST=None):
"""ensures everything is in a sane state"""
-
+
###############
# process stuff
+
class IProcess(IWorkflowAttributeAware, IDOMConfigurable, IDOMExportable):
"""A process definition."""
(at)(at) -224,17 +224,9 (at)(at)
def getProcessDOM():
"""returns XML for self as DOM node"""
- def getProcessXML(REQUEST=None):
- """Returns XML as a string containing editor information"""
-
def exportAsXML():
"""Exports process as UTF-8 encoded XML-String."""
-
- def deleteActivity(self, REQUEST):
- """removes an activity from the process definition"""
-
- def setContinueActivity(self, REQUEST=None):
- """sets the continue activity (from, to) if possible"""
+
class IActivity(IWorkflowAttributeAware, IDOMConfigurable, IDOMExportable):
"""A workflow activity.
(at)(at) -271,20 +263,20 (at)(at)
def graphGetStartActivities():
"""Return list of activities id which are startActivities of this
activity.
"""
-
+
def acquireActivity():
"""returns the activity instance from the acquisition chain"""
-
+
def deleteId(id):
"""Removes an id of any configured activity exits"""
def generateWorkItems(source, content_object):
"""Instanciates work items for this activity.
-
+
Returns list of work items.
"""
-
+
#######################
# content related stuff
(at)(at) -304,16 +296,16 (at)(at)
def assignProcess(process_id):
"""Assign a new instance of the process definition with the given id
to
this object.
-
+
Does nothing if the object already has a process instance assigned.
-
+
Returns nothing.
Raises AttributeError if a process with the given id does not
exist.
"""
def getInstance():
"""Return the currently assigned process instance or None.
-
+
XXX should raise an exception if no instance is assigned.
"""
(at)(at) -491,7 +483,7 (at)(at)
Returns nothing.
"""
-
+
def getActivityConfiguration(field, activity_id):
"""Return the configuration for this activity in the context of this
process instance.
(at)(at) -631,7 +623,7 (at)(at)
to ensure an up-to-date cache.
"""
-
+
###############################################
# specialized activity and work item interfaces
(at)(at) -716,7 +708,7 (at)(at)
def evaluate():
"Evaluate the TALES-Expression."
-
+
##############
# helper stuff
(at)(at) -758,6 +750,7 (at)(at)
Semantics are the same as in calling the url.
"""
+
class IRenderableAdapter(Interface):
"""Adapter to render an object as graph."""
(at)(at) -767,10 +760,11 (at)(at)
format: image format
kind: kind of rendering
REQUEST: request (if not None Content-Type will be set)
-
+
Returns image data.
"""
+
class IReferenceManager(Interface):
"""Adapter to manage references between activities"""
(at)(at) -778,8 +772,8 (at)(at)
"""Manages the references to this activity (continue_activity,
exits etc.)
"""
-
+
+
# Need the activity interface here after a refactoring for backwards
# compatibility
from Products.AlphaFlow.activities.interfaces import *
-from Products.AlphaFlow.editor.interfaces import *
Modified: AlphaFlow/trunk/process.py
==============================================================================
--- AlphaFlow/trunk/process.py (original)
+++ AlphaFlow/trunk/process.py Wed Feb 28 21:56:55 2007
(at)(at) -126,22 +126,7 (at)(at)
doc = minidom.Document()
self.writeDOM(doc)
return doc
-
- security.declareProtected(config.MANAGE_WORKFLOW, 'getProcessXML')
- def getProcessXML(self, REQUEST=None):
- """returns XML as a string containing editor information"""
- dom = self.getProcessDOM()
- activities = ','.join(self.listActivityIds())
- dom.documentElement.setAttribute('xmlns:editor',
- "http://www.gocept.com/alf/editor")
- dom.documentElement.setAttribute('editor:availableActivities',
- activities)
- if REQUEST is not None:
- REQUEST.RESPONSE.setHeader('Content-type', 'text/xml')
-
- return dom.toxml()
-
security.declareProtected(config.MANAGE_WORKFLOW, 'exportAsXML')
def exportAsXML(self):
"""Exports process as UTF-8 encoded XML-String."""
(at)(at) -159,46 +144,10 (at)(at)
if node.getAttribute('id') in inside_routes:
workflow.removeChild(node)
return doc.toprettyxml(encoding="utf-8")
-
- #########
- # graphical editor related methods
-
- security.declareProtected(config.MANAGE_WORKFLOW,
- 'changeProcessProperties')
- def changeProcessProperties(self, REQUEST):
- """changes the workflow properties"""
- self.title = REQUEST.get('title', '')
- self.description = REQUEST.get('description', '')
- self.startActivity = tuple(REQUEST.get('startActivity', []))
-
-
- security.declareProtected(config.MANAGE_WORKFLOW,
- 'deleteActivity')
- def deleteActivity(self, REQUEST):
- """removes an activity from the process definition"""
- id = REQUEST.get('id')
-
- if id in self.objectIds():
- self.manage_delObjects([id])
-
- for act in self.objectValues():
- exits = act.deleteId(id)
-
- security.declareProtected(config.MANAGE_WORKFLOW, 'setContinueActivity')
- def setContinueActivity(self, REQUEST=None):
- """sets the continue activity (from, to) if possible"""
- from_activity = getattr(self, REQUEST.get('from'))
- to_activity = getattr(self, REQUEST.get('to'))
-
- adapter = getReferenceManager(from_activity)
- if adapter is not None:
- adapter.manageActivityReference(to_activity)
-
-
#########
# private
-
+
security.declarePrivate('_set_allowed_roles_restriction')
def _set_allowed_roles_restriction(self, roles):
roles = tuple(roles) # do not acquire
Modified: AlphaFlow/trunk/processmanager.py
==============================================================================
--- AlphaFlow/trunk/processmanager.py (original)
+++ AlphaFlow/trunk/processmanager.py Wed Feb 28 21:56:55 2007
(at)(at) -167,18 +167,6 (at)(at)
if REQUEST is not None:
REQUEST.RESPONSE.redirect(self.absolute_url()+"/manage_tools")
- security.declareProtected(config.EDIT_WORKFLOW, "manage_editWorkflow")
- def manage_editWorkflow(self, processid, REQUEST):
- """moves the process definition to the workflow editor"""
- editor = getToolByName(self, 'workflow_editor')
-
- if processid not in editor.processes.objectIds():
- cbdata = self.processes.manage_copyObjects([processid])
- result = editor.processes.manage_pasteObjects(cb_copy_data=cbdata)
-
-
REQUEST.RESPONSE.redirect(editor.absolute_url()+"/processes/"+processid+"/views")
-
-
#########################
# IProcessManager
|
SVN: r4505 - in AlphaFlow/trunk: . activities adapters doc
Christian Theune <ct(at)gocept.com> |
2007-02-28 22:03:06 |
[ FULL ]
|
Author: ctheune
Date: Wed Feb 28 22:03:04 2007
New Revision: 4505
Modified:
AlphaFlow/trunk/__init__.py
AlphaFlow/trunk/activities/common.py
AlphaFlow/trunk/activities/notify.py
AlphaFlow/trunk/activities/permission.py
AlphaFlow/trunk/activity.py
AlphaFlow/trunk/adapters/alphaflowable.py
AlphaFlow/trunk/config.py
AlphaFlow/trunk/doc/ROADMAP.txt
AlphaFlow/trunk/importexport.py
AlphaFlow/trunk/process.py
Log:
- removed more editor pieces, removed xml export that was only used by editor
anyway.
Modified: AlphaFlow/trunk/__init__.py
==============================================================================
--- AlphaFlow/trunk/__init__.py (original)
+++ AlphaFlow/trunk/__init__.py Wed Feb 28 22:03:04 2007
(at)(at) -87,24 +87,11 (at)(at)
)
-def initialize_activityicons(context):
- currdir, subdir =
os.path.split(os.path.dirname(os.path.abspath(__file__)))
- icondir = "%s/%s" %(currdir, config.ACTIVITY_ICONS_DIR)
- icons = os.listdir(icondir)
-
- for icon in icons:
- iconpath = icondir+'/'+icon
- if os.path.isfile(iconpath):
- image = ImageFile(iconpath, globals())
- misc_.update({icon[:-4]:image})
-
-
def initialize(context):
DirectoryView.registerDirectory(config.SKINS_DIR, config.GLOBALS)
initialize_permissions(context)
initialize_tools(context)
initialize_activities(context)
- initialize_activityicons(context)
initialize_content(context)
initialize_index(context)
Modified: AlphaFlow/trunk/activities/common.py
==============================================================================
--- AlphaFlow/trunk/activities/common.py (original)
+++ AlphaFlow/trunk/activities/common.py Wed Feb 28 22:03:04 2007
(at)(at) -3,12 +3,12 (at)(at)
# Sibling imports
from Products.AlphaFlow.interfaces import IExit
-from Products.AlphaFlow.importexport import DOMExporter, DOMImporter
+from Products.AlphaFlow.importexport import DOMImporter
from Products.AlphaFlow.workflowattr import \
WorkflowAttribute, InitializeWorkflowAttributes
-
-class Exit(Persistent, DOMExporter, DOMImporter):
+
+class Exit(Persistent, DOMImporter):
__implements__ = (IExit, )
Modified: AlphaFlow/trunk/activities/notify.py
==============================================================================
--- AlphaFlow/trunk/activities/notify.py (original)
+++ AlphaFlow/trunk/activities/notify.py Wed Feb 28 22:03:04 2007
(at)(at) -26,7 +26,7 (at)(at)
IEMailActivity, IEMailWorkItem, IEMailRecipientMode
from Products.AlphaFlow.workflowattr import \
WorkflowAttribute, InitializeWorkflowAttributes, findAttrInAttributes
-from Products.AlphaFlow.importexport import DOMExporter, DOMImporter
+from Products.AlphaFlow.importexport import DOMImporter
from Products.AlphaFlow.registry import Registry
(at)(at) -201,7 +201,7 (at)(at)
-class AbstractRecipent(Persistent, DOMExporter, DOMImporter):
+class AbstractRecipent(Persistent, DOMImporter):
"""Abstract recipient class."""
__implements__ = (IEMailRecipientMode, )
Modified: AlphaFlow/trunk/activities/permission.py
==============================================================================
--- AlphaFlow/trunk/activities/permission.py (original)
+++ AlphaFlow/trunk/activities/permission.py Wed Feb 28 22:03:04 2007
(at)(at) -23,9 +23,9 (at)(at)
workflow_attributes_registry
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow import config
-from Products.AlphaFlow.importexport import DOMExporter, DOMImporter
+from Products.AlphaFlow.importexport import DOMImporter
-class PermissionSetting(DOMExporter, DOMImporter):
+class PermissionSetting(DOMImporter):
__implements__ = (IPermissionSetting, )
Modified: AlphaFlow/trunk/activity.py
==============================================================================
--- AlphaFlow/trunk/activity.py (original)
+++ AlphaFlow/trunk/activity.py Wed Feb 28 22:03:04 2007
(at)(at) -26,12 +26,11 (at)(at)
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow.workflowattr import \
WorkflowAttribute, InitializeWorkflowAttributes, findAttrInAttributes
-from Products.AlphaFlow.importexport import \
- DOMExporter, DOMImporter, convert_to_xml
+from Products.AlphaFlow.importexport import DOMImporter
from Products.AlphaFlow.registry import Registry
from Products.AlphaFlow.workitem import workitem_registry
-class BaseActivity(PropertyManager, SimpleItem, DOMExporter, DOMImporter):
+class BaseActivity(PropertyManager, SimpleItem, DOMImporter):
"""A base class to implement activities"""
__implements__ = SimpleItem.__implements__ + (IActivity,)
(at)(at) -62,12 +61,6 (at)(at)
'Workitems to be spawned just before the '
'workitem for this activity is started.',
datatype=tuple),
- WorkflowAttribute('editor:availableActivities',
- 'editor:availableActivities', None,
- 'a string which holds all activity ids for '
- 'the current workflow definition',
- importHandler=None,
- exportHandler="_attr_export_activities_list"),
WorkflowAttribute('commentfield',
'commentfield', "",
'Should the commentfield be hidden or have '
(at)(at) -140,22 +133,11 (at)(at)
temp = list(self.exits)
temp.remove(e)
self.exits = temp
-
- #########
- # private
- security.declarePrivate('_attr_export_activities_list')
- def _attr_export_activities_list(self, attr, node):
- "Export for editor specific attributes."
- node.setAttribute('xmlns:editor',
- 'http://www.gocept.com/alf/editor')
- node.setAttribute(attr.domAttr,
- convert_to_xml(",".join(self.listActivityIds())))
InitializeClass(BaseActivity)
-
class BaseAutomaticActivity(BaseActivity):
"""A base class for automatic activities (single exit)"""
Modified: AlphaFlow/trunk/adapters/alphaflowable.py
==============================================================================
--- AlphaFlow/trunk/adapters/alphaflowable.py (original)
+++ AlphaFlow/trunk/adapters/alphaflowable.py Wed Feb 28 22:03:04 2007
(at)(at) -12,7 +12,7 (at)(at)
# sibling imports
-from Products.AlphaFlow.interfaces import IProcessManager, IAlphaFlowEditor
+from Products.AlphaFlow.interfaces import IProcessManager
from Products.AlphaFlow.adapters import adapter
from Products.AlphaFlow.process import Process
from Products.AlphaFlow import config
(at)(at) -78,9 +78,6 (at)(at)
process.validation_errors = errors
-
-
def getAlphaFlowableAdapter(context):
- if IProcessManager.isImplementedBy(context) or\
- IAlphaFlowEditor.isImplementedBy(context):
+ if IProcessManager.isImplementedBy(context):
return ProcessManagerAdapter(context).__of__(context)
Modified: AlphaFlow/trunk/config.py
==============================================================================
--- AlphaFlow/trunk/config.py (original)
+++ AlphaFlow/trunk/config.py Wed Feb 28 22:03:04 2007
(at)(at) -47,7 +47,6 (at)(at)
GLOBALS = globals()
PROJECTNAME = "AlphaFlow"
WORKFLOW_DIRS = ['workflow', 'workflows']
-ACTIVITY_ICONS_DIR = "AlphaFlow/editor/icons"
# Postprocessing XSLT
PP_XSLT = "www/postprocessSVG.xsl"
Modified: AlphaFlow/trunk/doc/ROADMAP.txt
==============================================================================
--- AlphaFlow/trunk/doc/ROADMAP.txt (original)
+++ AlphaFlow/trunk/doc/ROADMAP.txt Wed Feb 28 22:03:04 2007
(at)(at) -5,6 +5,10 (at)(at)
2.0
---
+ - Remove editor
+
+ - Remove XML exporter
+
- Change installation to GenericSetup
- Write MS Visio importer
Modified: AlphaFlow/trunk/importexport.py
==============================================================================
--- AlphaFlow/trunk/importexport.py (original)
+++ AlphaFlow/trunk/importexport.py Wed Feb 28 22:03:04 2007
(at)(at) -18,65 +18,6 (at)(at)
from Products.AlphaFlow.exception import ConfigurationError
from Products.AlphaFlow.workflowattr import workflow_attributes_registry
-
-class DOMExporter:
- """Mixin class with DOM export capabilities."""
-
- __implements__ = (IDOMExportable, )
- security = ClassSecurityInfo()
-
- security.declarePrivate("writeDOM")
- def writeDOM(self, node):
- "Write the object into dom node."
- if hasattr(node, 'ownerDocument') and node.ownerDocument is not None:
- doc = node.ownerDocument # node inside
- else:
- doc = node # Document itself
- own_node = node.appendChild(doc.createElement(self.nodeName))
- for attr in self.attributes:
- if attr.exportHandler is None:
- continue
- exportHandler = getattr(self, attr.exportHandler)
- exportHandler(attr, own_node)
-
-
- security.declareProtected(config.EDIT_WORKFLOW, "getXML")
- def getXML(self, REQUEST=None):
- """returns the AlphaFlow XML for this object"""
- doc = minidom.Document()
- self.writeDOM(doc)
- doc.documentElement.setAttribute('xmlns:editor',
- "http://www.gocept.com/alf/editor")
- xml = doc.toxml()
- if REQUEST is not None:
- REQUEST.RESPONSE.setHeader('Content-type', 'text/xml')
- return xml
-
- ########################
- # public export handlers
-
- security.declarePrivate('_attr_export_simple')
- def _attr_export_simple(self, attr, node):
- "Export for attributes which need no special handling."
- value = getattr(self, attr.classAttr)
- value = convert_to_xml(value)
- if attr.encoding is not None:
- value = value.decode(attr.encoding)
- node.setAttribute(attr.domAttr, value)
-
- security.declarePrivate('_attr_export_id')
- def _attr_export_id(self, attr, node):
- "Export for id attribute."
- node.setAttribute(attr.domAttr, convert_to_xml(self.getId()))
-
- security.declarePrivate('_attr_export_as_childnodes')
- def _attr_export_as_childnodes(self, attr, node):
- "Export elements of a sequence attribute as child nodes."
- for element in getattr(self, attr.classAttr):
- element.writeDOM(node)
-
-InitializeClass(DOMExporter)
-
class DOMImporter:
"""Mixin class with capabilities to import attributes from DOM."""
Modified: AlphaFlow/trunk/process.py
==============================================================================
--- AlphaFlow/trunk/process.py (original)
+++ AlphaFlow/trunk/process.py Wed Feb 28 22:03:04 2007
(at)(at) -22,7 +22,7 (at)(at)
from Products.AlphaFlow.activity import activity_registry
from Products.AlphaFlow.workflowattr import \
WorkflowAttribute, InitializeWorkflowAttributes
-from Products.AlphaFlow.importexport import DOMExporter, DOMImporter
+from Products.AlphaFlow.importexport import DOMImporter
from Products.AlphaFlow.exception import UnknownActivityTypeError
from Products.AlphaFlow.adapters.referencemanager import getReferenceManager
(at)(at) -31,7 +31,7 (at)(at)
self.manage_addProcess(id, REQUEST)
-class Process(Folder, DOMExporter, DOMImporter):
+class Process(Folder, DOMImporter):
__implements__ = Folder.__implements__ + (IProcess,)
meta_type = "AlphaFlow Process"
|
|