comparison MPIWGThesaurus.py @ 0:b2e4605f20b2

beta version
author dwinter
date Thu, 30 Jun 2011 09:07:49 +0200
parents
children 95e1e37915c6
comparison
equal deleted inserted replaced
-1:000000000000 0:b2e4605f20b2
1 # TODO: generell verwaltung der tags im triple store und nicht in zope.
2 from OFS.Folder import Folder
3 from Globals import package_home
4 from Products.PageTemplates.PageTemplateFile import PageTemplateFile
5 from BTrees.OOBTree import OOBTree
6 from BTrees.OOBTree import OOSet
7
8 #import os
9 import os.path
10 import logging
11 import time
12 import email.Utils
13 from types import ListType
14 import transaction
15 import random
16 import urllib2
17 import urllib
18
19 class Entry:
20 """publicClass"""
21 def __init__(self,title,entries=[]):
22 self.title=title
23 self.entries=entries
24
25 def getTitle(self):
26 """getTitle"""
27 return self.title
28
29 class SuggestedTag:
30 """publicClass"""
31 type=""
32 userName=""
33 def __init__(self,name,comment,type,userName):
34 self.name=name
35 self.comment=comment
36 self.type=type
37 self.userName=userName
38
39
40 class MPIWGThesaurus(Folder):
41 """MPIWGThesaurus main folder"""
42 meta_type="MPIWGThesaurus"
43
44 TMP_PERSON_NS="http://ontologies.mpiwg-berlin.mpg.de/tempObjects/person/"
45 ONTOLOGY_NS="http://ontologies.mpiwg-berlin.mpg.de/authorities/namedIdentities/"
46 #personproviderURL="http://127.0.0.1:8280/MetaDataManagerRestlet/person/"
47 personproviderURL="http://virtuoso.mpiwg-berlin.mpg.de:8080/MetaDataManagerRestlet/person/"
48 additionalNamesGraphURL="file://newpersonsFromProjects"
49
50 #virtuosoServer="http://ontologies.mpiwg-berlin.mpg.de"
51 virtuosoServer="http://virtuoso.mpiwg-berlin.mpg.de:8890"
52 virtuosoDAV="/DAV/home/websiteuser/"
53 virtuosoDAVUser="websiteuser"
54 virtuosoDAVPW="w3s45us3"
55 virtuosoGraph="file://newpersonsFromProjects"
56
57 projectPersons= OOBTree()
58 projectObjects= OOBTree()
59 projectHistoricalPlaces= OOBTree()
60 projectSuggestedTags= OOBTree()
61 persons2Projects= OOBTree()
62 object2Projects=OOBTree()
63 historicalPlaces2Projects=OOBTree()
64 suggestedTags2Projects=OOBTree()
65 personIDtoNames=OOBTree()
66 suggestedPersons= OOBTree(); #TODO: das sollte die ueberfluessig werde und nur im triple store stehen.
67
68 tagList=[]
69 approachesTxt="""A
70 ---
71 ent1
72 ---
73 B
74 ---
75 enta
76 entb
77 entc
78 """
79
80 disciplines=[]
81 disciplinesTxt="""A
82 B
83 C
84 """
85
86 periods=[]
87 periodsTxt="""PA
88 PB
89 PC
90 """
91
92 spaces=[]
93 spacesTxt="""SPA
94 ---
95 sPent1
96 ---
97 SPB
98 ---
99 SPenta
100 SPentb
101 SPentc
102 """
103 technologies=[]
104 technologiesTxt="""TPA
105 ---
106 TPent1
107 ---
108 TPB
109 ---
110 TPenta
111 TPentb
112 TPentc
113 """
114
115 knowledgeTransfers=[]
116 knowledgeTransfersTxt="""KTPA
117 ---
118 TPent1
119 ---
120 TPB
121 ---
122 TPenta
123 TPentb
124 TPentc
125 """
126
127
128
129
130
131
132 manage_options = Folder.manage_options+(
133 {'label':'Main Config','action':'changeMPIWGThesaurusForm'},
134 #{'label':'Change Publications Special','action':'changePublications_specialForm'},
135 )
136
137 def __init__(self,id):
138 """init"""
139 self.id=id
140
141
142 def index_html(self):
143 """index file"""
144
145 # if hasattr(self,"storedProjectPersons"):
146 # self.projectPersons= getattr(self,"storedProjectPersons");
147 #
148 # if hasattr(self,"storedProjectObjects"):
149 # self.projectPersons= getattr(self,"storedProjectObjects");
150 #
151 #
152
153 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','index.html')).__of__(self)
154 return pt()
155
156
157 def changeMPIWGThesaurusForm(self):
158 """form for changing the project"""
159 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeMPIWGThesaurusForm.zpt')).__of__(self)
160 return pt()
161
162 def changeMPIWGThesaurus(self,approachesTxt,disciplinesTxt,periodsTxt,spacesTxt,technologiesTxt,knowledgeTransfersTxt,RESPONSE=None):
163 """change it"""
164 self.approachesTxt=approachesTxt
165 self.disciplinesTxt=disciplinesTxt
166 self.periodsTxt=periodsTxt
167 self.spacesTxt=spacesTxt
168 self.technologiesTxt=technologiesTxt
169 self.knowledgeTransfersTxt=knowledgeTransfersTxt
170
171 if RESPONSE is not None:
172 redirect(RESPONSE,'manage_main')
173
174 #In der Anzeige soll der Name der zitierten Personen in Klartext angezeigt werden, ausserdem die Varianten, wie sie tatsaechlich
175 #in den Projekten benutzt werden
176 def collectPersonNamesToIds(self):
177 """finde Namen zu den personen ids"""
178 self.personIDtoNames=OOBTree() # loessche alle
179
180 for personID in self.persons2Projects:
181 mainName=self.getMainNameFromTripleStore(personID); # hole die hauptbezeichnung aus dem triplestore
182
183 personNames=[]
184 for project in self.persons2Projects.get(personID):
185 #hole die personen aus dem projekte
186 logging.debug("Found:project:"+project)
187 namesInProject = self.projectPersons.get(project)
188
189 for nameInProjectTuple in namesInProject:
190 logging.debug(repr(nameInProjectTuple))
191 nameInProject=nameInProjectTuple[1]
192 logging.debug(nameInProjectTuple[0]+"??"+personID)
193 if nameInProjectTuple[0]==personID:
194 logging.debug("changing")
195 if mainName=="": # es gibt keinen Eintrag im Triplestore fuer name (sollte eigentlich nicht sein, ist dann ein Fehler dort)
196 mainName=nameInProject #nimm dann aber den ersten aus den projekten
197 if nameInProject!=mainName:
198 personNames.append(nameInProject)
199
200 logging.debug(str(mainName)+"- foundalso :"+",".join(personNames))
201 self.personIDtoNames.update({personID:(mainName,personNames)})
202
203 self.personIDtoNames=self.personIDtoNames # make clear that it has changed #TODO: change this to variablen with names _p
204
205 def getNamesFromID(self,personID):
206 retStr=""
207 retStr+=self.personIDtoNames.get(personID)[0] # hole die Hauptbezeichnung
208 additionalNames = self.personIDtoNames.get(personID)[1]
209 if len(additionalNames)>0:
210 retStr+=" ("+",".join(additionalNames)+","+")"
211 return retStr
212
213
214 def getMainNameFromTripleStore(self,personID):
215
216
217 cmdString ="""select * where { <%s> <http://xmlns.com/foaf/0.1/name> ?name}"""%personID
218
219
220 auth_handler = urllib2.HTTPBasicAuthHandler()
221 auth_handler.add_password(realm='sparql',
222 uri=self.virtuosoServer+"/sparql",
223 user=self.virtuosoDAVUser,
224 passwd=self.virtuosoDAVPW)
225
226 opener = urllib2.build_opener(auth_handler)
227 opener.addheaders = [('Content-Type','application/sparql-query')]
228
229 logging.debug(cmdString)
230 try:
231 r= opener.open(self.virtuosoServer+"/sparql", urllib.urlencode({'query':cmdString,'default-graph-uri':self.virtuosoGraph,'named-graph-uri':None,'format':'text/csv'}))
232 namesTxt=r.read()
233 except urllib2.URLError, e:
234 logging.error(e.code)
235 logging.error(e.read())
236 return
237
238 names=namesTxt.split("\n")
239 if len(names) < 2: #in der ersten Zeile stehen bei der Rückgabe die Spaltennamen, <2 heiss also es gibt keinen Eintrag
240 return
241
242 return names[1].replace('"','') # wir nehmen nur den ersten treffer
243
244
245 def changeTags(self,projectID,approaches=[],disciplines=[],periods=[],spaces=[],technologies=[],transfers=[],RESPONSE=None):
246 """change tags"""
247 self.changeTagFromList(projectID,"approaches", approaches)
248 self.changeTagFromList(projectID,"disciplines", disciplines)
249 self.changeTagFromList(projectID,"periods", periods)
250 self.changeTagFromList(projectID,"spaces", spaces)
251 self.changeTagFromList(projectID,"technologies", technologies)
252 self.changeTagFromList(projectID,"transfers", transfers)
253
254 self.projectObjects=self.projectObjects #necessesary to make the object persistent after the first call
255 self.projectHistoricalPlaces=self.projectHistoricalPlaces #necessesary to make the object persistent after the first call
256 self.projectPersons=self.projectPersons #necessesary to make the object persistent after the first call
257 self.projectSuggestedTags=self.projectSuggestedTags
258
259 self.persons2Projects=self.persons2Projects
260 self.object2Projects=self.object2Projects
261 self.historicalPlaces2Projects=self.historicalPlaces2Projects
262 self.suggestedTags2Projects=self.suggestedTags2Projects;
263
264 self.suggestedPersons=self.suggestedPersons;
265
266 def deleteAllTags(self):
267 """deleteAllTags - TODO: take this out!!,"""
268 setattr(self,"tags",None)
269
270 return "DONE!"
271
272 def deleteAllPersons(self):
273 """deleteAllTags - TODO: take this out!!,"""
274 self.projectPersons= OOBTree()
275 self.persons2Projects= OOBTree()
276 self.personIDtoNames=OOBTree()
277 self.suggestedPersons= OOBTree(); #TODO: das sollte die ueberfluessig werde und nur im triple store stehen.
278
279
280 return "DONE!"
281 def changeTagFromList(self,projectID,tagType,tagList):
282
283 logging.debug("changing:"+projectID)
284 logging.debug("asking tag::"+tagType)
285 if type(tagList) is not ListType:
286 tagList=[tagList]
287
288
289 tags = getattr(self,"tags",None)
290 if tags is None:
291 logging.debug("Create new tags")
292 tags=OOBTree()
293 setattr(self,"tags",tags)
294
295
296 tagsStored=tags.get(tagType,None)
297 if tagsStored is None:
298 tagsStored=OOBTree();
299
300
301
302 for tag in tagsStored.keys(): #gehe durch alle gespeichteren tags
303 logging.debug("checking:"+tag)
304 currentApproach = tagsStored.get(tag,None)
305 logging.debug(currentApproach)
306 if currentApproach is None:
307 currentApproach=OOSet()
308
309 if tag in tagList: #dieser ist getagged
310 currentApproach.update([projectID]);
311 tagList.remove(tag);
312 else:
313 if currentApproach.has_key(projectID):
314 currentApproach.remove(projectID);
315
316 tagsStored.update({tag:currentApproach});
317
318 for tag in tagList: # alle die nich nicht abearbeitet worden muessen noch angelegt werden
319 logging.debug("adding:"+tag)
320 newApproach=OOSet()
321 newApproach.update([projectID]);
322 tagsStored.insert(tag, newApproach);
323
324 tags.update({tagType:tagsStored})
325
326 transaction.commit()
327
328 def getTitle(self,entry):
329 return entry.title
330
331 def getEntries(self,entry):
332 return entry.entries
333
334 def getEntriesFromTxt(self,txt):
335 apps=[]
336 lines=txt.split("\n");
337 level=False
338 for line in lines:
339 line=line.rstrip().lstrip()
340 if line=="":
341 continue
342 if line=="---":
343
344 if level:
345 level=False
346 else:
347 level=True
348 else:
349 if not level:
350 entry=Entry(line,[])
351 apps.append(entry)
352 else:
353 entry.entries.append(Entry(line))
354
355 return apps[0:]
356
357 def getApproaches(self):
358
359 self.tagList=self.getEntriesFromTxt(self.approachesTxt)
360 return self.tagList
361
362 def getTagsJSON(self,projectID,tagType,RESPONSE=None):
363 """get all selected tagList"""
364 logging.debug("asking:"+projectID)
365 logging.debug("asking tag::"+tagType)
366 retList=[]
367 tags = getattr(self,"tags",None)
368 if tags is None:
369 return;
370
371 tagsStored=tags.get(tagType,None)
372 if tagsStored is None:
373 return;
374
375 for tag in tagsStored.keys(): #gehe durch alle gespeichteren approached
376 logging.debug("checking:"+tag)
377 currentTag = tagsStored.get(tag,None)
378 if currentTag is None:
379 continue
380 if currentTag.has_key(projectID):
381 retList.append(""" "%s" """%tag)
382
383 if RESPONSE:
384 RESPONSE.setHeader('Content-Type', "application/json")
385
386 logging.debug(retList)
387 return "["+",".join(retList)+"]"
388
389 def getDisciplines(self):
390
391 self.disciplines=self.getEntriesFromTxt(self.disciplinesTxt)
392 return self.disciplines
393
394
395 def getObjectsJSON(self,term="",RESPONSE=None):
396 """ get all stored objects as json list starting with term"""
397 term=term.lower();
398 logging.debug("Asking:"+term)
399 #objectList=["baus","berg","lurg"]
400 objects = self.objects2Projects;
401
402 objectList= [x for x in objects.keys()]
403
404 logging.debug("Create:"+repr(objectList))
405 retList=[]
406 for object in objectList:
407 if object.find(term)>-1:
408 retList.append(""" "%s" """%object)
409 ret="["
410 ret+=",".join(retList)
411 ret+="]"
412 logging.debug("Objects:"+ret)
413 if RESPONSE:
414 RESPONSE.setHeader('Content-Type', "application/json")
415 return ret
416
417
418 def getHistoricalPlacesJSON(self,term="",RESPONSE=None):
419 """ get all stored historicalPlaces as json list starting with term"""
420 term=term.lower();
421 logging.debug("Asking:"+term)
422 #historicalPlaceList=["baus","berg","lurg"]
423 historicalPlaces = self.historicalPlaces2Projects;
424
425 historicalPlaceList= [x for x in historicalPlaces.keys()]
426
427 logging.debug("Create:"+repr(historicalPlaceList))
428 retList=[]
429 for historicalPlace in historicalPlaceList:
430 if historicalPlace.find(term)>-1:
431 retList.append(""" "%s" """%historicalPlace)
432 ret="["
433 ret+=",".join(retList)
434 ret+="]"
435 logging.debug("historicalPlaces:"+ret)
436 if RESPONSE:
437 RESPONSE.setHeader('Content-Type', "application/json")
438 return ret
439
440
441 def getPeriods(self):
442
443 self.periodes=self.getEntriesFromTxt(self.periodsTxt)
444 return self.periodes
445
446 def getSpaces(self):
447
448 self.spaces=self.getEntriesFromTxt(self.spacesTxt)
449 return self.spaces
450
451 def getTechnologies(self):
452
453 self.technologies=self.getEntriesFromTxt(self.technologiesTxt)
454 return self.technologies
455
456 def getKnowledgeTransfers(self):
457
458 self.knowledgeTransfers=self.getEntriesFromTxt(self.knowledgeTransfersTxt)
459 return self.knowledgeTransfers
460
461
462 def getObjectsFromProject(self,projectID):
463 return self.getFromProject(self.projectObjects,projectID);
464
465 def getHistoricalPlacesFromProject(self,projectID):
466 return self.getFromProject(self.projectHistoricalPlaces,projectID);
467
468 def getSuggestedTagsFromProject(self,projectID):
469 return self.getFromProject(self.projectSuggestedTags,projectID);
470
471
472 def getPersonsFromProject(self,projectID):
473 return self.getFromProject(self.projectPersons,projectID);
474
475 def getFromProject(self,objects,projectID):
476 if objects.has_key(projectID):
477 logging.debug("key exists:"+projectID)
478 persons=objects.get(projectID);
479 else:
480 persons=OOSet()
481 objects.update({projectID:persons})
482 logging.debug("key does not exists:"+projectID)
483
484
485 return persons
486
487 def getHistoricalPlacesFromProjectAsHTML(self,projectID):
488 """gertobjects"""
489 return self.getFromProjectAsHTML(self.projectHistoricalPlaces, projectID, "HistoricalPlace");
490
491 def getObjectsFromProjectAsHTML(self,projectID):
492 """gertobjects"""
493 return self.getFromProjectAsHTML(self.projectObjects, projectID, "Object");
494
495 def getPersonsFromProjectAsHTML(self,projectID):
496 """getpersons"""
497 return self.getFromProjectAsHTML(self.projectPersons, projectID, "Person");
498
499
500 def getFromProjectAsHTML(self,objects,projectID,type):
501 """getpersons"""
502 ret=""
503 if objects.has_key(projectID):
504 persons=objects.get(projectID);
505 else:
506 persons=OOSet()
507
508
509 for person in persons:
510 ret+="""<div class="removeButton">
511 <span>%s </span><div style="display:inline" class="remove%s"><span style="display:none" class="removeValue">%s</span>remove</div>
512 </div>"""%(person[1],type,person[0])
513
514
515 # ret+="""<div>
516 # <input type="checkbox" name="persons_remove"
517 # value="%s">
518 # <span>%s</span>
519 # </div>"""%(person[0],person[1])
520 #
521 logging.debug(type+":"+ret)
522 return ret
523
524
525 def removeHistoricalPlaceFromProject(self,projectID,value):
526 """remove"""
527 logging.debug("removeHP:"+projectID+":"+value);
528
529 HistoricalPlaces = self.getHistoricalPlacesFromProject(projectID)
530 for HistoricalPlace in HistoricalPlaces.keys():
531
532 logging.debug("trying:"+repr(HistoricalPlace[0])+"::"+repr(value)+"__")
533 if HistoricalPlace[0]==value:
534 logging.debug("---removed!")
535 HistoricalPlaces.remove(HistoricalPlace)
536
537 self.projectHistoricalPlaces.update({projectID:HistoricalPlaces})
538 retstring = self.getHistoricalPlacesFromProjectAsHTML(projectID)
539 logging.debug(retstring)
540 return retstring
541
542 def removeObjectFromProject(self,projectID,value):
543 """remove"""
544 logging.debug("remove:"+projectID+":"+value);
545
546 objects = self.getObjectsFromProject(projectID)
547 for object in objects.keys():
548
549 logging.debug("trying:"+repr(object[0])+"::"+repr(value)+"__")
550 if object[0]==value:
551 logging.debug("---removed!")
552 objects.remove(object)
553
554 self.projectObjects.update({projectID:objects})
555 retstring = self.getObjectsFromProjectAsHTML(projectID)
556 logging.debug(retstring)
557 return retstring
558
559 def removePersonFromProject(self,projectID,value):
560 """remove"""
561 logging.debug("remove:"+projectID+":"+value);
562
563 persons = self.getPersonsFromProject(projectID)
564 for person in persons.keys():
565
566 logging.debug("trying:"+repr(person[0])+"::"+repr(value)+"__")
567 if person[0]==value:
568 logging.debug("---removed!")
569 persons.remove(person)
570
571 self.projectPersons.update({projectID:persons})
572 retstring = self.getPersonsFromProjectAsHTML(projectID)
573 logging.debug(retstring)
574 return retstring
575
576 #fuegt die neue Person zur personIDtoNames hinzu, für die spätere Anzeige in der Personenliste
577 def addNameTOPersonIDNames(self,personID,label):
578 personName = self.personIDtoNames.get(personID)
579 if personName==None: # Anlegen falls noch nicht existent
580 personName=(label,[])
581 else:
582 if (not label in personName[1]) and (not label==personName[0]): # hinzufuegen falls der neuen name noch nicht als bezeichnugn fuer personID eingetragen ist
583 personName[1].append(label)
584
585 self.personIDtoNames.update({personID:personName})
586
587
588 def addPersonToProject(self,projectID,value,label):
589 """ add a person so the project"""
590 persons=self.getPersonsFromProject(projectID);
591
592 logging.debug("adding:"+projectID+":"+value+":"+label);
593
594 persons.insert([value,label])
595 self.projectPersons.update({projectID:persons})
596
597 for personTuple in persons:
598 #hole die abgespeicherten Projekte zu einer Person
599 person=personTuple[0] #hole die ID
600
601
602 if getattr(self,"persons2Projects",None)==None:
603 setattr(self,"persons2Projects",OOBTree())
604
605 projects = self.persons2Projects.get(person,None)
606
607 if projects==None:
608 projects=OOSet();
609
610 projects.insert(projectID )
611 logging.debug("update:"+person)
612 self.persons2Projects.update({person:projects})
613
614 self.addNameTOPersonIDNames(value,label)
615 retstring = self.getPersonsFromProjectAsHTML(projectID)
616 logging.debug(retstring)
617 transaction.commit()
618 return retstring
619
620 def getPersonsWithProjectIDs(self):
621 """holt die getaggted Personen mit Projekten"""
622 persons = self.persons2Projects;
623 ret={}
624 logging.debug("Check Person:"+repr(persons.keys()))
625 for person in persons.keys():
626 logging.debug("Check:"+person)
627 #TODO: person muss duch den namen von provuder geholt werden
628 list=[]
629 for projectID in persons.get(person):
630 list.append(self.getProjectDetails(projectID))
631
632 ret[person]=list[0:]
633 return ret
634
635 def getHistoricalPlacesWithProjectIDs(self):
636 """holt die getaggted Personen mit Projekten"""
637 HistoricalPlaces = self.HistoricalPlaces2Projects;
638 ret={}
639 logging.debug("Check HistoricalPlace:"+repr(HistoricalPlaces.keys()))
640 for HistoricalPlace in HistoricalPlaces.keys():
641 logging.debug("Check:"+HistoricalPlace)
642 #TODO: HistoricalPlace muss duch den namen von provuder geholt werden
643 list=[]
644 for projectID in HistoricalPlaces.get(HistoricalPlace):
645 list.append(self.getProjectDetails(projectID))
646
647 ret[HistoricalPlace]=list[0:]
648 return ret
649
650 def getObjectsWithProjectIDs(self):
651 """holt die getaggted Personen mit Projekten"""
652 objects = self.objects2Projects;
653 ret={}
654 logging.debug("Check Object:"+repr(objects.keys()))
655 for object in objects.keys():
656 logging.debug("Check:"+object)
657 #TODO: object muss duch den namen von provuder geholt werden
658 list=[]
659 for projectID in objects.get(object):
660 list.append(self.getProjectDetails(projectID))
661
662 ret[object]=list[0:]
663 return ret
664
665 def listAllSuggestedTags(self):
666 """list all tags"""
667 ret="<html><body>"
668 for projectID in self.projectSuggestedTags:
669 ret+="<h3>"+projectID+"</h3><table>"
670 for tags in self.projectSuggestedTags.get(projectID):
671 ret+="<tr><td>"+tags[0]+"</td><td>"+tags[1].type+"</td><td>"+tags[1].comment+"</td><td>"+tags[1].userName+"</td></tr>"
672 ret+="</table>"
673 ret+="</body></html>"
674 logging.debug(ret);
675 return ret
676
677 def suggestTag(self,projectID,tagName,tagComment,tagType,tagUserName):
678 """suggest a new tag"""
679 """ add a person so the project"""
680 SuggestedTags=self.getSuggestedTagsFromProject(projectID);
681
682 logging.debug("suggested:"+projectID+":"+tagName);
683
684
685 #TODO: Im moment noch keine Zuordnung zu einer ID.
686 newTag = SuggestedTag(tagName,tagComment,tagType,tagUserName)
687 SuggestedTags.insert([tagName,newTag])
688 self.projectSuggestedTags.update({projectID:SuggestedTags})
689
690
691
692 for SuggestedTagTuple in SuggestedTags:
693 #hole die abgespeicherten Projekte zu einer Person
694 person=SuggestedTagTuple[0] #hile die ID
695
696
697 if getattr(self,"SuggestedTags2Projects",None)==None:
698 setattr(self,"SuggestedTags2Projects",OOBTree())
699
700 projects = self.SuggestedTags2Projects.get(person,None)
701
702 if projects==None:
703 projects=OOSet();
704
705 projects.insert(projectID )
706 logging.debug("update:"+person)
707 self.SuggestedTags2Projects.update({person:projects})
708
709
710
711 #retstring = self.getSuggestedTagsFromProjectAsHTML(projectID)
712 #logging.debug(retstring)
713
714
715
716 #return retstring
717
718
719 def addHistoricalPlaceToProject(self,projectID,value):
720 """ add a person so the project"""
721 HistoricalPlaces=self.getHistoricalPlacesFromProject(projectID);
722
723 logging.debug("adding:"+projectID+":"+value);
724
725
726 #TODO: Im moment noch keine Zuordnung zu einer ID.
727 HistoricalPlaces.insert([value,value])
728 self.projectHistoricalPlaces.update({projectID:HistoricalPlaces})
729
730
731
732 for HistoricalPlaceTuple in HistoricalPlaces:
733 #hole die abgespeicherten Projekte zu einer Person
734 person=HistoricalPlaceTuple[0] #hile die ID
735
736
737 if getattr(self,"HistoricalPlaces2Projects",None)==None:
738 setattr(self,"HistoricalPlaces2Projects",OOBTree())
739
740 projects = self.HistoricalPlaces2Projects.get(person,None)
741
742 if projects==None:
743 projects=OOSet();
744
745 projects.insert(projectID )
746 logging.debug("update:"+person)
747 self.HistoricalPlaces2Projects.update({person:projects})
748
749
750
751 retstring = self.getHistoricalPlacesFromProjectAsHTML(projectID)
752 logging.debug(retstring)
753
754
755
756 return retstring
757
758 def addObjectToProject(self,projectID,value):
759 """ add a person so the project"""
760 objects=self.getObjectsFromProject(projectID);
761
762 logging.debug("adding:"+projectID+":"+value);
763
764
765 #TODO: Im moment noch keine Zuordnung zu einer ID.
766 objects.insert([value,value])
767 self.projectObjects.update({projectID:objects})
768
769
770
771 for objectTuple in objects:
772 #hole die abgespeicherten Projekte zu einer Person
773 person=objectTuple[0] #hile die ID
774
775
776 if getattr(self,"objects2Projects",None)==None:
777 setattr(self,"objects2Projects",OOBTree())
778
779 projects = self.objects2Projects.get(person,None)
780
781 if projects==None:
782 projects=OOSet();
783
784 projects.insert(projectID )
785 logging.debug("update:"+person)
786 self.objects2Projects.update({person:projects})
787
788
789
790 retstring = self.getObjectsFromProjectAsHTML(projectID)
791 logging.debug(retstring)
792
793
794
795 return retstring
796
797
798 def getProjectsWithTag(self,tagType,tagName):
799 tags = getattr(self,"tags",None)
800 if tags is None:
801 logging.debug("can't find Tags")
802 return []
803
804
805
806 tagsStored=tags.get(tagType,None)
807 if tagsStored is None:
808 logging.debug("can't find Tag:"+tagType)
809 return []
810
811 projects = tagsStored.get(tagName,None)
812 if projects is None:
813 logging.debug("can't find any projects for Tag:"+tagName+"("+tagType+")")
814 return []
815
816 ret=[]
817 for project in projects:
818 logging.debug("found:"+project)
819 ret.append(self.getProjectDetails(project))
820
821 return ret
822
823 def getProjectDetails(self,getID):
824 project=getattr(self.www_neu.projects,getID,None)
825 if project is None:
826 logging.debug("no project!! " +getID)
827 return
828
829 link="/en/research/projects/"+getID
830
831 title=project.getContent("short_title")
832 #persons=project.getPersonKeyList()
833 persons=project.getContent('xdata_01')
834 logging.debug("%s %s %s"%(link,title,persons))
835 return link,title,persons
836
837 # $.post("addNewPerson",{"projectID":
838 # $('#projectID').val(),
839 # "personName":$("#suggest_newPerson").val(),
840 # "personComment":$("#suggest_newPerson_comment").val()}
841 #
842 # );
843 #
844
845 def addAndCreateNewPerson(self,projectID,personName,personComment,personUserName):
846 """adds anew person to the project which is not in the authority file"""
847
848 id = random.randint(0, 1000000);
849 idstring="http://ontologies.mpiwg-berlin.mpg.de/tempObjects/person/"+str(id)
850 while self.suggestedPersons.has_key(idstring):
851 id = random.randint(0, 1000000);
852 #idstring="http://ontologies.mpiwg-berlin.mpg.de/tempObjects/person/"+str(id);
853 idstring=self.TEMP_PERSON_NS+str(id);
854
855
856 self.suggestedPersons.update({idstring:(personName,personComment,projectID,personUserName)})
857 self.createTempPersonInVirtuoso(projectID, idstring, personName, personComment) #TODO: add suername to the triplestore
858 return self.addPersonToProject(projectID, idstring, personName);
859
860 def createTempPersonInVirtuoso(self,projectID,personURI, personName,personComment):
861 """add a new person to the triple store of tempory persons"""
862 triples=[];
863 personID="<"+personURI+">"
864 triples.append((personID,"<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>","<http://ontologies.mpiwg-berlin.mpg.de/authorities/namedIdentities/Person>"))
865 triples.append((personID,"<http://erlangen-crm.org/110404/P3_has_note>",'"'+personComment+'"'))
866 triples.append((personID,"<http://xmlns.com/foaf/0.1/name>",'"'+personName+'"'))
867 triples.append((personID,"<http://ontologies.mpiwg-berlin.mpg.de/general/isMentionedOn>","<http://www.mpiwg-berlin.mpg.de/en/research/projects/"+projectID+">"))
868
869 cmdString ="insert in GRAPH <"+self.virtuosoGraph+"> {"
870 for triple in triples:
871 cmdString+=" ".join(triple)+"."
872
873 cmdString+="}"
874
875 auth_handler = urllib2.HTTPBasicAuthHandler()
876 auth_handler.add_password(realm='sparql',
877 uri=self.virtuosoServer+"/sparql",
878 user=self.virtuosoDAVUser,
879 passwd=self.virtuosoDAVPW)
880
881 opener = urllib2.build_opener(auth_handler)
882 opener.addheaders = [('Content-Type','application/sparql-query')]
883
884 logging.debug(cmdString)
885 try:
886 r= opener.open(self.virtuosoServer+"/sparql", urllib.urlencode({'query':cmdString,'default-graph-uri':self.virtuosoGraph,'named-graph-uri':None}))
887 logging.debug(r.read())
888 except urllib2.URLError, e:
889 logging.error(e.code)
890 logging.error(e.read())
891 return
892
893 opener2 = urllib2.build_opener()
894
895
896 personIDencoded=urllib.quote(personURI,safe="")
897 graphEncoded=urllib.quote(self.additionalNamesGraphURL,safe="")
898 url = self.personproviderURL+"id/"+personIDencoded+"/"+graphEncoded
899
900 try:
901 request = urllib2.Request(url);
902 request.get_method = lambda : 'PUT'
903 r= opener2.open(request);
904 logging.debug(r.read())
905 except urllib2.URLError, e:
906 logging.error(e.code)
907 logging.error(e.read())
908 return
909
910
911
912 return
913
914 def redirect(RESPONSE,url):
915 """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen"""
916
917 timeStamp=time.time()
918
919 if url.find("?")>-1: #giebt es schon parameter
920 addStr="&time=%s"
921 else:
922 addStr="?time=%s"
923
924 RESPONSE.setHeader('Last-Modified',email.Utils.formatdate().split("-")[0]+'GMT')
925 logging.error(email.Utils.formatdate()+' GMT')
926 RESPONSE.redirect(url+addStr%timeStamp)
927
928 def manage_addMPIWGThesaurusForm(self):
929 """form for adding the project"""
930 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMPIWGThesaurusForm.zpt')).__of__(self)
931 return pt()
932
933
934
935 def manage_addMPIWGThesaurus(self,id,RESPONSE=None):
936 """add it"""
937 newObj=MPIWGThesaurus(id)
938
939 self._setObject(id,newObj)
940
941
942 if RESPONSE is not None:
943 redirect(RESPONSE,'manage_main')