Mercurial > hg > MPIWGThesaurus
annotate MPIWGThesaurus.py @ 35:cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
author | dwinter |
---|---|
date | Thu, 24 Oct 2013 14:46:22 +0200 |
parents | 911defd02ff8 |
children | e13200d8d473 |
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): |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
716 """get all tags""" |
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 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
719 tags = getattr(self,"tags",None) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
720 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
721 if tags is None: |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
722 return; |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
723 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
724 #falls nicht gesetzt |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
725 if tagType is None: |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
726 tagTypes = tags.keys() |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
727 else: |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
728 tagTypes = [tagType] |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
729 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
730 for tagType in tagTypes: |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
731 retHash[tagType]=[] |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
732 tagsStored=tags.get(tagType,None) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
733 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
734 if tagsStored is None: |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
735 return; |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
736 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
737 for tag in tagsStored.keys(): #gehe durch alle gespeichteren approached |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
738 logging.debug("checking:"+tag) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
739 currentTag = tagsStored.get(tag,None) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
740 if currentTag is None: |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
741 continue |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
742 if currentTag.has_key(projectID): |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
743 retHash[tagType].append("""%s"""%tag) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
744 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
745 logging.debug(retHash) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
746 return retHash |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
747 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
748 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
749 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
750 |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
751 |
0 | 752 def getTagsJSON(self,projectID,tagType,RESPONSE=None): |
753 """get all selected tagList""" | |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
754 #logging.debug("asking:"+projectID) |
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
755 #logging.debug("asking tag::"+tagType) |
0 | 756 retList=[] |
757 tags = getattr(self,"tags",None) | |
758 if tags is None: | |
759 return; | |
760 | |
761 tagsStored=tags.get(tagType,None) | |
762 if tagsStored is None: | |
763 return; | |
764 | |
765 for tag in tagsStored.keys(): #gehe durch alle gespeichteren approached | |
766 logging.debug("checking:"+tag) | |
767 currentTag = tagsStored.get(tag,None) | |
768 if currentTag is None: | |
769 continue | |
770 if currentTag.has_key(projectID): | |
771 retList.append(""" "%s" """%tag) | |
772 | |
773 if RESPONSE: | |
774 RESPONSE.setHeader('Content-Type', "application/json") | |
775 | |
776 logging.debug(retList) | |
777 return "["+",".join(retList)+"]" | |
778 | |
21 | 779 |
780 | |
781 | |
25 | 782 def getTags(self,projectID,projectTags,RESPONSE=None): |
21 | 783 """get all selected tagList""" |
784 | |
25 | 785 #projectTags = self.getProjectsAndTags() |
35
cfb5bb05253a
direct oeffne des thesaurus mit neuem parameter open
dwinter
parents:
32
diff
changeset
|
786 #logging.debug(projectTags) |
21 | 787 |
25 | 788 project = projectTags.get(projectID) |
789 if project is None: | |
790 project = projectTags.get("/en/research/projects/"+projectID) #TODO fix this projectTag list from getProjectsAndTags()contains fullpath | |
791 if project is None: | |
792 return [] | |
793 retarray=[] | |
21 | 794 for tagType in self.tags.keys(): |
25 | 795 tags = project.tags.get(tagType,['']) |
796 retarray.append(self.utf8ify(";".join(tags))) | |
21 | 797 |
798 | |
25 | 799 return retarray |
800 # logging.debug("asking:"+projectID) | |
801 # | |
802 # | |
803 # apps = self.getApproaches()+ self.getDisciplines(); | |
804 # retList=[] | |
805 # for tagType in self.tags.keys(): | |
806 # | |
807 # logging.debug("asking tag::"+repr(tagType)) | |
808 # | |
809 # tags = getattr(self,"tags",None) | |
810 # if tags is None: | |
811 # continue; | |
812 # | |
813 # tagsStored=tags.get(tagType,None) | |
814 # if tagsStored is None: | |
815 # continue; | |
816 # | |
817 # for tag in tagsStored.keys(): #gehe durch alle gespeichteren approached | |
818 # logging.debug("checking:"+tag) | |
819 # currentTag = tagsStored.get(tag,None) | |
820 # if currentTag is None: | |
821 # continue | |
822 # if currentTag.has_key(projectID): | |
823 # retList.append(""" "%s" """%tag) | |
824 # | |
825 # if RESPONSE: | |
826 # RESPONSE.setHeader('Content-Type', "application/json") | |
827 # | |
828 # logging.debug(retList) | |
829 # return retList | |
21 | 830 |
0 | 831 def getDisciplines(self): |
832 | |
833 self.disciplines=self.getEntriesFromTxt(self.disciplinesTxt) | |
834 return self.disciplines | |
835 | |
836 | |
837 def getObjectsJSON(self,term="",RESPONSE=None): | |
838 """ get all stored objects as json list starting with term""" | |
839 term=term.lower(); | |
840 logging.debug("Asking:"+term) | |
841 #objectList=["baus","berg","lurg"] | |
842 objects = self.objects2Projects; | |
843 | |
844 objectList= [x for x in objects.keys()] | |
845 | |
846 logging.debug("Create:"+repr(objectList)) | |
847 retList=[] | |
848 for object in objectList: | |
849 if object.find(term)>-1: | |
850 retList.append(""" "%s" """%object) | |
851 ret="[" | |
852 ret+=",".join(retList) | |
853 ret+="]" | |
854 logging.debug("Objects:"+ret) | |
855 if RESPONSE: | |
856 RESPONSE.setHeader('Content-Type', "application/json") | |
857 return ret | |
858 | |
859 | |
860 def getHistoricalPlacesJSON(self,term="",RESPONSE=None): | |
861 """ get all stored historicalPlaces as json list starting with term""" | |
862 term=term.lower(); | |
863 logging.debug("Asking:"+term) | |
864 #historicalPlaceList=["baus","berg","lurg"] | |
865 historicalPlaces = self.historicalPlaces2Projects; | |
866 | |
867 historicalPlaceList= [x for x in historicalPlaces.keys()] | |
868 | |
869 logging.debug("Create:"+repr(historicalPlaceList)) | |
870 retList=[] | |
871 for historicalPlace in historicalPlaceList: | |
872 if historicalPlace.find(term)>-1: | |
873 retList.append(""" "%s" """%historicalPlace) | |
874 ret="[" | |
875 ret+=",".join(retList) | |
876 ret+="]" | |
877 logging.debug("historicalPlaces:"+ret) | |
878 if RESPONSE: | |
879 RESPONSE.setHeader('Content-Type', "application/json") | |
880 return ret | |
881 | |
882 | |
883 def getPeriods(self): | |
884 | |
885 self.periodes=self.getEntriesFromTxt(self.periodsTxt) | |
886 return self.periodes | |
887 | |
888 def getSpaces(self): | |
889 | |
890 self.spaces=self.getEntriesFromTxt(self.spacesTxt) | |
891 return self.spaces | |
892 | |
893 def getTechnologies(self): | |
894 | |
895 self.technologies=self.getEntriesFromTxt(self.technologiesTxt) | |
896 return self.technologies | |
897 | |
898 def getKnowledgeTransfers(self): | |
899 | |
900 self.knowledgeTransfers=self.getEntriesFromTxt(self.knowledgeTransfersTxt) | |
901 return self.knowledgeTransfers | |
902 | |
903 | |
904 def getObjectsFromProject(self,projectID): | |
905 return self.getFromProject(self.projectObjects,projectID); | |
906 | |
907 def getHistoricalPlacesFromProject(self,projectID): | |
908 return self.getFromProject(self.projectHistoricalPlaces,projectID); | |
909 | |
910 def getSuggestedTagsFromProject(self,projectID): | |
911 return self.getFromProject(self.projectSuggestedTags,projectID); | |
912 | |
913 | |
914 def getPersonsFromProject(self,projectID): | |
5 | 915 #hole alle personenID die zu einem Projekt gehoeren. |
916 #zurueckgegeben wird ein OOSet() | |
0 | 917 return self.getFromProject(self.projectPersons,projectID); |
918 | |
5 | 919 def getFromProject(self,objects,projectID): |
920 #holt die zu projectID gehoerigen objekte aus dem objects-set. | |
921 #oder legt einen neuen leeren Satz zu dieser ProjektID an. | |
922 #zuruecgegeben wird ein OOSet() | |
923 if objects.has_key(projectID): #wenn zu der ProjektID schon etwas abgespeichter ist, gieb es zurueck | |
0 | 924 logging.debug("key exists:"+projectID) |
925 persons=objects.get(projectID); | |
5 | 926 else: # andernfalls lege einen neuen Satz an. |
0 | 927 persons=OOSet() |
928 objects.update({projectID:persons}) | |
929 logging.debug("key does not exists:"+projectID) | |
930 | |
931 | |
932 return persons | |
933 | |
934 def getHistoricalPlacesFromProjectAsHTML(self,projectID): | |
935 """gertobjects""" | |
936 return self.getFromProjectAsHTML(self.projectHistoricalPlaces, projectID, "HistoricalPlace"); | |
937 | |
938 def getObjectsFromProjectAsHTML(self,projectID): | |
939 """gertobjects""" | |
940 return self.getFromProjectAsHTML(self.projectObjects, projectID, "Object"); | |
941 | |
942 def getPersonsFromProjectAsHTML(self,projectID): | |
943 """getpersons""" | |
944 return self.getFromProjectAsHTML(self.projectPersons, projectID, "Person"); | |
945 | |
946 | |
947 def getFromProjectAsHTML(self,objects,projectID,type): | |
948 """getpersons""" | |
949 ret="" | |
950 if objects.has_key(projectID): | |
951 persons=objects.get(projectID); | |
952 else: | |
953 persons=OOSet() | |
954 | |
955 | |
956 for person in persons: | |
957 ret+="""<div class="removeButton"> | |
958 <span>%s </span><div style="display:inline" class="remove%s"><span style="display:none" class="removeValue">%s</span>remove</div> | |
959 </div>"""%(person[1],type,person[0]) | |
960 | |
961 | |
962 # ret+="""<div> | |
963 # <input type="checkbox" name="persons_remove" | |
964 # value="%s"> | |
965 # <span>%s</span> | |
966 # </div>"""%(person[0],person[1]) | |
967 # | |
968 logging.debug(type+":"+ret) | |
969 return ret | |
970 | |
2 | 971 security.declareProtected('View management screens','removeHistoricalPlaceFromProject') |
0 | 972 def removeHistoricalPlaceFromProject(self,projectID,value): |
973 """remove""" | |
974 logging.debug("removeHP:"+projectID+":"+value); | |
975 | |
976 HistoricalPlaces = self.getHistoricalPlacesFromProject(projectID) | |
977 for HistoricalPlace in HistoricalPlaces.keys(): | |
978 | |
979 logging.debug("trying:"+repr(HistoricalPlace[0])+"::"+repr(value)+"__") | |
980 if HistoricalPlace[0]==value: | |
981 logging.debug("---removed!") | |
982 HistoricalPlaces.remove(HistoricalPlace) | |
983 | |
984 self.projectHistoricalPlaces.update({projectID:HistoricalPlaces}) | |
985 retstring = self.getHistoricalPlacesFromProjectAsHTML(projectID) | |
986 logging.debug(retstring) | |
987 return retstring | |
988 | |
2 | 989 security.declareProtected('View management screens','removeObjectFromProject') |
0 | 990 def removeObjectFromProject(self,projectID,value): |
991 """remove""" | |
992 logging.debug("remove:"+projectID+":"+value); | |
993 | |
15 | 994 |
995 self.storeChange("removeObject",projectID,value) | |
996 | |
0 | 997 objects = self.getObjectsFromProject(projectID) |
998 for object in objects.keys(): | |
999 | |
1000 logging.debug("trying:"+repr(object[0])+"::"+repr(value)+"__") | |
1001 if object[0]==value: | |
1002 logging.debug("---removed!") | |
1003 objects.remove(object) | |
1004 | |
15 | 1005 #now also delete the project from the object. |
1006 objectsOfPerson=self.objects2Projects.get(object[0]) | |
1007 | |
1008 | |
1009 if projectID in list(objectsOfPerson): | |
1010 objectsOfPerson.remove(projectID) | |
1011 #self.persons2Projects.update({person:projectsList}) | |
1012 if (len(objectsOfPerson)==0): #loesche person aus der liste wenn keine Projekte dazu existieren. | |
1013 del self.objects2Projects[object[0]] | |
1014 | |
0 | 1015 self.projectObjects.update({projectID:objects}) |
1016 retstring = self.getObjectsFromProjectAsHTML(projectID) | |
1017 logging.debug(retstring) | |
1018 return retstring | |
1019 | |
2 | 1020 security.declareProtected('View management screens','removePersonFromProject') |
0 | 1021 def removePersonFromProject(self,projectID,value): |
5 | 1022 """remove a person from the projeckt""" |
0 | 1023 logging.debug("remove:"+projectID+":"+value); |
15 | 1024 self.storeChange("removePerson",projectID,value) |
0 | 1025 |
5 | 1026 persons = self.getPersonsFromProject(projectID) # hole alle personen die mit dem Projekt verbunden sind. |
0 | 1027 for person in persons.keys(): |
1028 | |
1029 logging.debug("trying:"+repr(person[0])+"::"+repr(value)+"__") | |
5 | 1030 if person[0]==value:#person ist die zuloeschende, dann raus damit |
1031 | |
0 | 1032 logging.debug("---removed!") |
1033 persons.remove(person) | |
5 | 1034 |
1035 #now also delete the project from the person. | |
1036 projectsOfPerson=self.persons2Projects.get(person[0]) | |
1037 logging.debug(projectsOfPerson) | |
1038 if projectID in list(projectsOfPerson): | |
1039 projectsOfPerson.remove(projectID) | |
1040 #self.persons2Projects.update({person:projectsList}) | |
1041 if (len(projectsOfPerson)==0): #loesche person aus der liste wenn keine Projekte dazu existieren. | |
1042 del self.persons2Projects[person[0]] | |
1043 | |
1044 | |
1045 #self.projectPersons.update({projectID:persons}) | |
0 | 1046 retstring = self.getPersonsFromProjectAsHTML(projectID) |
1047 logging.debug(retstring) | |
1048 return retstring | |
1049 | |
10 | 1050 |
1051 #fuegt die neue Person zur personIDtoNames hinzu, fuer die spaetere Anzeige in der Personenliste | |
0 | 1052 def addNameTOPersonIDNames(self,personID,label): |
1053 personName = self.personIDtoNames.get(personID) | |
1054 if personName==None: # Anlegen falls noch nicht existent | |
1055 personName=(label,[]) | |
1056 else: | |
1057 if (not label in personName[1]) and (not label==personName[0]): # hinzufuegen falls der neuen name noch nicht als bezeichnugn fuer personID eingetragen ist | |
1058 personName[1].append(label) | |
1059 | |
1060 self.personIDtoNames.update({personID:personName}) | |
1061 | |
2 | 1062 security.declareProtected('View management screens','addPersonToProject') |
0 | 1063 def addPersonToProject(self,projectID,value,label): |
1064 """ add a person so the project""" | |
15 | 1065 self.storeChange("addPerson",projectID,value+":"+label) |
1066 | |
0 | 1067 persons=self.getPersonsFromProject(projectID); |
1068 | |
1069 logging.debug("adding:"+projectID+":"+value+":"+label); | |
1070 | |
1071 persons.insert([value,label]) | |
1072 self.projectPersons.update({projectID:persons}) | |
1073 | |
1074 for personTuple in persons: | |
1075 #hole die abgespeicherten Projekte zu einer Person | |
1076 person=personTuple[0] #hole die ID | |
1077 | |
1078 | |
1079 if getattr(self,"persons2Projects",None)==None: | |
1080 setattr(self,"persons2Projects",OOBTree()) | |
1081 | |
1082 projects = self.persons2Projects.get(person,None) | |
7 | 1083 logging.debug("found projects:"+ repr(projects)) |
1084 if projects is None: #person hatte noch keine projekte | |
0 | 1085 projects=OOSet(); |
5 | 1086 |
0 | 1087 projects.insert(projectID ) |
1088 logging.debug("update:"+person) | |
1089 self.persons2Projects.update({person:projects}) | |
7 | 1090 |
1091 self.addPersonAndFirstNameFromTripleStore(person) | |
1092 self.generateSortingOrderForPersonIDs(); | |
1093 | |
0 | 1094 self.addNameTOPersonIDNames(value,label) |
1095 retstring = self.getPersonsFromProjectAsHTML(projectID) | |
1096 logging.debug(retstring) | |
1097 transaction.commit() | |
1098 return retstring | |
1099 | |
7 | 1100 |
1101 | |
1102 def rearangePersonIDsHTML(self,REQUEST=None): | |
1103 """setze neue ID zu personen""" | |
1104 ret=[] | |
1105 for personID in self.persons2Projects.keys(): | |
1106 logging.debug(personID) | |
1107 | |
1108 masterID,name=self.findMasterIDAndName(personID.rstrip().lstrip()) | |
1109 logging.debug(" masterID -appending") | |
1110 logging.debug(repr(name)) | |
1111 if len(name)==0: | |
1112 name=[''] | |
1113 ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,name)[0])) | |
1114 | |
1115 | |
1116 if REQUEST: | |
1117 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','rearrangePersons.zpt')).__of__(self) | |
8 | 1118 return pt(changeList=ret,lookupUrl=self.PERSONS_LOOKUP_URL,editURL=self.EDIT_URL); |
7 | 1119 else: |
1120 return ret; | |
1121 | |
1122 def rearangePersonIDs(self,REQUEST): | |
1123 """unify a list of persons""" | |
1124 | |
1125 argv=REQUEST.form; | |
1126 logging.debug(repr(argv)) | |
1127 changes=argv['changes'] | |
1128 if isinstance(changes,str): | |
1129 changes=[changes] | |
1130 | |
1131 changeList=self.rearangePersonIDsHTML() | |
1132 personToMaster={} | |
1133 logging.debug("changelist:"+repr(changeList)) | |
1134 #aendere person2project | |
1135 for change in changes: | |
1136 changeItem=changeList[int(change)]; | |
1137 masterID=argv['newID_'+change].lstrip().rstrip() #make sure no spaces | |
1138 personID=changeItem[0] | |
1139 | |
1140 personToMaster[personID]=masterID | |
1141 masterIDProjects = self.persons2Projects.get(masterID,None); | |
1142 if masterIDProjects==None: | |
1143 masterIDProjects=OOSet(); | |
1144 #ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,[''])[0])) | |
1145 | |
1146 oldProjects= self.persons2Projects.get(personID) | |
1147 logging.debug("personID:"+repr(personID)) | |
1148 logging.debug("masterID:"+repr(masterID)) | |
1149 logging.debug("keys:"+repr(self.persons2Projects.keys())) | |
1150 logging.debug("oldProjects:"+repr(oldProjects)) | |
1151 masterIDProjects.update(oldProjects) | |
1152 self.persons2Projects.update({masterID:masterIDProjects}) | |
1153 self.persons2Projects.pop(personID) | |
1154 | |
1155 self.addPersonAndFirstNameFromTripleStore(masterID) #addpersontotiplestore | |
1156 | |
1157 logging.debug("Change:" +personID+":"+ masterID) | |
1158 | |
1159 if personID!=masterID: | |
1160 self.addSameAsRelationToTripleStore(personID,masterID) | |
1161 | |
1162 #aendere nun projectperson | |
1163 logging.debug(personToMaster) | |
1164 for project in self.projectPersons.keys(): | |
1165 personsNew=OOSet() | |
1166 | |
1167 persons=self.projectPersons.get(project) | |
1168 for person in persons: | |
1169 personsNew.insert([personToMaster.get(person[0],person[0]),person[1]]) | |
1170 logging.debug("REPLACE in:"+project+":" +repr(person)+" by "+ repr(personToMaster.get(person[0],person[0]))) | |
1171 self.projectPersons.update({project:personsNew}) | |
1172 | |
1173 self.generateSortingOrderForPersonIDs(); #now sort the new names | |
1174 return personToMaster | |
1175 #fuehre personen zusammen die ueber owl:sameAs verbunden sind | |
1176 def getUnifyPersonsList(self,REQUEST=None): | |
1177 """vereinheitlichung der personen auf eine ID aus der GND, wenn moeglich""" | |
1178 ret=[] | |
1179 for personID in self.persons2Projects.keys(): | |
1180 masterID,name=self.findMasterIDAndName(personID) | |
1181 logging.debug("masterID:"+masterID) | |
1182 if (masterID is not None) and (masterID is not "") and (not personID==masterID): | |
1183 #masterIDProjects = self.persons2Projects.get(masterID,None); | |
1184 ##if masterIDProjects==None: | |
1185 # masterIDProjects=OOSet(); | |
1186 logging.debug(" masterID -appending") | |
1187 logging.debug(repr(name)) | |
1188 | |
1189 | |
1190 ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,name)[0])) | |
1191 #masterIDProjects.update(self.persons2Projects.get(personID)); | |
1192 #self.persons2Projects.update({masterID:masterIDProjects}); | |
1193 | |
1194 | |
1195 if REQUEST: | |
1196 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','unifyPersons.zpt')).__of__(self) | |
1197 return pt(changeList=ret); | |
1198 | |
1199 else: | |
1200 return ret; | |
1201 | |
1202 def unifyPersons(self,changes,REQUEST=None): | |
1203 """unify a list of persons""" | |
1204 | |
1205 if isinstance(changes,str): | |
1206 changes=[changes] | |
1207 | |
1208 changeList=self.getUnifyPersonsList(); | |
1209 personToMaster={} | |
1210 logging.debug("changelist:"+repr(changeList)) | |
1211 #aendere person2project | |
1212 for change in changes: | |
1213 changeItem=changeList[int(change)]; | |
1214 masterID=changeItem[2] | |
1215 personID=changeItem[0] | |
1216 | |
1217 personToMaster[personID]=masterID | |
1218 masterIDProjects = self.persons2Projects.get(masterID,None); | |
1219 if masterIDProjects==None: | |
1220 masterIDProjects=OOSet(); | |
1221 #ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,[''])[0])) | |
1222 | |
1223 oldProjects= self.persons2Projects.get(personID) | |
1224 logging.debug("personID:"+repr(personID)) | |
1225 logging.debug("masterID:"+repr(masterID)) | |
1226 logging.debug("keys:"+repr(self.persons2Projects.keys())) | |
1227 logging.debug("oldProjects:"+repr(oldProjects)) | |
1228 masterIDProjects.update(oldProjects) | |
1229 self.persons2Projects.update({masterID:masterIDProjects}) | |
1230 self.persons2Projects.pop(personID) | |
1231 | |
1232 self.addPersonAndFirstNameFromTripleStore(masterID) #addpersontotiplestore | |
1233 | |
1234 logging.debug("Change:" +personID+":"+ masterID) | |
1235 | |
1236 #aendere nun projectperson | |
1237 logging.debug(personToMaster) | |
1238 for project in self.projectPersons.keys(): | |
1239 personsNew=OOSet() | |
1240 | |
1241 persons=self.projectPersons.get(project) | |
1242 for person in persons: | |
1243 personsNew.insert([personToMaster.get(person[0],person[0]),person[1]]) | |
1244 logging.debug("REPLACE in:"+project+":" +repr(person)+" by "+ repr(personToMaster.get(person[0],person[0]))) | |
1245 self.projectPersons.update({project:personsNew}) | |
1246 | |
1247 self.generateSortingOrderForPersonIDs(); #now sort the new names | |
1248 return personToMaster | |
1249 | |
1250 | |
1251 | |
1252 def findMasterIDAndName(self,ressourceID): | |
1253 queryString="""select * | |
1254 FROM <file://mpiwg_persons_dnb.rdf> | |
1255 FROM <file://mpiwg_persons_2.rdf> | |
1256 FROM <file:///GND.rdf> | |
1257 FROM <http://identifiedNames> | |
1258 where { | |
1259 ?person <http://www.w3.org/2002/07/owl#sameAs> <%s>. | |
1260 | |
1261 ?ident <http://ontologies.mpiwg-berlin.mpg.de/authorities/namedIdentities/identifies_NamedEntity> ?person. | |
1262 ?gnd crm:P1_is_identified_by ?ident. | |
1263 | |
1264 ?gnd <http://RDVocab.info/ElementsGr2/dateOfBirth> ?birthDate. | |
1265 ?gnd <http://RDVocab.info/ElementsGr2/dateOfDeath> ?deathDate. | |
1266 ?person <http://xmlns.com/foaf/0.1/name> ?name. | |
1267 ?person <http://xmlns.com/foaf/0.1/lastName> ?lastName. | |
1268 ?person <http://xmlns.com/foaf/0.1/firstName> ?firstName. | |
1269 } | |
1270 """%ressourceID | |
1271 entries = self.callSparqlAll(queryString); | |
1272 if len(entries)>0: | |
1273 return entries[0][0],entries[0][5:8] #nur den ersten Treffer und nur die personID | |
1274 | |
1275 | |
1276 return None,None | |
1277 | |
9 | 1278 security.declareProtected('View','getPersonsWithProjectIDs') |
5 | 1279 def getPersonsWithProjectIDs(self,check=False): |
0 | 1280 """holt die getaggted Personen mit Projekten""" |
1281 persons = self.persons2Projects; | |
1282 ret={} | |
4 | 1283 |
0 | 1284 logging.debug("Check Person:"+repr(persons.keys())) |
4 | 1285 personsList=[x for x in persons.keys()] |
1286 | |
1287 def sort(x,y): | |
7 | 1288 try: |
1289 sortNrx=self.personsIDForSort.index(x) | |
1290 except: | |
1291 logging.warn("couldn't find personsIDForSort:"+x) | |
1292 sortNrx=0 | |
1293 | |
1294 try: | |
1295 sortNry=self.personsIDForSort.index(y) | |
1296 except: | |
1297 logging.warn("couldn't find personsIDForSort:"+y) | |
1298 sortNry=0 | |
4 | 1299 #logging.debug("INSORT***") |
1300 #logging.debug((sortNrx,sortNry)) | |
1301 return cmp(sortNrx,sortNry) | |
1302 | |
1303 logging.debug("SORT***") | |
1304 logging.debug(self.personsIDForSort) | |
1305 logging.debug("SORT.list") | |
1306 logging.debug(personsList) | |
1307 personsList.sort(cmp=sort) | |
1308 #for person in persons.keys(): | |
1309 logging.debug("AFTERSORT***") | |
1310 logging.debug(personsList) | |
1311 for person in personsList: | |
0 | 1312 logging.debug("Check:"+person) |
4 | 1313 #TODO: person muss duch den namen von provider geholt werden |
5 | 1314 retlist=[] |
1315 projectsList=persons.get(person) | |
7 | 1316 if projectsList is None: |
1317 projectsList=[] | |
5 | 1318 for projectID in list(projectsList): #list notwendig da projectList in der folgenden iteration veraendert wird. |
1319 if check: #teste ob im Projekt noch ein Verweis auf den Namen steht | |
1320 #sollte eigentlich nicht sein. | |
1321 personsProjects=self.getPersonsFromProject(projectID) | |
1322 logging.debug("persons check mode") | |
1323 personsProjectsCheck=[x[0] for x in personsProjects] | |
1324 if not person in personsProjectsCheck: #falls es so ist korrigiere die Projektliste der Person | |
1325 #loesche die person von projectListe | |
1326 projectsList.remove(projectID) | |
1327 persons.update({person:projectsList}) | |
1328 | |
1329 retlist.append(self.getProjectDetails(projectID)) | |
1330 | |
1331 if check and (len(projectsList)==0): #loesche person aus der liste wenn keine Projekte dazu existieren. | |
1332 del persons[person] | |
1333 | |
1334 ret[person]=retlist[0:] | |
4 | 1335 |
1336 logging.debug("AFTERSORT-ret***") | |
1337 logging.debug(ret.keys()) | |
1338 return ret,personsList | |
0 | 1339 |
1340 def getHistoricalPlacesWithProjectIDs(self): | |
1341 """holt die getaggted Personen mit Projekten""" | |
1342 HistoricalPlaces = self.HistoricalPlaces2Projects; | |
1343 ret={} | |
1344 logging.debug("Check HistoricalPlace:"+repr(HistoricalPlaces.keys())) | |
1345 for HistoricalPlace in HistoricalPlaces.keys(): | |
1346 logging.debug("Check:"+HistoricalPlace) | |
1347 #TODO: HistoricalPlace muss duch den namen von provuder geholt werden | |
1348 list=[] | |
1349 for projectID in HistoricalPlaces.get(HistoricalPlace): | |
1350 list.append(self.getProjectDetails(projectID)) | |
1351 | |
1352 ret[HistoricalPlace]=list[0:] | |
1353 return ret | |
1354 | |
12 | 1355 def getObjectsWithProjectIDsSortedkeys(self): |
1356 | |
1357 def sortF(x,y): | |
1358 return cmp(x.lower(),y.lower()) | |
1359 keys = [x for x in self.getObjectsWithProjectIDs().keys()] | |
1360 keys.sort(sortF) | |
1361 return keys | |
1362 | |
0 | 1363 def getObjectsWithProjectIDs(self): |
15 | 1364 """holt die getagten Personen mit Projekten""" |
0 | 1365 objects = self.objects2Projects; |
1366 ret={} | |
1367 logging.debug("Check Object:"+repr(objects.keys())) | |
1368 for object in objects.keys(): | |
1369 logging.debug("Check:"+object) | |
1370 #TODO: object muss duch den namen von provuder geholt werden | |
1371 list=[] | |
1372 for projectID in objects.get(object): | |
1373 list.append(self.getProjectDetails(projectID)) | |
1374 | |
1375 ret[object]=list[0:] | |
28 | 1376 |
1377 logging.debug(ret) | |
0 | 1378 return ret |
1379 | |
2 | 1380 security.declareProtected('View management screens','listAllSuggestedTags') |
0 | 1381 def listAllSuggestedTags(self): |
1382 """list all tags""" | |
1383 ret="<html><body>" | |
1384 for projectID in self.projectSuggestedTags: | |
1385 ret+="<h3>"+projectID+"</h3><table>" | |
1386 for tags in self.projectSuggestedTags.get(projectID): | |
1387 ret+="<tr><td>"+tags[0]+"</td><td>"+tags[1].type+"</td><td>"+tags[1].comment+"</td><td>"+tags[1].userName+"</td></tr>" | |
1388 ret+="</table>" | |
1389 ret+="</body></html>" | |
1390 logging.debug(ret); | |
1391 return ret | |
2 | 1392 |
1393 security.declareProtected('View management screens','suggestTag') | |
0 | 1394 def suggestTag(self,projectID,tagName,tagComment,tagType,tagUserName): |
1395 """suggest a new tag""" | |
1396 """ add a person so the project""" | |
1397 SuggestedTags=self.getSuggestedTagsFromProject(projectID); | |
1398 | |
1399 logging.debug("suggested:"+projectID+":"+tagName); | |
1400 | |
1401 | |
1402 #TODO: Im moment noch keine Zuordnung zu einer ID. | |
1403 newTag = SuggestedTag(tagName,tagComment,tagType,tagUserName) | |
1404 SuggestedTags.insert([tagName,newTag]) | |
1405 self.projectSuggestedTags.update({projectID:SuggestedTags}) | |
1406 | |
1407 | |
1408 | |
1409 for SuggestedTagTuple in SuggestedTags: | |
1410 #hole die abgespeicherten Projekte zu einer Person | |
1411 person=SuggestedTagTuple[0] #hile die ID | |
1412 | |
1413 | |
1414 if getattr(self,"SuggestedTags2Projects",None)==None: | |
1415 setattr(self,"SuggestedTags2Projects",OOBTree()) | |
1416 | |
1417 projects = self.SuggestedTags2Projects.get(person,None) | |
1418 | |
1419 if projects==None: | |
1420 projects=OOSet(); | |
1421 | |
1422 projects.insert(projectID ) | |
1423 logging.debug("update:"+person) | |
1424 self.SuggestedTags2Projects.update({person:projects}) | |
1425 | |
1426 | |
1427 | |
1428 #retstring = self.getSuggestedTagsFromProjectAsHTML(projectID) | |
1429 #logging.debug(retstring) | |
1430 | |
1431 | |
1432 | |
1433 #return retstring | |
1434 | |
2 | 1435 security.declareProtected('View management screens','addHistoricalPlaceToProject') |
0 | 1436 def addHistoricalPlaceToProject(self,projectID,value): |
1437 """ add a person so the project""" | |
1438 HistoricalPlaces=self.getHistoricalPlacesFromProject(projectID); | |
1439 | |
1440 logging.debug("adding:"+projectID+":"+value); | |
1441 | |
1442 | |
1443 #TODO: Im moment noch keine Zuordnung zu einer ID. | |
1444 HistoricalPlaces.insert([value,value]) | |
1445 self.projectHistoricalPlaces.update({projectID:HistoricalPlaces}) | |
1446 | |
1447 | |
1448 | |
1449 for HistoricalPlaceTuple in HistoricalPlaces: | |
1450 #hole die abgespeicherten Projekte zu einer Person | |
1451 person=HistoricalPlaceTuple[0] #hile die ID | |
1452 | |
1453 | |
1454 if getattr(self,"HistoricalPlaces2Projects",None)==None: | |
1455 setattr(self,"HistoricalPlaces2Projects",OOBTree()) | |
1456 | |
1457 projects = self.HistoricalPlaces2Projects.get(person,None) | |
1458 | |
1459 if projects==None: | |
1460 projects=OOSet(); | |
1461 | |
1462 projects.insert(projectID ) | |
1463 logging.debug("update:"+person) | |
1464 self.HistoricalPlaces2Projects.update({person:projects}) | |
1465 | |
1466 | |
1467 | |
1468 retstring = self.getHistoricalPlacesFromProjectAsHTML(projectID) | |
1469 logging.debug(retstring) | |
1470 | |
1471 | |
1472 | |
1473 return retstring | |
1474 | |
2 | 1475 security.declareProtected('View management screens','addObjectToProject') |
0 | 1476 def addObjectToProject(self,projectID,value): |
1477 """ add a person so the project""" | |
1478 objects=self.getObjectsFromProject(projectID); | |
1479 | |
1480 logging.debug("adding:"+projectID+":"+value); | |
1481 | |
15 | 1482 self.storeChange("addObject",projectID,value) |
0 | 1483 |
1484 #TODO: Im moment noch keine Zuordnung zu einer ID. | |
1485 objects.insert([value,value]) | |
1486 self.projectObjects.update({projectID:objects}) | |
1487 | |
1488 | |
1489 | |
1490 for objectTuple in objects: | |
1491 #hole die abgespeicherten Projekte zu einer Person | |
1492 person=objectTuple[0] #hile die ID | |
1493 | |
1494 | |
1495 if getattr(self,"objects2Projects",None)==None: | |
1496 setattr(self,"objects2Projects",OOBTree()) | |
1497 | |
1498 projects = self.objects2Projects.get(person,None) | |
1499 | |
1500 if projects==None: | |
1501 projects=OOSet(); | |
1502 | |
1503 projects.insert(projectID ) | |
1504 logging.debug("update:"+person) | |
1505 self.objects2Projects.update({person:projects}) | |
1506 | |
1507 | |
1508 | |
1509 retstring = self.getObjectsFromProjectAsHTML(projectID) | |
1510 logging.debug(retstring) | |
1511 | |
1512 | |
1513 | |
1514 return retstring | |
1515 | |
1516 | |
1517 def getProjectsWithTag(self,tagType,tagName): | |
1518 tags = getattr(self,"tags",None) | |
1519 if tags is None: | |
1520 logging.debug("can't find Tags") | |
1521 return [] | |
1522 | |
1523 | |
1524 | |
1525 tagsStored=tags.get(tagType,None) | |
1526 if tagsStored is None: | |
1527 logging.debug("can't find Tag:"+tagType) | |
1528 return [] | |
1529 | |
1530 projects = tagsStored.get(tagName,None) | |
1531 if projects is None: | |
1532 logging.debug("can't find any projects for Tag:"+tagName+"("+tagType+")") | |
1533 return [] | |
1534 | |
1535 ret=[] | |
1536 for project in projects: | |
1537 logging.debug("found:"+project) | |
30 | 1538 proj =self.getProjectDetails(project); |
1539 if proj is not None: | |
1540 ret.append(proj) | |
0 | 1541 |
1542 return ret | |
1543 | |
1544 def getProjectDetails(self,getID): | |
28 | 1545 project=getattr(self.projects,getID,None) |
0 | 1546 if project is None: |
1547 logging.debug("no project!! " +getID) | |
30 | 1548 return None |
0 | 1549 |
1550 link="/en/research/projects/"+getID | |
1551 | |
27 | 1552 title=project.getContent("WEB_title") |
0 | 1553 #persons=project.getPersonKeyList() |
1554 persons=project.getContent('xdata_01') | |
1555 logging.debug("%s %s %s"%(link,title,persons)) | |
28 | 1556 |
1557 thumb = project.getThumbUrl() | |
1558 | |
1559 return link,title,persons,thumb | |
0 | 1560 |
1561 # $.post("addNewPerson",{"projectID": | |
1562 # $('#projectID').val(), | |
1563 # "personName":$("#suggest_newPerson").val(), | |
1564 # "personComment":$("#suggest_newPerson_comment").val()} | |
1565 # | |
1566 # ); | |
1567 # | |
2 | 1568 |
1569 security.declareProtected('View management screens','addAndCreateNewPerson') | |
0 | 1570 def addAndCreateNewPerson(self,projectID,personName,personComment,personUserName): |
1571 """adds anew person to the project which is not in the authority file""" | |
1572 | |
1573 id = random.randint(0, 1000000); | |
1574 idstring="http://ontologies.mpiwg-berlin.mpg.de/tempObjects/person/"+str(id) | |
1575 while self.suggestedPersons.has_key(idstring): | |
1576 id = random.randint(0, 1000000); | |
1577 #idstring="http://ontologies.mpiwg-berlin.mpg.de/tempObjects/person/"+str(id); | |
1578 idstring=self.TEMP_PERSON_NS+str(id); | |
1579 | |
1580 | |
1581 self.suggestedPersons.update({idstring:(personName,personComment,projectID,personUserName)}) | |
1582 self.createTempPersonInVirtuoso(projectID, idstring, personName, personComment) #TODO: add suername to the triplestore | |
1583 return self.addPersonToProject(projectID, idstring, personName); | |
2 | 1584 |
7 | 1585 def addSameAsRelationToTripleStore(self,personID,masterID): |
1586 cmdString ="insert in GRAPH <"+self.virtuosoGraph+"> {" | |
1587 cmdString +="<%s> <http://www.w3.org/2002/07/owl#sameAs> <%s>."%(personID,masterID) | |
1588 cmdString +="<%s> <http://www.w3.org/2002/07/owl#sameAs> <%s>."%(masterID,personID) | |
1589 cmdString+="}" | |
1590 | |
1591 auth_handler = urllib2.HTTPBasicAuthHandler() | |
1592 auth_handler.add_password(realm='sparql', | |
1593 uri=self.virtuosoServer+"/sparql", | |
1594 user=self.virtuosoDAVUser, | |
1595 passwd=self.virtuosoDAVPW) | |
1596 | |
1597 opener = urllib2.build_opener(auth_handler) | |
1598 opener.addheaders = [('Content-Type','application/sparql-query')] | |
1599 | |
1600 logging.debug(cmdString) | |
1601 try: | |
1602 r= opener.open(self.virtuosoServer+"/sparql", urllib.urlencode({'query':cmdString,'default-graph-uri':self.virtuosoGraph,'named-graph-uri':None})) | |
1603 logging.debug(r.read()) | |
1604 except urllib2.URLError, e: | |
1605 logging.error(e.code) | |
1606 logging.error(e.read()) | |
1607 return | |
1608 | |
1609 | |
2 | 1610 security.declareProtected('View management screens','createTempPersonInVirtuoso') |
0 | 1611 def createTempPersonInVirtuoso(self,projectID,personURI, personName,personComment): |
1612 """add a new person to the triple store of tempory persons""" | |
1613 triples=[]; | |
1614 personID="<"+personURI+">" | |
1615 triples.append((personID,"<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>","<http://ontologies.mpiwg-berlin.mpg.de/authorities/namedIdentities/Person>")) | |
1616 triples.append((personID,"<http://erlangen-crm.org/110404/P3_has_note>",'"'+personComment+'"')) | |
1617 triples.append((personID,"<http://xmlns.com/foaf/0.1/name>",'"'+personName+'"')) | |
1618 triples.append((personID,"<http://ontologies.mpiwg-berlin.mpg.de/general/isMentionedOn>","<http://www.mpiwg-berlin.mpg.de/en/research/projects/"+projectID+">")) | |
1619 | |
1620 cmdString ="insert in GRAPH <"+self.virtuosoGraph+"> {" | |
1621 for triple in triples: | |
1622 cmdString+=" ".join(triple)+"." | |
1623 | |
1624 cmdString+="}" | |
1625 | |
1626 auth_handler = urllib2.HTTPBasicAuthHandler() | |
1627 auth_handler.add_password(realm='sparql', | |
1628 uri=self.virtuosoServer+"/sparql", | |
1629 user=self.virtuosoDAVUser, | |
1630 passwd=self.virtuosoDAVPW) | |
1631 | |
1632 opener = urllib2.build_opener(auth_handler) | |
1633 opener.addheaders = [('Content-Type','application/sparql-query')] | |
1634 | |
1635 logging.debug(cmdString) | |
1636 try: | |
1637 r= opener.open(self.virtuosoServer+"/sparql", urllib.urlencode({'query':cmdString,'default-graph-uri':self.virtuosoGraph,'named-graph-uri':None})) | |
1638 logging.debug(r.read()) | |
1639 except urllib2.URLError, e: | |
1640 logging.error(e.code) | |
1641 logging.error(e.read()) | |
1642 return | |
1643 | |
1644 opener2 = urllib2.build_opener() | |
1645 | |
1646 | |
1647 personIDencoded=urllib.quote(personURI,safe="") | |
1648 graphEncoded=urllib.quote(self.additionalNamesGraphURL,safe="") | |
1649 url = self.personproviderURL+"id/"+personIDencoded+"/"+graphEncoded | |
1650 | |
1651 try: | |
1652 request = urllib2.Request(url); | |
1653 request.get_method = lambda : 'PUT' | |
1654 r= opener2.open(request); | |
1655 logging.debug(r.read()) | |
1656 except urllib2.URLError, e: | |
1657 logging.error(e.code) | |
1658 logging.error(e.read()) | |
1659 return | |
1660 | |
1661 | |
1662 | |
1663 return | |
15 | 1664 |
1665 # self.storeChange("removePerson",projectID,value) | |
1666 def storeChange(self,typeString,projectID,value): | |
1667 | |
1668 from time import gmtime,strftime | |
1669 | |
17 | 1670 |
1671 | |
1672 | |
1673 | |
15 | 1674 |
1675 fl = open(self.getLogpath(),"a") | |
1676 person = self.REQUEST.AUTHENTICATED_USER.getId() | |
1677 date = strftime("%Y-%m-%d %H:%M:%S", gmtime()) | |
1678 writeString ="\t".join((date,person,typeString,projectID,value)) | |
1679 fl.write(writeString+"\n") | |
1680 fl.flush() | |
1681 fl.close() | |
0 | 1682 |
17 | 1683 lastChangeInThesaurus = getattr(self,'lastChangeInThesaurus',OOBTree()) |
1684 lastChangeInThesaurus.update({projectID:date}) | |
1685 self.lastChangeInThesaurus=lastChangeInThesaurus | |
1686 | |
0 | 1687 def redirect(RESPONSE,url): |
1688 """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen""" | |
1689 | |
1690 timeStamp=time.time() | |
1691 | |
1692 if url.find("?")>-1: #giebt es schon parameter | |
1693 addStr="&time=%s" | |
1694 else: | |
1695 addStr="?time=%s" | |
1696 | |
1697 RESPONSE.setHeader('Last-Modified',email.Utils.formatdate().split("-")[0]+'GMT') | |
1698 logging.error(email.Utils.formatdate()+' GMT') | |
1699 RESPONSE.redirect(url+addStr%timeStamp) | |
1700 | |
1701 def manage_addMPIWGThesaurusForm(self): | |
1702 """form for adding the project""" | |
1703 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMPIWGThesaurusForm.zpt')).__of__(self) | |
1704 return pt() | |
1705 | |
1706 | |
1707 | |
1708 def manage_addMPIWGThesaurus(self,id,RESPONSE=None): | |
1709 """add it""" | |
1710 newObj=MPIWGThesaurus(id) | |
1711 | |
1712 self._setObject(id,newObj) | |
1713 | |
1714 | |
1715 if RESPONSE is not None: | |
24 | 1716 redirect(RESPONSE,'manage_main') |