@@ -107,7 +115,6 @@
diff --git a/browser/form.py b/browser/form.py
index 1b104b7..214f9d4 100644
--- a/browser/form.py
+++ b/browser/form.py
@@ -219,7 +219,8 @@ class EditObjectForm(ObjectForm):
def assignments(self):
for c in self.target.getConceptRelations():
r = ConceptRelationView(c, self.request)
- if r.isProtected: continue
+ if r.isProtected:
+ continue
yield r
@@ -242,7 +243,9 @@ class EditConceptForm(EditObjectForm):
def assignments(self):
for c in self.target.getParentRelations():
r = ConceptRelationView(c, self.request)
- if not r.isProtected and r.context != self.target:
+ if r.isProtected or r.isHidden(r.relation):
+ continue
+ if r.context != self.target:
yield r
diff --git a/knowledge/README.txt b/knowledge/README.txt
index ebfb43c..ed77023 100644
--- a/knowledge/README.txt
+++ b/knowledge/README.txt
@@ -130,6 +130,10 @@ fulfill the position offered:
>>> [list(d)[0].title for k, d in prov]
['Objectorienting Programming', 'oopython.pdf']
+Controlling knowledge-related form fields via a schema factory
+--------------------------------------------------------------
+
+ >>> from loops.knowledge.schema import PersonSchemaFactory
Views that make use of the knowledge management modules
-------------------------------------------------------
diff --git a/knowledge/configure.zcml b/knowledge/configure.zcml
index 9f2f7d1..1821b38 100644
--- a/knowledge/configure.zcml
+++ b/knowledge/configure.zcml
@@ -79,6 +79,8 @@
+
+
diff --git a/knowledge/interfaces.py b/knowledge/interfaces.py
index 6c3b373..964ffc0 100644
--- a/knowledge/interfaces.py
+++ b/knowledge/interfaces.py
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2008 Helmut Merz helmutm@cy55.de
+# Copyright (c) 2011 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
@@ -32,8 +32,9 @@ from cybertools.knowledge.interfaces import IKnowledgeElement
from loops.interfaces import IConceptSchema, ILoopsAdapter
from loops.organize.interfaces import IPerson as IBasePerson
from loops.organize.interfaces import ITask as IBaseTask
+from loops.schema.base import Relation, RelationSet
-_ = MessageFactory('zope')
+_ = MessageFactory('loops')
# TODO: separate interfaces for viewing and changing methods!
@@ -42,6 +43,12 @@ class IPerson(IBasePerson, IKnowing, ILoopsAdapter):
""" A person, including knowledge/learning management features.
"""
+ knowledge = RelationSet(
+ title=_(u'Knowledge'),
+ description=_(u'The knowledge elements for this person.'),
+ #target_types=('topic',), # set via global option knowledge.element
+ required=False)
+
class ITask(IBaseTask, IRequirementProfile, ILoopsAdapter):
""" A task, also acting as a knowledge requirement profile.
diff --git a/knowledge/knowledge.py b/knowledge/knowledge.py
index f4b3bc2..68a18c9 100644
--- a/knowledge/knowledge.py
+++ b/knowledge/knowledge.py
@@ -32,6 +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.common import ParentRelationSetProperty, ChildRelationSetProperty
from loops.interfaces import IConcept, IResource
from loops.i18n.common import I18NAdapterBase
from loops.knowledge.interfaces import IPerson, ITask, ITopic
@@ -82,6 +83,11 @@ class Person(BasePerson, Knowing, KnowledgeAdapterMixin):
knowledge/learning management features.
"""
+ _adapterAttributes = BasePerson._adapterAttributes + ('knowledge',)
+ _noexportAttributes = ('knowledge',)
+
+ knowledge = ParentRelationSetProperty('knows')
+
implements(IPerson)
def getKnowledge(self):
diff --git a/knowledge/schema.py b/knowledge/schema.py
new file mode 100644
index 0000000..2922672
--- /dev/null
+++ b/knowledge/schema.py
@@ -0,0 +1,45 @@
+#
+# Copyright (c) 2011 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
+#
+
+"""
+Specialized schema factories
+
+$Id$
+"""
+
+from zope.component import adapts
+
+from cybertools.meta.interfaces import IOptions
+from loops.knowledge.interfaces import IPerson
+from loops.organize.schema import PersonSchemaFactory as BasePersonSchemaFactory
+
+
+class PersonSchemaFactory(BasePersonSchemaFactory):
+
+ adapts(IPerson)
+
+ def __call__(self, interface, **kw):
+ schema = super(PersonSchemaFactory, self).__call__(interface, **kw)
+ if 'knowledge' in schema.fields.keys():
+ kelements = IOptions(self.context.getLoopsRoot())('knowledge.element')
+ if kelements:
+ schema.fields['knowledge'].target_types = kelements
+ else:
+ del schema.fields['knowledge']
+ return schema
+
diff --git a/schema/base.py b/schema/base.py
index adb6079..49e98f9 100644
--- a/schema/base.py
+++ b/schema/base.py
@@ -62,7 +62,7 @@ class Relation(Field):
instanceName='relation'))
def __init__(self, *args, **kw):
- self.target_types = kw.pop('target_types')
+ self.target_types = kw.pop('target_types', ())
super(Relation, self).__init__(*args, **kw)
@@ -73,10 +73,11 @@ class RelationSet(List):
__typeInfo__ = ('relationset',
FieldType('relationset', 'relationset',
u'A field representing a sequence of related objects.',
- instanceName='relationset'))
+ instanceName='relationset',
+ displayRenderer='display_relationset'))
def __init__(self, *args, **kw):
- self.target_types = kw.pop('target_types')
+ self.target_types = kw.pop('target_types', ())
self.selection_view = kw.pop('selection_view', None)
super(RelationSet, self).__init__(*args, **kw)
diff --git a/schema/field.py b/schema/field.py
index 76ff78f..910205f 100644
--- a/schema/field.py
+++ b/schema/field.py
@@ -76,7 +76,10 @@ class RelationSetFieldInstance(ListFieldInstance, BaseRelationFieldInstance):
for v in value]
def display(self, value):
- return ' | '.join([v.title for v in value])
+ nodeView = self.clientInstance.view.nodeView
+ return [dict(url=nodeView.getUrlForTarget(baseObject(v)),
+ label=v.title) for v in value]
+ #return ' | '.join([v.title for v in value])
def unmarshall(self, value):
return [util.getObjectForUid(v) for v in value]