From f0248b2ec836cac4a7e27db2bdd518f7dee229e0 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Thu, 31 Jul 2014 18:45:07 +0200 Subject: [PATCH] work in progress: job positions and competences --- expert/README.txt | 6 +- expert/search.txt | 16 ++--- external/README.txt | 6 +- knowledge/data/knowledge_de.dmp | 12 +++- knowledge/data/knowledge_update_de.dmp | 14 +++- knowledge/qualification/browser.py | 62 +++++++++++++++++- knowledge/qualification/configure.zcml | 16 +++++ .../qualification/qualification_macros.pt | 17 +++++ locales/de/LC_MESSAGES/loops.mo | Bin 25863 -> 26048 bytes locales/de/LC_MESSAGES/loops.po | 13 +++- organize/README.txt | 2 +- system/sync/README.txt | 2 +- xmlrpc/README.txt | 15 +++-- 13 files changed, 154 insertions(+), 27 deletions(-) create mode 100644 knowledge/qualification/qualification_macros.pt 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

+ + + + + + +
+
+ + + \ No newline at end of file diff --git a/locales/de/LC_MESSAGES/loops.mo b/locales/de/LC_MESSAGES/loops.mo index a98c638d83fc71ebaa3c0457ccd896eef5eb0515..bcc801f4c6ad0c2e886106ca284dc2ea687fddb0 100644 GIT binary patch delta 9419 zcmZA633yLe{>SkfiA0Dm*!Nfysj3J~>}Fh2YbizTTZ<~KW!li1 z!IWyXLoqFCI<-`%wG`7$Rcq=0{rTOm=kcHW^y_ubx#yn!-k&k^j{6-x;pbk82w358 z?eTM*D)@3q$4M^YI3bl)>NsIF9j6C|V=QK3ATBmnU=aEB=#N{m1a3!~a`s{*zK>z} zH3s9)7~(jt^N>U+1;uOm3Y?0lhH9f4s%Pa*u`KxxSPloGIv9^?aE9HVZ*D{lbT1ae z1D5{)RsRH*rhn(0Rk&dle!@~z_zg9);M$JU8^bXLvr!H1#G<$lRque6AGQ1^Seo*) z7=hRA{(aN{0%BMZ`gcM}uoOj6} z`Fp6Dhu8IG_x z`|+rT+F(gcxAF`OA)jOAQ?WStd6r*>Y_;pWLP8@ufLf9hR^c<$QhtTnf^SeObPLt- zFR14N6THJ%4)r?5V+m}8+LE@Y=Q^9cP|syxfZqQxBvf%cs>5lhfy_Xy#2jplYpnbf zs{T1FiI>gWSdILB)ZwdC-y3+6*%3AHuBa^^BK7`fl2C)AP$PZL^3zZQnT=Y3g{ZTz z95vHjr~wzE2Kp|lgA=HF7jPurMQve5qPK-(u@w0NboJme5~{Eb^RVsB^2m^b*PotYyKUz zR3D=nK56+ck+C>mVLFC4^bYYb-1pe=LjHsQc4VE91^4 zp*>t`H+G=5;BCtvM9tts%il(Ico)^cebhjUHT6~~6t$&gQD>*RTnL~FwI9T{X59HbS_~QhPUwkN;VO-q{mP{<6omzrf5s+ z7&V}ZSOz0euU%s+Z;q}iv>~Axbwn-I0My=Qp$0S_wF3F58BfQuI1^QGC92*QyT1)p z|4pobg{Zga6I_4~?f$%0tiMLKq?On4R@4mkpgP)*YWNUp2@m5_cpQ24ovNJFnZ)|Xk=RN>Bz}t8;~%Z!JcPM^-dQPy z>ZrQqV^OENHR^lP&GJK0TQJVb=c86=HEICv1`-;;7SwC^2CAb&sI57MYVb?De-qWw zBUD4B+Ir8GK^@{4)cqEgPeV;;Flq%Rp*o)B*~^(nLLI({8pul2j5nY?&MfyUS=!YQZc?H(dSG_~+j%uYQTNNCdX7Qg=AkyN8LFjp)cwAe zA8J00>M<96?=9*y%|U(1mbc?rE3w%M-ZBrP9ypEqVq8H@?KY~T-%$hcPxd+}jxGII zW9&$IT6;coxCHgw2~_=mp`O2tYWI43*PF>53aV02yo2{ese|Ro_d|coMGZ6$HS<~K zDpZ5JP>13j)Cb}ps8e|nRsW8a7iV-@>1wC})Nx6uVq?_l>4Iu7166UP<#SO3nr!7u z%r&Sj+Jb6uFAl@Q$bU}MQ{IwiqfS*ms@)lucjuGP9xg{6<8`Qp{(>6FLDZgoX!p<9 z{p+YDy<^_TD&&i#c!1?qEHpvAzNx78`k7SQ7e#wdYuNL_Ie7cp`{p(J5Vz`fZC$tsQXti9DhT- zRV8|PTM>gL_5Qacp{3}An)w*i%=1tkPeYA-F^1qW)ZyENCGj9?z{gP?{TsvZ7HZ}X zF%|uL^W%hxDyqPpYEo~ZV0KHLXW4JlS?oUFFgX5yw zJB3==&rt*X5j9c2zTW>%uZeCP1p`TNu${SB2hU^UEoz`gaTuOLou!2S-c~m1Z|{Fk3bbUSPz_GOvbYd6<5y8jy&KEnLDZo; zgX-WS>QG+C1iXV9Q1k$=UM#A;CaC&dP!s4kfc4jdLnzSFk47!^6x0K=P!Fs^)!U33 z;BHL9Bd8D3BP@><26}(rPDJf-CTifbu^}!)4eUeI08YAA;j9&WZQd|{zzS6S6?N#s z26+RCM-8L}YRS8zz6ZT5-xt+U2A0Mw%TG34)I{BRB(#(-p(?IL?fq_40~b&oe1pyK zJ5%%jzJ|Vk*1AhV zGrNyE?SaF+Jui)FC=T^N6KskdQ3IWhy1xeX{AN@KyHHzMh&r?%nP*Tdb{RGBtLUo2 z4v9bU5$b*$%cr6S z&}LNz=a_1q%VK-Qy{bUSM1`_K<7@Q2Qj zt|r85z7)T*lt=6RFHb^y{u5DxbZx6}0OQFwBy?%NFZojZ+c=J=JPIRm81Vw>Z;ASZ zu5@As<+}cCt|NVps80TMVwB$h?IfNjo+Ykvvjy?wRhP_WVyhKuHTK)pqr zA!?F$iGP!BgB=N7H9dU)_t-Sbp0e^4syu=SB_P{r(4+yEN;)awUn_NOU-uNjI{J)UMI1H^5(=2(jzem*Af}T zQ1XLu7Cye_lP*U5iO7GVyb={Elkchh54YOoC@4j&xBPGTGWiTb*UQ9sq7A{W`L3DV zOD0l?Y6M?u-|JVJ^y8}r>F>y-VJjib5XyBx_XkXjCY6t(z;^tW88+Fh|a!J?{`8UvM9m&^% zF`t3~sK2Q+KwWJKeF=31S=r~L+mfz;pX!EPwJ5tlx(87}`Ufk22j3u?5lt!g$6Le> z(!NXkuWJ$Ui!a4L@L>@ue?ls!Y#CUos4juAP;X<{^?t0*zf>dY~# zQP!1MWqEgwDq4o5^A(X}`Awvk6RG3};d_Lx&33=_6VF9Ik@jlwVI$Gc%3G0cZ0S0r zClC?Ze_gw|k#09b$cK^kv%KyPB(g03G|nRub>oSv2I&XH?^d>!I$cP|5+jN2gnqE5 zQyxx~Bz#|z^OEaD3X+JWL`Cw`h`$k!2>s*YU5vvx)OCpXGjW7iNBIzGHlDdrf*VvCQs|#rDKYcHcc{i4%C+($AWrIdPeIh1ki1%L)DczaBA}^hB(RdHDER zOroDQ>ysR^r^ik4% zu^6@{R+GMA_p9P_kv>R459SEcGKwvJ^#|N|s19GrBb; zA(|Fx8!||vjT#wILp3V?pU-_xGyebA|9Q>V`<(Nf=Q-zm&v|~gd3{gPf_IY=M@kh~ z5pg}26h#$rcCjdGlP`)sEpKZSy;CEKa&R}+!}2wws1SAw_QAr`2V#C4fkkmN@~Y?t ztb#MK1U`zF;Io(#MTzJo3aK>giW{Q8qAxmvzUa%){vD=M{{_on$y)IM8R!d}qxU-o z2cZ+a0h4iBsLw|G&%-pvkCucEPlXPfus9tyqbu8q18_HX!%DT|7mmY%)F+|+riJ!d zp*|neXkUz_aCNw!i%#G*EW!BETNFq|bRc*Xo$>cr63<~FOsNz1OG95!6}_K{uDmUp z;{NEsWARd)j`q6`UD#7-zs;DaPGJ{?a(E0&;|27=(i!oK>!UC1grj)2O;M=Hs!&)5epN6iqA{NDZq22=B!fxpEebD~>6BJC@@X&BGI^gYSiXK8A*bwT^p(}U| z9q1!;;-8_Z{T|(t^XT)%>&IJA1?``OW}+>cp+r9lzVI6K!5Qca??qF*3SH^uaDOZM zqW93fJsjGPV+!?ip}lZc6cwSKj`pjHZgB&2Vm*IV4`v~-b zu~-Zz1!rMp>I>1sw-KHAyTQHafS&|EL*H{0o#1!Y{r-QV;NeJW7{4GHJp(1s6=tHD zX@pL&DVmWUXuqL24yU18cM#pWZ?QODK%Xn#D863<&0sT3xT4+^QgImixlKSHm>b$x zg!Xml9>0b@w;MgY2hataMlR~R3A&Q) z=;!e!dWsLDe;vQZEX>~|iZU=8*}Z5O*1?5X6E|Z8{2TiIAJDD%1)We)4w&_{1O;bO z1MOHB{Y)C8ndpPvaX6ZxwdhuDMEk#tY4|$Y|6_FGUxxcXqbp8o7H@4T`dn=^^NEI` zp%uDINvrTqS@ zG>=blV>ETW(L*=|eZfL>PnV+;dIg=xHgp1Spey+h-Ks<3{!#P{e2aDQ7jz=ETEt&L zeJtqr-<|^h!4q{s_oh4Au^*b+LFm8}(E)EnCol^gcrH5dqEKHM>Z{Q$c@`Nv+JYtV zG&)|smYgNO|AG`ueG}w-MZ<9{F2x-D0ZnP=R#D`i>rrTC?!>%-(Fv`@(zpu!>^6t? zmx5c-1?@zi+m8wN_Hzo(=p>qf)98wS#&rA*?U&X%?pGDPUjyx*fn~7~`W5xWg*Y?Z zFVH5QSPD9DHFN>>+mL@>)Qkov&>Br?JM4@eAm41>3PWOyQq$*egN72gjiU%|aiXhaQ&2=s-_|`bP9rzl#2V>cjDOim z1giua1lytgd!xS}BhiIU#N-5p=@d-K9CUyM*qZ-4wivrmfBQ22LSjm%_`x1%|0~gn zjzC|04Z4siSP2(k7OuxjaUYt|6X;LzDNOjlc?w#(bNs?g^pG?`e=xeChjbX`4G`KF zps9Wgoxpmu-)8hIy@O8hAlmPXP(OiA=uBtw?~N3esb$bTtct!c8%JR~1fYKSEdZ9hS#J-Qs#Rv|lUCI|IRySe5ph5)@3?GV}!-(a-4h(EbU!lJCR) zLfzwEu*&EQ+oJ>IpwEp(``;egmj~CQ3wQ<1@LT9sCJs>Wzg|zGGcVpF{$rGhHL3SU zS2!Ij;0mgX0XM<+N0&B%?I@Ws<9 z6u`TKi-PxKL)urMD|{23z(I5?PKNp!EK2>7zVVCG(acpsCzOF^xGi3SoiHEv?o0lC zQ9l~ot3lWfuSI9L4&B@5Fcn`4{spU3--osEN3>tXe(}U=p$n=X%tj~J96d9g(1~>G zNB(^E#;ef>o<>u>3C+YVbc^=mt#}%X<8?XlR!m1%z6AYxoT2P)Mba?}~VDN}?Sy&<-8Z&#pf@@MJ88bI}akhi32vG-F%Pfp?-4-;XJH2t9OP zqtEB>A5S<@l0r!us$mIig08#^cE?^g0+*wQ=oFgrk^|xaTc8W*fc3C1ddOy?8C`}> z;8FBUYzV#(-%mu_D6oCeTj&bX2ga$bgr>A5y3!ul6tBnnxEeWk(fgQz6|Ri`+I7Ji z)Tg3*z7n0#8Z=W|uoS+Ih5i2bQEWIIdYEoO_i`qt%s)6jbmh_a*TkZJ{|zZLz&2NRg_CJF5JC089EVjkuA@L7US4><=!zc>bI33;NXV97N!Nzz9omk4ycmk!- z`xQdHZm?0X1(xN0d-Tu^MkjJJI*~bO#vd3;{{10%Bs8o-2U>$^xGB`P2j4f66 z3utO<@kuz5M(9dfp&9IeZpoC;J_qf8H~N(=L$`1(+HX^Wf-~BJzVJ2lyL}TY;BNFQ zIEJqHEZXlvXivT>K9ps#C+*E~56(d|(R*b4lRXgKvI*#Wrla>0b1681h3JbHBR^)* z3hac(&=qEkif7ya{TkY#E9-=w_CDyI4@2KG4PD`EY>tbt67CB3KS!QVM8_#Oz!`Ke z&!LAUb#!cbG-b8XnP;K*TcC%xGn%2{=nAh#2cCgW>>jjz1-hWM=;!z~_VWAxje@D@ zF(zJ74w{kS=zt^9?|eLV!5Qevw_^j`jTP}{binkhz3+5Y3{!L{O z3hrqcbOIGHKh{Q1Z6-Rww&)8whx+B{#QLKHj15jhCpHhA*fMmh9z(~=4edL|lK*lv z><$fIp#z*mUvM_G=N}iRtQb0>GU$LA=x5gwOXEaz?-S_OEJfe54Snw(^tpZLM7|nF z{!QsA8eI9Wn1o(Uh|w0f-XUB;4`L-9oJ3cgMJx#qRHp4+;>l3YPuXj8OjMWlYlr~^ zzf(~@`?>!YUoTL(og4oDzmmjY>K?AY6SJw$Al6WxLHvHD)7Fsix;`fF581txs}Ro< z{9HsM>C-6mTSxr~BH_2`wSpT@#l`>iZ!>D9?nQ#1g8y7SDc#01M{w7FTK`+{TYrs6 zrcWBN{J*#25^Zx_zn_BFTQPb2<>|eP4*$X@iQ$xI;uylKCH2*LrTCwFsm~{tQoRK; z2={+3dR-Z86IY|Ju|92Q%>QXBjfmPbG$t-kei*CcUx<@LQR-d`@Ij(GbwHX;5^c`{BzuS+ODMT{c6{KHm0uf+N*)A$fklZIBJ6yY^DCOU@y4COyzHhmw)p?Ftle+cg*?j)`z{5#?`HYV@C zBmKMIiRep=C)R{9uSih%kcRriapG3$)5Fc3)V-=v|1;Xx>m}kwqHm}_hgVUbfHjH1 zL@nxG9f*b0z1rdSxESrjF4Pl0P$)+<4V~`9Z>diviV|K0!@ao1DyeU!G7&f6Bz&A0 zNW4z{b7DHtj_{gAT*^JKYBACNSn?mPTZ3QWZNxu_=ZIoFcnfwV&J#)0&teYNBi2&B zgJ?<=qTU%VzS>inO5DdiuLi+KD3?zP6ilW5NvN-\n" "Language-Team: loops developers \n" "MIME-Version: 1.0\n" @@ -298,7 +298,16 @@ msgstr "Rang Team" msgid "Team Size" msgstr "Anzahl der vom Team ausgefüllten Fragebögen" -# competence (qualification) +# compentence and qualification management + +msgid "Jobs / Positions" +msgstr "Stellen" + +msgid "Create Job..." +msgstr "Stelle anlegen..." + +msgid "Create a new job / position" +msgstr "Eine neue Stelle anlegen..." msgid "Validity Period (Months)" msgstr "Gültigkeitszeitraum (Monate)" diff --git a/organize/README.txt b/organize/README.txt index c37d7f3..adfe499 100644 --- a/organize/README.txt +++ b/organize/README.txt @@ -427,7 +427,7 @@ Send Email to Members >>> form.subject u"loops Notification from '$site'" >>> form.mailBody - u'\n\nEvent #1\nhttp://127.0.0.1/loops/views/menu/.117\n\n' + u'\n\nEvent #1\nhttp://127.0.0.1/loops/views/menu/.127\n\n' Show Presence of Other Users diff --git a/system/sync/README.txt b/system/sync/README.txt index 143c6a9..0cfb89d 100644 --- a/system/sync/README.txt +++ b/system/sync/README.txt @@ -18,7 +18,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) >>> from cybertools.tracking.btree import TrackingStorage >>> from loops.system.job import JobRecord diff --git a/xmlrpc/README.txt b/xmlrpc/README.txt index de55ea2..b12dd76 100755 --- a/xmlrpc/README.txt +++ b/xmlrpc/README.txt @@ -35,7 +35,7 @@ ZCML setup): Let's look what setup has provided us with: >>> len(concepts) - 24 + 27 Now let's add a few more concepts: @@ -72,7 +72,8 @@ note that the 'hasType' predicate is not shown as it should not be applied in an explicit assignment. >>> sorted(t['name'] for t in xrf.getConceptTypes()) - [u'competence', u'customer', u'domain', u'file', u'note', u'person', + [u'competence', u'customer', u'domain', u'file', u'ipskill', + u'ipskillsrequired', u'jobposition', u'note', u'person', u'predicate', u'report', u'task', u'textdocument', u'topic', u'type'] >>> sorted(t['name'] for t in xrf.getPredicates()) [u'depends', u'issubtype', u'knows', u'ownedby', u'provides', u'requires', @@ -95,7 +96,8 @@ All methods that retrieve one object also returns its children and parents: >>> ch[0]['name'] u'hasType' >>> sorted(c['name'] for c in ch[0]['objects']) - [u'competence', u'customer', u'domain', u'file', u'note', u'person', + [u'competence', u'customer', u'domain', u'file', u'ipskill', + u'ipskillsrequired', u'jobposition', u'note', u'person', u'predicate', u'report', u'task', u'textdocument', u'topic', u'type'] >>> pa = defaultPred['parents'] @@ -114,7 +116,8 @@ We can also retrieve children and parents explicitely: >>> ch[0]['name'] u'hasType' >>> sorted(c['name'] for c in ch[0]['objects']) - [u'competence', u'customer', u'domain', u'file', u'note', u'person', + [u'competence', u'customer', u'domain', u'file', u'ipskill', + u'ipskillsrequired', u'jobposition', u'note', u'person', u'predicate', u'report', u'task', u'textdocument', u'topic', u'type'] >>> pa = xrf.getParents('5') @@ -174,14 +177,14 @@ Updating the concept map >>> topicId = xrf.getObjectByName('topic')['id'] >>> xrf.createConcept(topicId, u'zope2', u'Zope 2') - {'description': u'', 'title': u'Zope 2', 'type': '38', 'id': '76', + {'description': u'', 'title': u'Zope 2', 'type': '44', 'id': '86', 'name': u'zope2'} The name of the concept is checked by a name chooser; if the corresponding parameter is empty, the name will be generated from the title. >>> xrf.createConcept(topicId, u'', u'Python') - {'description': u'', 'title': u'Python', 'type': '38', 'id': '78', + {'description': u'', 'title': u'Python', 'type': '44', 'id': '88', 'name': u'python'} If we try to deassign a ``hasType`` relation nothing will happen; a