diff --git a/CHANGES.txt b/CHANGES.txt index 1485bf1..d4269a0 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -6,6 +6,8 @@ $Id$ 1.1 --- +- yellow pages: view task_candidates for selecting persons with required + knowledge for task - improve 'move' and 'delegate' actions: create new run, store source and target work items, keep state when moving - keep access trail (history) in session diff --git a/knowledge/browser.py b/knowledge/browser.py index 5da1369..2b79bf7 100644 --- a/knowledge/browser.py +++ b/knowledge/browser.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 @@ -58,14 +58,13 @@ actions.register('editTopic', 'portlet', DialogAction, ) -class MyKnowledge(BaseView): +class MyKnowledge(ConceptView): - #template = NamedTemplate('loops.knowledge_macros') template = ViewPageTemplateFile('knowledge_macros.pt') @Lazy def macro(self): - return self.template.macros['requirements'] + return self.template.macros['requirement_providers'] @Lazy def person(self): @@ -91,3 +90,12 @@ class MyKnowledge(BaseView): 'providers': (BaseView(p.context, request) for p in prov)} for req, prov in providers) + +class Candidates(ConceptView): + + template = ViewPageTemplateFile('knowledge_macros.pt') + + @Lazy + def macro(self): + return self.template.macros['requirement_candidates'] + diff --git a/knowledge/configure.zcml b/knowledge/configure.zcml index 1821b38..5b3a3c4 100644 --- a/knowledge/configure.zcml +++ b/knowledge/configure.zcml @@ -74,8 +74,15 @@ zope.publisher.interfaces.browser.IBrowserRequest" provides="zope.interface.Interface" factory="loops.knowledge.browser.MyKnowledge" - permission="zope.View" - /> + permission="zope.View" /> + + diff --git a/knowledge/interfaces.py b/knowledge/interfaces.py index 964ffc0..5d747ad 100644 --- a/knowledge/interfaces.py +++ b/knowledge/interfaces.py @@ -36,8 +36,6 @@ from loops.schema.base import Relation, RelationSet _ = MessageFactory('loops') -# TODO: separate interfaces for viewing and changing methods! - class IPerson(IBasePerson, IKnowing, ILoopsAdapter): """ A person, including knowledge/learning management features. @@ -54,6 +52,12 @@ class ITask(IBaseTask, IRequirementProfile, ILoopsAdapter): """ A task, also acting as a knowledge requirement profile. """ + requirements = RelationSet( + title=_(u'Requirements'), + description=_(u'The knowledge required for this task.'), + #target_types=('topic',), # set via global option knowledge.element + required=False) + class ITopic(IConceptSchema, IKnowledgeElement, ILoopsAdapter): """ Just a topic, some general classification concept. diff --git a/knowledge/knowledge.py b/knowledge/knowledge.py index 68a18c9..38db3fd 100644 --- a/knowledge/knowledge.py +++ b/knowledge/knowledge.py @@ -150,6 +150,11 @@ class Task(BaseTask, KnowledgeAdapterMixin): implements(ITask) + _adapterAttributes = BasePerson._adapterAttributes + ('requirements',) + _noexportAttributes = ('requirements',) + + requirements = ParentRelationSetProperty('requires') + def getRequirements(self): return (IKnowledgeElement(c) for c in self.context.getParents((self.requiresPred,))) @@ -160,6 +165,26 @@ class Task(BaseTask, KnowledgeAdapterMixin): def removeRequirement(self, obj): self.context.deassignParent(obj.context, (self.requiresPred,)) + def getCandidates(self): + result = [] + candidates = [] + reqs = list(self.requirements) + for req in reqs: + for p in req.getKnowers(): + if p not in candidates: + candidates.append(p) + item = dict(person=p, required=[], other=[], fit=0.0) + for k in p.knowledge: + if k in reqs: + item['required'].append(k) + item['fit'] += 1.0 + else: + item['other'].append(k) + result.append(item) + for item in result: + item['fit'] /= len(reqs) + return sorted(result, key=lambda x: (-x['fit'], x['person'].title)) + class ConceptKnowledgeProvider(AdapterBase, KnowledgeAdapterMixin): diff --git a/knowledge/knowledge_macros.pt b/knowledge/knowledge_macros.pt index 5abc24d..1a8f660 100644 --- a/knowledge/knowledge_macros.pt +++ b/knowledge/knowledge_macros.pt @@ -1,14 +1,11 @@ - + + + + + - - Concept: - Title - - - Requirements + Requirements Requirement @@ -16,20 +13,48 @@ - Concept Title + Concept Title - Provider Title + Provider Title - - + + + + + + Candidates for Task + + + Candidate + Fit + Knowledge + + + + + + + + + , + + + + + + + diff --git a/locales/de/LC_MESSAGES/loops.mo b/locales/de/LC_MESSAGES/loops.mo index 91529e9..8cda197 100644 Binary files a/locales/de/LC_MESSAGES/loops.mo and b/locales/de/LC_MESSAGES/loops.mo differ diff --git a/locales/de/LC_MESSAGES/loops.po b/locales/de/LC_MESSAGES/loops.po index ccdf831..028544c 100644 --- a/locales/de/LC_MESSAGES/loops.po +++ b/locales/de/LC_MESSAGES/loops.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: $Id$\n" "POT-Creation-Date: 2007-05-22 12:00 CET\n" -"PO-Revision-Date: 2011-03-07 12:00 CET\n" +"PO-Revision-Date: 2011-04-30 12:00 CET\n" "Last-Translator: Helmut Merz \n" "Language-Team: loops developers \n" "MIME-Version: 1.0\n" @@ -498,10 +498,25 @@ msgid "End date" msgstr "Ende" msgid "Knowledge" -msgstr "Wissen" +msgstr "Kompetenzen" + +msgid "Requirements" +msgstr "Anforderungen" msgid "The knowledge elements for this person." -msgstr "Die Wissenselemente für diese Person." +msgstr "Die Kompetenzen dieser Person." + +msgid "Candidates for Task" +msgstr "Kandidaten für Aufgabe" + +msgid "Candidate" +msgstr "Kandidat" + +msgid "Fit" +msgstr "DG" + +msgid "description_fit" +msgstr "Deckungsgrad" msgid "Create loops Note" msgstr "loops-Notiz anlegen"