From b3ff0831d92eb2b027ce7ae8e241420aa0d80993 Mon Sep 17 00:00:00 2001 From: helmutm Date: Sat, 27 May 2006 16:53:59 +0000 Subject: [PATCH] knowledge stuff working, including first view git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1231 fd906abe-77d9-0310-91a1-e0d9ade77398 --- browser/concept.py | 24 +++++++------- browser/configure.zcml | 14 +++++++-- browser/node.py | 39 ++++++++++++++++++----- configure.zcml | 1 + interfaces.py | 8 ++--- knowledge/browser.py | 20 ++++++++---- knowledge/configure.zcml | 59 +++++++++++++++++++++++++++++++++++ knowledge/interfaces.py | 2 ++ knowledge/knowledge.py | 6 ++-- knowledge/knowledge_macros.pt | 35 +++++++++++++++++++++ knowledge/util.py | 30 ++++++++++++++++++ view.py | 10 +++--- 12 files changed, 211 insertions(+), 37 deletions(-) create mode 100644 knowledge/knowledge_macros.pt create mode 100644 knowledge/util.py diff --git a/browser/concept.py b/browser/concept.py index 910228d..fca92f9 100644 --- a/browser/concept.py +++ b/browser/concept.py @@ -99,20 +99,22 @@ class ConceptView(BaseView): @Lazy def view(self): - ti = IType(self.context).typeInterface - # TODO: check the interface (maybe for a base interface IViewProvider) - # instead of the viewName attribute: - if ti and 'viewName' in ti: - typeAdapter = ti(self.context) - viewName = typeAdapter.viewName + viewName = self.request.get('loops.viewName') or getattr(self, '_viewName', None) + if not viewName: + ti = IType(self.context).typeInterface + # TODO: check the interface (maybe for a base interface IViewProvider) + # instead of the viewName attribute: + if ti and 'viewName' in ti: + typeAdapter = ti(self.context) + viewName = typeAdapter.viewName + if viewName: # ??? Would it make sense to use a somehow restricted interface # that should be provided by the view like IQuery? #viewInterface = getattr(typeAdapter, 'viewInterface', None) or IQuery - if viewName: - adapter = component.queryMultiAdapter((self.context, self.request), - interface.Interface, name=viewName) - if adapter is not None: - return adapter + adapter = component.queryMultiAdapter((self.context, self.request), + interface.Interface, name=viewName) + if adapter is not None: + return adapter #elif type provides view: use this return self diff --git a/browser/configure.zcml b/browser/configure.zcml index 2b1cbbf..1686ec7 100644 --- a/browser/configure.zcml +++ b/browser/configure.zcml @@ -443,7 +443,7 @@ name="AddLoopsNode.html" content_factory="loops.view.Node" schema="loops.interfaces.INode" - fields="title description nodeType viewer body" + fields="title description nodeType viewName body" template="add.pt" permission="zope.ManageContent"> @@ -464,7 +464,7 @@ label="Edit Node" name="edit.html" schema="loops.interfaces.INode" - fields="title description nodeType viewer body" + fields="title description nodeType viewName body" for="loops.interfaces.INode" template="edit.pt" permission="zope.ManageContent" @@ -547,6 +547,16 @@ name="node.html" /> + + + + diff --git a/interfaces.py b/interfaces.py index da05358..a08fbac 100644 --- a/interfaces.py +++ b/interfaces.py @@ -314,10 +314,10 @@ class IView(ILoopsObject): target = Attribute('Target object that is referenced by this view') - viewer = schema.TextLine( - title=_(u'Viewer Method Specification'), - description=_(u'Name, path or relative URI specifying a viewer ' - '(template, macro, ...) for this object'), + viewName = schema.TextLine( + title=_(u'View name'), + description=_(u'Name of a special view be used for presenting ' + 'this object.'), default=u'', required=False) diff --git a/knowledge/browser.py b/knowledge/browser.py index 3803227..8023c0d 100644 --- a/knowledge/browser.py +++ b/knowledge/browser.py @@ -40,13 +40,18 @@ _ = MessageFactory('zope') class MyKnowledge(BaseView): - def __init__(self, context, request): - self.context = context - self.request = request - person = getPersonForLoggedInUser(request) + template = NamedTemplate('loops.knowledge_macros') + + @Lazy + def macro(self): + return self.template.macros['requirements'] + + @Lazy + def person(self): + person = getPersonForLoggedInUser(self.request) if person is not None: person = IPerson(person) - self.person = person + return person def myKnowledge(self): if self.person is None: @@ -57,8 +62,11 @@ class MyKnowledge(BaseView): def myKnowledgeProvidersForTask(self): if self.person is None: return () + request = self.request task = ITask(self.context) # TODO: check correct conceptType for context! providers = self.person.getProvidersNeeded(task) - return providers + return ({'required': BaseView(req.context, request), + 'providers': (BaseView(p.context, request) for p in prov)} + for req, prov in providers) diff --git a/knowledge/configure.zcml b/knowledge/configure.zcml index 26e038d..96cf2c0 100644 --- a/knowledge/configure.zcml +++ b/knowledge/configure.zcml @@ -6,6 +6,13 @@ i18n_domain="zope" > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/knowledge/interfaces.py b/knowledge/interfaces.py index f76699f..e15d895 100644 --- a/knowledge/interfaces.py +++ b/knowledge/interfaces.py @@ -34,6 +34,8 @@ from cybertools.organize.interfaces import ITask as IBaseTask _ = MessageFactory('zope') +# TODO: separate interfaces for viewing and changing methods! + class IPerson(IBasePerson, IKnowing): """ A person, including knowledge/learning management features. diff --git a/knowledge/knowledge.py b/knowledge/knowledge.py index 10a6108..cefe24b 100644 --- a/knowledge/knowledge.py +++ b/knowledge/knowledge.py @@ -32,7 +32,7 @@ from zope.cachedescriptors.property import Lazy from cybertools.typology.interfaces import IType from cybertools.knowledge.interfaces import IKnowledgeElement, IKnowledgeProvider from cybertools.knowledge.knowing import Knowing -from loops.interfaces import IConcept +from loops.interfaces import IConcept, IResource from loops.knowledge.interfaces import IPerson, ITask from loops.organize.party import Person as BasePerson from loops.organize.task import Task as BaseTask @@ -41,7 +41,8 @@ from loops.type import TypeInterfaceSourceList, AdapterBase # register type interfaces - (TODO: use a function for this) -TypeInterfaceSourceList.typeInterfaces += (IPerson, IKnowledgeElement, ITask) +TypeInterfaceSourceList.typeInterfaces += (IPerson, IKnowledgeElement, + ITask, IKnowledgeProvider) class KnowledgeAdapterMixin(object): @@ -170,6 +171,7 @@ class ConceptKnowledgeProvider(AdapterBase, KnowledgeAdapterMixin): class ResourceKnowledgeProvider(AdapterBase, KnowledgeAdapterMixin): implements(IKnowledgeProvider) + adapts(IResource) def getProvidedKnowledge(self): return (IKnowledgeElement(c) diff --git a/knowledge/knowledge_macros.pt b/knowledge/knowledge_macros.pt new file mode 100644 index 0000000..5abc24d --- /dev/null +++ b/knowledge/knowledge_macros.pt @@ -0,0 +1,35 @@ + +
+

+ Concept: + Title +

+ +
+

Requirements

+ + + + + + + + + +
RequirementProviders
+ Concept Title + + + Provider Title + +
+
+
+
+
diff --git a/knowledge/util.py b/knowledge/util.py new file mode 100644 index 0000000..dba144e --- /dev/null +++ b/knowledge/util.py @@ -0,0 +1,30 @@ +# +# Copyright (c) 2006 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 +# + +""" +Utilities. + +$Id$ +""" + +from zope.app.pagetemplate import ViewPageTemplateFile +from zope.formlib.namedtemplate import NamedTemplateImplementation + + +knowledge_macros = NamedTemplateImplementation( + ViewPageTemplateFile('knowledge_macros.pt')) diff --git a/view.py b/view.py index cd1805e..db6ddc4 100644 --- a/view.py +++ b/view.py @@ -60,10 +60,12 @@ class View(object): def setDescription(self, description): self._description = description description = property(getDescription, setDescription) - _viewer = u'' - def getViewer(self): return self._viewer - def setViewer(self, viewer): self._viewer = viewer - viewer = property(getViewer, setViewer) + _viewName = u'' + def getViewName(self): return self._viewName or getattr(self, '_viewer', u'') + def setViewName(self, viewName): self._viewName = viewName + viewName = property(getViewName, setViewName) + + viewer = property(getViewName, setViewName) # BBB def getTarget(self): rels = getRelations(first=self, relationships=[TargetRelation])