work in progress: new knowledge package for learning and knowledge management
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@1226 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
2308be0919
commit
dc0993ecc5
8 changed files with 460 additions and 0 deletions
70
knowledge/README.txt
Normal file
70
knowledge/README.txt
Normal file
|
@ -0,0 +1,70 @@
|
|||
Knowledge management, learning, and similar stuff
|
||||
=================================================
|
||||
|
||||
($Id$)
|
||||
|
||||
Let's first set up a tree of knowledge elements (topics) and their
|
||||
interdependencies:
|
||||
|
||||
>>> from cybertools.knowledge.element import KnowledgeElement
|
||||
>>> progLang = KnowledgeElement()
|
||||
>>> ooProg = KnowledgeElement()
|
||||
>>> python = KnowledgeElement()
|
||||
>>> pyBasics = KnowledgeElement()
|
||||
>>> pyOo = KnowledgeElement()
|
||||
>>> pySpecials = KnowledgeElement()
|
||||
|
||||
The knowledge may be organized in a hierarchy (taxonomy) of topics; we
|
||||
don't use this at the moment but it is important to give the knowledge
|
||||
an overall structure.
|
||||
|
||||
>>> python.parent = progLang
|
||||
>>> pyBasics.parent = python
|
||||
>>> pyOo.parent = python
|
||||
>>> pySpecials.parent = python
|
||||
|
||||
An important point here is that a knowledge element may depend on another;
|
||||
this means that somebody first has to acquire one of the knowledge elements
|
||||
before being able to acquire a dependent element. In our example one
|
||||
would first have to study object-oriented programming in general and the
|
||||
Python basics before being able to study object oriented programming
|
||||
with Python.
|
||||
|
||||
>>> pyOo.dependsOn(ooProg)
|
||||
>>> pyOo.dependsOn(pyBasics)
|
||||
|
||||
Now we create a person that knows about basic Python programming:
|
||||
|
||||
>>> from cybertools.knowledge.knowing import Knowing
|
||||
>>> john = Knowing()
|
||||
>>> john.knows(pyBasics)
|
||||
|
||||
Next we have a position that requires knowledge in object-oriented
|
||||
programming with Python:
|
||||
|
||||
>>> from cybertools.knowledge.position import Position
|
||||
>>> pos01 = Position()
|
||||
>>> pos01.requires(pyOo)
|
||||
|
||||
Now we can ask what knowledge john is lacking if he would like to take
|
||||
the position offered:
|
||||
|
||||
>>> john.getMissingKnowledge(pos01) == (ooProg, pyOo,)
|
||||
True
|
||||
|
||||
Luckily there are a few elearning content objects out there that
|
||||
provide some of the knowledge needed:
|
||||
|
||||
>>> from cybertools.knowledge.provider import KnowledgeProvider
|
||||
>>> doc01 = KnowledgeProvider()
|
||||
>>> doc02 = KnowledgeProvider()
|
||||
|
||||
>>> doc01.provides(ooProg)
|
||||
>>> doc02.provides(pyOo)
|
||||
|
||||
So that we are now able to find out what john has to study in order to
|
||||
fulfill the position offered:
|
||||
|
||||
>>> list(john.getProvidersNeeded(pos01))
|
||||
|
||||
|
4
knowledge/__init__.py
Normal file
4
knowledge/__init__.py
Normal file
|
@ -0,0 +1,4 @@
|
|||
"""
|
||||
$Id$
|
||||
"""
|
||||
|
72
knowledge/element.py
Normal file
72
knowledge/element.py
Normal file
|
@ -0,0 +1,72 @@
|
|||
#
|
||||
# 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
|
||||
#
|
||||
|
||||
"""
|
||||
Represent knowledge elements and their interrelations.
|
||||
|
||||
$Id$
|
||||
"""
|
||||
|
||||
from zope.interface import implements
|
||||
from cybertools.knowledge.interfaces import IKnowledgeElement
|
||||
|
||||
|
||||
class KnowledgeElement(object):
|
||||
|
||||
implements(IKnowledgeElement)
|
||||
|
||||
def __init__(self):
|
||||
self._parent = None
|
||||
self._dependencies = {}
|
||||
# backlinks:
|
||||
self._children = set()
|
||||
self._dependents = set()
|
||||
self._knowers = set()
|
||||
self._requiringPositions = set()
|
||||
self._providers = set()
|
||||
|
||||
def setParent(self, obj):
|
||||
old = self._parent
|
||||
if old is not None and old != obj:
|
||||
del old._children[self]
|
||||
if obj is not None and old != obj:
|
||||
obj._children.add(self)
|
||||
self._parent = obj
|
||||
def getParent(self): return self._parent
|
||||
parent = property(getParent, setParent)
|
||||
|
||||
def getDependencies(self):
|
||||
return self._dependencies
|
||||
|
||||
def dependsOn(self, obj):
|
||||
self._dependencies[obj] = True
|
||||
obj._dependents.add(self)
|
||||
|
||||
def removeDependency(self, obj):
|
||||
del self._dependencies[obj]
|
||||
del obj._dependents[self]
|
||||
|
||||
def getDependents(self):
|
||||
return self._dependents
|
||||
|
||||
def getKnowers(self):
|
||||
return self._knowers
|
||||
|
||||
def getProviders(self):
|
||||
return tuple(self._providers)
|
||||
|
139
knowledge/interfaces.py
Normal file
139
knowledge/interfaces.py
Normal file
|
@ -0,0 +1,139 @@
|
|||
#
|
||||
# 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
|
||||
#
|
||||
|
||||
"""
|
||||
Interfaces for knowledge management and e-learning.
|
||||
|
||||
$Id$
|
||||
"""
|
||||
|
||||
from zope.interface import Interface, Attribute
|
||||
from zope import schema
|
||||
from zope.i18nmessageid import MessageFactory
|
||||
|
||||
_ = MessageFactory('zope')
|
||||
|
||||
|
||||
class IKnowledgeElement(Interface):
|
||||
""" An entity denoting some sort of knowledge.
|
||||
"""
|
||||
|
||||
parent = Attribute('An optional parent element (sort of parent topic)')
|
||||
|
||||
def getDependencies():
|
||||
""" Return a collection of knowledge elements this object depends on.
|
||||
"""
|
||||
|
||||
def dependsOn(element):
|
||||
""" Add an element to the collection of elements this object
|
||||
depends on.
|
||||
"""
|
||||
|
||||
def removeDependency(element):
|
||||
""" Remove the element given from the collection of elements
|
||||
this object depends on.
|
||||
"""
|
||||
|
||||
def getDependents():
|
||||
""" Return a collection of knowledge elements that are depending
|
||||
on this object.
|
||||
"""
|
||||
|
||||
def getKnowers():
|
||||
""" Return a collection of Knowing objects that have this object
|
||||
in their knowledge portfolio.
|
||||
"""
|
||||
|
||||
def getProviders():
|
||||
""" Return a collection of knowledge providers that provide this
|
||||
object.
|
||||
"""
|
||||
|
||||
|
||||
class IKnowing(Interface):
|
||||
""" Someone who knows something.
|
||||
"""
|
||||
|
||||
def getKnowledge():
|
||||
""" Return the collection of elements that constitute the
|
||||
knowledge of this object.
|
||||
"""
|
||||
|
||||
def knows(self, element):
|
||||
""" Add an element to the collection of elementsthat constitute the
|
||||
knowledge of this object.
|
||||
"""
|
||||
|
||||
def removeKnowledge(element):
|
||||
""" Remove the element given from the collection of elements
|
||||
that constitute the knowledge of this object.
|
||||
"""
|
||||
|
||||
def getMissingKnowledge(position):
|
||||
""" Return a tuple of knowledge elements that this object
|
||||
is missing for fulfilling the position given.
|
||||
"""
|
||||
|
||||
def getProvidersNeeded(position):
|
||||
""" Return two tuples: first a tuple of knowledge providers that
|
||||
provide knowledge needed for fulfilling the position given,
|
||||
second a tuple with the requirements that could not
|
||||
be met by the available knowledge providers.
|
||||
"""
|
||||
|
||||
|
||||
class IPosition(Interface):
|
||||
""" A position requires a certain knowledge.
|
||||
"""
|
||||
|
||||
def getRequirements():
|
||||
""" Return the collection of knowledge elements this object requires.
|
||||
"""
|
||||
|
||||
def requires(element):
|
||||
""" Add a knowledge element to the collection of elements this
|
||||
object requires.
|
||||
"""
|
||||
|
||||
def removeKnowledge(element):
|
||||
""" Remove the element given from the collection of elements
|
||||
this object requires.
|
||||
"""
|
||||
|
||||
|
||||
class IKnowledgeProvider(Interface):
|
||||
""" An object that is able to provide a certain knowledge - that may
|
||||
be a document or some sort of elearning content, ...
|
||||
"""
|
||||
|
||||
def getProvidedKnowledge():
|
||||
""" Return a collection of knowledge elements this object provides.
|
||||
"""
|
||||
|
||||
def provides(element):
|
||||
""" Add a knowledge element to the collection of elements this
|
||||
object provides.
|
||||
"""
|
||||
|
||||
def removeProvidedKnowledge(element):
|
||||
""" Remove the element given from the collection of elements
|
||||
this object provides.
|
||||
"""
|
||||
|
||||
|
||||
|
55
knowledge/knowing.py
Normal file
55
knowledge/knowing.py
Normal file
|
@ -0,0 +1,55 @@
|
|||
#
|
||||
# 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
|
||||
#
|
||||
|
||||
"""
|
||||
Manage objects (people) who know something.
|
||||
|
||||
$Id$
|
||||
"""
|
||||
|
||||
from zope.interface import implements
|
||||
from cybertools.knowledge.interfaces import IKnowing
|
||||
|
||||
|
||||
class Knowing(object):
|
||||
|
||||
implements(IKnowing)
|
||||
|
||||
def __init__(self):
|
||||
self._knowledge = {}
|
||||
|
||||
def getKnowledge(self):
|
||||
return self._knowledge
|
||||
|
||||
def knows(self, obj):
|
||||
self._knowledge[obj] = True
|
||||
obj._knowers.add(self)
|
||||
|
||||
def removeKnowledge(self, obj):
|
||||
del self._knowledge[obj]
|
||||
del obj._knowers[self]
|
||||
|
||||
def getMissingKnowledge(self, position):
|
||||
# to be done
|
||||
return tuple(position.getRequirements())
|
||||
|
||||
def getProvidersNeeded(self, position):
|
||||
return ((k, k.getProviders())
|
||||
for k in self.getMissingKnowledge(position))
|
||||
|
||||
|
46
knowledge/position.py
Normal file
46
knowledge/position.py
Normal file
|
@ -0,0 +1,46 @@
|
|||
#
|
||||
# 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
|
||||
#
|
||||
|
||||
"""
|
||||
Represent positions that require certain knowledge.
|
||||
|
||||
$Id$
|
||||
"""
|
||||
|
||||
from zope.interface import implements
|
||||
from cybertools.knowledge.interfaces import IPosition
|
||||
|
||||
|
||||
class Position(object):
|
||||
|
||||
implements(IPosition)
|
||||
|
||||
def __init__(self):
|
||||
self._requirements = {}
|
||||
|
||||
def getRequirements(self):
|
||||
return self._requirements
|
||||
|
||||
def requires(self, obj):
|
||||
self._requirements[obj] = True
|
||||
obj._requiringPositions.add(self)
|
||||
|
||||
def removeRequirement(self, obj):
|
||||
del self._requirements[obj]
|
||||
del obj._requiringPositions[self]
|
||||
|
46
knowledge/provider.py
Normal file
46
knowledge/provider.py
Normal file
|
@ -0,0 +1,46 @@
|
|||
#
|
||||
# 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
|
||||
#
|
||||
|
||||
"""
|
||||
Knowledge providers provide knowledge.
|
||||
|
||||
$Id$
|
||||
"""
|
||||
|
||||
from zope.interface import implements
|
||||
from cybertools.knowledge.interfaces import IKnowledgeProvider
|
||||
|
||||
|
||||
class KnowledgeProvider(object):
|
||||
|
||||
implements(IKnowledgeProvider)
|
||||
|
||||
def __init__(self):
|
||||
self._providedKnowledge = {}
|
||||
|
||||
def getProvidedKnowledge(self):
|
||||
return self._providedKnowledge
|
||||
|
||||
def provides(self, obj):
|
||||
self._providedKnowledge[obj] = True
|
||||
obj._providers.add(self)
|
||||
|
||||
def removeDependency(self, obj):
|
||||
del self._providedKnowledge[obj]
|
||||
del obj._providers[self]
|
||||
|
28
knowledge/tests.py
Executable file
28
knowledge/tests.py
Executable file
|
@ -0,0 +1,28 @@
|
|||
#! /usr/bin/python
|
||||
|
||||
"""
|
||||
Tests for the 'cybertools.knowledge' package.
|
||||
|
||||
$Id$
|
||||
"""
|
||||
|
||||
import unittest, doctest
|
||||
from zope.testing.doctestunit import DocFileSuite
|
||||
from cybertools.knowledge.knowing import Knowing
|
||||
|
||||
class TestKnowledge(unittest.TestCase):
|
||||
"Basic tests for the knowledge package."
|
||||
|
||||
def testBasicStuff(self):
|
||||
p = Knowing()
|
||||
|
||||
|
||||
def test_suite():
|
||||
flags = doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS
|
||||
return unittest.TestSuite((
|
||||
unittest.makeSuite(TestKnowledge),
|
||||
DocFileSuite('README.txt', optionflags=flags),
|
||||
))
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main(defaultTest='test_suite')
|
Loading…
Add table
Reference in a new issue