diff --git a/browser/concept.py b/browser/concept.py index 3e62bcd..daaa383 100644 --- a/browser/concept.py +++ b/browser/concept.py @@ -326,6 +326,9 @@ class ConceptView(BaseView): return result def isHidden(self, pr): + if (getName(pr.second.conceptType) in + IOptions(adapted(pr.predicate))('hide_parents_for', [])): + return True hideRoles = IOptions(adapted(pr.first.conceptType))('hide_for', None) if hideRoles is not None: principal = self.request.principal diff --git a/browser/concept_macros.pt b/browser/concept_macros.pt index 783cb84..fb9ee85 100644 --- a/browser/concept_macros.pt +++ b/browser/concept_macros.pt @@ -69,12 +69,20 @@ - + + + + | + + + +
@@ -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]