knowledge stuff working, including first view

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1231 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2006-05-27 16:53:59 +00:00
parent 8423fcea57
commit b3ff0831d9
12 changed files with 211 additions and 37 deletions

View file

@ -99,16 +99,18 @@ class ConceptView(BaseView):
@Lazy @Lazy
def view(self): def view(self):
viewName = self.request.get('loops.viewName') or getattr(self, '_viewName', None)
if not viewName:
ti = IType(self.context).typeInterface ti = IType(self.context).typeInterface
# TODO: check the interface (maybe for a base interface IViewProvider) # TODO: check the interface (maybe for a base interface IViewProvider)
# instead of the viewName attribute: # instead of the viewName attribute:
if ti and 'viewName' in ti: if ti and 'viewName' in ti:
typeAdapter = ti(self.context) typeAdapter = ti(self.context)
viewName = typeAdapter.viewName viewName = typeAdapter.viewName
if viewName:
# ??? Would it make sense to use a somehow restricted interface # ??? Would it make sense to use a somehow restricted interface
# that should be provided by the view like IQuery? # that should be provided by the view like IQuery?
#viewInterface = getattr(typeAdapter, 'viewInterface', None) or IQuery #viewInterface = getattr(typeAdapter, 'viewInterface', None) or IQuery
if viewName:
adapter = component.queryMultiAdapter((self.context, self.request), adapter = component.queryMultiAdapter((self.context, self.request),
interface.Interface, name=viewName) interface.Interface, name=viewName)
if adapter is not None: if adapter is not None:

View file

@ -443,7 +443,7 @@
name="AddLoopsNode.html" name="AddLoopsNode.html"
content_factory="loops.view.Node" content_factory="loops.view.Node"
schema="loops.interfaces.INode" schema="loops.interfaces.INode"
fields="title description nodeType viewer body" fields="title description nodeType viewName body"
template="add.pt" template="add.pt"
permission="zope.ManageContent"> permission="zope.ManageContent">
@ -464,7 +464,7 @@
label="Edit Node" label="Edit Node"
name="edit.html" name="edit.html"
schema="loops.interfaces.INode" schema="loops.interfaces.INode"
fields="title description nodeType viewer body" fields="title description nodeType viewName body"
for="loops.interfaces.INode" for="loops.interfaces.INode"
template="edit.pt" template="edit.pt"
permission="zope.ManageContent" permission="zope.ManageContent"
@ -547,6 +547,16 @@
name="node.html" name="node.html"
/> />
<zope:adapter
name="listpages"
for="loops.interfaces.INode
zope.publisher.interfaces.browser.IBrowserRequest"
provides="zope.interface.Interface"
factory="loops.browser.node.ListPages"
permission="zope.View"
/>
<!-- render file or image assigned to a node as target --> <!-- render file or image assigned to a node as target -->
<page <page

View file

@ -55,23 +55,35 @@ class NodeView(BaseView):
@Lazy @Lazy
def macro(self): def macro(self):
macroName = self.request.get('viewer') return self.template.macros['content']
if not macroName: #macroName = self.request.get('loops.viewName')
macroName = self.context.viewer or 'content' #if not macroName:
return self.template.macros[macroName] # macroName = self.context.viewName or 'content'
#return self.template.macros[macroName]
@Lazy
def view(self):
viewName = self.request.get('loops.viewName') or self.context.viewName
if viewName:
adapter = component.queryMultiAdapter((self.context, self.request),
interface.Interface, name=viewName)
if adapter is not None:
return adapter
return self
@Lazy @Lazy
def item(self): def item(self):
target = self.request.annotations.get('loops.view', {}).get('target') target = self.request.annotations.get('loops.view', {}).get('target')
# was there a .target... element in the URL?
if target is not None: if target is not None:
# .target.... traversal magic basicView = zapi.getMultiAdapter((target, self.request))
return zapi.getMultiAdapter((target, self.request)) return basicView.view
return self.page return self.page
@Lazy @Lazy
def page(self): def page(self):
page = self.context.getPage() page = self.context.getPage()
return page is not None and NodeView(page, self.request) or None return page is not None and NodeView(page, self.request).view or None
@Lazy @Lazy
def textItems(self): def textItems(self):
@ -107,8 +119,8 @@ class NodeView(BaseView):
obj = self.targetObject obj = self.targetObject
if obj is not None: if obj is not None:
basicView = zapi.getMultiAdapter((obj, self.request)) basicView = zapi.getMultiAdapter((obj, self.request))
basicView._viewName = self.context.viewName
return basicView.view return basicView.view
#return zapi.getMultiAdapter((obj, self.request))
def renderTarget(self): def renderTarget(self):
target = self.target target = self.target
@ -212,6 +224,17 @@ class NodeView(BaseView):
return zapi.getUtility(IIntIds).getId(target) return zapi.getUtility(IIntIds).getId(target)
class ListPages(NodeView):
@Lazy
def macro(self):
return self.template.macros['listpages']
@Lazy
def view(self):
return self
class ConfigureView(NodeView): class ConfigureView(NodeView):
""" An editing view for configuring a node, optionally creating """ An editing view for configuring a node, optionally creating
a target object. a target object.

View file

@ -315,6 +315,7 @@
name="loops.PredicateSource" name="loops.PredicateSource"
/> />
<include package=".knowledge" />
<include package=".organize" /> <include package=".organize" />
<include package=".browser" /> <include package=".browser" />

View file

@ -314,10 +314,10 @@ class IView(ILoopsObject):
target = Attribute('Target object that is referenced by this view') target = Attribute('Target object that is referenced by this view')
viewer = schema.TextLine( viewName = schema.TextLine(
title=_(u'Viewer Method Specification'), title=_(u'View name'),
description=_(u'Name, path or relative URI specifying a viewer ' description=_(u'Name of a special view be used for presenting '
'(template, macro, ...) for this object'), 'this object.'),
default=u'', default=u'',
required=False) required=False)

View file

@ -40,13 +40,18 @@ _ = MessageFactory('zope')
class MyKnowledge(BaseView): class MyKnowledge(BaseView):
def __init__(self, context, request): template = NamedTemplate('loops.knowledge_macros')
self.context = context
self.request = request @Lazy
person = getPersonForLoggedInUser(request) def macro(self):
return self.template.macros['requirements']
@Lazy
def person(self):
person = getPersonForLoggedInUser(self.request)
if person is not None: if person is not None:
person = IPerson(person) person = IPerson(person)
self.person = person return person
def myKnowledge(self): def myKnowledge(self):
if self.person is None: if self.person is None:
@ -57,8 +62,11 @@ class MyKnowledge(BaseView):
def myKnowledgeProvidersForTask(self): def myKnowledgeProvidersForTask(self):
if self.person is None: if self.person is None:
return () return ()
request = self.request
task = ITask(self.context) task = ITask(self.context)
# TODO: check correct conceptType for context! # TODO: check correct conceptType for context!
providers = self.person.getProvidersNeeded(task) 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)

View file

@ -6,6 +6,13 @@
i18n_domain="zope" i18n_domain="zope"
> >
<!-- named templates -->
<zope:adapter
factory="loops.knowledge.util.knowledge_macros"
for="loops.browser.common.BaseView"
name="loops.knowledge_macros" />
<!-- knowledge/learning management stuff --> <!-- knowledge/learning management stuff -->
<zope:adapter factory="loops.knowledge.knowledge.Person" <zope:adapter factory="loops.knowledge.knowledge.Person"
@ -15,6 +22,58 @@
<zope:class class="loops.knowledge.knowledge.Person"> <zope:class class="loops.knowledge.knowledge.Person">
<require permission="zope.View" <require permission="zope.View"
interface="loops.knowledge.interfaces.IPerson" /> interface="loops.knowledge.interfaces.IPerson" />
<require permission="zope.ManageContent"
set_schema="loops.knowledge.interfaces.IPerson" />
</zope:class> </zope:class>
<zope:adapter factory="loops.knowledge.knowledge.Topic"
provides="cybertools.knowledge.interfaces.IKnowledgeElement"
trusted="True" />
<zope:class class="loops.knowledge.knowledge.Topic">
<require permission="zope.View"
interface="cybertools.knowledge.interfaces.IKnowledgeElement" />
</zope:class>
<zope:adapter factory="loops.knowledge.knowledge.Task"
provides="loops.knowledge.interfaces.ITask"
trusted="True" />
<zope:class class="loops.knowledge.knowledge.Task">
<require permission="zope.View"
interface="loops.knowledge.interfaces.ITask" />
<require permission="zope.ManageContent"
set_schema="loops.knowledge.interfaces.ITask" />
</zope:class>
<zope:adapter factory="loops.knowledge.knowledge.ConceptKnowledgeProvider"
provides="cybertools.knowledge.interfaces.IKnowledgeProvider"
trusted="True" />
<zope:class class="loops.knowledge.knowledge.ConceptKnowledgeProvider">
<require permission="zope.View"
interface="cybertools.knowledge.interfaces.IKnowledgeProvider" />
</zope:class>
<zope:adapter factory="loops.knowledge.knowledge.ResourceKnowledgeProvider"
provides="cybertools.knowledge.interfaces.IKnowledgeProvider"
trusted="True" />
<zope:class class="loops.knowledge.knowledge.ResourceKnowledgeProvider">
<require permission="zope.View"
interface="cybertools.knowledge.interfaces.IKnowledgeProvider" />
</zope:class>
<!-- views -->
<zope:adapter
name="requirements"
for="loops.interfaces.IConcept
zope.publisher.interfaces.browser.IBrowserRequest"
provides="zope.interface.Interface"
factory="loops.knowledge.browser.MyKnowledge"
permission="zope.View"
/>
</configure> </configure>

View file

@ -34,6 +34,8 @@ from cybertools.organize.interfaces import ITask as IBaseTask
_ = MessageFactory('zope') _ = MessageFactory('zope')
# TODO: separate interfaces for viewing and changing methods!
class IPerson(IBasePerson, IKnowing): class IPerson(IBasePerson, IKnowing):
""" A person, including knowledge/learning management features. """ A person, including knowledge/learning management features.

View file

@ -32,7 +32,7 @@ from zope.cachedescriptors.property import Lazy
from cybertools.typology.interfaces import IType from cybertools.typology.interfaces import IType
from cybertools.knowledge.interfaces import IKnowledgeElement, IKnowledgeProvider from cybertools.knowledge.interfaces import IKnowledgeElement, IKnowledgeProvider
from cybertools.knowledge.knowing import Knowing 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.knowledge.interfaces import IPerson, ITask
from loops.organize.party import Person as BasePerson from loops.organize.party import Person as BasePerson
from loops.organize.task import Task as BaseTask 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) # register type interfaces - (TODO: use a function for this)
TypeInterfaceSourceList.typeInterfaces += (IPerson, IKnowledgeElement, ITask) TypeInterfaceSourceList.typeInterfaces += (IPerson, IKnowledgeElement,
ITask, IKnowledgeProvider)
class KnowledgeAdapterMixin(object): class KnowledgeAdapterMixin(object):
@ -170,6 +171,7 @@ class ConceptKnowledgeProvider(AdapterBase, KnowledgeAdapterMixin):
class ResourceKnowledgeProvider(AdapterBase, KnowledgeAdapterMixin): class ResourceKnowledgeProvider(AdapterBase, KnowledgeAdapterMixin):
implements(IKnowledgeProvider) implements(IKnowledgeProvider)
adapts(IResource)
def getProvidedKnowledge(self): def getProvidedKnowledge(self):
return (IKnowledgeElement(c) return (IKnowledgeElement(c)

View file

@ -0,0 +1,35 @@
<metal:listing define-macro="requirements">
<div>
<h3 tal:attributes="class string:content-$level;
ondblclick item/openEditWindow">
<span i18n:translate="">Concept</span>:
<span tal:content="item/title">Title</span>
</h3>
<metal:listing define-macro="requirementslisting2">
<div tal:attributes="class string:content-$level;
ondblclick python: item.openEditWindow('configure.html')">
<h4>Requirements</h4>
<table class="listing">
<tr>
<th i18n:translate="">Requirement</th>
<th i18n:translate="">Providers</th>
</tr>
<tr tal:repeat="related item/myKnowledgeProvidersForTask">
<td>
<a href="#"
tal:attributes="href string:${view/url}/.target${related/required/uniqueId}"
tal:content="related/required/title">Concept Title</a>
</td>
<td>
<tal:provider repeat="prov related/providers">
<a href="#"
tal:attributes="href string:${view/url}/.target${prov/uniqueId}"
tal:content="prov/title">Provider Title</a>
</tal:provider>
</td>
</tr>
</table>
</div>
</metal:listing>
</div>
</metal:listing>

30
knowledge/util.py Normal file
View file

@ -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'))

10
view.py
View file

@ -60,10 +60,12 @@ class View(object):
def setDescription(self, description): self._description = description def setDescription(self, description): self._description = description
description = property(getDescription, setDescription) description = property(getDescription, setDescription)
_viewer = u'' _viewName = u''
def getViewer(self): return self._viewer def getViewName(self): return self._viewName or getattr(self, '_viewer', u'')
def setViewer(self, viewer): self._viewer = viewer def setViewName(self, viewName): self._viewName = viewName
viewer = property(getViewer, setViewer) viewName = property(getViewName, setViewName)
viewer = property(getViewName, setViewName) # BBB
def getTarget(self): def getTarget(self):
rels = getRelations(first=self, relationships=[TargetRelation]) rels = getRelations(first=self, relationships=[TargetRelation])