diff --git a/composer/schema/browser/common.py b/composer/schema/browser/common.py
new file mode 100644
index 0000000..1e1ddca
--- /dev/null
+++ b/composer/schema/browser/common.py
@@ -0,0 +1,91 @@
+#
+# Copyright (c) 2007 Helmut Merz helmutm@cy55.de
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+
+"""
+Common base class(es) for schema and other template views.
+
+$Id$
+"""
+
+from zope import component
+from zope.cachedescriptors.property import Lazy
+
+from cybertools.composer.interfaces import IInstance
+from cybertools.composer.schema.interfaces import IClientFactory
+
+
+class BaseView(object):
+
+ clientName = None
+
+ def __init__(self, context, request):
+ self.context = context
+ self.request = request
+
+ @Lazy
+ def manager(self):
+ return self.context.getManager()
+
+ @Lazy
+ def previousTemplate(self):
+ return self.getPreviousTemplate()
+
+ def getPreviousTemplate(self):
+ templates = self.context.getManager().getClientSchemas()
+ context = self.context
+ idx = templates.find(context)
+ if idx > 0:
+ #return templates[idx-1].name
+ return templates.keys()[idx-1]
+ else:
+ return None
+
+ @Lazy
+ def nextTemplate(self):
+ return self.getNextTemplate()
+
+ def getNextTemplate(self):
+ templates = self.context.getManager().getClientSchemas()
+ context = self.context
+ idx = templates.find(context)
+ if 0 <= idx < len(templates) - 1:
+ #return templates[idx+1].name
+ return templates.keys()[idx+1]
+ else:
+ return None
+
+ @Lazy
+ def url(self):
+ from zope.traversing.browser import absoluteURL
+ url = absoluteURL(self.context, self.request)
+
+ buttonActions = dict(
+ submit_previous=getPreviousTemplate,
+ submit_next=getNextTemplate,
+ )
+
+ #@Lazy
+ def nextUrl(self):
+ #viewName = 'thankyou.html'
+ viewName = ''
+ form = self.request.form
+ for bn in self.buttonActions:
+ if bn in form:
+ viewName = self.buttonActions[bn](self)
+ break
+ return '%s/%s?id=%s' % (self.url, viewName, self.clientName)
diff --git a/composer/schema/browser/configure.zcml b/composer/schema/browser/configure.zcml
index ee1c325..f98ddf7 100644
--- a/composer/schema/browser/configure.zcml
+++ b/composer/schema/browser/configure.zcml
@@ -8,7 +8,7 @@
@@ -19,7 +19,7 @@
diff --git a/composer/schema/browser/base.py b/composer/schema/browser/schema.py
similarity index 83%
rename from composer/schema/browser/base.py
rename to composer/schema/browser/schema.py
index 06d68db..72ca606 100644
--- a/composer/schema/browser/base.py
+++ b/composer/schema/browser/schema.py
@@ -25,17 +25,12 @@ $Id$
from zope import component
from zope.cachedescriptors.property import Lazy
+from cybertools.composer.schema.browser.common import BaseView
from cybertools.composer.interfaces import IInstance
from cybertools.composer.schema.interfaces import IClientFactory
-class SchemaView(object):
-
- clientName = None
-
- def __init__(self, context, request):
- self.context = context
- self.request = request
+class SchemaView(BaseView):
@Lazy
def fields(self):
@@ -78,12 +73,7 @@ class SchemaView(object):
instance = component.getAdapter(client, IInstance, name='editor')
instance.template = self.context
instance.applyTemplate(form)
- return True
- #self.request.response.redirect(self.nextUrl)
- #return False
+ #return True
+ self.request.response.redirect(self.nextUrl())
+ return False
- @Lazy
- def nextUrl(self):
- from zope.traversing.browser import absoluteURL
- url = absoluteURL(self.context, self.request)
- return '%s/thankyou.html?id=%s' % (url, self.clientName)
diff --git a/organize/browser/service.py b/organize/browser/service.py
index 28fef2c..40fe8d3 100644
--- a/organize/browser/service.py
+++ b/organize/browser/service.py
@@ -26,16 +26,11 @@ from zope import component
from zope.cachedescriptors.property import Lazy
from cybertools.organize.interfaces import IClientRegistrations
+from cybertools.composer.schema.browser.common import BaseView
from cybertools.composer.schema.interfaces import IClientFactory
-class RegistrationTemplateView(object):
-
- clientName = None
-
- def __init__(self, context, request):
- self.context = context
- self.request = request
+class RegistrationTemplateView(BaseView):
@Lazy
def services(self):
@@ -87,12 +82,6 @@ class RegistrationTemplateView(object):
toDelete = [s for s in oldServices
if s in allServices and s not in newServices]
regs.unregister(toDelete)
- return True
- #self.request.response.redirect(self.nextUrl)
- #return False
-
- @Lazy
- def nextUrl(self):
- from zope.traversing.browser import absoluteURL
- url = absoluteURL(self.context, self.request)
- return '%s/thankyou.html?id=%s' % (url, self.clientName)
+ #return True
+ self.request.response.redirect(self.nextUrl())
+ return False
diff --git a/organize/service.py b/organize/service.py
index f30f8e7..dc03170 100644
--- a/organize/service.py
+++ b/organize/service.py
@@ -58,6 +58,9 @@ class ServiceManager(object):
def getServices(self):
return self.services
+ def getClientSchemas(self):
+ return self.clientSchemas
+
@Lazy
def clients(self):
return self.clientsFactory()
@@ -138,8 +141,8 @@ class RegistrationTemplate(object):
implements(IRegistrationTemplate)
def __init__(self, name=None, manager=None):
- self.name = name
- self.manager = manager
+ self.name = self.__name__ = name
+ self.manager = self.__parent__ = manager
@property
def services(self):
diff --git a/util/jeep.py b/util/jeep.py
index 0f57d3b..c88dc01 100644
--- a/util/jeep.py
+++ b/util/jeep.py
@@ -105,3 +105,20 @@ class Jeep(object):
delattr(self, key)
return value
+ def find(self, obj):
+ if isinstance(obj, basestring):
+ key = obj
+ else:
+ key = getattr(obj, '__name__', getattr(obj, 'name', _notfound))
+ if key is _notfound:
+ raise AttributeError("No name attribute present")
+ if key in self:
+ return self._sequence.index(key)
+ else:
+ return -1
+
+ def index(self, obj):
+ idx = self.find(obj)
+ if idx < 0:
+ raise ValueError('list.index(x): x not in list')
+ return idx