Mercurial > hg > MPIWGThesaurus
annotate MPIWGThesaurus.py @ 38:a8907351ddf2
fixed only /en/research links.
author | casties |
---|---|
date | Tue, 29 Oct 2013 16:47:36 +0100 |
parents | e13200d8d473 |
children | 4342a81e0aa0 |
rev | line source |
---|---|
1 | 1 #Klasse zum Taggen und Anzeigen der Tags von Projekte bzw. allgemein Webseiten des Institutes |
2 #Tags werden in der Instanz abgespeichert | |
3 #Personenname kommen aus dem Virtuoso-Triplestore , lokal erzeugte zusaetliche Name werden dort abgespeichert | |
10 | 4 #Fuer die Suche ueber die Personenname wird das MetaDataManagerRestlet benoetigt. |
1 | 5 #TODO: Zur Zeit werden die entsprechenden Server URLs hier in der Klasse definiert. |
6 | |
7 | |
0 | 8 # TODO: generell verwaltung der tags im triple store und nicht in zope. |
1 | 9 # TODO: mache server und namespaces konfigurierbar im project |
10 | |
11 | |
0 | 12 from OFS.Folder import Folder |
13 from Globals import package_home | |
14 from Products.PageTemplates.PageTemplateFile import PageTemplateFile | |
15 from BTrees.OOBTree import OOBTree | |
16 from BTrees.OOBTree import OOSet | |
2 | 17 from AccessControl import ClassSecurityInfo |
18 | |
0 | 19 #import os |
20 import os.path | |
21 import logging | |
22 import time | |
23 import email.Utils | |
24 from types import ListType | |
25 import transaction | |
26 import random | |
27 import urllib2 | |
28 import urllib | |
20 | 29 |
18 | 30 |
0 | 31 |
17 | 32 class projectHolder: |
33 projectHolder="" | |
34 projectName="" | |
35 projectID="" | |
36 persons="" | |
37 tags={} | |
38 | |
39 def __init__(self,ID): | |
40 self.projectID=ID | |
41 self.tags={} | |
42 | |
1 | 43 #Entry beschreibt jeweils einen Tag mit dem Namen "title", entries enthaelt eine Liste von Subtags (der Klasse Entry), die diesem Tag untergeordnet sind. |
0 | 44 class Entry: |
45 """publicClass""" | |
1 | 46 |
47 #=========================================================================== | |
48 # __init__ | |
49 #=========================================================================== | |
0 | 50 def __init__(self,title,entries=[]): |
51 self.title=title | |
52 self.entries=entries | |
53 | |
54 def getTitle(self): | |
55 """getTitle""" | |
56 return self.title | |
57 | |
1 | 58 #Beschriebt einen von einem Benutzer vorgeschlagenen Tag |
0 | 59 class SuggestedTag: |
60 """publicClass""" | |
61 type="" | |
62 userName="" | |
63 def __init__(self,name,comment,type,userName): | |
64 self.name=name | |
65 self.comment=comment | |
66 self.type=type | |
67 self.userName=userName | |
68 | |
69 | |
70 class MPIWGThesaurus(Folder): | |
71 """MPIWGThesaurus main folder""" | |
2 | 72 security=ClassSecurityInfo() |
73 | |
0 | 74 meta_type="MPIWGThesaurus" |
75 | |
76 TMP_PERSON_NS="http://ontologies.mpiwg-berlin.mpg.de/tempObjects/person/" | |
77 ONTOLOGY_NS="http://ontologies.mpiwg-berlin.mpg.de/authorities/namedIdentities/" | |
7 | 78 personproviderURL="http://127.0.0.1:8280/MetaDataManagerRestlet/person/" |
79 #personproviderURL="http://virtuoso.mpiwg-berlin.mpg.de:8080/MetaDataManagerRestlet/person/" | |
80 #PERSONS_LOOKUP_URL="http://127.0.0.1:8280/MetaDataManagerRestlet/search/persons" | |
81 PERSONS_LOOKUP_URL="http://127.0.0.1:8280/MetaDataManagerRestlet/persons" | |
8 | 82 EDIT_URL="http://127.0.0.1:8280/MetaDataManagerRestlet/edit?id=" |
83 #PERSONS_LOOKUP_URL="http://virtuoso.mpiwg-berlin.mpg.de:8080/MetaDataManagerRestlet/person/" | |
7 | 84 |
0 | 85 additionalNamesGraphURL="file://newpersonsFromProjects" |
86 | |
87 #virtuosoServer="http://ontologies.mpiwg-berlin.mpg.de" | |
88 virtuosoServer="http://virtuoso.mpiwg-berlin.mpg.de:8890" | |
89 virtuosoDAV="/DAV/home/websiteuser/" | |
90 virtuosoDAVUser="websiteuser" | |
91 virtuosoDAVPW="w3s45us3" | |
92 virtuosoGraph="file://newpersonsFromProjects" | |
93 | |
15 | 94 logpathDefault="/var/tmp/tagchanges.log" |
95 | |
1 | 96 #BTrees fuer die Tags |
97 | |
7 | 98 projectPersons= OOBTree() #project --> personen IDs |
15 | 99 projectObjects= OOBTree() #project --> objects |
0 | 100 projectHistoricalPlaces= OOBTree() |
101 projectSuggestedTags= OOBTree() | |
7 | 102 persons2Projects= OOBTree() #personenID --> projects |
15 | 103 objects2Projects=OOBTree() #objects --> projects |
0 | 104 historicalPlaces2Projects=OOBTree() |
105 suggestedTags2Projects=OOBTree() | |
4 | 106 personIDtoNames=OOBTree() # weist den personenIDs Klartextnamen aus dem Triplestore zu |
5 | 107 personsIDForSort=[] # liste personenID sortiert nach dem tupel (nachname,vorname) |
108 personsIDForSortFull=[] # liste (personenID,(nachname,vorname)) nicht sortiert! | |
109 | |
0 | 110 suggestedPersons= OOBTree(); #TODO: das sollte die ueberfluessig werde und nur im triple store stehen. |
111 | |
112 tagList=[] | |
1 | 113 |
114 #default liste fuer tags, wird ueber das Managementinterface ueberschrieben | |
0 | 115 approachesTxt="""A |
116 --- | |
117 ent1 | |
118 --- | |
119 B | |
120 --- | |
121 enta | |
122 entb | |
123 entc | |
124 """ | |
125 | |
126 disciplines=[] | |
127 disciplinesTxt="""A | |
128 B | |
129 C | |
130 """ | |
131 | |
132 periods=[] | |
133 periodsTxt="""PA | |
134 PB | |
135 PC | |
136 """ | |
137 | |
138 spaces=[] | |
139 spacesTxt="""SPA | |
140 --- | |
141 sPent1 | |
142 --- | |
143 SPB | |
144 --- | |
145 SPenta | |
146 SPentb | |
147 SPentc | |
148 """ | |
149 technologies=[] | |
150 technologiesTxt="""TPA | |
151 --- | |
152 TPent1 | |
153 --- | |
154 TPB | |
155 --- | |
156 TPenta | |
157 TPentb | |
158 TPentc | |
159 """ | |
160 | |
161 knowledgeTransfers=[] | |
162 knowledgeTransfersTxt="""KTPA | |
163 --- | |
164 TPent1 | |
165 --- | |
166 TPB | |
167 --- | |
168 TPenta | |
169 TPentb | |
170 TPentc | |
171 """ | |
172 | |
173 | |
174 | |
175 | |
176 | |
177 | |
178 manage_options = Folder.manage_options+( | |
1 | 179 {'label':'Thesaurus entries','action':'changeMPIWGThesaurusForm'}, |
180 {'label':'Manage Thesaurus','action':'manageMPIWGThesaurus'}, | |
15 | 181 {'label':'Thesaurus Log','action':'manageMPIWGThesaurusLogs'}, |
0 | 182 #{'label':'Change Publications Special','action':'changePublications_specialForm'}, |
183 ) | |
184 | |
185 def __init__(self,id): | |
186 """init""" | |
187 self.id=id | |
188 | |
189 | |
190 def index_html(self): | |
191 """index file""" | |
1 | 192 |
0 | 193 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','index.html')).__of__(self) |
194 return pt() | |
195 | |
2 | 196 security.declareProtected('View management screens','changeMPIWGThesaurusForm') |
0 | 197 def changeMPIWGThesaurusForm(self): |
198 """form for changing the project""" | |
199 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeMPIWGThesaurusForm.zpt')).__of__(self) | |
200 return pt() | |
201 | |
2 | 202 security.declareProtected('View management screens','manageMPIWGThesaurus') |
1 | 203 def manageMPIWGThesaurus(self): |
204 """form for changing the project""" | |
205 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageMPIWGThesaurus.zpt')).__of__(self) | |
206 return pt() | |
207 | |
15 | 208 security.declareProtected('View management screens','manageMPIWGThesaurusLogs') |
209 def manageMPIWGThesaurusLogs(self): | |
210 """form for changing the project""" | |
211 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageMPIWGThesaurusLog.zpt')).__of__(self) | |
212 return pt() | |
213 | |
214 def changeMPIWGThesaurusLog(self,logpath,RESPONSE=None): | |
215 """change log file path""" | |
216 self.logpath=logpath | |
217 | |
218 if RESPONSE is not None: | |
219 redirect(RESPONSE,'manage_main') | |
220 | |
221 | |
2 | 222 security.declareProtected('View management screens','changeMPIWGThesaurus') |
0 | 223 def changeMPIWGThesaurus(self,approachesTxt,disciplinesTxt,periodsTxt,spacesTxt,technologiesTxt,knowledgeTransfersTxt,RESPONSE=None): |
224 """change it""" | |
225 self.approachesTxt=approachesTxt | |
226 self.disciplinesTxt=disciplinesTxt | |
227 self.periodsTxt=periodsTxt | |
228 self.spacesTxt=spacesTxt | |
229 self.technologiesTxt=technologiesTxt | |
230 self.knowledgeTransfersTxt=knowledgeTransfersTxt | |
231 | |
232 if RESPONSE is not None: | |
233 redirect(RESPONSE,'manage_main') | |
15 | 234 |
235 | |
24 | 236 # def getAllProjectsAndTagsAsCSV(self,archived=1): |
237 # """alle projekte auch die nicht getaggten""" | |
238 # retList=[] | |
239 # for project in self.getProjectFields('WEB_title_or_short'): | |
240 # proj = project[0] | |
241 # p_name = project[1] | |
242 # retProj=[] | |
243 # if (not proj.isArchivedProject() and archived==1) or (proj.isArchivedProject() and archived==2): | |
244 # retProj.append(self.utf8ify(p_name)) | |
245 # retProj.append(self.utf8ify(proj.getContent('xdata_01'))) | |
246 # retProj.append("|".join([person[1] for person in self.thesaurus.getPersonsFromProject(proj.getId())])) | |
247 # retProj.append("|".join([person[1] for person in self.thesaurus.getHistoricalPlacesFromProject(proj.getId())])) | |
248 # retProj.append("|".join([person[1] for person in self.thesaurus.getObjectsFromProject(proj.getId())])) | |
249 # retProj.append("|".join(self.thesaurus.getTags(proj.getId()))) | |
250 # retList.append("\t".join(retProj)) | |
251 # | |
252 # return "\n".join(retList); | |
253 # | |
17 | 254 def getProjectsAndTags(self): |
255 """projekte und tags""" | |
256 | |
257 | |
258 projectTags={} | |
259 for tag in self.tags.keys(): | |
260 logging.debug("getProjectsAndTags:"+tag) | |
261 # <div class="level1_projects" tal:repeat="proj | |
262 # python:here.getProjectsWithTag('approaches',here.getTitle(level1))"><a tal:attributes="href | |
263 # python:proj[0]"><span tal:content="python:proj[1]">my proj</span><tal:x define="person python:proj[2]"><span | |
264 # class="person_projects" tal:content="person"/></tal:x></a></div> | |
21 | 265 #</div> |
17 | 266 |
267 for subTag in self.tags.get(tag): | |
268 projs = self.getProjectsWithTag(tag,subTag) | |
269 if not isinstance(projs, ListType): | |
270 projs=[projs] | |
271 | |
272 for proj in projs: | |
25 | 273 if proj is None: |
274 continue | |
17 | 275 projectID=proj[0] |
276 logging.debug("PTS"+repr(projectTags)) | |
277 project=projectTags.get(projectID,projectHolder(projectID)) | |
278 project.projectName=proj[1] | |
279 project.persons=proj[2] | |
280 logging.debug(project) | |
281 logging.debug(tag) | |
282 logging.debug("PROTS"+repr(project.tags)) | |
283 tagsOfType=project.tags.get(tag,OOSet()) | |
284 logging.debug(tagsOfType) | |
285 tagsOfType.add(subTag.decode('utf-8')) | |
286 | |
287 logging.debug("Adding %s to %s"%(subTag,projectID)) | |
288 project.tags[tag]=tagsOfType | |
289 | |
290 projectTags[projectID]=project | |
291 logging.debug("Saved %s to %s"%(repr(list(tagsOfType)),projectID)) | |
292 logging.debug(projectTags) | |
293 | |
294 | |
295 | |
296 return projectTags | |
297 | |
22 | 298 def getProjectsAndTagsAsCSV(self): |
17 | 299 """get the projects as tab""" |
300 ret="" | |
301 | |
302 #genereate headers | |
303 headers=['date','projectPath','projectName','researchers resp'] | |
304 headers.extend(list(self.tags.keys())) | |
305 ret+="\t".join(headers)+"\n" | |
306 | |
307 projectTags = self.getProjectsAndTags() | |
308 for projectID in projectTags.keys(): | |
309 retarray=[] | |
310 splitted = projectID.split("/") # hiern nur die eingetliche ID ohne den Pfad | |
311 if len(splitted)>0: | |
312 projectIDShort=splitted[-1] | |
313 retarray.append(self.lastChangeInThesaurus.get(projectIDShort,'')) | |
314 else: | |
315 retarray.append('') | |
316 retarray.append(projectID) | |
317 project = projectTags.get(projectID) | |
318 retarray.append(project.projectName) | |
319 retarray.append(project.persons) | |
320 | |
321 | |
322 | |
323 for tagType in self.tags.keys(): | |
324 tags = project.tags.get(tagType,['']) | |
325 retarray.append(";".join(tags)) | |
326 | |
327 | |
328 ret+="\t".join(retarray)+"\n" | |
329 | |
330 return ret | |
331 | |
15 | 332 def getLogpath(self): |
333 return getattr(self,"logpath",self.logpathDefault) | |
334 | |
335 def getLogfile(self,projectID="",date=""): | |
336 | |
337 # logfile format : YYYY-MM-TT HH:mm:ss\tUSER\ttype\tprojectid\CHANGED_TAG_or_OBJECT_or_PERSON | |
338 if not os.path.exists(self.getLogpath()): | |
339 return "" | |
340 | |
341 fh = open(self.getLogpath(),"r") | |
342 lines=fh.readlines() | |
343 | |
344 if (projectID!=""): | |
345 ret=[] | |
346 for line in lines: | |
347 splitted=line.split("\t") | |
348 if splitted[3]==projectID: | |
349 ret.append(line) | |
350 | |
351 lines=ret[0:] | |
352 | |
353 if (date!=""): | |
354 ret=[] | |
355 for line in lines: | |
356 splitted=line.split("\t") | |
357 if splitted[0]>=date: | |
358 ret.append(line) | |
359 | |
360 | |
361 lines=ret[0:] | |
362 | |
363 txt= "".join(lines) | |
364 fh.close() | |
365 | |
366 | |
367 | |
368 | |
369 return txt | |
370 | |
0 | 371 #In der Anzeige soll der Name der zitierten Personen in Klartext angezeigt werden, ausserdem die Varianten, wie sie tatsaechlich |
372 #in den Projekten benutzt werden | |
2 | 373 |
5 | 374 |
375 def addPersonAndFirstNameFromTripleStore(self, personID): | |
376 mainName, sortName = self.getMainNameFromTripleStore(personID) # hole die hauptbezeichnung aus dem triplestore | |
377 personNames = [] | |
7 | 378 logging.debug("get person:"+ personID) |
379 logging.debug("names:"+repr(mainName)+":"+ repr(sortName)) | |
380 | |
381 projects=self.persons2Projects.get(personID) | |
382 logging.debug(repr(projects)) | |
383 if projects is None: | |
384 projects=[] | |
385 | |
386 for project in projects: #hole die personen aus dem projekte | |
5 | 387 logging.debug("Found:project:" + project) |
388 namesInProject = self.projectPersons.get(project) | |
389 for nameInProjectTuple in namesInProject: | |
390 logging.debug(repr(nameInProjectTuple)) | |
391 nameInProject = nameInProjectTuple[1] | |
392 logging.debug(nameInProjectTuple[0] + "??" + personID) | |
393 if nameInProjectTuple[0] == personID: | |
394 logging.debug("changing") | |
395 if mainName == "": # es gibt keinen Eintrag im Triplestore fuer name (sollte eigentlich nicht sein, ist dann ein Fehler dort) | |
396 mainName = nameInProject #nimm dann aber den ersten aus den projekten | |
397 if nameInProject != mainName: | |
398 personNames.append(nameInProject) | |
399 | |
400 logging.debug(str(mainName) + "- foundalso :" + ",".join(personNames)) | |
401 self.personIDtoNames.update({personID:(mainName, personNames)}) | |
402 self.personsIDForSortFull.append((personID, sortName)) | |
403 | |
404 | |
405 | |
406 def generateSortingOrderForPersonIDs(self): | |
407 def sort(x,y): | |
408 logging.debug("sort:") | |
409 logging.debug((x[1][0],y[1][0])) | |
410 return cmp(x[1][0],y[1][0]) | |
411 | |
412 self.personsIDForSortFull.sort(cmp=sort) | |
413 | |
414 self.personsIDForSort=[x[0] for x in self.personsIDForSortFull] | |
415 | |
416 self.personIDtoNames=self.personIDtoNames # make clear that it has changed #TODO: change this to variablen with names _p | |
417 | |
4 | 418 security.declareProtected('View management screens','collectPersonNamesToIds') |
0 | 419 def collectPersonNamesToIds(self): |
1 | 420 """Ordne Namen aus dem Triplestore bzw. die vergebenenden Label den Personen-Ids zu.""" |
5 | 421 #sollte z.B. gemacht werden, wenn im Triplestore editiert wurde. |
4 | 422 self.personIDtoNames=OOBTree() # loesche alle |
423 self.personsIDForSort=[] | |
5 | 424 self.personsIDForSortFull=[] |
0 | 425 for personID in self.persons2Projects: |
6 | 426 self.addPersonAndFirstNameFromTripleStore(personID) |
4 | 427 |
428 | |
429 | |
430 | |
431 #sortiere personIDs nach erstmal nach Nachnamene TODO: sortiere nach name,vorname | |
5 | 432 |
433 self.generateSortingOrderForPersonIDs(); | |
434 # def sort(x,y): | |
435 # logging.debug("sort:") | |
436 # logging.debug((x[1][0],y[1][0])) | |
437 # return cmp(x[1][0],y[1][0]) | |
438 # | |
439 # self.personsIDForSortFull.sort(cmp=sort) | |
440 # | |
441 # self.personsIDForSort=[x[0] for x in self.personsIDForSortFull] | |
442 # | |
443 # self.personIDtoNames=self.personIDtoNames # make clear that it has changed #TODO: change this to variablen with names _p | |
444 # | |
1 | 445 #Hole die Namen, die einer personID zugeordnet sind. |
0 | 446 def getNamesFromID(self,personID): |
7 | 447 personID=personID.rstrip().lstrip() #make sure no spaces |
448 logging.debug("<"+personID+">") | |
0 | 449 retStr="" |
7 | 450 |
451 retStr+=self.personIDtoNames.get(personID,[personID])[0] # hole die Hauptbezeichnung, falls keine angeben ist, wird die ID ausgegeben, das is jedoch ein Felher in den Daten!! | |
8 | 452 #additionalNames = self.personIDtoNames.get(personID,['',[]])[1] |
453 #if len(additionalNames)>0: | |
454 # retStr+=" ("+",".join(additionalNames)+","+")" | |
0 | 455 return retStr |
456 | |
457 | |
1 | 458 #Hole die Hauptnamemsansetzung aus dem Triplestore ),falls vorhanden, wenn nicht ist der String leer. |
4 | 459 #ausserdem einen Namen zum sortieren, = Tupel(nachname, vorname) |
0 | 460 def getMainNameFromTripleStore(self,personID): |
461 | |
462 | |
463 cmdString ="""select * where { <%s> <http://xmlns.com/foaf/0.1/name> ?name}"""%personID | |
464 | |
4 | 465 names= self.callSparql(cmdString) |
466 | |
467 cmdString ="""select * where { <%s> <http://xmlns.com/foaf/0.1/lastName> ?name}"""%personID | |
468 | |
469 lastName= self.callSparql(cmdString) | |
470 | |
471 cmdString ="""select * where { <%s> <http://xmlns.com/foaf/0.1/firstName> ?name}"""%personID | |
472 | |
473 firstName= self.callSparql(cmdString) | |
474 | |
475 return names,(lastName,firstName) | |
476 | |
477 | |
7 | 478 def callSparqlAll(self,cmdString): |
479 """list of results""" | |
480 auth_handler = urllib2.HTTPBasicAuthHandler() | |
481 auth_handler.add_password(realm='sparql', | |
482 uri=self.virtuosoServer+"/sparql", | |
483 user=self.virtuosoDAVUser, | |
484 passwd=self.virtuosoDAVPW) | |
485 | |
486 opener = urllib2.build_opener(auth_handler) | |
487 opener.addheaders = [('Content-Type','application/sparql-query')] | |
488 | |
489 logging.debug(cmdString) | |
490 try: | |
491 logging.debug(self.virtuosoServer+"/sparql?" + urllib.urlencode({'query':cmdString,'default-graph-uri':self.virtuosoGraph,'named-graph-uri':'','format':'text/csv'})) | |
492 #r= opener.open(self.virtuosoServer+"/sparql", urllib.urlencode({'query':cmdString,'default-graph-uri':self.virtuosoGraph,'named-graph-uri':'','format':'text/csv'})) | |
493 r= opener.open(self.virtuosoServer+"/sparql", urllib.urlencode({'query':cmdString,'default-graph-uri':'','named-graph-uri':'','format':'text/csv'})) | |
494 namesTxt=r.read() | |
495 except urllib2.URLError, e: | |
496 logging.error(e.code) | |
497 logging.error(e.read()) | |
498 | |
499 | |
500 return | |
501 logging.debug(namesTxt) | |
502 names=namesTxt.split("\n") | |
10 | 503 if len(names) < 2: #in der ersten Zeile stehen bei der Rueckgabe die Spaltennamen, <2 heiss also es gibt keinen Eintrag |
7 | 504 return [] |
505 | |
506 ret=[] | |
507 for name in names[1:]: | |
508 line=[] | |
509 for entry in name.split("\",\""): | |
510 | |
511 line.append(entry.replace('"','')); | |
512 ret.append(line); | |
513 return ret; | |
514 | |
4 | 515 def callSparql(self,cmdString): |
0 | 516 |
517 auth_handler = urllib2.HTTPBasicAuthHandler() | |
518 auth_handler.add_password(realm='sparql', | |
519 uri=self.virtuosoServer+"/sparql", | |
520 user=self.virtuosoDAVUser, | |
521 passwd=self.virtuosoDAVPW) | |
522 | |
523 opener = urllib2.build_opener(auth_handler) | |
524 opener.addheaders = [('Content-Type','application/sparql-query')] | |
525 | |
526 logging.debug(cmdString) | |
527 try: | |
4 | 528 logging.debug(self.virtuosoServer+"/sparql?" + urllib.urlencode({'query':cmdString,'default-graph-uri':self.virtuosoGraph,'named-graph-uri':'','format':'text/csv'})) |
529 #r= opener.open(self.virtuosoServer+"/sparql", urllib.urlencode({'query':cmdString,'default-graph-uri':self.virtuosoGraph,'named-graph-uri':'','format':'text/csv'})) | |
530 r= opener.open(self.virtuosoServer+"/sparql", urllib.urlencode({'query':cmdString,'default-graph-uri':'','named-graph-uri':'','format':'text/csv'})) | |
0 | 531 namesTxt=r.read() |
532 except urllib2.URLError, e: | |
533 logging.error(e.code) | |
534 logging.error(e.read()) | |
4 | 535 |
536 | |
0 | 537 return |
4 | 538 logging.debug(namesTxt) |
0 | 539 names=namesTxt.split("\n") |
10 | 540 if len(names) < 2: #in der ersten Zeile stehen bei der Rueckgabe die Spaltennamen, <2 heiss also es gibt keinen Eintrag |
0 | 541 return |
542 | |
543 return names[1].replace('"','') # wir nehmen nur den ersten treffer | |
544 | |
545 | |
2 | 546 security.declareProtected('View management screens','changeTags') |
0 | 547 def changeTags(self,projectID,approaches=[],disciplines=[],periods=[],spaces=[],technologies=[],transfers=[],RESPONSE=None): |
548 """change tags""" | |
549 self.changeTagFromList(projectID,"approaches", approaches) | |
550 self.changeTagFromList(projectID,"disciplines", disciplines) | |
551 self.changeTagFromList(projectID,"periods", periods) | |
552 self.changeTagFromList(projectID,"spaces", spaces) | |
553 self.changeTagFromList(projectID,"technologies", technologies) | |
554 self.changeTagFromList(projectID,"transfers", transfers) | |
555 | |
556 self.projectObjects=self.projectObjects #necessesary to make the object persistent after the first call | |
557 self.projectHistoricalPlaces=self.projectHistoricalPlaces #necessesary to make the object persistent after the first call | |
558 self.projectPersons=self.projectPersons #necessesary to make the object persistent after the first call | |
559 self.projectSuggestedTags=self.projectSuggestedTags | |
560 | |
561 self.persons2Projects=self.persons2Projects | |
3 | 562 self.objects2Projects=self.objects2Projects |
0 | 563 self.historicalPlaces2Projects=self.historicalPlaces2Projects |
564 self.suggestedTags2Projects=self.suggestedTags2Projects; | |
565 | |
566 self.suggestedPersons=self.suggestedPersons; | |
567 | |
2 | 568 security.declareProtected('View management screens','deleteAllTags') |
0 | 569 def deleteAllTags(self): |
570 """deleteAllTags - TODO: take this out!!,""" | |
571 setattr(self,"tags",None) | |
572 | |
573 return "DONE!" | |
574 | |
2 | 575 security.declareProtected('View management screens','deleteAllPersons') |
0 | 576 def deleteAllPersons(self): |
577 """deleteAllTags - TODO: take this out!!,""" | |
578 self.projectPersons= OOBTree() | |
579 self.persons2Projects= OOBTree() | |
580 self.personIDtoNames=OOBTree() | |
581 self.suggestedPersons= OOBTree(); #TODO: das sollte die ueberfluessig werde und nur im triple store stehen. | |
582 | |
583 | |
584 return "DONE!" | |
2 | 585 |
3 | 586 security.declareProtected('View management screens','deleteAllObjects') |
587 def deleteAllObjects(self): | |
588 """deleteAllTags - TODO: take this out!!,""" | |
589 logging.debug("delete all objects") | |
590 self.projectObjects= OOBTree() | |
591 self.objects2Projects=OOBTree() | |
592 | |
593 | |
594 return "DONE!" | |
595 | |
0 | 596 def changeTagFromList(self,projectID,tagType,tagList): |
597 | |
598 logging.debug("changing:"+projectID) | |
599 logging.debug("asking tag::"+tagType) | |
600 if type(tagList) is not ListType: | |
601 tagList=[tagList] | |
602 | |
603 | |
604 tags = getattr(self,"tags",None) | |
605 if tags is None: | |
606 logging.debug("Create new tags") | |
607 tags=OOBTree() | |
608 setattr(self,"tags",tags) | |
609 | |
610 | |
611 tagsStored=tags.get(tagType,None) | |
612 if tagsStored is None: | |
613 tagsStored=OOBTree(); | |
614 | |
615 | |
616 | |
617 for tag in tagsStored.keys(): #gehe durch alle gespeichteren tags | |
618 logging.debug("checking:"+tag) | |
15 | 619 projectsOfTag = tagsStored.get(tag,None) |
620 logging.debug(projectsOfTag) | |
621 if projectsOfTag is None: | |
622 projectsOfTag=OOSet() | |
0 | 623 |
624 if tag in tagList: #dieser ist getagged | |
15 | 625 projectsOfTag.update([projectID]); |
626 self.storeChange("added",projectID,tag) | |
0 | 627 tagList.remove(tag); |
628 else: | |
15 | 629 if projectsOfTag.has_key(projectID): |
630 projectsOfTag.remove(projectID); | |
631 self.storeChange("remove",projectID,tag) | |
632 | |
633 tagsStored.update({tag:projectsOfTag}); | |
0 | 634 |
15 | 635 for tag in tagList: # alle Tags, die nicht abgearbeitet worden sind, muessen noch angelegt werden |
0 | 636 logging.debug("adding:"+tag) |
637 newApproach=OOSet() | |
638 newApproach.update([projectID]); | |
639 tagsStored.insert(tag, newApproach); | |
640 | |
641 tags.update({tagType:tagsStored}) | |
642 | |
643 transaction.commit() | |
644 | |
645 def getTitle(self,entry): | |
646 return entry.title | |
647 | |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
648 def thes_quote(self,txt): |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
649 import md5 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
650 logging.debug("@*%s*@"%txt) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
651 return md5.md5(txt.lower()).hexdigest() |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
652 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
653 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
654 def formatTag(self,tag): |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
655 splitted= tag.split("_") |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
656 return splitted[-1] |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
657 |
15 | 658 def getEntriesFormatted(self,entries,formatType): |
12 | 659 if not hasattr(self,'levelFormatted'): |
32 | 660 pt=PageTemplateFile('zpt/levelFormatted', globals()).__of__(self) |
15 | 661 return pt(level1_entries=entries,type=formatType) |
12 | 662 |
32 | 663 pt = getattr(self,'levelFormatted') |
28 | 664 return pt(level1_entries=entries,type=formatType) |
665 | |
666 | |
667 #return self.levelFormatted(level1_entries=entries,type=formatType) | |
12 | 668 |
0 | 669 def getEntries(self,entry): |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
670 #logging.debug("GETENTRY:"+repr(entry)) |
0 | 671 return entry.entries |
672 | |
1 | 673 #nimmt ein eine Text der Form |
674 # TAG1 | |
675 # --- | |
676 # SUBTAG1_1 | |
677 # SUBTAG1_2 | |
678 # --- | |
679 # TAG2 | |
680 # --- | |
681 # SUBTAG2_1 | |
682 # SUBTAG2_2 | |
683 #.... | |
684 # und erzeugt daraus eine entsprechende Liste von Entries | |
0 | 685 def getEntriesFromTxt(self,txt): |
27 | 686 |
0 | 687 apps=[] |
688 lines=txt.split("\n"); | |
689 level=False | |
690 for line in lines: | |
691 line=line.rstrip().lstrip() | |
692 if line=="": | |
693 continue | |
694 if line=="---": | |
695 | |
696 if level: | |
697 level=False | |
698 else: | |
699 level=True | |
700 else: | |
701 if not level: | |
702 entry=Entry(line,[]) | |
703 apps.append(entry) | |
704 else: | |
705 entry.entries.append(Entry(line)) | |
706 | |
707 return apps[0:] | |
708 | |
709 def getApproaches(self): | |
710 | |
711 self.tagList=self.getEntriesFromTxt(self.approachesTxt) | |
712 return self.tagList | |
713 | |
2 | 714 |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
715 def getTagsAsHash(self,projectID,tagType=None): |
36 | 716 """get all tags as hash or None if no tag exists""" |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
717 retHash={} |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
718 |
36 | 719 tagCnt=0 |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
720 tags = getattr(self,"tags",None) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
721 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
722 if tags is None: |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
723 return; |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
724 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
725 #falls nicht gesetzt |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
726 if tagType is None: |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
727 tagTypes = tags.keys() |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
728 else: |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
729 tagTypes = [tagType] |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
730 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
731 for tagType in tagTypes: |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
732 retHash[tagType]=[] |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
733 tagsStored=tags.get(tagType,None) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
734 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
735 if tagsStored is None: |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
736 return; |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
737 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
738 for tag in tagsStored.keys(): #gehe durch alle gespeichteren approached |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
739 logging.debug("checking:"+tag) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
740 currentTag = tagsStored.get(tag,None) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
741 if currentTag is None: |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
742 continue |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
743 if currentTag.has_key(projectID): |
36 | 744 tagCnt+=1 |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
745 retHash[tagType].append("""%s"""%tag) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
746 |
36 | 747 if tagCnt==0: |
748 return None | |
749 | |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
750 return retHash |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
751 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
752 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
753 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
754 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
755 |
0 | 756 def getTagsJSON(self,projectID,tagType,RESPONSE=None): |
757 """get all selected tagList""" | |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
758 #logging.debug("asking:"+projectID) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
759 #logging.debug("asking tag::"+tagType) |
0 | 760 retList=[] |
761 tags = getattr(self,"tags",None) | |
762 if tags is None: | |
763 return; | |
764 | |
765 tagsStored=tags.get(tagType,None) | |
766 if tagsStored is None: | |
767 return; | |
768 | |
769 for tag in tagsStored.keys(): #gehe durch alle gespeichteren approached | |
770 logging.debug("checking:"+tag) | |
771 currentTag = tagsStored.get(tag,None) | |
772 if currentTag is None: | |
773 continue | |
774 if currentTag.has_key(projectID): | |
775 retList.append(""" "%s" """%tag) | |
776 | |
777 if RESPONSE: | |
778 RESPONSE.setHeader('Content-Type', "application/json") | |
779 | |
780 logging.debug(retList) | |
781 return "["+",".join(retList)+"]" | |
782 | |
21 | 783 |
784 | |
785 | |
25 | 786 def getTags(self,projectID,projectTags,RESPONSE=None): |
21 | 787 """get all selected tagList""" |
788 | |
25 | 789 #projectTags = self.getProjectsAndTags() |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
790 #logging.debug(projectTags) |
21 | 791 |
25 | 792 project = projectTags.get(projectID) |
793 if project is None: | |
794 project = projectTags.get("/en/research/projects/"+projectID) #TODO fix this projectTag list from getProjectsAndTags()contains fullpath | |
795 if project is None: | |
796 return [] | |
797 retarray=[] | |
21 | 798 for tagType in self.tags.keys(): |
25 | 799 tags = project.tags.get(tagType,['']) |
800 retarray.append(self.utf8ify(";".join(tags))) | |
21 | 801 |
802 | |
25 | 803 return retarray |
804 # logging.debug("asking:"+projectID) | |
805 # | |
806 # | |
807 # apps = self.getApproaches()+ self.getDisciplines(); | |
808 # retList=[] | |
809 # for tagType in self.tags.keys(): | |
810 # | |
811 # logging.debug("asking tag::"+repr(tagType)) | |
812 # | |
813 # tags = getattr(self,"tags",None) | |
814 # if tags is None: | |
815 # continue; | |
816 # | |
817 # tagsStored=tags.get(tagType,None) | |
818 # if tagsStored is None: | |
819 # continue; | |
820 # | |
821 # for tag in tagsStored.keys(): #gehe durch alle gespeichteren approached | |
822 # logging.debug("checking:"+tag) | |
823 # currentTag = tagsStored.get(tag,None) | |
824 # if currentTag is None: | |
825 # continue | |
826 # if currentTag.has_key(projectID): | |
827 # retList.append(""" "%s" """%tag) | |
828 # | |
829 # if RESPONSE: | |
830 # RESPONSE.setHeader('Content-Type', "application/json") | |
831 # | |
832 # logging.debug(retList) | |
833 # return retList | |
21 | 834 |
0 | 835 def getDisciplines(self): |
836 | |
837 self.disciplines=self.getEntriesFromTxt(self.disciplinesTxt) | |
838 return self.disciplines | |
839 | |
840 | |
841 def getObjectsJSON(self,term="",RESPONSE=None): | |
842 """ get all stored objects as json list starting with term""" | |
843 term=term.lower(); | |
844 logging.debug("Asking:"+term) | |
845 #objectList=["baus","berg","lurg"] | |
846 objects = self.objects2Projects; | |
847 | |
848 objectList= [x for x in objects.keys()] | |
849 | |
850 logging.debug("Create:"+repr(objectList)) | |
851 retList=[] | |
852 for object in objectList: | |
853 if object.find(term)>-1: | |
854 retList.append(""" "%s" """%object) | |
855 ret="[" | |
856 ret+=",".join(retList) | |
857 ret+="]" | |
858 logging.debug("Objects:"+ret) | |
859 if RESPONSE: | |
860 RESPONSE.setHeader('Content-Type', "application/json") | |
861 return ret | |
862 | |
863 | |
864 def getHistoricalPlacesJSON(self,term="",RESPONSE=None): | |
865 """ get all stored historicalPlaces as json list starting with term""" | |
866 term=term.lower(); | |
867 logging.debug("Asking:"+term) | |
868 #historicalPlaceList=["baus","berg","lurg"] | |
869 historicalPlaces = self.historicalPlaces2Projects; | |
870 | |
871 historicalPlaceList= [x for x in historicalPlaces.keys()] | |
872 | |
873 logging.debug("Create:"+repr(historicalPlaceList)) | |
874 retList=[] | |
875 for historicalPlace in historicalPlaceList: | |
876 if historicalPlace.find(term)>-1: | |
877 retList.append(""" "%s" """%historicalPlace) | |
878 ret="[" | |
879 ret+=",".join(retList) | |
880 ret+="]" | |
881 logging.debug("historicalPlaces:"+ret) | |
882 if RESPONSE: | |
883 RESPONSE.setHeader('Content-Type', "application/json") | |
884 return ret | |
885 | |
886 | |
887 def getPeriods(self): | |
888 | |
889 self.periodes=self.getEntriesFromTxt(self.periodsTxt) | |
890 return self.periodes | |
891 | |
892 def getSpaces(self): | |
893 | |
894 self.spaces=self.getEntriesFromTxt(self.spacesTxt) | |
895 return self.spaces | |
896 | |
897 def getTechnologies(self): | |
898 | |
899 self.technologies=self.getEntriesFromTxt(self.technologiesTxt) | |
900 return self.technologies | |
901 | |
902 def getKnowledgeTransfers(self): | |
903 | |
904 self.knowledgeTransfers=self.getEntriesFromTxt(self.knowledgeTransfersTxt) | |
905 return self.knowledgeTransfers | |
906 | |
907 | |
908 def getObjectsFromProject(self,projectID): | |
909 return self.getFromProject(self.projectObjects,projectID); | |
910 | |
911 def getHistoricalPlacesFromProject(self,projectID): | |
912 return self.getFromProject(self.projectHistoricalPlaces,projectID); | |
913 | |
914 def getSuggestedTagsFromProject(self,projectID): | |
915 return self.getFromProject(self.projectSuggestedTags,projectID); | |
916 | |
917 | |
918 def getPersonsFromProject(self,projectID): | |
5 | 919 #hole alle personenID die zu einem Projekt gehoeren. |
920 #zurueckgegeben wird ein OOSet() | |
0 | 921 return self.getFromProject(self.projectPersons,projectID); |
922 | |
5 | 923 def getFromProject(self,objects,projectID): |
924 #holt die zu projectID gehoerigen objekte aus dem objects-set. | |
925 #oder legt einen neuen leeren Satz zu dieser ProjektID an. | |
926 #zuruecgegeben wird ein OOSet() | |
927 if objects.has_key(projectID): #wenn zu der ProjektID schon etwas abgespeichter ist, gieb es zurueck | |
0 | 928 logging.debug("key exists:"+projectID) |
929 persons=objects.get(projectID); | |
5 | 930 else: # andernfalls lege einen neuen Satz an. |
0 | 931 persons=OOSet() |
932 objects.update({projectID:persons}) | |
933 logging.debug("key does not exists:"+projectID) | |
934 | |
935 | |
936 return persons | |
937 | |
938 def getHistoricalPlacesFromProjectAsHTML(self,projectID): | |
939 """gertobjects""" | |
940 return self.getFromProjectAsHTML(self.projectHistoricalPlaces, projectID, "HistoricalPlace"); | |
941 | |
942 def getObjectsFromProjectAsHTML(self,projectID): | |
943 """gertobjects""" | |
944 return self.getFromProjectAsHTML(self.projectObjects, projectID, "Object"); | |
945 | |
946 def getPersonsFromProjectAsHTML(self,projectID): | |
947 """getpersons""" | |
948 return self.getFromProjectAsHTML(self.projectPersons, projectID, "Person"); | |
949 | |
950 | |
951 def getFromProjectAsHTML(self,objects,projectID,type): | |
952 """getpersons""" | |
953 ret="" | |
954 if objects.has_key(projectID): | |
955 persons=objects.get(projectID); | |
956 else: | |
957 persons=OOSet() | |
958 | |
959 | |
960 for person in persons: | |
961 ret+="""<div class="removeButton"> | |
962 <span>%s </span><div style="display:inline" class="remove%s"><span style="display:none" class="removeValue">%s</span>remove</div> | |
963 </div>"""%(person[1],type,person[0]) | |
964 | |
965 | |
966 # ret+="""<div> | |
967 # <input type="checkbox" name="persons_remove" | |
968 # value="%s"> | |
969 # <span>%s</span> | |
970 # </div>"""%(person[0],person[1]) | |
971 # | |
972 logging.debug(type+":"+ret) | |
973 return ret | |
974 | |
2 | 975 security.declareProtected('View management screens','removeHistoricalPlaceFromProject') |
0 | 976 def removeHistoricalPlaceFromProject(self,projectID,value): |
977 """remove""" | |
978 logging.debug("removeHP:"+projectID+":"+value); | |
979 | |
980 HistoricalPlaces = self.getHistoricalPlacesFromProject(projectID) | |
981 for HistoricalPlace in HistoricalPlaces.keys(): | |
982 | |
983 logging.debug("trying:"+repr(HistoricalPlace[0])+"::"+repr(value)+"__") | |
984 if HistoricalPlace[0]==value: | |
985 logging.debug("---removed!") | |
986 HistoricalPlaces.remove(HistoricalPlace) | |
987 | |
988 self.projectHistoricalPlaces.update({projectID:HistoricalPlaces}) | |
989 retstring = self.getHistoricalPlacesFromProjectAsHTML(projectID) | |
990 logging.debug(retstring) | |
991 return retstring | |
992 | |
2 | 993 security.declareProtected('View management screens','removeObjectFromProject') |
0 | 994 def removeObjectFromProject(self,projectID,value): |
995 """remove""" | |
996 logging.debug("remove:"+projectID+":"+value); | |
997 | |
15 | 998 |
999 self.storeChange("removeObject",projectID,value) | |
1000 | |
0 | 1001 objects = self.getObjectsFromProject(projectID) |
1002 for object in objects.keys(): | |
1003 | |
1004 logging.debug("trying:"+repr(object[0])+"::"+repr(value)+"__") | |
1005 if object[0]==value: | |
1006 logging.debug("---removed!") | |
1007 objects.remove(object) | |
1008 | |
15 | 1009 #now also delete the project from the object. |
1010 objectsOfPerson=self.objects2Projects.get(object[0]) | |
1011 | |
1012 | |
1013 if projectID in list(objectsOfPerson): | |
1014 objectsOfPerson.remove(projectID) | |
1015 #self.persons2Projects.update({person:projectsList}) | |
1016 if (len(objectsOfPerson)==0): #loesche person aus der liste wenn keine Projekte dazu existieren. | |
1017 del self.objects2Projects[object[0]] | |
1018 | |
0 | 1019 self.projectObjects.update({projectID:objects}) |
1020 retstring = self.getObjectsFromProjectAsHTML(projectID) | |
1021 logging.debug(retstring) | |
1022 return retstring | |
1023 | |
2 | 1024 security.declareProtected('View management screens','removePersonFromProject') |
0 | 1025 def removePersonFromProject(self,projectID,value): |
5 | 1026 """remove a person from the projeckt""" |
0 | 1027 logging.debug("remove:"+projectID+":"+value); |
15 | 1028 self.storeChange("removePerson",projectID,value) |
0 | 1029 |
5 | 1030 persons = self.getPersonsFromProject(projectID) # hole alle personen die mit dem Projekt verbunden sind. |
0 | 1031 for person in persons.keys(): |
1032 | |
1033 logging.debug("trying:"+repr(person[0])+"::"+repr(value)+"__") | |
5 | 1034 if person[0]==value:#person ist die zuloeschende, dann raus damit |
1035 | |
0 | 1036 logging.debug("---removed!") |
1037 persons.remove(person) | |
5 | 1038 |
1039 #now also delete the project from the person. | |
1040 projectsOfPerson=self.persons2Projects.get(person[0]) | |
1041 logging.debug(projectsOfPerson) | |
1042 if projectID in list(projectsOfPerson): | |
1043 projectsOfPerson.remove(projectID) | |
1044 #self.persons2Projects.update({person:projectsList}) | |
1045 if (len(projectsOfPerson)==0): #loesche person aus der liste wenn keine Projekte dazu existieren. | |
1046 del self.persons2Projects[person[0]] | |
1047 | |
1048 | |
1049 #self.projectPersons.update({projectID:persons}) | |
0 | 1050 retstring = self.getPersonsFromProjectAsHTML(projectID) |
1051 logging.debug(retstring) | |
1052 return retstring | |
1053 | |
10 | 1054 |
1055 #fuegt die neue Person zur personIDtoNames hinzu, fuer die spaetere Anzeige in der Personenliste | |
0 | 1056 def addNameTOPersonIDNames(self,personID,label): |
1057 personName = self.personIDtoNames.get(personID) | |
1058 if personName==None: # Anlegen falls noch nicht existent | |
1059 personName=(label,[]) | |
1060 else: | |
1061 if (not label in personName[1]) and (not label==personName[0]): # hinzufuegen falls der neuen name noch nicht als bezeichnugn fuer personID eingetragen ist | |
1062 personName[1].append(label) | |
1063 | |
1064 self.personIDtoNames.update({personID:personName}) | |
1065 | |
2 | 1066 security.declareProtected('View management screens','addPersonToProject') |
0 | 1067 def addPersonToProject(self,projectID,value,label): |
1068 """ add a person so the project""" | |
15 | 1069 self.storeChange("addPerson",projectID,value+":"+label) |
1070 | |
0 | 1071 persons=self.getPersonsFromProject(projectID); |
1072 | |
1073 logging.debug("adding:"+projectID+":"+value+":"+label); | |
1074 | |
1075 persons.insert([value,label]) | |
1076 self.projectPersons.update({projectID:persons}) | |
1077 | |
1078 for personTuple in persons: | |
1079 #hole die abgespeicherten Projekte zu einer Person | |
1080 person=personTuple[0] #hole die ID | |
1081 | |
1082 | |
1083 if getattr(self,"persons2Projects",None)==None: | |
1084 setattr(self,"persons2Projects",OOBTree()) | |
1085 | |
1086 projects = self.persons2Projects.get(person,None) | |
7 | 1087 logging.debug("found projects:"+ repr(projects)) |
1088 if projects is None: #person hatte noch keine projekte | |
0 | 1089 projects=OOSet(); |
5 | 1090 |
0 | 1091 projects.insert(projectID ) |
1092 logging.debug("update:"+person) | |
1093 self.persons2Projects.update({person:projects}) | |
7 | 1094 |
1095 self.addPersonAndFirstNameFromTripleStore(person) | |
1096 self.generateSortingOrderForPersonIDs(); | |
1097 | |
0 | 1098 self.addNameTOPersonIDNames(value,label) |
1099 retstring = self.getPersonsFromProjectAsHTML(projectID) | |
1100 logging.debug(retstring) | |
1101 transaction.commit() | |
1102 return retstring | |
1103 | |
7 | 1104 |
1105 | |
1106 def rearangePersonIDsHTML(self,REQUEST=None): | |
1107 """setze neue ID zu personen""" | |
1108 ret=[] | |
1109 for personID in self.persons2Projects.keys(): | |
1110 logging.debug(personID) | |
1111 | |
1112 masterID,name=self.findMasterIDAndName(personID.rstrip().lstrip()) | |
1113 logging.debug(" masterID -appending") | |
1114 logging.debug(repr(name)) | |
1115 if len(name)==0: | |
1116 name=[''] | |
1117 ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,name)[0])) | |
1118 | |
1119 | |
1120 if REQUEST: | |
1121 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','rearrangePersons.zpt')).__of__(self) | |
8 | 1122 return pt(changeList=ret,lookupUrl=self.PERSONS_LOOKUP_URL,editURL=self.EDIT_URL); |
7 | 1123 else: |
1124 return ret; | |
1125 | |
1126 def rearangePersonIDs(self,REQUEST): | |
1127 """unify a list of persons""" | |
1128 | |
1129 argv=REQUEST.form; | |
1130 logging.debug(repr(argv)) | |
1131 changes=argv['changes'] | |
1132 if isinstance(changes,str): | |
1133 changes=[changes] | |
1134 | |
1135 changeList=self.rearangePersonIDsHTML() | |
1136 personToMaster={} | |
1137 logging.debug("changelist:"+repr(changeList)) | |
1138 #aendere person2project | |
1139 for change in changes: | |
1140 changeItem=changeList[int(change)]; | |
1141 masterID=argv['newID_'+change].lstrip().rstrip() #make sure no spaces | |
1142 personID=changeItem[0] | |
1143 | |
1144 personToMaster[personID]=masterID | |
1145 masterIDProjects = self.persons2Projects.get(masterID,None); | |
1146 if masterIDProjects==None: | |
1147 masterIDProjects=OOSet(); | |
1148 #ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,[''])[0])) | |
1149 | |
1150 oldProjects= self.persons2Projects.get(personID) | |
1151 logging.debug("personID:"+repr(personID)) | |
1152 logging.debug("masterID:"+repr(masterID)) | |
1153 logging.debug("keys:"+repr(self.persons2Projects.keys())) | |
1154 logging.debug("oldProjects:"+repr(oldProjects)) | |
1155 masterIDProjects.update(oldProjects) | |
1156 self.persons2Projects.update({masterID:masterIDProjects}) | |
1157 self.persons2Projects.pop(personID) | |
1158 | |
1159 self.addPersonAndFirstNameFromTripleStore(masterID) #addpersontotiplestore | |
1160 | |
1161 logging.debug("Change:" +personID+":"+ masterID) | |
1162 | |
1163 if personID!=masterID: | |
1164 self.addSameAsRelationToTripleStore(personID,masterID) | |
1165 | |
1166 #aendere nun projectperson | |
1167 logging.debug(personToMaster) | |
1168 for project in self.projectPersons.keys(): | |
1169 personsNew=OOSet() | |
1170 | |
1171 persons=self.projectPersons.get(project) | |
1172 for person in persons: | |
1173 personsNew.insert([personToMaster.get(person[0],person[0]),person[1]]) | |
1174 logging.debug("REPLACE in:"+project+":" +repr(person)+" by "+ repr(personToMaster.get(person[0],person[0]))) | |
1175 self.projectPersons.update({project:personsNew}) | |
1176 | |
1177 self.generateSortingOrderForPersonIDs(); #now sort the new names | |
1178 return personToMaster | |
1179 #fuehre personen zusammen die ueber owl:sameAs verbunden sind | |
1180 def getUnifyPersonsList(self,REQUEST=None): | |
1181 """vereinheitlichung der personen auf eine ID aus der GND, wenn moeglich""" | |
1182 ret=[] | |
1183 for personID in self.persons2Projects.keys(): | |
1184 masterID,name=self.findMasterIDAndName(personID) | |
1185 logging.debug("masterID:"+masterID) | |
1186 if (masterID is not None) and (masterID is not "") and (not personID==masterID): | |
1187 #masterIDProjects = self.persons2Projects.get(masterID,None); | |
1188 ##if masterIDProjects==None: | |
1189 # masterIDProjects=OOSet(); | |
1190 logging.debug(" masterID -appending") | |
1191 logging.debug(repr(name)) | |
1192 | |
1193 | |
1194 ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,name)[0])) | |
1195 #masterIDProjects.update(self.persons2Projects.get(personID)); | |
1196 #self.persons2Projects.update({masterID:masterIDProjects}); | |
1197 | |
1198 | |
1199 if REQUEST: | |
1200 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','unifyPersons.zpt')).__of__(self) | |
1201 return pt(changeList=ret); | |
1202 | |
1203 else: | |
1204 return ret; | |
1205 | |
1206 def unifyPersons(self,changes,REQUEST=None): | |
1207 """unify a list of persons""" | |
1208 | |
1209 if isinstance(changes,str): | |
1210 changes=[changes] | |
1211 | |
1212 changeList=self.getUnifyPersonsList(); | |
1213 personToMaster={} | |
1214 logging.debug("changelist:"+repr(changeList)) | |
1215 #aendere person2project | |
1216 for change in changes: | |
1217 changeItem=changeList[int(change)]; | |
1218 masterID=changeItem[2] | |
1219 personID=changeItem[0] | |
1220 | |
1221 personToMaster[personID]=masterID | |
1222 masterIDProjects = self.persons2Projects.get(masterID,None); | |
1223 if masterIDProjects==None: | |
1224 masterIDProjects=OOSet(); | |
1225 #ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,[''])[0])) | |
1226 | |
1227 oldProjects= self.persons2Projects.get(personID) | |
1228 logging.debug("personID:"+repr(personID)) | |
1229 logging.debug("masterID:"+repr(masterID)) | |
1230 logging.debug("keys:"+repr(self.persons2Projects.keys())) | |
1231 logging.debug("oldProjects:"+repr(oldProjects)) | |
1232 masterIDProjects.update(oldProjects) | |
1233 self.persons2Projects.update({masterID:masterIDProjects}) | |
1234 self.persons2Projects.pop(personID) | |
1235 | |
1236 self.addPersonAndFirstNameFromTripleStore(masterID) #addpersontotiplestore | |
1237 | |
1238 logging.debug("Change:" +personID+":"+ masterID) | |
1239 | |
1240 #aendere nun projectperson | |
1241 logging.debug(personToMaster) | |
1242 for project in self.projectPersons.keys(): | |
1243 personsNew=OOSet() | |
1244 | |
1245 persons=self.projectPersons.get(project) | |
1246 for person in persons: | |
1247 personsNew.insert([personToMaster.get(person[0],person[0]),person[1]]) | |
1248 logging.debug("REPLACE in:"+project+":" +repr(person)+" by "+ repr(personToMaster.get(person[0],person[0]))) | |
1249 self.projectPersons.update({project:personsNew}) | |
1250 | |
1251 self.generateSortingOrderForPersonIDs(); #now sort the new names | |
1252 return personToMaster | |
1253 | |
1254 | |
1255 | |
1256 def findMasterIDAndName(self,ressourceID): | |
1257 queryString="""select * | |
1258 FROM <file://mpiwg_persons_dnb.rdf> | |
1259 FROM <file://mpiwg_persons_2.rdf> | |
1260 FROM <file:///GND.rdf> | |
1261 FROM <http://identifiedNames> | |
1262 where { | |
1263 ?person <http://www.w3.org/2002/07/owl#sameAs> <%s>. | |
1264 | |
1265 ?ident <http://ontologies.mpiwg-berlin.mpg.de/authorities/namedIdentities/identifies_NamedEntity> ?person. | |
1266 ?gnd crm:P1_is_identified_by ?ident. | |
1267 | |
1268 ?gnd <http://RDVocab.info/ElementsGr2/dateOfBirth> ?birthDate. | |
1269 ?gnd <http://RDVocab.info/ElementsGr2/dateOfDeath> ?deathDate. | |
1270 ?person <http://xmlns.com/foaf/0.1/name> ?name. | |
1271 ?person <http://xmlns.com/foaf/0.1/lastName> ?lastName. | |
1272 ?person <http://xmlns.com/foaf/0.1/firstName> ?firstName. | |
1273 } | |
1274 """%ressourceID | |
1275 entries = self.callSparqlAll(queryString); | |
1276 if len(entries)>0: | |
1277 return entries[0][0],entries[0][5:8] #nur den ersten Treffer und nur die personID | |
1278 | |
1279 | |
1280 return None,None | |
1281 | |
9 | 1282 security.declareProtected('View','getPersonsWithProjectIDs') |
5 | 1283 def getPersonsWithProjectIDs(self,check=False): |
0 | 1284 """holt die getaggted Personen mit Projekten""" |
1285 persons = self.persons2Projects; | |
1286 ret={} | |
4 | 1287 |
0 | 1288 logging.debug("Check Person:"+repr(persons.keys())) |
4 | 1289 personsList=[x for x in persons.keys()] |
1290 | |
1291 def sort(x,y): | |
7 | 1292 try: |
1293 sortNrx=self.personsIDForSort.index(x) | |
1294 except: | |
1295 logging.warn("couldn't find personsIDForSort:"+x) | |
1296 sortNrx=0 | |
1297 | |
1298 try: | |
1299 sortNry=self.personsIDForSort.index(y) | |
1300 except: | |
1301 logging.warn("couldn't find personsIDForSort:"+y) | |
1302 sortNry=0 | |
4 | 1303 #logging.debug("INSORT***") |
1304 #logging.debug((sortNrx,sortNry)) | |
1305 return cmp(sortNrx,sortNry) | |
1306 | |
1307 logging.debug("SORT***") | |
1308 logging.debug(self.personsIDForSort) | |
1309 logging.debug("SORT.list") | |
1310 logging.debug(personsList) | |
1311 personsList.sort(cmp=sort) | |
1312 #for person in persons.keys(): | |
1313 logging.debug("AFTERSORT***") | |
1314 logging.debug(personsList) | |
1315 for person in personsList: | |
0 | 1316 logging.debug("Check:"+person) |
4 | 1317 #TODO: person muss duch den namen von provider geholt werden |
5 | 1318 retlist=[] |
1319 projectsList=persons.get(person) | |
7 | 1320 if projectsList is None: |
1321 projectsList=[] | |
5 | 1322 for projectID in list(projectsList): #list notwendig da projectList in der folgenden iteration veraendert wird. |
1323 if check: #teste ob im Projekt noch ein Verweis auf den Namen steht | |
1324 #sollte eigentlich nicht sein. | |
1325 personsProjects=self.getPersonsFromProject(projectID) | |
1326 logging.debug("persons check mode") | |
1327 personsProjectsCheck=[x[0] for x in personsProjects] | |
1328 if not person in personsProjectsCheck: #falls es so ist korrigiere die Projektliste der Person | |
1329 #loesche die person von projectListe | |
1330 projectsList.remove(projectID) | |
1331 persons.update({person:projectsList}) | |
1332 | |
1333 retlist.append(self.getProjectDetails(projectID)) | |
1334 | |
1335 if check and (len(projectsList)==0): #loesche person aus der liste wenn keine Projekte dazu existieren. | |
1336 del persons[person] | |
1337 | |
1338 ret[person]=retlist[0:] | |
4 | 1339 |
1340 logging.debug("AFTERSORT-ret***") | |
1341 logging.debug(ret.keys()) | |
1342 return ret,personsList | |
0 | 1343 |
1344 def getHistoricalPlacesWithProjectIDs(self): | |
1345 """holt die getaggted Personen mit Projekten""" | |
1346 HistoricalPlaces = self.HistoricalPlaces2Projects; | |
1347 ret={} | |
1348 logging.debug("Check HistoricalPlace:"+repr(HistoricalPlaces.keys())) | |
1349 for HistoricalPlace in HistoricalPlaces.keys(): | |
1350 logging.debug("Check:"+HistoricalPlace) | |
1351 #TODO: HistoricalPlace muss duch den namen von provuder geholt werden | |
1352 list=[] | |
1353 for projectID in HistoricalPlaces.get(HistoricalPlace): | |
1354 list.append(self.getProjectDetails(projectID)) | |
1355 | |
1356 ret[HistoricalPlace]=list[0:] | |
1357 return ret | |
1358 | |
12 | 1359 def getObjectsWithProjectIDsSortedkeys(self): |
1360 | |
1361 def sortF(x,y): | |
1362 return cmp(x.lower(),y.lower()) | |
1363 keys = [x for x in self.getObjectsWithProjectIDs().keys()] | |
1364 keys.sort(sortF) | |
1365 return keys | |
1366 | |
0 | 1367 def getObjectsWithProjectIDs(self): |
15 | 1368 """holt die getagten Personen mit Projekten""" |
0 | 1369 objects = self.objects2Projects; |
1370 ret={} | |
1371 logging.debug("Check Object:"+repr(objects.keys())) | |
1372 for object in objects.keys(): | |
1373 logging.debug("Check:"+object) | |
1374 #TODO: object muss duch den namen von provuder geholt werden | |
1375 list=[] | |
1376 for projectID in objects.get(object): | |
1377 list.append(self.getProjectDetails(projectID)) | |
1378 | |
1379 ret[object]=list[0:] | |
28 | 1380 |
1381 logging.debug(ret) | |
0 | 1382 return ret |
1383 | |
2 | 1384 security.declareProtected('View management screens','listAllSuggestedTags') |
0 | 1385 def listAllSuggestedTags(self): |
1386 """list all tags""" | |
1387 ret="<html><body>" | |
1388 for projectID in self.projectSuggestedTags: | |
1389 ret+="<h3>"+projectID+"</h3><table>" | |
1390 for tags in self.projectSuggestedTags.get(projectID): | |
1391 ret+="<tr><td>"+tags[0]+"</td><td>"+tags[1].type+"</td><td>"+tags[1].comment+"</td><td>"+tags[1].userName+"</td></tr>" | |
1392 ret+="</table>" | |
1393 ret+="</body></html>" | |
1394 logging.debug(ret); | |
1395 return ret | |
2 | 1396 |
1397 security.declareProtected('View management screens','suggestTag') | |
0 | 1398 def suggestTag(self,projectID,tagName,tagComment,tagType,tagUserName): |
1399 """suggest a new tag""" | |
1400 """ add a person so the project""" | |
1401 SuggestedTags=self.getSuggestedTagsFromProject(projectID); | |
1402 | |
1403 logging.debug("suggested:"+projectID+":"+tagName); | |
1404 | |
1405 | |
1406 #TODO: Im moment noch keine Zuordnung zu einer ID. | |
1407 newTag = SuggestedTag(tagName,tagComment,tagType,tagUserName) | |
1408 SuggestedTags.insert([tagName,newTag]) | |
1409 self.projectSuggestedTags.update({projectID:SuggestedTags}) | |
1410 | |
1411 | |
1412 | |
1413 for SuggestedTagTuple in SuggestedTags: | |
1414 #hole die abgespeicherten Projekte zu einer Person | |
1415 person=SuggestedTagTuple[0] #hile die ID | |
1416 | |
1417 | |
1418 if getattr(self,"SuggestedTags2Projects",None)==None: | |
1419 setattr(self,"SuggestedTags2Projects",OOBTree()) | |
1420 | |
1421 projects = self.SuggestedTags2Projects.get(person,None) | |
1422 | |
1423 if projects==None: | |
1424 projects=OOSet(); | |
1425 | |
1426 projects.insert(projectID ) | |
1427 logging.debug("update:"+person) | |
1428 self.SuggestedTags2Projects.update({person:projects}) | |
1429 | |
1430 | |
1431 | |
1432 #retstring = self.getSuggestedTagsFromProjectAsHTML(projectID) | |
1433 #logging.debug(retstring) | |
1434 | |
1435 | |
1436 | |
1437 #return retstring | |
1438 | |
2 | 1439 security.declareProtected('View management screens','addHistoricalPlaceToProject') |
0 | 1440 def addHistoricalPlaceToProject(self,projectID,value): |
1441 """ add a person so the project""" | |
1442 HistoricalPlaces=self.getHistoricalPlacesFromProject(projectID); | |
1443 | |
1444 logging.debug("adding:"+projectID+":"+value); | |
1445 | |
1446 | |
1447 #TODO: Im moment noch keine Zuordnung zu einer ID. | |
1448 HistoricalPlaces.insert([value,value]) | |
1449 self.projectHistoricalPlaces.update({projectID:HistoricalPlaces}) | |
1450 | |
1451 | |
1452 | |
1453 for HistoricalPlaceTuple in HistoricalPlaces: | |
1454 #hole die abgespeicherten Projekte zu einer Person | |
1455 person=HistoricalPlaceTuple[0] #hile die ID | |
1456 | |
1457 | |
1458 if getattr(self,"HistoricalPlaces2Projects",None)==None: | |
1459 setattr(self,"HistoricalPlaces2Projects",OOBTree()) | |
1460 | |
1461 projects = self.HistoricalPlaces2Projects.get(person,None) | |
1462 | |
1463 if projects==None: | |
1464 projects=OOSet(); | |
1465 | |
1466 projects.insert(projectID ) | |
1467 logging.debug("update:"+person) | |
1468 self.HistoricalPlaces2Projects.update({person:projects}) | |
1469 | |
1470 | |
1471 | |
1472 retstring = self.getHistoricalPlacesFromProjectAsHTML(projectID) | |
1473 logging.debug(retstring) | |
1474 | |
1475 | |
1476 | |
1477 return retstring | |
1478 | |
2 | 1479 security.declareProtected('View management screens','addObjectToProject') |
0 | 1480 def addObjectToProject(self,projectID,value): |
1481 """ add a person so the project""" | |
1482 objects=self.getObjectsFromProject(projectID); | |
1483 | |
1484 logging.debug("adding:"+projectID+":"+value); | |
1485 | |
15 | 1486 self.storeChange("addObject",projectID,value) |
0 | 1487 |
1488 #TODO: Im moment noch keine Zuordnung zu einer ID. | |
1489 objects.insert([value,value]) | |
1490 self.projectObjects.update({projectID:objects}) | |
1491 | |
1492 | |
1493 | |
1494 for objectTuple in objects: | |
1495 #hole die abgespeicherten Projekte zu einer Person | |
1496 person=objectTuple[0] #hile die ID | |
1497 | |
1498 | |
1499 if getattr(self,"objects2Projects",None)==None: | |
1500 setattr(self,"objects2Projects",OOBTree()) | |
1501 | |
1502 projects = self.objects2Projects.get(person,None) | |
1503 | |
1504 if projects==None: | |
1505 projects=OOSet(); | |
1506 | |
1507 projects.insert(projectID ) | |
1508 logging.debug("update:"+person) | |
1509 self.objects2Projects.update({person:projects}) | |
1510 | |
1511 | |
1512 | |
1513 retstring = self.getObjectsFromProjectAsHTML(projectID) | |
1514 logging.debug(retstring) | |
1515 | |
1516 | |
1517 | |
1518 return retstring | |
1519 | |
1520 | |
1521 def getProjectsWithTag(self,tagType,tagName): | |
1522 tags = getattr(self,"tags",None) | |
1523 if tags is None: | |
1524 logging.debug("can't find Tags") | |
1525 return [] | |
1526 | |
1527 | |
1528 | |
1529 tagsStored=tags.get(tagType,None) | |
1530 if tagsStored is None: | |
1531 logging.debug("can't find Tag:"+tagType) | |
1532 return [] | |
1533 | |
1534 projects = tagsStored.get(tagName,None) | |
1535 if projects is None: | |
1536 logging.debug("can't find any projects for Tag:"+tagName+"("+tagType+")") | |
1537 return [] | |
1538 | |
1539 ret=[] | |
1540 for project in projects: | |
1541 logging.debug("found:"+project) | |
30 | 1542 proj =self.getProjectDetails(project); |
1543 if proj is not None: | |
1544 ret.append(proj) | |
0 | 1545 |
1546 return ret | |
1547 | |
38 | 1548 def getProjectDetails(self,projectId): |
1549 project=getattr(self.projects,projectId,None) | |
0 | 1550 if project is None: |
38 | 1551 logging.debug("no project!! " +projectId) |
30 | 1552 return None |
0 | 1553 |
38 | 1554 link=projectId |
0 | 1555 |
27 | 1556 title=project.getContent("WEB_title") |
0 | 1557 #persons=project.getPersonKeyList() |
1558 persons=project.getContent('xdata_01') | |
1559 logging.debug("%s %s %s"%(link,title,persons)) | |
28 | 1560 |
1561 thumb = project.getThumbUrl() | |
1562 | |
1563 return link,title,persons,thumb | |
0 | 1564 |
1565 # $.post("addNewPerson",{"projectID": | |
1566 # $('#projectID').val(), | |
1567 # "personName":$("#suggest_newPerson").val(), | |
1568 # "personComment":$("#suggest_newPerson_comment").val()} | |
1569 # | |
1570 # ); | |
1571 # | |
2 | 1572 |
1573 security.declareProtected('View management screens','addAndCreateNewPerson') | |
0 | 1574 def addAndCreateNewPerson(self,projectID,personName,personComment,personUserName): |
1575 """adds anew person to the project which is not in the authority file""" | |
1576 | |
1577 id = random.randint(0, 1000000); | |
1578 idstring="http://ontologies.mpiwg-berlin.mpg.de/tempObjects/person/"+str(id) | |
1579 while self.suggestedPersons.has_key(idstring): | |
1580 id = random.randint(0, 1000000); | |
1581 #idstring="http://ontologies.mpiwg-berlin.mpg.de/tempObjects/person/"+str(id); | |
1582 idstring=self.TEMP_PERSON_NS+str(id); | |
1583 | |
1584 | |
1585 self.suggestedPersons.update({idstring:(personName,personComment,projectID,personUserName)}) | |
1586 self.createTempPersonInVirtuoso(projectID, idstring, personName, personComment) #TODO: add suername to the triplestore | |
1587 return self.addPersonToProject(projectID, idstring, personName); | |
2 | 1588 |
7 | 1589 def addSameAsRelationToTripleStore(self,personID,masterID): |
1590 cmdString ="insert in GRAPH <"+self.virtuosoGraph+"> {" | |
1591 cmdString +="<%s> <http://www.w3.org/2002/07/owl#sameAs> <%s>."%(personID,masterID) | |
1592 cmdString +="<%s> <http://www.w3.org/2002/07/owl#sameAs> <%s>."%(masterID,personID) | |
1593 cmdString+="}" | |
1594 | |
1595 auth_handler = urllib2.HTTPBasicAuthHandler() | |
1596 auth_handler.add_password(realm='sparql', | |
1597 uri=self.virtuosoServer+"/sparql", | |
1598 user=self.virtuosoDAVUser, | |
1599 passwd=self.virtuosoDAVPW) | |
1600 | |
1601 opener = urllib2.build_opener(auth_handler) | |
1602 opener.addheaders = [('Content-Type','application/sparql-query')] | |
1603 | |
1604 logging.debug(cmdString) | |
1605 try: | |
1606 r= opener.open(self.virtuosoServer+"/sparql", urllib.urlencode({'query':cmdString,'default-graph-uri':self.virtuosoGraph,'named-graph-uri':None})) | |
1607 logging.debug(r.read()) | |
1608 except urllib2.URLError, e: | |
1609 logging.error(e.code) | |
1610 logging.error(e.read()) | |
1611 return | |
1612 | |
1613 | |
2 | 1614 security.declareProtected('View management screens','createTempPersonInVirtuoso') |
0 | 1615 def createTempPersonInVirtuoso(self,projectID,personURI, personName,personComment): |
1616 """add a new person to the triple store of tempory persons""" | |
1617 triples=[]; | |
1618 personID="<"+personURI+">" | |
1619 triples.append((personID,"<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>","<http://ontologies.mpiwg-berlin.mpg.de/authorities/namedIdentities/Person>")) | |
1620 triples.append((personID,"<http://erlangen-crm.org/110404/P3_has_note>",'"'+personComment+'"')) | |
1621 triples.append((personID,"<http://xmlns.com/foaf/0.1/name>",'"'+personName+'"')) | |
1622 triples.append((personID,"<http://ontologies.mpiwg-berlin.mpg.de/general/isMentionedOn>","<http://www.mpiwg-berlin.mpg.de/en/research/projects/"+projectID+">")) | |
1623 | |
1624 cmdString ="insert in GRAPH <"+self.virtuosoGraph+"> {" | |
1625 for triple in triples: | |
1626 cmdString+=" ".join(triple)+"." | |
1627 | |
1628 cmdString+="}" | |
1629 | |
1630 auth_handler = urllib2.HTTPBasicAuthHandler() | |
1631 auth_handler.add_password(realm='sparql', | |
1632 uri=self.virtuosoServer+"/sparql", | |
1633 user=self.virtuosoDAVUser, | |
1634 passwd=self.virtuosoDAVPW) | |
1635 | |
1636 opener = urllib2.build_opener(auth_handler) | |
1637 opener.addheaders = [('Content-Type','application/sparql-query')] | |
1638 | |
1639 logging.debug(cmdString) | |
1640 try: | |
1641 r= opener.open(self.virtuosoServer+"/sparql", urllib.urlencode({'query':cmdString,'default-graph-uri':self.virtuosoGraph,'named-graph-uri':None})) | |
1642 logging.debug(r.read()) | |
1643 except urllib2.URLError, e: | |
1644 logging.error(e.code) | |
1645 logging.error(e.read()) | |
1646 return | |
1647 | |
1648 opener2 = urllib2.build_opener() | |
1649 | |
1650 | |
1651 personIDencoded=urllib.quote(personURI,safe="") | |
1652 graphEncoded=urllib.quote(self.additionalNamesGraphURL,safe="") | |
1653 url = self.personproviderURL+"id/"+personIDencoded+"/"+graphEncoded | |
1654 | |
1655 try: | |
1656 request = urllib2.Request(url); | |
1657 request.get_method = lambda : 'PUT' | |
1658 r= opener2.open(request); | |
1659 logging.debug(r.read()) | |
1660 except urllib2.URLError, e: | |
1661 logging.error(e.code) | |
1662 logging.error(e.read()) | |
1663 return | |
1664 | |
1665 | |
1666 | |
1667 return | |
15 | 1668 |
1669 # self.storeChange("removePerson",projectID,value) | |
1670 def storeChange(self,typeString,projectID,value): | |
1671 | |
1672 from time import gmtime,strftime | |
1673 | |
17 | 1674 |
1675 | |
1676 | |
1677 | |
15 | 1678 |
1679 fl = open(self.getLogpath(),"a") | |
1680 person = self.REQUEST.AUTHENTICATED_USER.getId() | |
1681 date = strftime("%Y-%m-%d %H:%M:%S", gmtime()) | |
1682 writeString ="\t".join((date,person,typeString,projectID,value)) | |
1683 fl.write(writeString+"\n") | |
1684 fl.flush() | |
1685 fl.close() | |
0 | 1686 |
17 | 1687 lastChangeInThesaurus = getattr(self,'lastChangeInThesaurus',OOBTree()) |
1688 lastChangeInThesaurus.update({projectID:date}) | |
1689 self.lastChangeInThesaurus=lastChangeInThesaurus | |
1690 | |
0 | 1691 def redirect(RESPONSE,url): |
1692 """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen""" | |
1693 | |
1694 timeStamp=time.time() | |
1695 | |
1696 if url.find("?")>-1: #giebt es schon parameter | |
1697 addStr="&time=%s" | |
1698 else: | |
1699 addStr="?time=%s" | |
1700 | |
1701 RESPONSE.setHeader('Last-Modified',email.Utils.formatdate().split("-")[0]+'GMT') | |
1702 logging.error(email.Utils.formatdate()+' GMT') | |
1703 RESPONSE.redirect(url+addStr%timeStamp) | |
1704 | |
1705 def manage_addMPIWGThesaurusForm(self): | |
1706 """form for adding the project""" | |
1707 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMPIWGThesaurusForm.zpt')).__of__(self) | |
1708 return pt() | |
1709 | |
1710 | |
1711 | |
1712 def manage_addMPIWGThesaurus(self,id,RESPONSE=None): | |
1713 """add it""" | |
1714 newObj=MPIWGThesaurus(id) | |
1715 | |
1716 self._setObject(id,newObj) | |
1717 | |
1718 | |
1719 if RESPONSE is not None: | |
24 | 1720 redirect(RESPONSE,'manage_main') |