diff MPIWGThesaurus.py @ 45:efdbe9eb2403

thesaurus jetzt in datenbank
author dwinter
date Mon, 25 Nov 2013 08:12:11 +0100
parents a30307377ed9
children 7c1782d65c9b cb20308fe412
line wrap: on
line diff
--- a/MPIWGThesaurus.py	Wed Nov 06 15:03:36 2013 +0100
+++ b/MPIWGThesaurus.py	Mon Nov 25 08:12:11 2013 +0100
@@ -4,7 +4,6 @@
 #Fuer die Suche ueber die Personenname wird das MetaDataManagerRestlet benoetigt.
 #TODO: Zur Zeit werden die entsprechenden Server URLs hier in der Klasse definiert.
 
-
 # TODO: generell verwaltung der tags im triple store und nicht in zope.
 # TODO: mache server und namespaces konfigurierbar im project
 
@@ -15,6 +14,7 @@
 from BTrees.OOBTree import OOBTree
 from BTrees.OOBTree import OOSet
 from AccessControl import ClassSecurityInfo
+from Products.ZDBInterface.ZDBInterfaceFolder import ZDBInterfaceFolder
 
 #import os
 import re
@@ -27,6 +27,7 @@
 import random
 import urllib2
 import urllib
+import json
 
 from SrvTxtUtils import utf8ify
 
@@ -68,7 +69,7 @@
         self.userName=userName
         
 
-class MPIWGThesaurus(Folder):
+class MPIWGThesaurus(ZDBInterfaceFolder, Folder):
     """MPIWGThesaurus main folder"""
     security=ClassSecurityInfo()
 
@@ -96,17 +97,17 @@
     
     #BTrees fuer die Tags
     
-    projectPersons= OOBTree() #project --> personen IDs
-    projectObjects= OOBTree() #project --> objects
-    projectHistoricalPlaces= OOBTree()
+    #projectPersons= OOBTree() #project --> personen IDs
+    #projectObjects= OOBTree() #project --> objects
+    #projectHistoricalPlaces= OOBTree()
     projectSuggestedTags= OOBTree()
-    persons2Projects= OOBTree() #personenID --> projects
-    objects2Projects=OOBTree() #objects --> projects
-    historicalPlaces2Projects=OOBTree()
+    #persons2Projects= OOBTree() #personenID --> projects
+    #objects2Projects=OOBTree() #objects --> projects
+    #historicalPlaces2Projects=OOBTree()
     suggestedTags2Projects=OOBTree()
-    personIDtoNames=OOBTree() # weist den personenIDs Klartextnamen aus dem Triplestore zu
-    personsIDForSort=[] # liste personenID sortiert nach dem tupel (nachname,vorname)
-    personsIDForSortFull=[] # liste (personenID,(nachname,vorname)) nicht sortiert!
+    ##personIDtoNames=OOBTree() # weist den personenIDs Klartextnamen aus dem Triplestore zu
+    ##personsIDForSort=[] # liste personenID sortiert nach dem tupel (nachname,vorname)
+    ##personsIDForSortFull=[] # liste (personenID,(nachname,vorname)) nicht sortiert!
    
     suggestedPersons= OOBTree(); #TODO: das sollte die ueberfluessig werde und nur im triple store stehen.
     
@@ -176,7 +177,7 @@
     
     
     
-    manage_options = Folder.manage_options+(
+    manage_options = ZDBInterfaceFolder.manage_options+(
         {'label':'Thesaurus entries','action':'changeMPIWGThesaurusForm'},
         {'label':'Manage Thesaurus','action':'manageMPIWGThesaurus'},
         {'label':'Thesaurus Log','action':'manageMPIWGThesaurusLogs'},
@@ -327,7 +328,24 @@
                 
         return ret
     
-
+    def getTags(self,projectID,projectTags,RESPONSE=None):
+        """get all selected tagList"""
+        
+        #projectTags = self.getProjectsAndTags()
+        #logging.debug(projectTags)
+        
+        project = projectTags.get(projectID)
+        if project is None:
+            project = projectTags.get("/en/research/projects/"+projectID) #TODO fix this projectTag list from getProjectsAndTags()contains  fullpath
+        if project is None:
+            return []    
+        retarray=[]    
+        for tagType in self.tags.keys():
+                tags = project.tags.get(tagType,[''])
+                retarray.append(utf8ify(";".join(tags)))
+            
+            
+        return retarray 
     def getAllProjectsAndTagsAsCSV(self,active=0,archived=0,RESPONSE=None):
         """alle projekte auch die nicht getaggten"""
         retList=[]
@@ -353,9 +371,9 @@
             retProj.append(utf8ify(getattr(proj,'creationTime','20050101000000')))  
             retProj.append("")#TODO: project created at
             retProj.append(str(proj.isActiveProject()))
-            retProj.append(";".join([person[1] for person in self.getPersonsFromProject(proj.getId())]))
+            #retProj.append(";".join([person[1] for person in self.getPersonsFromProject(proj.getId())]))
             #retProj.append(";".join([person[1] for person in self.thesaurus.getHistoricalPlacesFromProject(proj.getId())]))
-            retProj.append(";".join([person[1] for person in self.getObjectsFromProject(proj.getId())]))
+            #retProj.append(";".join([person[1] for person in self.getObjectsFromProject(proj.getId())]))
             retProj+=self.getTags(proj.getId(),projectTags)
             retList.append("\t".join(retProj))
         
@@ -408,92 +426,92 @@
     #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 addPersonAndFirstNameFromTripleStore(self, personID):
-        mainName, sortName = self.getMainNameFromTripleStore(personID) # hole die hauptbezeichnung aus dem triplestore
-        personNames = []
-        logging.debug("get person:"+ personID)
-        logging.debug("names:"+repr(mainName)+":"+ repr(sortName))
-        
-        projects=self.persons2Projects.get(personID)
-        logging.debug(repr(projects))
-        if projects is None:
-            projects=[]
-            
-        for project in projects: #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.personsIDForSortFull.append((personID, sortName))
-        
-   
-   
-    def generateSortingOrderForPersonIDs(self):
-        def sort(x,y):
-            logging.debug("sort:")
-            logging.debug((x[1][0],y[1][0]))
-            return cmp(x[1][0],y[1][0])
-            
-        self.personsIDForSortFull.sort(cmp=sort)
-           
-        self.personsIDForSort=[x[0] for x in self.personsIDForSortFull]
-                                      
-        self.personIDtoNames=self.personIDtoNames # make clear that it has changed #TODO: change this to variablen with names _p
-    
-    security.declareProtected('View management screens','collectPersonNamesToIds')
-    def collectPersonNamesToIds(self):
-        """Ordne Namen aus dem Triplestore bzw. die vergebenenden Label den Personen-Ids zu."""
-        #sollte z.B. gemacht werden, wenn im Triplestore editiert wurde.
-        self.personIDtoNames=OOBTree() # loesche alle 
-        self.personsIDForSort=[]
-        self.personsIDForSortFull=[]
-        for personID in self.persons2Projects:
-            self.addPersonAndFirstNameFromTripleStore(personID)
-            
-          
-            
-                                    
-        #sortiere personIDs nach erstmal nach Nachnamene TODO: sortiere nach name,vorname
-        
-        self.generateSortingOrderForPersonIDs();
-#        def sort(x,y):
-#            logging.debug("sort:")
-#            logging.debug((x[1][0],y[1][0]))
-#            return cmp(x[1][0],y[1][0])
+# 
+#     def addPersonAndFirstNameFromTripleStore(self, personID):
+#         mainName, sortName = self.getMainNameFromTripleStore(personID) # hole die hauptbezeichnung aus dem triplestore
+#         personNames = []
+#         logging.debug("get person:"+ personID)
+#         logging.debug("names:"+repr(mainName)+":"+ repr(sortName))
+#         
+#         projects=self.persons2Projects.get(personID)
+#         logging.debug(repr(projects))
+#         if projects is None:
+#             projects=[]
+#             
+#         for project in projects: #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.personsIDForSortFull.append((personID, sortName))
+#         
+#    
+#    
+#     def generateSortingOrderForPersonIDs(self):
+#         def sort(x,y):
+#             logging.debug("sort:")
+#             logging.debug((x[1][0],y[1][0]))
+#             return cmp(x[1][0],y[1][0])
+#             
+#         self.personsIDForSortFull.sort(cmp=sort)
 #            
-#        self.personsIDForSortFull.sort(cmp=sort)
+#         self.personsIDForSort=[x[0] for x in self.personsIDForSortFull]
+#                                       
+#         self.personIDtoNames=self.personIDtoNames # make clear that it has changed #TODO: change this to variablen with names _p
+#     
+#     security.declareProtected('View management screens','collectPersonNamesToIds')
+#     def collectPersonNamesToIds(self):
+#         """Ordne Namen aus dem Triplestore bzw. die vergebenenden Label den Personen-Ids zu."""
+#         #sollte z.B. gemacht werden, wenn im Triplestore editiert wurde.
+#         self.personIDtoNames=OOBTree() # loesche alle 
+#         self.personsIDForSort=[]
+#         self.personsIDForSortFull=[]
+#         for personID in self.persons2Projects:
+#             self.addPersonAndFirstNameFromTripleStore(personID)
+#             
 #           
-#        self.personsIDForSort=[x[0] for x in self.personsIDForSortFull]
-#                                      
-#        self.personIDtoNames=self.personIDtoNames # make clear that it has changed #TODO: change this to variablen with names _p
-#    
-    #Hole die Namen, die einer personID zugeordnet sind.
-    def getNamesFromID(self,personID):
-        personID=personID.rstrip().lstrip() #make sure no spaces
-        logging.debug("<"+personID+">")
-        retStr=""
-        
-        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!!
-        #additionalNames = self.personIDtoNames.get(personID,['',[]])[1]
-        #if len(additionalNames)>0:
-        #    retStr+=" ("+",".join(additionalNames)+","+")"
-        return retStr
-    
-        
-    #Hole die Hauptnamemsansetzung aus dem Triplestore ),falls vorhanden, wenn nicht ist der String leer.
-    #ausserdem einen Namen zum sortieren, =  Tupel(nachname, vorname)
+#             
+#                                     
+#         #sortiere personIDs nach erstmal nach Nachnamene TODO: sortiere nach name,vorname
+#         
+#         self.generateSortingOrderForPersonIDs();
+# #        def sort(x,y):
+# #            logging.debug("sort:")
+# #            logging.debug((x[1][0],y[1][0]))
+# #            return cmp(x[1][0],y[1][0])
+# #            
+# #        self.personsIDForSortFull.sort(cmp=sort)
+# #           
+# #        self.personsIDForSort=[x[0] for x in self.personsIDForSortFull]
+# #                                      
+# #        self.personIDtoNames=self.personIDtoNames # make clear that it has changed #TODO: change this to variablen with names _p
+# #    
+#     #Hole die Namen, die einer personID zugeordnet sind.
+# #     def getNamesFromID(self,personID):
+# #         personID=personID.rstrip().lstrip() #make sure no spaces
+# #         logging.debug("<"+personID+">")
+# #         retStr=""
+# #         
+# #         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!!
+# #         #additionalNames = self.personIDtoNames.get(personID,['',[]])[1]
+# #         #if len(additionalNames)>0:
+# #         #    retStr+=" ("+",".join(additionalNames)+","+")"
+# #         return retStr
+# #     
+# #         
+#     #Hole die Hauptnamemsansetzung aus dem Triplestore ),falls vorhanden, wenn nicht ist der String leer.
+#     #ausserdem einen Namen zum sortieren, =  Tupel(nachname, vorname)
     def getMainNameFromTripleStore(self,personID):
         
         
@@ -582,7 +600,7 @@
             
     security.declareProtected('View management screens','changeTags')            
     def changeTags(self,projectID,approaches=[],disciplines=[],periods=[],spaces=[],technologies=[],transfers=[],RESPONSE=None):
-        """change tags"""
+        """Aendert die Tags im angegebenen Project"""
         self.changeTagFromList(projectID,"approaches", approaches)
         self.changeTagFromList(projectID,"disciplines", disciplines)
         self.changeTagFromList(projectID,"periods", periods)
@@ -591,13 +609,13 @@
         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.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.objects2Projects=self.objects2Projects
-        self.historicalPlaces2Projects=self.historicalPlaces2Projects
+        #self.historicalPlaces2Projects=self.historicalPlaces2Projects
         self.suggestedTags2Projects=self.suggestedTags2Projects;
         
         self.suggestedPersons=self.suggestedPersons;
@@ -605,7 +623,6 @@
     security.declareProtected('View management screens','deleteAllTags')                    
     def deleteAllTags(self):
         """deleteAllTags - TODO: take this out!!,"""
-        setattr(self,"tags",None)
         
         return "DONE!"
     
@@ -620,65 +637,139 @@
         
         return "DONE!"
     
-    security.declareProtected('View management screens','deleteAllObjects')                    
-    def deleteAllObjects(self):
-        """deleteAllTags - TODO: take this out!!,"""
-        logging.debug("delete all objects")
-        self.projectObjects= OOBTree()
-        self.objects2Projects=OOBTree()
-    
-        
-        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]
+        
+        #hole alle tags des projektID vom Typ tagaTyle
+        if isinstance(tagList,str):
+            tagList=[tagList]        
         
+        tggsOfProject = self.getTagsFromDB(projectID,tagType)
+        for tagOfProject in tggsOfProject:
+            if tagOfProject in tagList:
+                #schon getagged
+                #nichts mehr zu tun spater
+                tagList.remove(tagOfProject)
+            else:
+                #nicht mehr getaggt
+                #delete Entry from database
+                self.deleteTagInDB(projectID,tagType,tagOfProject)
+                
+        
+        
+        #in der taglList sind jetzt nur noch die Tags uebrig die hinzugegefuegt werden muessen
+        for tag in tagList:
+            self.addTagToDB(projectID,tagType=tagType,tag=tag)
+        
+        transaction.commit()
+    
     
-        tags = getattr(self,"tags",None)
-        if tags is None:
-            logging.debug("Create new tags")
-            tags=OOBTree()
-            setattr(self,"tags",tags)
+    def getTagsFromDB(self,projectID=None,tagType=None,startsWith=""):
+        # hole alle tags vom typ tagType des projectes mit ID
+        ql =[]
+        
+        if tagType is not None:
+            qs="select tag_name from thesaurus_tags where tag_type = %s"
+            ql.append(tagType)
+        else:
+            qs="select tag_name from thesaurus_tags"
+             
+        if projectID is not None:
+            qs=qs + " and id in (select tag_id as id from thesaurus_projects_tags where project_id = %s)"
+            ql.append(projectID)
+        
+        
+        res =self.executeZSQL(qs,ql)
+        
+        
+        if (startsWith is None) or (startsWith ==""):
+            ret = [r.tag_name for r in res]
+        else:
+            ret=[]
+            for r in res:
+                if r.tag_name.lower().startswith(startsWith):
+                    ret.append(r.tag_name)
+        
+        logging.debug(ret)
+        return ret
+    
+    
+    def deleteTagInDB(self,projectID,tagType,tag):
+        # loesche den tag von typ tagType aus der dem Project
+        
+        # first get tag_id
         
+        qs = "select id from thesaurus_tags where tag_type = %s and tag_name= %s"
+        logging.debug("DELETE")
+        ids = self.executeZSQL(qs,[tagType,tag])
+        
+        for idR in ids:
+            qs = "delete from thesaurus_projects_tags where project_id=%s and tag_id=%s"
+            self.executeZSQL(qs,[projectID,idR.id])
+            
+        logging.debug("DELETE-END")
+        return
     
-        tagsStored=tags.get(tagType,None)
-        if tagsStored is None:
-            tagsStored=OOBTree();
+    def addTagToDB(self,projectID,tagType=None,tag=None,tag_ID=None):
+        """fuege den tag vom typ tagType zum Project hinzu, wenn tag_ID wird zuerst genommen, die anderen Felder werden
+        nur genommen falls tag_ID None ist.
+        """
+
+        # schaue on es den tag schon gibt, wenn nicht anlegen
+        
+        if tag_ID is None and tagType is None and tag is None:
+            raise Exception("either tag_id or tag_type and tag shouldn't be None")
+        
+        
+        if tag_ID is not None:
+            qsSelect = "select id from thesaurus_tags where id = %s "
+            ids = self.executeZSQL(qsSelect,tag_ID)
+        else:
+            if tagType is None or tag is None:
+                raise Exception("tag_type and tag shouldn't be None")
+        
+            else:
+                qsSelect = "select id from thesaurus_tags where tag_type = %s and tag_name= %s"
+                ids = self.executeZSQL(qsSelect,[tagType,tag])
+      
+        
+        logging.debug(ids)
+        logging.debug(len(ids))
         
         
         
-        for tag in tagsStored.keys(): #gehe durch alle gespeichteren tags
-            logging.debug("checking:"+tag)
-            projectsOfTag = tagsStored.get(tag,None)
-            logging.debug(projectsOfTag)
-            if projectsOfTag is None:
-                projectsOfTag=OOSet()
-            
-            if tag in tagList: #dieser ist getagged
-                projectsOfTag.update([projectID]);
-                self.storeChange("added",projectID,tag)
-                tagList.remove(tag); 
+        
+        if len(ids) == 0:
+            if tag_ID is None:
+                qs = "insert into thesaurus_tags (tag_type,tag_name) values (%s,%s)"
+                self.executeZSQL(qs,[tagType,tag]) # anlegen
+                transaction.commit()
+                ids = self.executeZSQL(qsSelect,[tagType,tag]) #ids holen
+                
             else:
-                if projectsOfTag.has_key(projectID):
-                    projectsOfTag.remove(projectID);
-                    self.storeChange("remove",projectID,tag)
-                    
-            tagsStored.update({tag:projectsOfTag});
+                raise Exception("no tag with tag_id: %s"%tag_ID)
+      
+    
+        for idResult in ids:
+
+            #check if already in
+            qsSelect = "select id from thesaurus_projects_tags where project_id = %s and tag_id= %s"
+            
+            tag_ids = self.executeZSQL(qsSelect,[projectID,idResult.id])
+            
+            if len (tag_ids) ==  0:
+                        
+                qs="insert into thesaurus_projects_tags (project_id,tag_id) values (%s,%s)"
+            
+                self.executeZSQL(qs,[projectID,idResult.id])
+            
         
-        for tag in tagList: # alle Tags, die nicht abgearbeitet worden sind, muessen noch angelegt werden
-            logging.debug("adding:"+tag)
-            newApproach=OOSet()
-            newApproach.update([projectID]);
-            tagsStored.insert(tag, newApproach);
+        
+        return ids[0].id #sollte eigentlich auch nur genau einen geben.
         
-        tags.update({tagType:tagsStored})
         
-        transaction.commit()
-        
+  
     def getTitle(self,entry):
         return entry.title
     
@@ -753,39 +844,26 @@
         """get all  tags as hash or None if no tag exists"""
         retHash={}
         
-        tagCnt=0
-        tags = getattr(self,"tags",None)
-        
-        if tags is None:
-            return;
-        
         #falls nicht gesetzt
         if tagType is None:
-            tagTypes = tags.keys()
+            
+            
+            tagTypes = [tag.tag_type for tag in self.executeZSQL("select distinct tag_type from thesaurus_tags")]
+            #tagTypes = tags.keys()
         else:
             tagTypes = [tagType]
         
+        tagCnt=0
         for tagType in tagTypes:
-            tagsStored=tags.get(tagType,None)
             
-            if tagsStored is None:
-                # WTF: was: return
-                continue
-            
-            retHash[tagType]=[]
+            #retHash[tagType]=[]
+            tagCnt=0
 
-            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):
-                    tagCnt+=1
-                    retHash[tagType].append("""%s"""%tag)
-                    
-            if len(retHash[tagType]) == 0:
-                # empty tag list
-                del retHash[tagType]
+            tags =self.getTagsFromDB(projectID, tagType)
+            if len(tags) !=0:
+                retHash[tagType] = [self.getLabel(tag,tagType) for tag in tags]
+                tagCnt+=1
+           
             
         if tagCnt==0:
             return None
@@ -796,135 +874,81 @@
     
     
     
-    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;
+    def getTagsJSON(self,projectID=None,tagType=None,startWith="",RESPONSE=None):
+        """get all selected tags returs them as a list"""
+ 
+        tags = self.getTagsFromDB(projectID, tagType,startWith)
         
-        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)+"]"
+        ret = json.dumps(tags)
+        
+        
+        logging.debug(ret)
+        return ret
     
     
     
   
-    def getTags(self,projectID,projectTags,RESPONSE=None):
-        """get all selected tagList"""
-        
-        #projectTags = self.getProjectsAndTags()
-        #logging.debug(projectTags)
-        
-        project = projectTags.get(projectID)
-        if project is None:
-            project = projectTags.get("/en/research/projects/"+projectID) #TODO fix this projectTag list from getProjectsAndTags()contains  fullpath
-        if project is None:
-            return []    
-        retarray=[]    
-        for tagType in self.tags.keys():
-                tags = project.tags.get(tagType,[''])
-                retarray.append(utf8ify(";".join(tags)))
-            
-            
-        return retarray       
-#        logging.debug("asking:"+projectID)
-#        
-#        
-#        apps = self.getApproaches()+ self.getDisciplines();
-#        retList=[]
-#        for tagType in self.tags.keys():
-#        
-#            logging.debug("asking tag::"+repr(tagType))
-#            
-#            tags = getattr(self,"tags",None)
-#            if tags is None:
-#                continue;
-#            
-#            tagsStored=tags.get(tagType,None)
-#            if tagsStored is None:
-#                continue;
-#            
-#            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 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"""
+    def getObjectsJSON(self,term="",RESPONSE=None):    
+        """ get all stored objects as json list starting with term, 
+        need this for autocompletion from JQUERY which ads ?term= to the URL"""
         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
+        
+        return self.getTagsJSON(tagType="object", startWith=term, RESPONSE=RESPONSE)
         
         
-    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
+#         
+#         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):
@@ -948,148 +972,149 @@
         return self.knowledgeTransfers
     
     
-    def getObjectsFromProject(self,projectID):
-        return self.getFromProject(self.projectObjects,projectID);
-    
-    def getHistoricalPlacesFromProject(self,projectID):
-        return self.getFromProject(self.projectHistoricalPlaces,projectID);
+#     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):
-        #hole alle personenID die zu einem Projekt gehoeren.
-        #zurueckgegeben wird ein OOSet()
-        return self.getFromProject(self.projectPersons,projectID);
-    
+#     def getPersonsFromProject(self,projectID):
+#         #hole alle personenID die zu einem Projekt gehoeren.
+#         #zurueckgegeben wird ein OOSet()
+#         return self.getFromProject(self.projectPersons,projectID);
+#     
     def getFromProject(self,objects,projectID): 
-        #holt die zu projectID gehoerigen objekte aus dem objects-set. 
+        #holt die zur projectID gehoerigen objekte aus dem objects-set. 
         #oder legt einen neuen leeren Satz zu dieser ProjektID an.
         #zuruecgegeben wird ein OOSet()
-        if objects.has_key(projectID): #wenn zu der ProjektID schon etwas abgespeichter ist, gieb es zurueck
+        if objects.has_key(projectID): #wenn zu der ProjektID schon etwas abgespeichter ist, gibt es zurueck
             logging.debug("key exists:"+projectID)
-            persons=objects.get(projectID);
+            entries=objects.get(projectID);
         else: # andernfalls lege einen neuen Satz an.
-            persons=OOSet()
-            objects.update({projectID:persons})
+            entries=OOSet()
+            objects.update({projectID:entries})
             logging.debug("key does not exists:"+projectID)
-            
-        
-        return persons
-    
-    def getHistoricalPlacesFromProjectAsHTML(self,projectID):
-        """gertobjects"""
-        return self.getFromProjectAsHTML(self.projectHistoricalPlaces, projectID, "HistoricalPlace");
+             
+         
+        return entries
+     
+#    def getHistoricalPlacesFromProjectAsHTML(self,projectID):
+#        """gertobjects"""
+#        return self.getFromProjectAsHTML(self.projectHistoricalPlaces, projectID, "HistoricalPlace");
  
     def getObjectsFromProjectAsHTML(self,projectID):
         """gertobjects"""
-        return self.getFromProjectAsHTML(self.projectObjects, projectID, "Object");
+        return self.getFromProjectAsHTML( projectID, "object");
     
     def getPersonsFromProjectAsHTML(self,projectID):
         """getpersons"""
-        return self.getFromProjectAsHTML(self.projectPersons, projectID, "Person");
+        return self.getFromProjectAsHTML(projectID, "person");
+       
+      
+    def getLabel(self,tag,tagType):
+        
+        qsSelect = "select tag_label from thesaurus_tags where tag_type = %s and tag_name= %s"
+     
+        ids = self.executeZSQL(qsSelect,[tagType,tag]) #ids holen
+        
+        
+        if len(ids)==0: #sollte eigentlich nicht sein
+            return None
+        
+        #es sollte nur genau einen geben, alle anderen werden ignoriert-
+        
+        if ids[0].tag_label is None or ids[0].tag_label == '':
+            return tag
+        
+        else:
+            return ids[0].tag_label
+        
+        
+        
+        
+        
+    def addLabel(self,tagID,label):
+        """Fuege zu einem tag mit tagID den Label hinzu"""
+        qs = "update thesaurus_tags set tag_label=%s where id=%s"
+        
+        self.executeZSQL(qs,[label,tagID]) # anlegen
+        transaction.commit()
+        
+        
        
         
-    def getFromProjectAsHTML(self,objects,projectID,type):
-        """getpersons"""
+  
+          
+    def getFromProjectAsHTML(self,projectID,tagType):
+        """Hole die Tags vom entsprechenden Tag-Type aus der Datenbank"""
         ret=""
-        if objects.has_key(projectID):
-            persons=objects.get(projectID);
-        else:
-            persons=OOSet()
+        
+        tags = self.getTagsFromDB(projectID, tagType, None);
+           
+        for tag in tags:
             
-        
-        for person in persons:
+            tagLabel = self.getLabel(tag,tagType)
+            
             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])
+        </div>"""%(tagLabel,tagType,tag)
             
             
 #            ret+="""<div>
-#        <input type="checkbox" name="persons_remove"
+#        <input tagType="checkbox" name="persons_remove"
 #         value="%s">
 #        <span>%s</span>
 #        </div>"""%(person[0],person[1])
 #        
-        logging.debug(type+":"+ret)
+        logging.debug(tagType+":"+ret)
         return ret
     
-    security.declareProtected('View management screens','removeHistoricalPlaceFromProject')                    
-    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
-    
+#     security.declareProtected('View management screens','removeHistoricalPlaceFromProject')                    
+#     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
+#     
     security.declareProtected('View management screens','removeObjectFromProject') 
     def removeObjectFromProject(self,projectID,value):
-        """remove"""
+        """remove an object from the list"""
         logging.debug("remove:"+projectID+":"+value);
         
         
         self.storeChange("removeObject",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.deleteTagInDB(projectID, "object", value)
         
-            #now also delete the project from the object.
-                objectsOfPerson=self.objects2Projects.get(object[0])
-               
-
-                if projectID in list(objectsOfPerson):
-                    objectsOfPerson.remove(projectID)
-                    #self.persons2Projects.update({person:projectsList})
-                    if (len(objectsOfPerson)==0): #loesche person aus der liste wenn keine Projekte dazu existieren.
-                        del self.objects2Projects[object[0]]
-             
-        self.projectObjects.update({projectID:objects})
         retstring = self.getObjectsFromProjectAsHTML(projectID)
         logging.debug(retstring)
         return retstring
     
+    
     security.declareProtected('View management screens','removePersonFromProject') 
     def removePersonFromProject(self,projectID,value):
         """remove a person from the projeckt"""
         logging.debug("remove:"+projectID+":"+value);
         self.storeChange("removePerson",projectID,value)
         
-        persons = self.getPersonsFromProject(projectID) # hole alle personen die mit dem Projekt verbunden sind.
-        for person in persons.keys():
-           
-            logging.debug("trying:"+repr(person[0])+"::"+repr(value)+"__")
-            if person[0]==value:#person ist die zuloeschende, dann raus damit
-            
-                logging.debug("---removed!")
-                persons.remove(person)
-                
-                #now also delete the project from the person.
-                projectsOfPerson=self.persons2Projects.get(person[0])
-                logging.debug(projectsOfPerson)
-                if projectID in list(projectsOfPerson):
-                    projectsOfPerson.remove(projectID)
-                    #self.persons2Projects.update({person:projectsList})
-                    if (len(projectsOfPerson)==0): #loesche person aus der liste wenn keine Projekte dazu existieren.
-                        del self.persons2Projects[person[0]]
-             
-                     
-        #self.projectPersons.update({projectID:persons})
+     
+        self.deleteTagInDB(projectID, "person", value)
+        
         retstring = self.getPersonsFromProjectAsHTML(projectID)
         logging.debug(retstring)
         return retstring
@@ -1111,34 +1136,14 @@
         """ add a person so the project"""
         self.storeChange("addPerson",projectID,value+":"+label)
         
-        persons=self.getPersonsFromProject(projectID);
-        
+                    
         logging.debug("adding:"+projectID+":"+value+":"+label);
       
-        persons.insert([value,label])
-        self.projectPersons.update({projectID:persons})
+        personID = self.addTagToDB(projectID, tagType="person", tag=value) ##lege neue Person an oder gib exitierende ID 
         
-        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)
-            logging.debug("found projects:"+ repr(projects))
-            if projects is None: #person hatte noch keine projekte
-                projects=OOSet();
-                
-            projects.insert(projectID )
-            logging.debug("update:"+person)
-            self.persons2Projects.update({person:projects})
-            
-            self.addPersonAndFirstNameFromTripleStore(person)
-            self.generateSortingOrderForPersonIDs();
-               
-        self.addNameTOPersonIDNames(value,label)
+        self.addLabel(personID,label)
+       
+       
         retstring = self.getPersonsFromProjectAsHTML(projectID)
         logging.debug(retstring)
         transaction.commit()
@@ -1146,155 +1151,155 @@
     
     
     
-    def rearangePersonIDsHTML(self,REQUEST=None):
-        """setze neue ID zu personen"""
-        ret=[]
-        for personID in self.persons2Projects.keys():
-            logging.debug(personID)
-            
-            masterID,name=self.findMasterIDAndName(personID.rstrip().lstrip())
-            logging.debug("        masterID -appending")
-            logging.debug(repr(name))
-            if len(name)==0:
-                name=['']
-            ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,name)[0]))   
-                                      
-    
-        if REQUEST:
-            pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','rearrangePersons.zpt')).__of__(self)
-            return pt(changeList=ret,lookupUrl=self.PERSONS_LOOKUP_URL,editURL=self.EDIT_URL);
-        else:
-            return ret; 
-        
-    def rearangePersonIDs(self,REQUEST):
-        """unify a list of persons"""
-        
-        argv=REQUEST.form;
-        logging.debug(repr(argv))
-        changes=argv['changes']
-        if isinstance(changes,str):
-            changes=[changes]
-        
-        changeList=self.rearangePersonIDsHTML()
-        personToMaster={}
-        logging.debug("changelist:"+repr(changeList))
-        #aendere person2project
-        for change in changes:
-            changeItem=changeList[int(change)];
-            masterID=argv['newID_'+change].lstrip().rstrip() #make sure no spaces
-            personID=changeItem[0]
-            
-            personToMaster[personID]=masterID
-            masterIDProjects = self.persons2Projects.get(masterID,None);
-            if masterIDProjects==None:
-                masterIDProjects=OOSet();
-                #ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,[''])[0]))   
-                
-            oldProjects= self.persons2Projects.get(personID)
-            logging.debug("personID:"+repr(personID))
-            logging.debug("masterID:"+repr(masterID))
-            logging.debug("keys:"+repr(self.persons2Projects.keys()))
-            logging.debug("oldProjects:"+repr(oldProjects))
-            masterIDProjects.update(oldProjects)
-            self.persons2Projects.update({masterID:masterIDProjects})
-            self.persons2Projects.pop(personID)
-            
-            self.addPersonAndFirstNameFromTripleStore(masterID) #addpersontotiplestore
-            
-            logging.debug("Change:" +personID+":"+ masterID)
-            
-            if personID!=masterID:
-                self.addSameAsRelationToTripleStore(personID,masterID)
-            
-        #aendere nun projectperson
-        logging.debug(personToMaster)
-        for project in self.projectPersons.keys():
-            personsNew=OOSet()
-            
-            persons=self.projectPersons.get(project)
-            for person in persons:
-                personsNew.insert([personToMaster.get(person[0],person[0]),person[1]])
-                logging.debug("REPLACE in:"+project+":" +repr(person)+" by "+ repr(personToMaster.get(person[0],person[0])))
-            self.projectPersons.update({project:personsNew})
-            
-        self.generateSortingOrderForPersonIDs(); #now sort the new names
-        return personToMaster
-    #fuehre personen zusammen die ueber owl:sameAs verbunden sind
-    def getUnifyPersonsList(self,REQUEST=None):
-        """vereinheitlichung der personen auf eine ID aus der GND, wenn moeglich"""
-        ret=[]
-        for personID in self.persons2Projects.keys():
-            masterID,name=self.findMasterIDAndName(personID)
-            logging.debug("masterID:"+masterID)
-            if (masterID is not None) and (masterID is not "") and (not personID==masterID):
-                #masterIDProjects = self.persons2Projects.get(masterID,None);
-                ##if masterIDProjects==None:
-                #    masterIDProjects=OOSet();
-                logging.debug("        masterID -appending")
-                logging.debug(repr(name))
-
-            
-                ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,name)[0]))   
-                #masterIDProjects.update(self.persons2Projects.get(personID));
-                #self.persons2Projects.update({masterID:masterIDProjects});
-                                        
-    
-        if REQUEST:
-            pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','unifyPersons.zpt')).__of__(self)
-            return pt(changeList=ret);
-        
-        else:
-            return ret; 
-    
-    def unifyPersons(self,changes,REQUEST=None):
-        """unify a list of persons"""
-        
-        if isinstance(changes,str):
-            changes=[changes]
-        
-        changeList=self.getUnifyPersonsList();
-        personToMaster={}
-        logging.debug("changelist:"+repr(changeList))
-        #aendere person2project
-        for change in changes:
-            changeItem=changeList[int(change)];
-            masterID=changeItem[2]
-            personID=changeItem[0]
-            
-            personToMaster[personID]=masterID
-            masterIDProjects = self.persons2Projects.get(masterID,None);
-            if masterIDProjects==None:
-                masterIDProjects=OOSet();
-                #ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,[''])[0]))   
-                
-            oldProjects= self.persons2Projects.get(personID)
-            logging.debug("personID:"+repr(personID))
-            logging.debug("masterID:"+repr(masterID))
-            logging.debug("keys:"+repr(self.persons2Projects.keys()))
-            logging.debug("oldProjects:"+repr(oldProjects))
-            masterIDProjects.update(oldProjects)
-            self.persons2Projects.update({masterID:masterIDProjects})
-            self.persons2Projects.pop(personID)
-            
-            self.addPersonAndFirstNameFromTripleStore(masterID) #addpersontotiplestore
-            
-            logging.debug("Change:" +personID+":"+ masterID)
-            
-        #aendere nun projectperson
-        logging.debug(personToMaster)
-        for project in self.projectPersons.keys():
-            personsNew=OOSet()
-            
-            persons=self.projectPersons.get(project)
-            for person in persons:
-                personsNew.insert([personToMaster.get(person[0],person[0]),person[1]])
-                logging.debug("REPLACE in:"+project+":" +repr(person)+" by "+ repr(personToMaster.get(person[0],person[0])))
-            self.projectPersons.update({project:personsNew})
-            
-        self.generateSortingOrderForPersonIDs(); #now sort the new names
-        return personToMaster
-        
-        
+#     def rearangePersonIDsHTML(self,REQUEST=None):
+#         """setze neue ID zu personen"""
+#         ret=[]
+#         for personID in self.persons2Projects.keys():
+#             logging.debug(personID)
+#             
+#             masterID,name=self.findMasterIDAndName(personID.rstrip().lstrip())
+#             logging.debug("        masterID -appending")
+#             logging.debug(repr(name))
+#             if len(name)==0:
+#                 name=['']
+#             ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,name)[0]))   
+#                                       
+#     
+#         if REQUEST:
+#             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','rearrangePersons.zpt')).__of__(self)
+#             return pt(changeList=ret,lookupUrl=self.PERSONS_LOOKUP_URL,editURL=self.EDIT_URL);
+#         else:
+#             return ret; 
+#         
+#     def rearangePersonIDs(self,REQUEST):
+#         """unify a list of persons"""
+#         
+#         argv=REQUEST.form;
+#         logging.debug(repr(argv))
+#         changes=argv['changes']
+#         if isinstance(changes,str):
+#             changes=[changes]
+#         
+#         changeList=self.rearangePersonIDsHTML()
+#         personToMaster={}
+#         logging.debug("changelist:"+repr(changeList))
+#         #aendere person2project
+#         for change in changes:
+#             changeItem=changeList[int(change)];
+#             masterID=argv['newID_'+change].lstrip().rstrip() #make sure no spaces
+#             personID=changeItem[0]
+#             
+#             personToMaster[personID]=masterID
+#             masterIDProjects = self.persons2Projects.get(masterID,None);
+#             if masterIDProjects==None:
+#                 masterIDProjects=OOSet();
+#                 #ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,[''])[0]))   
+#                 
+#             oldProjects= self.persons2Projects.get(personID)
+#             logging.debug("personID:"+repr(personID))
+#             logging.debug("masterID:"+repr(masterID))
+#             logging.debug("keys:"+repr(self.persons2Projects.keys()))
+#             logging.debug("oldProjects:"+repr(oldProjects))
+#             masterIDProjects.update(oldProjects)
+#             self.persons2Projects.update({masterID:masterIDProjects})
+#             self.persons2Projects.pop(personID)
+#             
+#             self.addPersonAndFirstNameFromTripleStore(masterID) #addpersontotiplestore
+#             
+#             logging.debug("Change:" +personID+":"+ masterID)
+#             
+#             if personID!=masterID:
+#                 self.addSameAsRelationToTripleStore(personID,masterID)
+#             
+#         #aendere nun projectperson
+#         logging.debug(personToMaster)
+#         for project in self.projectPersons.keys():
+#             personsNew=OOSet()
+#             
+#             persons=self.projectPersons.get(project)
+#             for person in persons:
+#                 personsNew.insert([personToMaster.get(person[0],person[0]),person[1]])
+#                 logging.debug("REPLACE in:"+project+":" +repr(person)+" by "+ repr(personToMaster.get(person[0],person[0])))
+#             self.projectPersons.update({project:personsNew})
+#             
+#         self.generateSortingOrderForPersonIDs(); #now sort the new names
+#         return personToMaster
+#     #fuehre personen zusammen die ueber owl:sameAs verbunden sind
+#     def getUnifyPersonsList(self,REQUEST=None):
+#         """vereinheitlichung der personen auf eine ID aus der GND, wenn moeglich"""
+#         ret=[]
+#         for personID in self.persons2Projects.keys():
+#             masterID,name=self.findMasterIDAndName(personID)
+#             logging.debug("masterID:"+masterID)
+#             if (masterID is not None) and (masterID is not "") and (not personID==masterID):
+#                 #masterIDProjects = self.persons2Projects.get(masterID,None);
+#                 ##if masterIDProjects==None:
+#                 #    masterIDProjects=OOSet();
+#                 logging.debug("        masterID -appending")
+#                 logging.debug(repr(name))
+# 
+#             
+#                 ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,name)[0]))   
+#                 #masterIDProjects.update(self.persons2Projects.get(personID));
+#                 #self.persons2Projects.update({masterID:masterIDProjects});
+#                                         
+#     
+#         if REQUEST:
+#             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','unifyPersons.zpt')).__of__(self)
+#             return pt(changeList=ret);
+#         
+#         else:
+#             return ret; 
+#     
+#     def unifyPersons(self,changes,REQUEST=None):
+#         """unify a list of persons"""
+#         
+#         if isinstance(changes,str):
+#             changes=[changes]
+#         
+#         changeList=self.getUnifyPersonsList();
+#         personToMaster={}
+#         logging.debug("changelist:"+repr(changeList))
+#         #aendere person2project
+#         for change in changes:
+#             changeItem=changeList[int(change)];
+#             masterID=changeItem[2]
+#             personID=changeItem[0]
+#             
+#             personToMaster[personID]=masterID
+#             masterIDProjects = self.persons2Projects.get(masterID,None);
+#             if masterIDProjects==None:
+#                 masterIDProjects=OOSet();
+#                 #ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,[''])[0]))   
+#                 
+#             oldProjects= self.persons2Projects.get(personID)
+#             logging.debug("personID:"+repr(personID))
+#             logging.debug("masterID:"+repr(masterID))
+#             logging.debug("keys:"+repr(self.persons2Projects.keys()))
+#             logging.debug("oldProjects:"+repr(oldProjects))
+#             masterIDProjects.update(oldProjects)
+#             self.persons2Projects.update({masterID:masterIDProjects})
+#             self.persons2Projects.pop(personID)
+#             
+#             self.addPersonAndFirstNameFromTripleStore(masterID) #addpersontotiplestore
+#             
+#             logging.debug("Change:" +personID+":"+ masterID)
+#             
+#         #aendere nun projectperson
+#         logging.debug(personToMaster)
+#         for project in self.projectPersons.keys():
+#             personsNew=OOSet()
+#             
+#             persons=self.projectPersons.get(project)
+#             for person in persons:
+#                 personsNew.insert([personToMaster.get(person[0],person[0]),person[1]])
+#                 logging.debug("REPLACE in:"+project+":" +repr(person)+" by "+ repr(personToMaster.get(person[0],person[0])))
+#             self.projectPersons.update({project:personsNew})
+#             
+#         self.generateSortingOrderForPersonIDs(); #now sort the new names
+#         return personToMaster
+#         
+#         
     
     def findMasterIDAndName(self,ressourceID):
         queryString="""select * 
@@ -1321,10 +1326,38 @@
         
     
         return None,None
+  
+  
+  
+    def getPersonsWithProjectsSortedkeys(self):
         
+        def sortF(x,y):
+            return cmp(x.lower(),y.lower())
+        keys = [x for x in self.getPersonsWithProjects().keys()]
+        keys.sort(sortF)
+        return keys      
+    
     security.declareProtected('View','getPersonsWithProjectIDs') 
-    def getPersonsWithProjectIDs(self,check=False):
+   
+    def getPersonsWithProjects(self,check=False):
         """holt die getaggted Personen mit Projekten"""
+        
+       
+        objs = self.getTagsFromDB(None, "person", "")
+        
+        ret={}
+        #fuege jetzt die projekt informationen an
+        for obj in objs:
+            obs = self.getProjectsWithTag("person", obj)
+            if len(obs)> 0:
+                ret[obj]=obs
+        
+        return ret
+    
+        
+        
+        
+        
         persons = self.persons2Projects;
         ret={}
         
@@ -1384,46 +1417,46 @@
         logging.debug(ret.keys()) 
         return ret,personsList
     
-    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 getObjectsWithProjectIDsSortedkeys(self):
+#     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 getObjectsWithProjectsSortedkeys(self):
         
         def sortF(x,y):
             return cmp(x.lower(),y.lower())
-        keys = [x for x in self.getObjectsWithProjectIDs().keys()]
+        keys = [x for x in self.getObjectsWithProjects().keys()]
         keys.sort(sortF)
         return keys
     
-    def getObjectsWithProjectIDs(self):
-        """holt die getagten Personen mit Projekten"""
-        objects = self.objects2Projects;
+    def getObjectsWithProjects(self):
+        """holt die getagten Objekte mit Projekten"""
+       
+        #hole all objekte
+        objs = self.getTagsFromDB(None, "object", "")
+        
         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:]
-            
-        logging.debug(ret)
+        #fuege jetzt die projekt informationen an
+        for obj in objs:
+            obs = self.getProjectsWithTag("object", obj)
+            if len(obs)> 0:
+                ret[obj]=obs
+        
         return ret
     
+    
+    
     security.declareProtected('View management screens','listAllSuggestedTags')     
     def listAllSuggestedTags(self):
         """list all tags"""
@@ -1479,106 +1512,79 @@
         
         #return retstring
         
-    security.declareProtected('View management screens','addHistoricalPlaceToProject')     
-    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
-    
+#     security.declareProtected('View management screens','addHistoricalPlaceToProject')     
+#     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
+#     
     security.declareProtected('View management screens','addObjectToProject')     
     def addObjectToProject(self,projectID,value):
         """ add a person so the project"""
-        objects=self.getObjectsFromProject(projectID);
-        
-        logging.debug("adding:"+projectID+":"+value);
-        
+        #objects=self.getObjectsFromProject(projectID);    
+        logging.debug("adding:"+projectID+":"+value);    
         self.storeChange("addObject",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})
-        
-        
-        
+        self.addTagToDB(projectID, tagType="object", tag=value)
+         
         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 []
+        """hole alle projekte mit tags vom typ tagType and tagName"""
         
-        projects = tagsStored.get(tagName,None)
-        if projects is None:
-            logging.debug("can't find any projects for Tag:"+tagName+"("+tagType+")")
-            return []
+        qs = """select distinct project_id from thesaurus_projects_tags where tag_id in 
+        (select id as tag_id from thesaurus_tags where tag_type = %s and tag_name = %s)
+        """
+        
+        
+        #hole alle projecte
         
         ret=[]
-        for project in projects:
+        for projectRes in self.executeZSQL(qs,[tagType,tagName]):
+            
+            project = projectRes.project_id
+            
             logging.debug("found:"+project)
             proj =self.getProjectDetails(project);
             if proj is not None: