diff --git a/expert/README.txt b/expert/README.txt
index 545c865..7ac8ed8 100644
--- a/expert/README.txt
+++ b/expert/README.txt
@@ -27,7 +27,7 @@ configuration):
>>> concepts, resources, views = t.setup()
>>> len(concepts) + len(resources)
- 38
+ 41
>>> loopsRoot = site['loops']
@@ -47,11 +47,11 @@ Type- and text-based queries
>>> from loops.expert import query
>>> qu = query.Title('ty*')
>>> list(qu.apply())
- [0, 2, 69]
+ [0, 2, 79]
>>> qu = query.Type('loops:*')
>>> len(list(qu.apply()))
- 38
+ 41
>>> qu = query.Type('loops:concept:predicate')
>>> len(list(qu.apply()))
diff --git a/expert/search.txt b/expert/search.txt
index d66ed00..8905fc6 100755
--- a/expert/search.txt
+++ b/expert/search.txt
@@ -66,13 +66,13 @@ zcml in real life:
>>> t = searchView.typesForSearch()
>>> len(t)
- 16
+ 19
>>> t.getTermByToken('loops:resource:*').title
'Any Resource'
>>> t = searchView.conceptTypesForSearch()
>>> len(t)
- 13
+ 16
>>> t.getTermByToken('loops:concept:*').title
'Any Concept'
@@ -91,7 +91,7 @@ a controller attribute for the search view.
>>> searchView.submitReplacing('1.results', '1.search.form', pageView)
'submitReplacing("1.results", "1.search.form",
- "http://127.0.0.1/loops/views/page/.target100/@@searchresults.html");...'
+ "http://127.0.0.1/loops/views/page/.target110/@@searchresults.html");...'
Basic (text/title) search
-------------------------
@@ -177,7 +177,7 @@ of the concepts' titles:
>>> request = TestRequest(form=form)
>>> view = Search(page, request)
>>> view.listConcepts()
- u"{identifier: 'id', items: [{label: 'Zope (Thema)', name: 'Zope', id: '105'}, {label: 'Zope 2 (Thema)', name: 'Zope 2', id: '107'}, {label: 'Zope 3 (Thema)', name: 'Zope 3', id: '109'}]}"
+ u"{identifier: 'id', items: [{label: 'Zope (Thema)', name: 'Zope', id: '115'}, {label: 'Zope 2 (Thema)', name: 'Zope 2', id: '117'}, {label: 'Zope 3 (Thema)', name: 'Zope 3', id: '119'}]}"
Preset Concept Types on Search Forms
------------------------------------
@@ -219,13 +219,13 @@ and thus include the customer type in the preset search types.
>>> searchView.conceptsForType('loops:concept:customer')
[{'token': 'none', 'title': u'not selected'},
- {'token': '78', 'title': u'Customer 1'},
- {'token': '80', 'title': u'Customer 2'},
- {'token': '82', 'title': u'Customer 3'}]
+ {'token': '88', 'title': u'Customer 1'},
+ {'token': '90', 'title': u'Customer 2'},
+ {'token': '92', 'title': u'Customer 3'}]
Let's use this new search option for querying:
- >>> form = {'search.4.text_selected': u'74'}
+ >>> form = {'search.4.text_selected': u'84'}
>>> resultsView = SearchResults(page, TestRequest(form=form))
>>> results = list(resultsView.results)
>>> results[0].title
diff --git a/external/README.txt b/external/README.txt
index 5fddc0e..c98ad79 100644
--- a/external/README.txt
+++ b/external/README.txt
@@ -17,7 +17,7 @@ Let's set up a loops site with basic and example concepts and resources.
>>> concepts, resources, views = t.setup()
>>> loopsRoot = site['loops']
>>> len(concepts), len(resources), len(views)
- (35, 3, 1)
+ (38, 3, 1)
Importing loops Objects
@@ -44,7 +44,7 @@ Creating the corresponding objects
>>> loader = Loader(loopsRoot)
>>> loader.load(elements)
>>> len(concepts), len(resources), len(views)
- (36, 3, 1)
+ (39, 3, 1)
>>> from loops.common import adapted
>>> adMyquery = adapted(concepts['myquery'])
@@ -118,7 +118,7 @@ Extracting elements
>>> extractor = Extractor(loopsRoot, os.path.join(dataDirectory, 'export'))
>>> elements = list(extractor.extract())
>>> len(elements)
- 67
+ 74
Writing object information to the external storage
--------------------------------------------------
diff --git a/knowledge/data/knowledge_de.dmp b/knowledge/data/knowledge_de.dmp
index 83367d9..751cf9f 100644
--- a/knowledge/data/knowledge_de.dmp
+++ b/knowledge/data/knowledge_de.dmp
@@ -1,6 +1,12 @@
-type(u'competence', u'Kompetenz', viewName=u'',
+type(u'competence', u'Qualifikation', viewName=u'',
typeInterface=u'loops.knowledge.qualification.interfaces.ICompetence',
options=u'action.portlet:create_subtype,edit_concept')
+type(u'ipskill', u'Kompetenz', viewName=u'',
+ options=u'action.portlet:edit_concept')
+type(u'ipskillsrequired', u'Soll-Profil', viewName=u'',
+ options=u'action.portlet:edit_concept')
+type(u'jobposition', u'Stelle', viewName=u'',
+ options=u'action.portlet:edit_concept')
type(u'person', u'Person', viewName=u'',
typeInterface=u'loops.knowledge.interfaces.IPerson',
options=u'action.portlet:createQualification,editPerson')
@@ -35,6 +41,9 @@ concept(u'qualification_overview', u'Qualification Overview', u'report',
# structure
child(u'general', u'competence', u'standard')
child(u'general', u'depends', u'standard')
+child(u'general', u'ipskill', u'standard')
+child(u'general', u'ipskillsrequired', u'standard')
+child(u'general', u'jobposition', u'standard')
child(u'general', u'knows', u'standard')
child(u'general', u'person', u'standard')
child(u'general', u'provides', u'standard')
@@ -44,6 +53,7 @@ child(u'general', u'topic', u'standard')
#child(u'general', u'training', u'standard')
child(u'system', u'issubtype', u'standard')
+child(u'system', u'report', u'standard')
child(u'competence', u'competence', u'issubtype')
#child(u'competence', u'training', u'issubtype', usePredicate=u'provides')
diff --git a/knowledge/data/knowledge_update_de.dmp b/knowledge/data/knowledge_update_de.dmp
index 2a359c2..06d7f29 100644
--- a/knowledge/data/knowledge_update_de.dmp
+++ b/knowledge/data/knowledge_update_de.dmp
@@ -1,6 +1,14 @@
-type(u'competence', u'Kompetenz', viewName=u'',
+type(u'competence', u'Qualifikation', viewName=u'',
typeInterface=u'loops.knowledge.qualification.interfaces.ICompetence',
options=u'action.portlet:create_subtype,edit_concept')
+type(u'ipskill', u'Kompetenz', viewName=u'',
+ options=u'action.portlet:edit_concept')
+type(u'ipskillsrequired', u'Soll-Profil', viewName=u'',
+ options=u'action.portlet:edit_concept')
+type(u'jobposition', u'Stelle', viewName=u'',
+ options=u'action.portlet:edit_concept')
+type(u'report', u'Report', viewName=u'',
+ typeInterface='loops.expert.report.IReport')
# type(u'person', u'Person', viewName=u'',
# typeInterface=u'loops.knowledge.interfaces.IPerson',
# options=u'action.portlet:editPerson')
@@ -33,6 +41,9 @@ concept(u'qualification_overview', u'Qualification Overview', u'report',
# structure
child(u'general', u'competence', u'standard')
child(u'general', u'depends', u'standard')
+child(u'general', u'ipskill', u'standard')
+child(u'general', u'ipskillsrequired', u'standard')
+child(u'general', u'jobposition', u'standard')
child(u'general', u'knows', u'standard')
#child(u'general', u'person', u'standard')
child(u'general', u'provides', u'standard')
@@ -42,6 +53,7 @@ child(u'general', u'requires', u'standard')
#child(u'general', u'training', u'standard')
child(u'system', u'issubtype', u'standard')
+child(u'system', u'report', u'standard')
child(u'competence', u'competence', u'issubtype')
#child(u'competence', u'training', u'issubtype', usePredicate=u'provides')
diff --git a/knowledge/qualification/browser.py b/knowledge/qualification/browser.py
index e9e6641..054e143 100644
--- a/knowledge/qualification/browser.py
+++ b/knowledge/qualification/browser.py
@@ -25,11 +25,71 @@ from zope import interface, component
from zope.app.pagetemplate import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy
+from cybertools.browser.action import actions
+from loops.browser.action import DialogAction
+from loops.browser.concept import ConceptView
from loops.expert.browser.report import ResultsConceptView
-from loops.knowledge.browser import template, knowledge_macros
+from loops.organize.party import getPersonForUser
+from loops.util import _
+
+template = ViewPageTemplateFile('qualification_macros.pt')
+
+
+actions.register('createJobPosition', 'portlet', DialogAction,
+ title=_(u'Create Job...'),
+ description=_(u'Create a new job / position.'),
+ viewName='create_concept.html',
+ dialogName='createPosition',
+ typeToken='.loops/concepts/jobposition',
+ fixedType=True,
+ innerForm='inner_concept_form.html',
+ permission='loops.AssignAsParent',
+)
class Qualifications(ResultsConceptView):
reportName = 'qualification_overview'
+
+class QualificationBaseView(object):
+
+ template = template
+ templateName = 'knowledge.qualification'
+
+ @Lazy
+ def institutionType(self):
+ return self.conceptManager['institution']
+
+ @Lazy
+ def jobPositionType(self):
+ return self.conceptManager['jobposition']
+
+ @Lazy
+ def isMemberPredicate(self):
+ return self.conceptManager['ismember']
+
+
+class JobPositionsOverview(QualificationBaseView, ConceptView):
+
+ macroName = 'jobpositions'
+
+ @Lazy
+ def positions(self):
+ result = []
+ p = getPersonForUser(self.context, self.request)
+ if p is not None:
+ for parent in p.getParents([self.isMemberPredicate]):
+ if parent.conceptType == self.institutionType:
+ for child in parent.getChildren([self.defaultPredicate]):
+ if child.conceptType == self.jobPositionType:
+ result.append(child)
+ return result
+
+
+class IPSkillsForm(QualificationBaseView, ConceptView):
+ """ Form for entering interpersonal skills required for a certain position.
+ """
+
+ macroName = 'ipskillsform'
+
diff --git a/knowledge/qualification/configure.zcml b/knowledge/qualification/configure.zcml
index e4f02c9..06a3a27 100644
--- a/knowledge/qualification/configure.zcml
+++ b/knowledge/qualification/configure.zcml
@@ -23,6 +23,22 @@
factory="loops.knowledge.qualification.browser.Qualifications"
permission="zope.View" />
+
+
+
+
+
+
+
+
+ Jobs / Positions
+
+
+
+
+
+