From 719bd165aae0906424973e7edaf4586c3c432b66 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Mon, 11 Jun 2012 17:32:34 +0200 Subject: [PATCH] work in progress: Competence and Certification Management (CCM): fix structure, start with form for qualification record creation --- knowledge/browser.py | 3 ++ knowledge/configure.zcml | 13 ++++++ knowledge/data/loops_knowledge_de.dmp | 34 +++++++-------- knowledge/data/loops_knowledge_update_de.dmp | 44 ++++++++++++++++++++ knowledge/knowledge_macros.pt | 42 +++++++++++++++++++ knowledge/qualification.py | 11 ++++- organize/README.txt | 2 +- organize/work/browser.py | 7 +++- 8 files changed, 134 insertions(+), 22 deletions(-) create mode 100644 knowledge/data/loops_knowledge_update_de.dmp diff --git a/knowledge/browser.py b/knowledge/browser.py index ff9781e..8a7a281 100644 --- a/knowledge/browser.py +++ b/knowledge/browser.py @@ -32,6 +32,7 @@ from loops.browser.common import BaseView from loops.browser.concept import ConceptView from loops.expert.browser.report import ResultsConceptView from loops.knowledge.interfaces import IPerson, ITask +from loops.knowledge.qualification import QualificationRecord from loops.organize.work.browser import CreateWorkItemForm, CreateWorkItem from loops.organize.party import getPersonForUser from loops.util import _ @@ -120,6 +121,8 @@ class PersonQualificationView(ResultsConceptView): class CreateQualificationRecordForm(CreateWorkItemForm): macros = knowledge_macros + recordManagerName = 'qualification' + trackFactory = QualificationRecord @Lazy def macro(self): diff --git a/knowledge/configure.zcml b/knowledge/configure.zcml index 2552184..da2bb30 100644 --- a/knowledge/configure.zcml +++ b/knowledge/configure.zcml @@ -100,6 +100,19 @@ factory="loops.knowledge.browser.Candidates" permission="zope.View" /> + + + + diff --git a/knowledge/data/loops_knowledge_de.dmp b/knowledge/data/loops_knowledge_de.dmp index 2ca69b4..3b2ce7b 100644 --- a/knowledge/data/loops_knowledge_de.dmp +++ b/knowledge/data/loops_knowledge_de.dmp @@ -1,17 +1,17 @@ -type(u'competence', u'Competence', viewName=u'', - typeInterface=u'', options=u'action.portlet:edit_concept') +type(u'competence', u'Kompetenz', viewName=u'', + typeInterface=u'', options=u'action.portlet:create_subtype,edit_concept') type(u'person', u'Person', viewName=u'', typeInterface=u'loops.knowledge.interfaces.IPerson', - options=u'action.portlet:editPerson') + options=u'action.portlet:createQualification,editPerson') type(u'task', u'Aufgabe', viewName=u'', typeInterface=u'loops.knowledge.interfaces.ITask', - options=u'action.portlet:createTopic,editTopic') + options=u'action.portlet:createTask,editTask') type(u'topic', u'Thema', viewName=u'', typeInterface=u'loops.knowledge.interfaces.ITopic', - options=u'action.portlet:createTopic,editTopic') + options=u'action.portlet:createTask,createTopic,editTopic') type(u'training', u'Schulung', viewName=u'', typeInterface=u'loops.organize.interfaces.ITask', - options=u'action.portlet:create_subtype,edit_concept') + options=u'action.portlet:edit_concept') concept(u'general', u'Allgemein', u'domain') concept(u'system', u'System', u'domain') @@ -26,19 +26,19 @@ concept(u'issubtype', u'is Subtype', u'predicate', options=u'hide_children', predicateInterface='loops.interfaces.IIsSubtype') # structure -child(u'competence', u'general', u'standard') -child(u'depends', u'general', u'standard') -child(u'knows', u'general', u'standard') -child(u'person', u'general', u'standard') -child(u'provides', u'general', u'standard') -child(u'requires', u'general', u'standard') -child(u'task', u'general', u'standard') -child(u'topic', u'general', u'standard') -child(u'training', u'general', u'standard') +child(u'general', u'competence', u'standard') +child(u'general', u'depends', u'standard') +child(u'general', u'knows', u'standard') +child(u'general', u'person', u'standard') +child(u'general', u'provides', u'standard') +child(u'general', u'requires', u'standard') +child(u'general', u'task', u'standard') +child(u'general', u'topic', u'standard') +child(u'general', u'training', u'standard') -child(u'issubtype', u'system', u'standard') +child(u'system', u'issubtype', u'standard') -child(u'training', u'competence', u'issubtype', usePredicate=u'provides') +child(u'competence', u'training', u'issubtype', usePredicate=u'provides') # records records(u'qualification', u'loops.knowledge.qualification.QualificationRecord') diff --git a/knowledge/data/loops_knowledge_update_de.dmp b/knowledge/data/loops_knowledge_update_de.dmp new file mode 100644 index 0000000..4080f43 --- /dev/null +++ b/knowledge/data/loops_knowledge_update_de.dmp @@ -0,0 +1,44 @@ +type(u'competence', u'Kompetenz', viewName=u'', + typeInterface=u'', options=u'action.portlet:create_subtype,edit_concept') +# type(u'person', u'Person', viewName=u'', +# typeInterface=u'loops.knowledge.interfaces.IPerson', +# options=u'action.portlet:editPerson') +# type(u'task', u'Aufgabe', viewName=u'', +# typeInterface=u'loops.knowledge.interfaces.ITask', +# options=u'action.portlet:createTask,editTask') +# type(u'topic', u'Thema', viewName=u'', +# typeInterface=u'loops.knowledge.interfaces.ITopic', +# options=u'action.portlet:createTask,createTopic,editTopic') +type(u'training', u'Schulung', viewName=u'', + typeInterface=u'loops.organize.interfaces.ITask', + options=u'action.portlet:edit_concept') + +concept(u'general', u'Allgemein', u'domain') +concept(u'system', u'System', u'domain') + +# predicates +concept(u'depends', u'depends', u'predicate') +concept(u'knows', u'knows', u'predicate') +concept(u'provides', u'provides', u'predicate') +concept(u'requires', u'requires', u'predicate') + +concept(u'issubtype', u'is Subtype', u'predicate', options=u'hide_children', + predicateInterface='loops.interfaces.IIsSubtype') + +# structure +child(u'general', u'competence', u'standard') +child(u'general', u'depends', u'standard') +child(u'general', u'knows', u'standard') +#child(u'general', u'person', u'standard') +child(u'general', u'provides', u'standard') +child(u'general', u'requires', u'standard') +#child(u'general', u'task', u'standard') +#child(u'general', u'topic', u'standard') +child(u'general', u'training', u'standard') + +child(u'system', u'issubtype', u'standard') + +child(u'competence', u'training', u'issubtype', usePredicate=u'provides') + +# records +records(u'qualification', u'loops.knowledge.qualification.QualificationRecord') diff --git a/knowledge/knowledge_macros.pt b/knowledge/knowledge_macros.pt index 5d12f77..f775b71 100644 --- a/knowledge/knowledge_macros.pt +++ b/knowledge/knowledge_macros.pt @@ -62,6 +62,48 @@
+ + +
Add Qualification Record
+
+ +
+
+
+
+ + +   + + + + + +
+
+ +
+
+
diff --git a/knowledge/qualification.py b/knowledge/qualification.py index 62b115e..f123c39 100644 --- a/knowledge/qualification.py +++ b/knowledge/qualification.py @@ -38,8 +38,12 @@ from loops.organize.work.base import WorkItem, WorkItems @implementer(IStatesDefinition) def qualificationStates(): return StatesDefinition('qualification', + State('new', 'new', ('assign',), + color='grey'), State('open', 'open', - ('register', 'pass', 'fail', 'cancel', 'modify'), + ('register', + #'pass', 'fail', + 'cancel', 'modify'), color='red'), State('registered', 'registered', ('register', 'pass', 'fail', 'unregister', 'cancel', 'modify'), @@ -61,14 +65,17 @@ def qualificationStates(): State('open_x', 'open', ('modify',), color='red'), State('registered_x', 'registered', ('modify',), color='yellow'), # transitions: + Transition('assign', 'assign', 'open'), Transition('register', 'register', 'registered'), Transition('pass', 'pass', 'passed'), Transition('fail', 'fail', 'failed'), Transition('unregister', 'unregister', 'open'), Transition('cancel', 'cancel', 'cancelled'), + Transition('modify', 'modify', 'open'), Transition('close', 'close', 'closed'), Transition('open', 'open', 'open'), - initialState='open') + #initialState='open') + initialState='new') # TODO: handle assignment to competence class QualificationRecord(WorkItem): diff --git a/organize/README.txt b/organize/README.txt index 7857c1a..55bc758 100644 --- a/organize/README.txt +++ b/organize/README.txt @@ -260,7 +260,7 @@ Automatic security settings on persons >>> from zope.traversing.api import getName >>> list(sorted(getName(c) for c in concepts['person'].getChildren())) - [u'general', u'jim', u'john', u'martha', u'person.newuser'] + [u'jim', u'john', u'martha', u'person.newuser'] Person objects that have a user assigned to them receive this user (principal) as their owner. diff --git a/organize/work/browser.py b/organize/work/browser.py index dfcc9d1..f0d86fb 100644 --- a/organize/work/browser.py +++ b/organize/work/browser.py @@ -307,6 +307,8 @@ class UserWorkItems(PersonWorkItems): class CreateWorkItemForm(ObjectForm, BaseTrackView): template = work_macros + recordManagerName = 'work' + trackFactory = WorkItem def checkPermissions(self): return canAccessObject(self.task or self.target) @@ -325,9 +327,10 @@ class CreateWorkItemForm(ObjectForm, BaseTrackView): def track(self): id = self.request.form.get('id') if id is not None: - workItems = self.loopsRoot.getRecordManager()['work'] + workItems = self.loopsRoot.getRecordManager()[ + self.recordManagerName] return workItems.get(id) - return WorkItem(None, 0, None, {}) + return self.trackFactory(None, 0, None, {}) @Lazy def title(self):