From 5247eee6f610127e50a7d28a5fdf29700c789661 Mon Sep 17 00:00:00 2001 From: helmutm Date: Mon, 6 Aug 2007 09:09:02 +0000 Subject: [PATCH] provide navigation between forms git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@1882 fd906abe-77d9-0310-91a1-e0d9ade77398 --- composer/schema/browser/common.py | 91 +++++++++++++++++++ composer/schema/browser/configure.zcml | 4 +- .../schema/browser/{base.py => schema.py} | 20 +--- organize/browser/service.py | 21 +---- organize/service.py | 7 +- util/jeep.py | 17 ++++ 6 files changed, 125 insertions(+), 35 deletions(-) create mode 100644 composer/schema/browser/common.py rename composer/schema/browser/{base.py => schema.py} (83%) 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