diff MPIWGThesaurus.py @ 0:b2e4605f20b2

beta version
author dwinter
date Thu, 30 Jun 2011 09:07:49 +0200
parents
children 95e1e37915c6
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MPIWGThesaurus.py	Thu Jun 30 09:07:49 2011 +0200
@@ -0,0 +1,943 @@
+# TODO: generell verwaltung der tags im triple store und nicht in zope.
+from OFS.Folder import Folder
+from Globals import package_home
+from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+from BTrees.OOBTree import OOBTree
+from BTrees.OOBTree import OOSet
+   
+#import os
+import os.path
+import logging
+import time
+import email.Utils
+from types import ListType
+import transaction
+import random
+import urllib2
+import urllib
+
+class Entry:
+    """publicClass"""
+    def __init__(self,title,entries=[]):
+        self.title=title
+        self.entries=entries
+        
+    def getTitle(self):
+        """getTitle"""
+        return self.title
+    
+class SuggestedTag:
+    """publicClass"""
+    type=""
+    userName=""
+    def __init__(self,name,comment,type,userName):
+        self.name=name
+        self.comment=comment
+        self.type=type
+        self.userName=userName
+        
+
+class MPIWGThesaurus(Folder):
+    """MPIWGThesaurus main folder"""
+    meta_type="MPIWGThesaurus"
+   
+    TMP_PERSON_NS="http://ontologies.mpiwg-berlin.mpg.de/tempObjects/person/"
+    ONTOLOGY_NS="http://ontologies.mpiwg-berlin.mpg.de/authorities/namedIdentities/"
+    #personproviderURL="http://127.0.0.1:8280/MetaDataManagerRestlet/person/"
+    personproviderURL="http://virtuoso.mpiwg-berlin.mpg.de:8080/MetaDataManagerRestlet/person/"
+    additionalNamesGraphURL="file://newpersonsFromProjects"
+    
+    #virtuosoServer="http://ontologies.mpiwg-berlin.mpg.de"
+    virtuosoServer="http://virtuoso.mpiwg-berlin.mpg.de:8890"
+    virtuosoDAV="/DAV/home/websiteuser/"
+    virtuosoDAVUser="websiteuser"
+    virtuosoDAVPW="w3s45us3"
+    virtuosoGraph="file://newpersonsFromProjects"
+    
+    projectPersons= OOBTree()
+    projectObjects= OOBTree()
+    projectHistoricalPlaces= OOBTree()
+    projectSuggestedTags= OOBTree()
+    persons2Projects= OOBTree()
+    object2Projects=OOBTree()
+    historicalPlaces2Projects=OOBTree()
+    suggestedTags2Projects=OOBTree()
+    personIDtoNames=OOBTree()
+    suggestedPersons= OOBTree(); #TODO: das sollte die ueberfluessig werde und nur im triple store stehen.
+    
+    tagList=[]
+    approachesTxt="""A
+    ---
+    ent1
+    ---
+    B
+    ---
+    enta
+    entb
+    entc
+    """
+    
+    disciplines=[]
+    disciplinesTxt="""A
+   B
+   C
+    """
+    
+    periods=[]
+    periodsTxt="""PA
+   PB
+   PC
+    """
+    
+    spaces=[]
+    spacesTxt="""SPA
+    ---
+    sPent1
+    ---
+    SPB
+    ---
+    SPenta
+    SPentb
+    SPentc
+    """
+    technologies=[]
+    technologiesTxt="""TPA
+    ---
+    TPent1
+    ---
+    TPB
+    ---
+    TPenta
+    TPentb
+    TPentc
+    """
+    
+    knowledgeTransfers=[]
+    knowledgeTransfersTxt="""KTPA
+    ---
+    TPent1
+    ---
+    TPB
+    ---
+    TPenta
+    TPentb
+    TPentc
+    """
+    
+    
+    
+    
+    
+    
+    manage_options = Folder.manage_options+(
+        {'label':'Main Config','action':'changeMPIWGThesaurusForm'},
+        #{'label':'Change Publications Special','action':'changePublications_specialForm'},
+        )
+    
+    def __init__(self,id):
+        """init"""
+        self.id=id
+       
+        
+    def index_html(self):
+        """index file"""
+        
+#        if hasattr(self,"storedProjectPersons"):
+#            self.projectPersons= getattr(self,"storedProjectPersons");
+#        
+#        if hasattr(self,"storedProjectObjects"):
+#            self.projectPersons= getattr(self,"storedProjectObjects");
+#       
+#      
+   
+        pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','index.html')).__of__(self)
+        return pt()
+    
+    
+    def changeMPIWGThesaurusForm(self):
+        """form for changing the project"""
+        pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeMPIWGThesaurusForm.zpt')).__of__(self)
+        return pt()
+    
+    def changeMPIWGThesaurus(self,approachesTxt,disciplinesTxt,periodsTxt,spacesTxt,technologiesTxt,knowledgeTransfersTxt,RESPONSE=None):
+        """change it"""
+        self.approachesTxt=approachesTxt
+        self.disciplinesTxt=disciplinesTxt
+        self.periodsTxt=periodsTxt
+        self.spacesTxt=spacesTxt
+        self.technologiesTxt=technologiesTxt
+        self.knowledgeTransfersTxt=knowledgeTransfersTxt
+    
+        if RESPONSE is not None:
+            redirect(RESPONSE,'manage_main')
+     
+    #In der Anzeige soll der Name der zitierten Personen in Klartext angezeigt werden, ausserdem die Varianten, wie sie tatsaechlich
+    #in den Projekten benutzt werden
+    def collectPersonNamesToIds(self):
+        """finde Namen zu den personen ids"""
+        self.personIDtoNames=OOBTree() # loessche alle 
+        
+        for personID in self.persons2Projects:
+            mainName=self.getMainNameFromTripleStore(personID); # hole die hauptbezeichnung aus dem triplestore
+            
+            personNames=[]
+            for project in self.persons2Projects.get(personID):
+                #hole die personen aus dem projekte 
+                logging.debug("Found:project:"+project)
+                namesInProject = self.projectPersons.get(project)
+                
+                for nameInProjectTuple in namesInProject:
+                    logging.debug(repr(nameInProjectTuple))
+                    nameInProject=nameInProjectTuple[1]
+                    logging.debug(nameInProjectTuple[0]+"??"+personID)
+                    if nameInProjectTuple[0]==personID:
+                        logging.debug("changing")
+                        if mainName=="": # es gibt keinen Eintrag im Triplestore fuer name (sollte eigentlich nicht sein, ist dann ein Fehler dort)
+                            mainName=nameInProject #nimm dann aber den ersten aus den projekten
+                        if nameInProject!=mainName:
+                            personNames.append(nameInProject)
+            
+            logging.debug(str(mainName)+"- foundalso :"+",".join(personNames))
+            self.personIDtoNames.update({personID:(mainName,personNames)})
+                                         
+        self.personIDtoNames=self.personIDtoNames # make clear that it has changed #TODO: change this to variablen with names _p
+    
+    def getNamesFromID(self,personID):
+        retStr=""
+        retStr+=self.personIDtoNames.get(personID)[0] # hole die Hauptbezeichnung
+        additionalNames = self.personIDtoNames.get(personID)[1]
+        if len(additionalNames)>0:
+            retStr+=" ("+",".join(additionalNames)+","+")"
+        return retStr
+    
+        
+    def getMainNameFromTripleStore(self,personID):
+        
+        
+        cmdString ="""select * where { <%s> <http://xmlns.com/foaf/0.1/name> ?name}"""%personID
+    
+
+        auth_handler = urllib2.HTTPBasicAuthHandler()
+        auth_handler.add_password(realm='sparql',
+                          uri=self.virtuosoServer+"/sparql",
+                          user=self.virtuosoDAVUser,
+                          passwd=self.virtuosoDAVPW)
+                          
+        opener = urllib2.build_opener(auth_handler)
+        opener.addheaders = [('Content-Type','application/sparql-query')]
+        
+        logging.debug(cmdString)
+        try:
+            r= opener.open(self.virtuosoServer+"/sparql", urllib.urlencode({'query':cmdString,'default-graph-uri':self.virtuosoGraph,'named-graph-uri':None,'format':'text/csv'}))
+            namesTxt=r.read()
+        except urllib2.URLError, e:
+            logging.error(e.code)
+            logging.error(e.read())
+            return
+        
+        names=namesTxt.split("\n")
+        if len(names) < 2: #in der ersten Zeile stehen bei der Rückgabe die Spaltennamen, <2 heiss also es gibt keinen Eintrag
+            return
+         
+        return names[1].replace('"','') # wir nehmen nur den ersten treffer
+         
+            
+    def changeTags(self,projectID,approaches=[],disciplines=[],periods=[],spaces=[],technologies=[],transfers=[],RESPONSE=None):
+        """change tags"""
+        self.changeTagFromList(projectID,"approaches", approaches)
+        self.changeTagFromList(projectID,"disciplines", disciplines)
+        self.changeTagFromList(projectID,"periods", periods)
+        self.changeTagFromList(projectID,"spaces", spaces)
+        self.changeTagFromList(projectID,"technologies", technologies)
+        self.changeTagFromList(projectID,"transfers", transfers)
+        
+        self.projectObjects=self.projectObjects #necessesary to make the object persistent after the first call
+        self.projectHistoricalPlaces=self.projectHistoricalPlaces #necessesary to make the object persistent after the first call
+        self.projectPersons=self.projectPersons #necessesary to make the object persistent after the first call
+        self.projectSuggestedTags=self.projectSuggestedTags
+        
+        self.persons2Projects=self.persons2Projects
+        self.object2Projects=self.object2Projects
+        self.historicalPlaces2Projects=self.historicalPlaces2Projects
+        self.suggestedTags2Projects=self.suggestedTags2Projects;
+        
+        self.suggestedPersons=self.suggestedPersons;
+        
+    def deleteAllTags(self):
+        """deleteAllTags - TODO: take this out!!,"""
+        setattr(self,"tags",None)
+        
+        return "DONE!"
+    
+    def deleteAllPersons(self):
+        """deleteAllTags - TODO: take this out!!,"""
+        self.projectPersons= OOBTree()
+        self.persons2Projects= OOBTree()
+        self.personIDtoNames=OOBTree()
+        self.suggestedPersons= OOBTree(); #TODO: das sollte die ueberfluessig werde und nur im triple store stehen.
+    
+        
+        return "DONE!"
+    def changeTagFromList(self,projectID,tagType,tagList):
+        
+        logging.debug("changing:"+projectID)
+        logging.debug("asking tag::"+tagType)
+        if type(tagList) is not ListType:
+            tagList=[tagList]
+        
+    
+        tags = getattr(self,"tags",None)
+        if tags is None:
+            logging.debug("Create new tags")
+            tags=OOBTree()
+            setattr(self,"tags",tags)
+        
+    
+        tagsStored=tags.get(tagType,None)
+        if tagsStored is None:
+            tagsStored=OOBTree();
+        
+        
+        
+        for tag in tagsStored.keys(): #gehe durch alle gespeichteren tags
+            logging.debug("checking:"+tag)
+            currentApproach = tagsStored.get(tag,None)
+            logging.debug(currentApproach)
+            if currentApproach is None:
+                currentApproach=OOSet()
+            
+            if tag in tagList: #dieser ist getagged
+                currentApproach.update([projectID]);
+                tagList.remove(tag); 
+            else:
+                if currentApproach.has_key(projectID):
+                    currentApproach.remove(projectID);
+                
+            tagsStored.update({tag:currentApproach});
+        
+        for tag in tagList: # alle die nich nicht abearbeitet worden muessen noch angelegt werden
+            logging.debug("adding:"+tag)
+            newApproach=OOSet()
+            newApproach.update([projectID]);
+            tagsStored.insert(tag, newApproach);
+        
+        tags.update({tagType:tagsStored})
+        
+        transaction.commit()
+        
+    def getTitle(self,entry):
+        return entry.title
+    
+    def getEntries(self,entry):
+        return entry.entries
+    
+    def getEntriesFromTxt(self,txt):
+        apps=[]
+        lines=txt.split("\n");
+        level=False
+        for line in lines:
+            line=line.rstrip().lstrip()
+            if line=="":
+                continue
+            if line=="---":
+                
+                if level:
+                    level=False
+                else:
+                    level=True
+            else:
+                if not level:
+                    entry=Entry(line,[])
+                    apps.append(entry)
+                else:
+                    entry.entries.append(Entry(line))
+                
+        return apps[0:]
+    
+    def getApproaches(self):
+        
+        self.tagList=self.getEntriesFromTxt(self.approachesTxt)    
+        return self.tagList
+    
+    def getTagsJSON(self,projectID,tagType,RESPONSE=None):
+        """get all selected tagList"""
+        logging.debug("asking:"+projectID)
+        logging.debug("asking tag::"+tagType)
+        retList=[]
+        tags = getattr(self,"tags",None)
+        if tags is None:
+            return;
+        
+        tagsStored=tags.get(tagType,None)
+        if tagsStored is None:
+            return;
+        
+        for tag in tagsStored.keys(): #gehe durch alle gespeichteren approached
+            logging.debug("checking:"+tag)
+            currentTag = tagsStored.get(tag,None)
+            if currentTag is None:
+                continue
+            if currentTag.has_key(projectID):
+                retList.append(""" "%s" """%tag)
+        
+        if RESPONSE:
+            RESPONSE.setHeader('Content-Type', "application/json")
+        
+        logging.debug(retList)
+        return "["+",".join(retList)+"]"
+    
+    def getDisciplines(self):
+        
+        self.disciplines=self.getEntriesFromTxt(self.disciplinesTxt)    
+        return self.disciplines
+    
+    
+    def getObjectsJSON(self,term="",RESPONSE=None):
+        """ get all stored objects as json list starting with term"""
+        term=term.lower();
+        logging.debug("Asking:"+term)
+        #objectList=["baus","berg","lurg"]
+        objects = self.objects2Projects;
+
+        objectList= [x for x in objects.keys()]   
+       
+        logging.debug("Create:"+repr(objectList))    
+        retList=[]
+        for object in objectList:
+            if object.find(term)>-1:
+                retList.append(""" "%s" """%object)
+        ret="["
+        ret+=",".join(retList)
+        ret+="]"
+        logging.debug("Objects:"+ret)
+        if RESPONSE:
+            RESPONSE.setHeader('Content-Type', "application/json")
+        return ret
+        
+        
+    def getHistoricalPlacesJSON(self,term="",RESPONSE=None):
+        """ get all stored historicalPlaces as json list starting with term"""
+        term=term.lower();
+        logging.debug("Asking:"+term)
+        #historicalPlaceList=["baus","berg","lurg"]
+        historicalPlaces = self.historicalPlaces2Projects;
+
+        historicalPlaceList= [x for x in historicalPlaces.keys()]   
+       
+        logging.debug("Create:"+repr(historicalPlaceList))    
+        retList=[]
+        for historicalPlace in historicalPlaceList:
+            if historicalPlace.find(term)>-1:
+                retList.append(""" "%s" """%historicalPlace)
+        ret="["
+        ret+=",".join(retList)
+        ret+="]"
+        logging.debug("historicalPlaces:"+ret)
+        if RESPONSE:
+            RESPONSE.setHeader('Content-Type', "application/json")
+        return ret
+        
+        
+    def getPeriods(self):
+        
+        self.periodes=self.getEntriesFromTxt(self.periodsTxt)    
+        return self.periodes
+    
+    def getSpaces(self):
+        
+        self.spaces=self.getEntriesFromTxt(self.spacesTxt)    
+        return self.spaces
+    
+    def getTechnologies(self):
+        
+        self.technologies=self.getEntriesFromTxt(self.technologiesTxt)    
+        return self.technologies
+    
+    def getKnowledgeTransfers(self):
+        
+        self.knowledgeTransfers=self.getEntriesFromTxt(self.knowledgeTransfersTxt)    
+        return self.knowledgeTransfers
+    
+    
+    def getObjectsFromProject(self,projectID):
+        return self.getFromProject(self.projectObjects,projectID);
+    
+    def getHistoricalPlacesFromProject(self,projectID):
+        return self.getFromProject(self.projectHistoricalPlaces,projectID);
+    
+    def getSuggestedTagsFromProject(self,projectID):
+        return self.getFromProject(self.projectSuggestedTags,projectID);
+ 
+    
+    def getPersonsFromProject(self,projectID):
+        return self.getFromProject(self.projectPersons,projectID);
+    
+    def getFromProject(self,objects,projectID):  
+        if objects.has_key(projectID):
+            logging.debug("key exists:"+projectID)
+            persons=objects.get(projectID);
+        else:
+            persons=OOSet()
+            objects.update({projectID:persons})
+            logging.debug("key does not exists:"+projectID)
+            
+        
+        return persons
+    
+    def getHistoricalPlacesFromProjectAsHTML(self,projectID):
+        """gertobjects"""
+        return self.getFromProjectAsHTML(self.projectHistoricalPlaces, projectID, "HistoricalPlace");
+ 
+    def getObjectsFromProjectAsHTML(self,projectID):
+        """gertobjects"""
+        return self.getFromProjectAsHTML(self.projectObjects, projectID, "Object");
+    
+    def getPersonsFromProjectAsHTML(self,projectID):
+        """getpersons"""
+        return self.getFromProjectAsHTML(self.projectPersons, projectID, "Person");
+       
+        
+    def getFromProjectAsHTML(self,objects,projectID,type):
+        """getpersons"""
+        ret=""
+        if objects.has_key(projectID):
+            persons=objects.get(projectID);
+        else:
+            persons=OOSet()
+            
+        
+        for person in persons:
+            ret+="""<div class="removeButton">
+        <span>%s </span><div style="display:inline" class="remove%s"><span style="display:none" class="removeValue">%s</span>remove</div>
+        </div>"""%(person[1],type,person[0])
+            
+            
+#            ret+="""<div>
+#        <input type="checkbox" name="persons_remove"
+#         value="%s">
+#        <span>%s</span>
+#        </div>"""%(person[0],person[1])
+#        
+        logging.debug(type+":"+ret)
+        return ret
+    
+    
+    def removeHistoricalPlaceFromProject(self,projectID,value):
+        """remove"""
+        logging.debug("removeHP:"+projectID+":"+value);
+        
+        HistoricalPlaces = self.getHistoricalPlacesFromProject(projectID)
+        for HistoricalPlace in HistoricalPlaces.keys():
+           
+            logging.debug("trying:"+repr(HistoricalPlace[0])+"::"+repr(value)+"__")
+            if HistoricalPlace[0]==value:
+                logging.debug("---removed!")
+                HistoricalPlaces.remove(HistoricalPlace)
+        
+        self.projectHistoricalPlaces.update({projectID:HistoricalPlaces})
+        retstring = self.getHistoricalPlacesFromProjectAsHTML(projectID)
+        logging.debug(retstring)
+        return retstring
+    
+    def removeObjectFromProject(self,projectID,value):
+        """remove"""
+        logging.debug("remove:"+projectID+":"+value);
+        
+        objects = self.getObjectsFromProject(projectID)
+        for object in objects.keys():
+           
+            logging.debug("trying:"+repr(object[0])+"::"+repr(value)+"__")
+            if object[0]==value:
+                logging.debug("---removed!")
+                objects.remove(object)
+        
+        self.projectObjects.update({projectID:objects})
+        retstring = self.getObjectsFromProjectAsHTML(projectID)
+        logging.debug(retstring)
+        return retstring
+    
+    def removePersonFromProject(self,projectID,value):
+        """remove"""
+        logging.debug("remove:"+projectID+":"+value);
+        
+        persons = self.getPersonsFromProject(projectID)
+        for person in persons.keys():
+           
+            logging.debug("trying:"+repr(person[0])+"::"+repr(value)+"__")
+            if person[0]==value:
+                logging.debug("---removed!")
+                persons.remove(person)
+        
+        self.projectPersons.update({projectID:persons})
+        retstring = self.getPersonsFromProjectAsHTML(projectID)
+        logging.debug(retstring)
+        return retstring
+    
+    #fuegt die neue Person zur personIDtoNames hinzu, für die spätere Anzeige in der Personenliste
+    def addNameTOPersonIDNames(self,personID,label):
+        personName = self.personIDtoNames.get(personID)
+        if personName==None: # Anlegen falls noch nicht existent
+            personName=(label,[])
+        else:
+            if (not label in personName[1]) and (not label==personName[0]): # hinzufuegen falls der neuen name noch nicht als bezeichnugn fuer personID eingetragen ist
+                personName[1].append(label) 
+    
+        self.personIDtoNames.update({personID:personName})
+        
+        
+    def addPersonToProject(self,projectID,value,label):
+        """ add a person so the project"""
+        persons=self.getPersonsFromProject(projectID);
+        
+        logging.debug("adding:"+projectID+":"+value+":"+label);
+      
+        persons.insert([value,label])
+        self.projectPersons.update({projectID:persons})
+        
+        for personTuple in persons:
+            #hole die abgespeicherten Projekte zu einer Person
+            person=personTuple[0] #hole die ID
+            
+            
+            if getattr(self,"persons2Projects",None)==None:
+                setattr(self,"persons2Projects",OOBTree())
+         
+            projects = self.persons2Projects.get(person,None)
+                   
+            if projects==None:
+                projects=OOSet();
+            
+            projects.insert(projectID )
+            logging.debug("update:"+person)
+            self.persons2Projects.update({person:projects})
+        
+        self.addNameTOPersonIDNames(value,label)
+        retstring = self.getPersonsFromProjectAsHTML(projectID)
+        logging.debug(retstring)
+        transaction.commit()
+        return retstring
+    
+    def getPersonsWithProjectIDs(self):
+        """holt die getaggted Personen mit Projekten"""
+        persons = self.persons2Projects;
+        ret={}
+        logging.debug("Check Person:"+repr(persons.keys()))
+        for person in persons.keys():
+            logging.debug("Check:"+person)
+            #TODO: person muss duch den namen von provuder geholt werden
+            list=[]
+            for projectID in persons.get(person):
+                list.append(self.getProjectDetails(projectID))
+            
+            ret[person]=list[0:]
+        return ret
+    
+    def getHistoricalPlacesWithProjectIDs(self):
+        """holt die getaggted Personen mit Projekten"""
+        HistoricalPlaces = self.HistoricalPlaces2Projects;
+        ret={}
+        logging.debug("Check HistoricalPlace:"+repr(HistoricalPlaces.keys()))
+        for HistoricalPlace in HistoricalPlaces.keys():
+            logging.debug("Check:"+HistoricalPlace)
+            #TODO: HistoricalPlace muss duch den namen von provuder geholt werden
+            list=[]
+            for projectID in HistoricalPlaces.get(HistoricalPlace):
+                list.append(self.getProjectDetails(projectID))
+            
+            ret[HistoricalPlace]=list[0:]
+        return ret
+    
+    def getObjectsWithProjectIDs(self):
+        """holt die getaggted Personen mit Projekten"""
+        objects = self.objects2Projects;
+        ret={}
+        logging.debug("Check Object:"+repr(objects.keys()))
+        for object in objects.keys():
+            logging.debug("Check:"+object)
+            #TODO: object muss duch den namen von provuder geholt werden
+            list=[]
+            for projectID in objects.get(object):
+                list.append(self.getProjectDetails(projectID))
+            
+            ret[object]=list[0:]
+        return ret
+    
+    def listAllSuggestedTags(self):
+        """list all tags"""
+        ret="<html><body>"
+        for projectID in self.projectSuggestedTags:
+            ret+="<h3>"+projectID+"</h3><table>"
+            for tags in self.projectSuggestedTags.get(projectID):
+                ret+="<tr><td>"+tags[0]+"</td><td>"+tags[1].type+"</td><td>"+tags[1].comment+"</td><td>"+tags[1].userName+"</td></tr>"
+            ret+="</table>"
+        ret+="</body></html>"
+        logging.debug(ret);
+        return ret
+        
+    def suggestTag(self,projectID,tagName,tagComment,tagType,tagUserName):
+        """suggest a new tag"""
+        """ add a person so the project"""
+        SuggestedTags=self.getSuggestedTagsFromProject(projectID);
+        
+        logging.debug("suggested:"+projectID+":"+tagName);
+        
+     
+        #TODO: Im moment noch keine Zuordnung zu einer ID.
+        newTag = SuggestedTag(tagName,tagComment,tagType,tagUserName)
+        SuggestedTags.insert([tagName,newTag])
+        self.projectSuggestedTags.update({projectID:SuggestedTags})
+        
+       
+        
+        for SuggestedTagTuple in SuggestedTags:
+            #hole die abgespeicherten Projekte zu einer Person
+            person=SuggestedTagTuple[0] #hile die ID
+            
+            
+            if getattr(self,"SuggestedTags2Projects",None)==None:
+                setattr(self,"SuggestedTags2Projects",OOBTree())
+         
+            projects = self.SuggestedTags2Projects.get(person,None)
+                   
+            if projects==None:
+                projects=OOSet();
+            
+            projects.insert(projectID )
+            logging.debug("update:"+person)
+            self.SuggestedTags2Projects.update({person:projects})
+        
+        
+        
+        #retstring = self.getSuggestedTagsFromProjectAsHTML(projectID)
+        #logging.debug(retstring)
+        
+        
+        
+        #return retstring
+        
+    
+    def addHistoricalPlaceToProject(self,projectID,value):
+        """ add a person so the project"""
+        HistoricalPlaces=self.getHistoricalPlacesFromProject(projectID);
+        
+        logging.debug("adding:"+projectID+":"+value);
+        
+     
+        #TODO: Im moment noch keine Zuordnung zu einer ID.
+        HistoricalPlaces.insert([value,value])
+        self.projectHistoricalPlaces.update({projectID:HistoricalPlaces})
+        
+       
+        
+        for HistoricalPlaceTuple in HistoricalPlaces:
+            #hole die abgespeicherten Projekte zu einer Person
+            person=HistoricalPlaceTuple[0] #hile die ID
+            
+            
+            if getattr(self,"HistoricalPlaces2Projects",None)==None:
+                setattr(self,"HistoricalPlaces2Projects",OOBTree())
+         
+            projects = self.HistoricalPlaces2Projects.get(person,None)
+                   
+            if projects==None:
+                projects=OOSet();
+            
+            projects.insert(projectID )
+            logging.debug("update:"+person)
+            self.HistoricalPlaces2Projects.update({person:projects})
+        
+        
+        
+        retstring = self.getHistoricalPlacesFromProjectAsHTML(projectID)
+        logging.debug(retstring)
+        
+        
+        
+        return retstring
+    
+    def addObjectToProject(self,projectID,value):
+        """ add a person so the project"""
+        objects=self.getObjectsFromProject(projectID);
+        
+        logging.debug("adding:"+projectID+":"+value);
+        
+     
+        #TODO: Im moment noch keine Zuordnung zu einer ID.
+        objects.insert([value,value])
+        self.projectObjects.update({projectID:objects})
+        
+       
+        
+        for objectTuple in objects:
+            #hole die abgespeicherten Projekte zu einer Person
+            person=objectTuple[0] #hile die ID
+            
+            
+            if getattr(self,"objects2Projects",None)==None:
+                setattr(self,"objects2Projects",OOBTree())
+         
+            projects = self.objects2Projects.get(person,None)
+                   
+            if projects==None:
+                projects=OOSet();
+            
+            projects.insert(projectID )
+            logging.debug("update:"+person)
+            self.objects2Projects.update({person:projects})
+        
+        
+        
+        retstring = self.getObjectsFromProjectAsHTML(projectID)
+        logging.debug(retstring)
+        
+        
+        
+        return retstring
+    
+    
+    def getProjectsWithTag(self,tagType,tagName):
+        tags = getattr(self,"tags",None)
+        if tags is None:
+            logging.debug("can't find Tags")
+            return []
+            
+        
+    
+        tagsStored=tags.get(tagType,None)
+        if tagsStored is None:
+            logging.debug("can't find Tag:"+tagType)
+            return []
+        
+        projects = tagsStored.get(tagName,None)
+        if projects is None:
+            logging.debug("can't find any projects for Tag:"+tagName+"("+tagType+")")
+            return []
+        
+        ret=[]
+        for project in projects:
+            logging.debug("found:"+project)
+            ret.append(self.getProjectDetails(project))
+
+        return ret
+    
+    def getProjectDetails(self,getID):
+        project=getattr(self.www_neu.projects,getID,None)
+        if project is None:
+            logging.debug("no project!! " +getID)
+            return
+        
+        link="/en/research/projects/"+getID
+        
+        title=project.getContent("short_title")
+        #persons=project.getPersonKeyList()
+        persons=project.getContent('xdata_01')
+        logging.debug("%s %s %s"%(link,title,persons))
+        return link,title,persons
+    
+#        $.post("addNewPerson",{"projectID":
+#                     $('#projectID').val(),
+#                     "personName":$("#suggest_newPerson").val(),
+#                     "personComment":$("#suggest_newPerson_comment").val()}
+#               
+#              );         
+#    
+
+    def addAndCreateNewPerson(self,projectID,personName,personComment,personUserName):
+        """adds anew person to the project which is not in the authority file"""
+        
+        id = random.randint(0, 1000000); 
+        idstring="http://ontologies.mpiwg-berlin.mpg.de/tempObjects/person/"+str(id)
+        while self.suggestedPersons.has_key(idstring):
+            id = random.randint(0, 1000000); 
+            #idstring="http://ontologies.mpiwg-berlin.mpg.de/tempObjects/person/"+str(id);
+            idstring=self.TEMP_PERSON_NS+str(id);
+            
+            
+        self.suggestedPersons.update({idstring:(personName,personComment,projectID,personUserName)})
+        self.createTempPersonInVirtuoso(projectID, idstring, personName, personComment) #TODO: add suername to the triplestore
+        return self.addPersonToProject(projectID, idstring, personName);
+        
+    def createTempPersonInVirtuoso(self,projectID,personURI, personName,personComment):
+        """add a new person to the triple store of tempory persons"""
+        triples=[];
+        personID="<"+personURI+">"
+        triples.append((personID,"<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>","<http://ontologies.mpiwg-berlin.mpg.de/authorities/namedIdentities/Person>"))
+        triples.append((personID,"<http://erlangen-crm.org/110404/P3_has_note>",'"'+personComment+'"'))
+        triples.append((personID,"<http://xmlns.com/foaf/0.1/name>",'"'+personName+'"'))
+        triples.append((personID,"<http://ontologies.mpiwg-berlin.mpg.de/general/isMentionedOn>","<http://www.mpiwg-berlin.mpg.de/en/research/projects/"+projectID+">"))
+        
+        cmdString ="insert in GRAPH <"+self.virtuosoGraph+">  {"
+        for triple in triples:
+            cmdString+=" ".join(triple)+"."
+        
+        cmdString+="}"
+
+        auth_handler = urllib2.HTTPBasicAuthHandler()
+        auth_handler.add_password(realm='sparql',
+                          uri=self.virtuosoServer+"/sparql",
+                          user=self.virtuosoDAVUser,
+                          passwd=self.virtuosoDAVPW)
+                          
+        opener = urllib2.build_opener(auth_handler)
+        opener.addheaders = [('Content-Type','application/sparql-query')]
+        
+        logging.debug(cmdString)
+        try:
+            r= opener.open(self.virtuosoServer+"/sparql", urllib.urlencode({'query':cmdString,'default-graph-uri':self.virtuosoGraph,'named-graph-uri':None}))
+            logging.debug(r.read())
+        except urllib2.URLError, e:
+            logging.error(e.code)
+            logging.error(e.read())
+            return
+        
+        opener2 = urllib2.build_opener()
+        
+       
+        personIDencoded=urllib.quote(personURI,safe="")
+        graphEncoded=urllib.quote(self.additionalNamesGraphURL,safe="")
+        url = self.personproviderURL+"id/"+personIDencoded+"/"+graphEncoded
+         
+        try:
+            request = urllib2.Request(url);
+            request.get_method = lambda : 'PUT'
+            r= opener2.open(request);
+            logging.debug(r.read())
+        except urllib2.URLError, e:
+            logging.error(e.code)
+            logging.error(e.read())
+            return
+        
+                    
+       
+        return
+        
+def redirect(RESPONSE,url):
+        """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen"""
+        
+        timeStamp=time.time()
+        
+        if url.find("?")>-1: #giebt es schon parameter
+            addStr="&time=%s"
+        else:
+            addStr="?time=%s"
+            
+        RESPONSE.setHeader('Last-Modified',email.Utils.formatdate().split("-")[0]+'GMT')
+        logging.error(email.Utils.formatdate()+' GMT')
+        RESPONSE.redirect(url+addStr%timeStamp)
+        
+def manage_addMPIWGThesaurusForm(self):
+    """form for adding the project"""
+    pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addMPIWGThesaurusForm.zpt')).__of__(self)
+    return pt()
+
+
+
+def manage_addMPIWGThesaurus(self,id,RESPONSE=None):
+    """add it"""
+    newObj=MPIWGThesaurus(id)
+
+    self._setObject(id,newObj)
+
+
+    if RESPONSE is not None:
+        redirect(RESPONSE,'manage_main')
\ No newline at end of file