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
+
+
+
+
+
+
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])