comparison MPIWGThesaurus.py @ 45:efdbe9eb2403

thesaurus jetzt in datenbank
author dwinter
date Mon, 25 Nov 2013 08:12:11 +0100
parents a30307377ed9
children 7c1782d65c9b cb20308fe412
comparison
equal deleted inserted replaced
44:a30307377ed9 45:efdbe9eb2403
1 #Klasse zum Taggen und Anzeigen der Tags von Projekte bzw. allgemein Webseiten des Institutes 1 #Klasse zum Taggen und Anzeigen der Tags von Projekte bzw. allgemein Webseiten des Institutes
2 #Tags werden in der Instanz abgespeichert 2 #Tags werden in der Instanz abgespeichert
3 #Personenname kommen aus dem Virtuoso-Triplestore , lokal erzeugte zusaetliche Name werden dort abgespeichert 3 #Personenname kommen aus dem Virtuoso-Triplestore , lokal erzeugte zusaetliche Name werden dort abgespeichert
4 #Fuer die Suche ueber die Personenname wird das MetaDataManagerRestlet benoetigt. 4 #Fuer die Suche ueber die Personenname wird das MetaDataManagerRestlet benoetigt.
5 #TODO: Zur Zeit werden die entsprechenden Server URLs hier in der Klasse definiert. 5 #TODO: Zur Zeit werden die entsprechenden Server URLs hier in der Klasse definiert.
6
7 6
8 # TODO: generell verwaltung der tags im triple store und nicht in zope. 7 # TODO: generell verwaltung der tags im triple store und nicht in zope.
9 # TODO: mache server und namespaces konfigurierbar im project 8 # TODO: mache server und namespaces konfigurierbar im project
10 9
11 10
13 from Globals import package_home 12 from Globals import package_home
14 from Products.PageTemplates.PageTemplateFile import PageTemplateFile 13 from Products.PageTemplates.PageTemplateFile import PageTemplateFile
15 from BTrees.OOBTree import OOBTree 14 from BTrees.OOBTree import OOBTree
16 from BTrees.OOBTree import OOSet 15 from BTrees.OOBTree import OOSet
17 from AccessControl import ClassSecurityInfo 16 from AccessControl import ClassSecurityInfo
17 from Products.ZDBInterface.ZDBInterfaceFolder import ZDBInterfaceFolder
18 18
19 #import os 19 #import os
20 import re 20 import re
21 import os.path 21 import os.path
22 import logging 22 import logging
25 from types import ListType 25 from types import ListType
26 import transaction 26 import transaction
27 import random 27 import random
28 import urllib2 28 import urllib2
29 import urllib 29 import urllib
30 import json
30 31
31 from SrvTxtUtils import utf8ify 32 from SrvTxtUtils import utf8ify
32 33
33 class projectHolder: 34 class projectHolder:
34 projectHolder="" 35 projectHolder=""
66 self.comment=comment 67 self.comment=comment
67 self.type=type 68 self.type=type
68 self.userName=userName 69 self.userName=userName
69 70
70 71
71 class MPIWGThesaurus(Folder): 72 class MPIWGThesaurus(ZDBInterfaceFolder, Folder):
72 """MPIWGThesaurus main folder""" 73 """MPIWGThesaurus main folder"""
73 security=ClassSecurityInfo() 74 security=ClassSecurityInfo()
74 75
75 meta_type="MPIWGThesaurus" 76 meta_type="MPIWGThesaurus"
76 77
94 95
95 logpathDefault="/var/tmp/tagchanges.log" 96 logpathDefault="/var/tmp/tagchanges.log"
96 97
97 #BTrees fuer die Tags 98 #BTrees fuer die Tags
98 99
99 projectPersons= OOBTree() #project --> personen IDs 100 #projectPersons= OOBTree() #project --> personen IDs
100 projectObjects= OOBTree() #project --> objects 101 #projectObjects= OOBTree() #project --> objects
101 projectHistoricalPlaces= OOBTree() 102 #projectHistoricalPlaces= OOBTree()
102 projectSuggestedTags= OOBTree() 103 projectSuggestedTags= OOBTree()
103 persons2Projects= OOBTree() #personenID --> projects 104 #persons2Projects= OOBTree() #personenID --> projects
104 objects2Projects=OOBTree() #objects --> projects 105 #objects2Projects=OOBTree() #objects --> projects
105 historicalPlaces2Projects=OOBTree() 106 #historicalPlaces2Projects=OOBTree()
106 suggestedTags2Projects=OOBTree() 107 suggestedTags2Projects=OOBTree()
107 personIDtoNames=OOBTree() # weist den personenIDs Klartextnamen aus dem Triplestore zu 108 ##personIDtoNames=OOBTree() # weist den personenIDs Klartextnamen aus dem Triplestore zu
108 personsIDForSort=[] # liste personenID sortiert nach dem tupel (nachname,vorname) 109 ##personsIDForSort=[] # liste personenID sortiert nach dem tupel (nachname,vorname)
109 personsIDForSortFull=[] # liste (personenID,(nachname,vorname)) nicht sortiert! 110 ##personsIDForSortFull=[] # liste (personenID,(nachname,vorname)) nicht sortiert!
110 111
111 suggestedPersons= OOBTree(); #TODO: das sollte die ueberfluessig werde und nur im triple store stehen. 112 suggestedPersons= OOBTree(); #TODO: das sollte die ueberfluessig werde und nur im triple store stehen.
112 113
113 tagList=[] 114 tagList=[]
114 115
174 175
175 176
176 177
177 178
178 179
179 manage_options = Folder.manage_options+( 180 manage_options = ZDBInterfaceFolder.manage_options+(
180 {'label':'Thesaurus entries','action':'changeMPIWGThesaurusForm'}, 181 {'label':'Thesaurus entries','action':'changeMPIWGThesaurusForm'},
181 {'label':'Manage Thesaurus','action':'manageMPIWGThesaurus'}, 182 {'label':'Manage Thesaurus','action':'manageMPIWGThesaurus'},
182 {'label':'Thesaurus Log','action':'manageMPIWGThesaurusLogs'}, 183 {'label':'Thesaurus Log','action':'manageMPIWGThesaurusLogs'},
183 #{'label':'Change Publications Special','action':'changePublications_specialForm'}, 184 #{'label':'Change Publications Special','action':'changePublications_specialForm'},
184 ) 185 )
325 326
326 ret+="\t".join(retarray)+"\n" 327 ret+="\t".join(retarray)+"\n"
327 328
328 return ret 329 return ret
329 330
330 331 def getTags(self,projectID,projectTags,RESPONSE=None):
332 """get all selected tagList"""
333
334 #projectTags = self.getProjectsAndTags()
335 #logging.debug(projectTags)
336
337 project = projectTags.get(projectID)
338 if project is None:
339 project = projectTags.get("/en/research/projects/"+projectID) #TODO fix this projectTag list from getProjectsAndTags()contains fullpath
340 if project is None:
341 return []
342 retarray=[]
343 for tagType in self.tags.keys():
344 tags = project.tags.get(tagType,[''])
345 retarray.append(utf8ify(";".join(tags)))
346
347
348 return retarray
331 def getAllProjectsAndTagsAsCSV(self,active=0,archived=0,RESPONSE=None): 349 def getAllProjectsAndTagsAsCSV(self,active=0,archived=0,RESPONSE=None):
332 """alle projekte auch die nicht getaggten""" 350 """alle projekte auch die nicht getaggten"""
333 retList=[] 351 retList=[]
334 headers=['projectId','sortingNumber','projectName','scholars','startedAt','completedAt','lastChangeThesaurusAt','lastChangeProjectAt','projectCreatedAt','active','persons','objects'] 352 headers=['projectId','sortingNumber','projectName','scholars','startedAt','completedAt','lastChangeThesaurusAt','lastChangeProjectAt','projectCreatedAt','active','persons','objects']
335 headers.extend(list(self.tags.keys())) 353 headers.extend(list(self.tags.keys()))
351 n = re.sub("[:\- ]","",str(changeDate)) 369 n = re.sub("[:\- ]","",str(changeDate))
352 retProj.append(n) 370 retProj.append(n)
353 retProj.append(utf8ify(getattr(proj,'creationTime','20050101000000'))) 371 retProj.append(utf8ify(getattr(proj,'creationTime','20050101000000')))
354 retProj.append("")#TODO: project created at 372 retProj.append("")#TODO: project created at
355 retProj.append(str(proj.isActiveProject())) 373 retProj.append(str(proj.isActiveProject()))
356 retProj.append(";".join([person[1] for person in self.getPersonsFromProject(proj.getId())])) 374 #retProj.append(";".join([person[1] for person in self.getPersonsFromProject(proj.getId())]))
357 #retProj.append(";".join([person[1] for person in self.thesaurus.getHistoricalPlacesFromProject(proj.getId())])) 375 #retProj.append(";".join([person[1] for person in self.thesaurus.getHistoricalPlacesFromProject(proj.getId())]))
358 retProj.append(";".join([person[1] for person in self.getObjectsFromProject(proj.getId())])) 376 #retProj.append(";".join([person[1] for person in self.getObjectsFromProject(proj.getId())]))
359 retProj+=self.getTags(proj.getId(),projectTags) 377 retProj+=self.getTags(proj.getId(),projectTags)
360 retList.append("\t".join(retProj)) 378 retList.append("\t".join(retProj))
361 379
362 if RESPONSE: 380 if RESPONSE:
363 RESPONSE.setHeader('Content-Disposition','attachment; filename="ProjectsAndTags.tab"') 381 RESPONSE.setHeader('Content-Disposition','attachment; filename="ProjectsAndTags.tab"')
406 return txt 424 return txt
407 425
408 #In der Anzeige soll der Name der zitierten Personen in Klartext angezeigt werden, ausserdem die Varianten, wie sie tatsaechlich 426 #In der Anzeige soll der Name der zitierten Personen in Klartext angezeigt werden, ausserdem die Varianten, wie sie tatsaechlich
409 #in den Projekten benutzt werden 427 #in den Projekten benutzt werden
410 428
411 429 #
412 def addPersonAndFirstNameFromTripleStore(self, personID): 430 # def addPersonAndFirstNameFromTripleStore(self, personID):
413 mainName, sortName = self.getMainNameFromTripleStore(personID) # hole die hauptbezeichnung aus dem triplestore 431 # mainName, sortName = self.getMainNameFromTripleStore(personID) # hole die hauptbezeichnung aus dem triplestore
414 personNames = [] 432 # personNames = []
415 logging.debug("get person:"+ personID) 433 # logging.debug("get person:"+ personID)
416 logging.debug("names:"+repr(mainName)+":"+ repr(sortName)) 434 # logging.debug("names:"+repr(mainName)+":"+ repr(sortName))
417 435 #
418 projects=self.persons2Projects.get(personID) 436 # projects=self.persons2Projects.get(personID)
419 logging.debug(repr(projects)) 437 # logging.debug(repr(projects))
420 if projects is None: 438 # if projects is None:
421 projects=[] 439 # projects=[]
422 440 #
423 for project in projects: #hole die personen aus dem projekte 441 # for project in projects: #hole die personen aus dem projekte
424 logging.debug("Found:project:" + project) 442 # logging.debug("Found:project:" + project)
425 namesInProject = self.projectPersons.get(project) 443 # namesInProject = self.projectPersons.get(project)
426 for nameInProjectTuple in namesInProject: 444 # for nameInProjectTuple in namesInProject:
427 logging.debug(repr(nameInProjectTuple)) 445 # logging.debug(repr(nameInProjectTuple))
428 nameInProject = nameInProjectTuple[1] 446 # nameInProject = nameInProjectTuple[1]
429 logging.debug(nameInProjectTuple[0] + "??" + personID) 447 # logging.debug(nameInProjectTuple[0] + "??" + personID)
430 if nameInProjectTuple[0] == personID: 448 # if nameInProjectTuple[0] == personID:
431 logging.debug("changing") 449 # logging.debug("changing")
432 if mainName == "": # es gibt keinen Eintrag im Triplestore fuer name (sollte eigentlich nicht sein, ist dann ein Fehler dort) 450 # if mainName == "": # es gibt keinen Eintrag im Triplestore fuer name (sollte eigentlich nicht sein, ist dann ein Fehler dort)
433 mainName = nameInProject #nimm dann aber den ersten aus den projekten 451 # mainName = nameInProject #nimm dann aber den ersten aus den projekten
434 if nameInProject != mainName: 452 # if nameInProject != mainName:
435 personNames.append(nameInProject) 453 # personNames.append(nameInProject)
436 454 #
437 logging.debug(str(mainName) + "- foundalso :" + ",".join(personNames)) 455 # logging.debug(str(mainName) + "- foundalso :" + ",".join(personNames))
438 self.personIDtoNames.update({personID:(mainName, personNames)}) 456 # self.personIDtoNames.update({personID:(mainName, personNames)})
439 self.personsIDForSortFull.append((personID, sortName)) 457 # self.personsIDForSortFull.append((personID, sortName))
440 458 #
441 459 #
442 460 #
443 def generateSortingOrderForPersonIDs(self): 461 # def generateSortingOrderForPersonIDs(self):
444 def sort(x,y): 462 # def sort(x,y):
445 logging.debug("sort:") 463 # logging.debug("sort:")
446 logging.debug((x[1][0],y[1][0])) 464 # logging.debug((x[1][0],y[1][0]))
447 return cmp(x[1][0],y[1][0]) 465 # return cmp(x[1][0],y[1][0])
448 466 #
449 self.personsIDForSortFull.sort(cmp=sort) 467 # self.personsIDForSortFull.sort(cmp=sort)
450
451 self.personsIDForSort=[x[0] for x in self.personsIDForSortFull]
452
453 self.personIDtoNames=self.personIDtoNames # make clear that it has changed #TODO: change this to variablen with names _p
454
455 security.declareProtected('View management screens','collectPersonNamesToIds')
456 def collectPersonNamesToIds(self):
457 """Ordne Namen aus dem Triplestore bzw. die vergebenenden Label den Personen-Ids zu."""
458 #sollte z.B. gemacht werden, wenn im Triplestore editiert wurde.
459 self.personIDtoNames=OOBTree() # loesche alle
460 self.personsIDForSort=[]
461 self.personsIDForSortFull=[]
462 for personID in self.persons2Projects:
463 self.addPersonAndFirstNameFromTripleStore(personID)
464
465
466
467
468 #sortiere personIDs nach erstmal nach Nachnamene TODO: sortiere nach name,vorname
469
470 self.generateSortingOrderForPersonIDs();
471 # def sort(x,y):
472 # logging.debug("sort:")
473 # logging.debug((x[1][0],y[1][0]))
474 # return cmp(x[1][0],y[1][0])
475 # 468 #
476 # self.personsIDForSortFull.sort(cmp=sort) 469 # self.personsIDForSort=[x[0] for x in self.personsIDForSortFull]
470 #
471 # self.personIDtoNames=self.personIDtoNames # make clear that it has changed #TODO: change this to variablen with names _p
472 #
473 # security.declareProtected('View management screens','collectPersonNamesToIds')
474 # def collectPersonNamesToIds(self):
475 # """Ordne Namen aus dem Triplestore bzw. die vergebenenden Label den Personen-Ids zu."""
476 # #sollte z.B. gemacht werden, wenn im Triplestore editiert wurde.
477 # self.personIDtoNames=OOBTree() # loesche alle
478 # self.personsIDForSort=[]
479 # self.personsIDForSortFull=[]
480 # for personID in self.persons2Projects:
481 # self.addPersonAndFirstNameFromTripleStore(personID)
482 #
477 # 483 #
478 # self.personsIDForSort=[x[0] for x in self.personsIDForSortFull] 484 #
479 # 485 #
480 # self.personIDtoNames=self.personIDtoNames # make clear that it has changed #TODO: change this to variablen with names _p 486 # #sortiere personIDs nach erstmal nach Nachnamene TODO: sortiere nach name,vorname
481 # 487 #
482 #Hole die Namen, die einer personID zugeordnet sind. 488 # self.generateSortingOrderForPersonIDs();
483 def getNamesFromID(self,personID): 489 # # def sort(x,y):
484 personID=personID.rstrip().lstrip() #make sure no spaces 490 # # logging.debug("sort:")
485 logging.debug("<"+personID+">") 491 # # logging.debug((x[1][0],y[1][0]))
486 retStr="" 492 # # return cmp(x[1][0],y[1][0])
487 493 # #
488 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!! 494 # # self.personsIDForSortFull.sort(cmp=sort)
489 #additionalNames = self.personIDtoNames.get(personID,['',[]])[1] 495 # #
490 #if len(additionalNames)>0: 496 # # self.personsIDForSort=[x[0] for x in self.personsIDForSortFull]
491 # retStr+=" ("+",".join(additionalNames)+","+")" 497 # #
492 return retStr 498 # # self.personIDtoNames=self.personIDtoNames # make clear that it has changed #TODO: change this to variablen with names _p
493 499 # #
494 500 # #Hole die Namen, die einer personID zugeordnet sind.
495 #Hole die Hauptnamemsansetzung aus dem Triplestore ),falls vorhanden, wenn nicht ist der String leer. 501 # # def getNamesFromID(self,personID):
496 #ausserdem einen Namen zum sortieren, = Tupel(nachname, vorname) 502 # # personID=personID.rstrip().lstrip() #make sure no spaces
503 # # logging.debug("<"+personID+">")
504 # # retStr=""
505 # #
506 # # 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!!
507 # # #additionalNames = self.personIDtoNames.get(personID,['',[]])[1]
508 # # #if len(additionalNames)>0:
509 # # # retStr+=" ("+",".join(additionalNames)+","+")"
510 # # return retStr
511 # #
512 # #
513 # #Hole die Hauptnamemsansetzung aus dem Triplestore ),falls vorhanden, wenn nicht ist der String leer.
514 # #ausserdem einen Namen zum sortieren, = Tupel(nachname, vorname)
497 def getMainNameFromTripleStore(self,personID): 515 def getMainNameFromTripleStore(self,personID):
498 516
499 517
500 cmdString ="""select * where { <%s> <http://xmlns.com/foaf/0.1/name> ?name}"""%personID 518 cmdString ="""select * where { <%s> <http://xmlns.com/foaf/0.1/name> ?name}"""%personID
501 519
580 return names[1].replace('"','') # wir nehmen nur den ersten treffer 598 return names[1].replace('"','') # wir nehmen nur den ersten treffer
581 599
582 600
583 security.declareProtected('View management screens','changeTags') 601 security.declareProtected('View management screens','changeTags')
584 def changeTags(self,projectID,approaches=[],disciplines=[],periods=[],spaces=[],technologies=[],transfers=[],RESPONSE=None): 602 def changeTags(self,projectID,approaches=[],disciplines=[],periods=[],spaces=[],technologies=[],transfers=[],RESPONSE=None):
585 """change tags""" 603 """Aendert die Tags im angegebenen Project"""
586 self.changeTagFromList(projectID,"approaches", approaches) 604 self.changeTagFromList(projectID,"approaches", approaches)
587 self.changeTagFromList(projectID,"disciplines", disciplines) 605 self.changeTagFromList(projectID,"disciplines", disciplines)
588 self.changeTagFromList(projectID,"periods", periods) 606 self.changeTagFromList(projectID,"periods", periods)
589 self.changeTagFromList(projectID,"spaces", spaces) 607 self.changeTagFromList(projectID,"spaces", spaces)
590 self.changeTagFromList(projectID,"technologies", technologies) 608 self.changeTagFromList(projectID,"technologies", technologies)
591 self.changeTagFromList(projectID,"transfers", transfers) 609 self.changeTagFromList(projectID,"transfers", transfers)
592 610
593 self.projectObjects=self.projectObjects #necessesary to make the object persistent after the first call 611 self.projectObjects=self.projectObjects #necessesary to make the object persistent after the first call
594 self.projectHistoricalPlaces=self.projectHistoricalPlaces #necessesary to make the object persistent after the first call 612 #self.projectHistoricalPlaces=self.projectHistoricalPlaces #necessesary to make the object persistent after the first call
595 self.projectPersons=self.projectPersons #necessesary to make the object persistent after the first call 613 self.projectPersons=self.projectPersons #necessesary to make the object persistent after the first call
596 self.projectSuggestedTags=self.projectSuggestedTags 614 self.projectSuggestedTags=self.projectSuggestedTags
597 615
598 self.persons2Projects=self.persons2Projects 616 self.persons2Projects=self.persons2Projects
599 self.objects2Projects=self.objects2Projects 617 self.objects2Projects=self.objects2Projects
600 self.historicalPlaces2Projects=self.historicalPlaces2Projects 618 #self.historicalPlaces2Projects=self.historicalPlaces2Projects
601 self.suggestedTags2Projects=self.suggestedTags2Projects; 619 self.suggestedTags2Projects=self.suggestedTags2Projects;
602 620
603 self.suggestedPersons=self.suggestedPersons; 621 self.suggestedPersons=self.suggestedPersons;
604 622
605 security.declareProtected('View management screens','deleteAllTags') 623 security.declareProtected('View management screens','deleteAllTags')
606 def deleteAllTags(self): 624 def deleteAllTags(self):
607 """deleteAllTags - TODO: take this out!!,""" 625 """deleteAllTags - TODO: take this out!!,"""
608 setattr(self,"tags",None)
609 626
610 return "DONE!" 627 return "DONE!"
611 628
612 security.declareProtected('View management screens','deleteAllPersons') 629 security.declareProtected('View management screens','deleteAllPersons')
613 def deleteAllPersons(self): 630 def deleteAllPersons(self):
618 self.suggestedPersons= OOBTree(); #TODO: das sollte die ueberfluessig werde und nur im triple store stehen. 635 self.suggestedPersons= OOBTree(); #TODO: das sollte die ueberfluessig werde und nur im triple store stehen.
619 636
620 637
621 return "DONE!" 638 return "DONE!"
622 639
623 security.declareProtected('View management screens','deleteAllObjects') 640
624 def deleteAllObjects(self):
625 """deleteAllTags - TODO: take this out!!,"""
626 logging.debug("delete all objects")
627 self.projectObjects= OOBTree()
628 self.objects2Projects=OOBTree()
629
630
631 return "DONE!"
632
633 def changeTagFromList(self,projectID,tagType,tagList): 641 def changeTagFromList(self,projectID,tagType,tagList):
634 642
635 logging.debug("changing:"+projectID) 643
636 logging.debug("asking tag::"+tagType) 644 #hole alle tags des projektID vom Typ tagaTyle
637 if type(tagList) is not ListType: 645 if isinstance(tagList,str):
638 tagList=[tagList] 646 tagList=[tagList]
639 647
640 648 tggsOfProject = self.getTagsFromDB(projectID,tagType)
641 tags = getattr(self,"tags",None) 649 for tagOfProject in tggsOfProject:
642 if tags is None: 650 if tagOfProject in tagList:
643 logging.debug("Create new tags") 651 #schon getagged
644 tags=OOBTree() 652 #nichts mehr zu tun spater
645 setattr(self,"tags",tags) 653 tagList.remove(tagOfProject)
646
647
648 tagsStored=tags.get(tagType,None)
649 if tagsStored is None:
650 tagsStored=OOBTree();
651
652
653
654 for tag in tagsStored.keys(): #gehe durch alle gespeichteren tags
655 logging.debug("checking:"+tag)
656 projectsOfTag = tagsStored.get(tag,None)
657 logging.debug(projectsOfTag)
658 if projectsOfTag is None:
659 projectsOfTag=OOSet()
660
661 if tag in tagList: #dieser ist getagged
662 projectsOfTag.update([projectID]);
663 self.storeChange("added",projectID,tag)
664 tagList.remove(tag);
665 else: 654 else:
666 if projectsOfTag.has_key(projectID): 655 #nicht mehr getaggt
667 projectsOfTag.remove(projectID); 656 #delete Entry from database
668 self.storeChange("remove",projectID,tag) 657 self.deleteTagInDB(projectID,tagType,tagOfProject)
669 658
670 tagsStored.update({tag:projectsOfTag}); 659
671 660
672 for tag in tagList: # alle Tags, die nicht abgearbeitet worden sind, muessen noch angelegt werden 661 #in der taglList sind jetzt nur noch die Tags uebrig die hinzugegefuegt werden muessen
673 logging.debug("adding:"+tag) 662 for tag in tagList:
674 newApproach=OOSet() 663 self.addTagToDB(projectID,tagType=tagType,tag=tag)
675 newApproach.update([projectID]);
676 tagsStored.insert(tag, newApproach);
677
678 tags.update({tagType:tagsStored})
679 664
680 transaction.commit() 665 transaction.commit()
681 666
667
668 def getTagsFromDB(self,projectID=None,tagType=None,startsWith=""):
669 # hole alle tags vom typ tagType des projectes mit ID
670 ql =[]
671
672 if tagType is not None:
673 qs="select tag_name from thesaurus_tags where tag_type = %s"
674 ql.append(tagType)
675 else:
676 qs="select tag_name from thesaurus_tags"
677
678 if projectID is not None:
679 qs=qs + " and id in (select tag_id as id from thesaurus_projects_tags where project_id = %s)"
680 ql.append(projectID)
681
682
683 res =self.executeZSQL(qs,ql)
684
685
686 if (startsWith is None) or (startsWith ==""):
687 ret = [r.tag_name for r in res]
688 else:
689 ret=[]
690 for r in res:
691 if r.tag_name.lower().startswith(startsWith):
692 ret.append(r.tag_name)
693
694 logging.debug(ret)
695 return ret
696
697
698 def deleteTagInDB(self,projectID,tagType,tag):
699 # loesche den tag von typ tagType aus der dem Project
700
701 # first get tag_id
702
703 qs = "select id from thesaurus_tags where tag_type = %s and tag_name= %s"
704 logging.debug("DELETE")
705 ids = self.executeZSQL(qs,[tagType,tag])
706
707 for idR in ids:
708 qs = "delete from thesaurus_projects_tags where project_id=%s and tag_id=%s"
709 self.executeZSQL(qs,[projectID,idR.id])
710
711 logging.debug("DELETE-END")
712 return
713
714 def addTagToDB(self,projectID,tagType=None,tag=None,tag_ID=None):
715 """fuege den tag vom typ tagType zum Project hinzu, wenn tag_ID wird zuerst genommen, die anderen Felder werden
716 nur genommen falls tag_ID None ist.
717 """
718
719 # schaue on es den tag schon gibt, wenn nicht anlegen
720
721 if tag_ID is None and tagType is None and tag is None:
722 raise Exception("either tag_id or tag_type and tag shouldn't be None")
723
724
725 if tag_ID is not None:
726 qsSelect = "select id from thesaurus_tags where id = %s "
727 ids = self.executeZSQL(qsSelect,tag_ID)
728 else:
729 if tagType is None or tag is None:
730 raise Exception("tag_type and tag shouldn't be None")
731
732 else:
733 qsSelect = "select id from thesaurus_tags where tag_type = %s and tag_name= %s"
734 ids = self.executeZSQL(qsSelect,[tagType,tag])
735
736
737 logging.debug(ids)
738 logging.debug(len(ids))
739
740
741
742
743 if len(ids) == 0:
744 if tag_ID is None:
745 qs = "insert into thesaurus_tags (tag_type,tag_name) values (%s,%s)"
746 self.executeZSQL(qs,[tagType,tag]) # anlegen
747 transaction.commit()
748 ids = self.executeZSQL(qsSelect,[tagType,tag]) #ids holen
749
750 else:
751 raise Exception("no tag with tag_id: %s"%tag_ID)
752
753
754 for idResult in ids:
755
756 #check if already in
757 qsSelect = "select id from thesaurus_projects_tags where project_id = %s and tag_id= %s"
758
759 tag_ids = self.executeZSQL(qsSelect,[projectID,idResult.id])
760
761 if len (tag_ids) == 0:
762
763 qs="insert into thesaurus_projects_tags (project_id,tag_id) values (%s,%s)"
764
765 self.executeZSQL(qs,[projectID,idResult.id])
766
767
768
769 return ids[0].id #sollte eigentlich auch nur genau einen geben.
770
771
772
682 def getTitle(self,entry): 773 def getTitle(self,entry):
683 return entry.title 774 return entry.title
684 775
685 def thes_quote(self,txt): 776 def thes_quote(self,txt):
686 import md5 777 import md5
751 842
752 def getTagsAsHash(self,projectID,tagType=None): 843 def getTagsAsHash(self,projectID,tagType=None):
753 """get all tags as hash or None if no tag exists""" 844 """get all tags as hash or None if no tag exists"""
754 retHash={} 845 retHash={}
755 846
756 tagCnt=0
757 tags = getattr(self,"tags",None)
758
759 if tags is None:
760 return;
761
762 #falls nicht gesetzt 847 #falls nicht gesetzt
763 if tagType is None: 848 if tagType is None:
764 tagTypes = tags.keys() 849
850
851 tagTypes = [tag.tag_type for tag in self.executeZSQL("select distinct tag_type from thesaurus_tags")]
852 #tagTypes = tags.keys()
765 else: 853 else:
766 tagTypes = [tagType] 854 tagTypes = [tagType]
767 855
856 tagCnt=0
768 for tagType in tagTypes: 857 for tagType in tagTypes:
769 tagsStored=tags.get(tagType,None) 858
770 859 #retHash[tagType]=[]
771 if tagsStored is None: 860 tagCnt=0
772 # WTF: was: return 861
773 continue 862 tags =self.getTagsFromDB(projectID, tagType)
774 863 if len(tags) !=0:
775 retHash[tagType]=[] 864 retHash[tagType] = [self.getLabel(tag,tagType) for tag in tags]
776 865 tagCnt+=1
777 for tag in tagsStored.keys(): #gehe durch alle gespeichteren approached 866
778 logging.debug("checking:"+tag)
779 currentTag = tagsStored.get(tag,None)
780 if currentTag is None:
781 continue
782 if currentTag.has_key(projectID):
783 tagCnt+=1
784 retHash[tagType].append("""%s"""%tag)
785
786 if len(retHash[tagType]) == 0:
787 # empty tag list
788 del retHash[tagType]
789 867
790 if tagCnt==0: 868 if tagCnt==0:
791 return None 869 return None
792 870
793 return retHash 871 return retHash
794 872
795 873
796 874
797 875
798 876
799 def getTagsJSON(self,projectID,tagType,RESPONSE=None): 877 def getTagsJSON(self,projectID=None,tagType=None,startWith="",RESPONSE=None):
800 """get all selected tagList""" 878 """get all selected tags returs them as a list"""
801 #logging.debug("asking:"+projectID) 879
802 #logging.debug("asking tag::"+tagType) 880 tags = self.getTagsFromDB(projectID, tagType,startWith)
803 retList=[] 881
804 tags = getattr(self,"tags",None)
805 if tags is None:
806 return;
807
808 tagsStored=tags.get(tagType,None)
809 if tagsStored is None:
810 return;
811
812 for tag in tagsStored.keys(): #gehe durch alle gespeichteren approached
813 logging.debug("checking:"+tag)
814 currentTag = tagsStored.get(tag,None)
815 if currentTag is None:
816 continue
817 if currentTag.has_key(projectID):
818 retList.append(""" "%s" """%tag)
819 882
820 if RESPONSE: 883 if RESPONSE:
821 RESPONSE.setHeader('Content-Type', "application/json") 884 RESPONSE.setHeader('Content-Type', "application/json")
822 885
823 logging.debug(retList) 886 ret = json.dumps(tags)
824 return "["+",".join(retList)+"]" 887
888
889 logging.debug(ret)
890 return ret
825 891
826 892
827 893
828 894
829 def getTags(self,projectID,projectTags,RESPONSE=None): 895
830 """get all selected tagList"""
831
832 #projectTags = self.getProjectsAndTags()
833 #logging.debug(projectTags)
834
835 project = projectTags.get(projectID)
836 if project is None:
837 project = projectTags.get("/en/research/projects/"+projectID) #TODO fix this projectTag list from getProjectsAndTags()contains fullpath
838 if project is None:
839 return []
840 retarray=[]
841 for tagType in self.tags.keys():
842 tags = project.tags.get(tagType,[''])
843 retarray.append(utf8ify(";".join(tags)))
844
845
846 return retarray
847 # logging.debug("asking:"+projectID)
848 #
849 #
850 # apps = self.getApproaches()+ self.getDisciplines();
851 # retList=[]
852 # for tagType in self.tags.keys():
853 #
854 # logging.debug("asking tag::"+repr(tagType))
855 #
856 # tags = getattr(self,"tags",None)
857 # if tags is None:
858 # continue;
859 #
860 # tagsStored=tags.get(tagType,None)
861 # if tagsStored is None:
862 # continue;
863 #
864 # for tag in tagsStored.keys(): #gehe durch alle gespeichteren approached
865 # logging.debug("checking:"+tag)
866 # currentTag = tagsStored.get(tag,None)
867 # if currentTag is None:
868 # continue
869 # if currentTag.has_key(projectID):
870 # retList.append(""" "%s" """%tag)
871 #
872 # if RESPONSE:
873 # RESPONSE.setHeader('Content-Type', "application/json")
874 #
875 # logging.debug(retList)
876 # return retList
877
878 def getDisciplines(self): 896 def getDisciplines(self):
879 897
880 self.disciplines=self.getEntriesFromTxt(self.disciplinesTxt) 898 self.disciplines=self.getEntriesFromTxt(self.disciplinesTxt)
881 return self.disciplines 899 return self.disciplines
882 900
883 901
884 def getObjectsJSON(self,term="",RESPONSE=None): 902 def getObjectsJSON(self,term="",RESPONSE=None):
885 """ get all stored objects as json list starting with term""" 903 """ get all stored objects as json list starting with term,
904 need this for autocompletion from JQUERY which ads ?term= to the URL"""
886 term=term.lower(); 905 term=term.lower();
887 logging.debug("Asking:"+term) 906
888 #objectList=["baus","berg","lurg"] 907 return self.getTagsJSON(tagType="object", startWith=term, RESPONSE=RESPONSE)
889 objects = self.objects2Projects; 908
890 909
891 objectList= [x for x in objects.keys()] 910 #
892 911 # logging.debug("Asking:"+term)
893 logging.debug("Create:"+repr(objectList)) 912 # #objectList=["baus","berg","lurg"]
894 retList=[] 913 # objects = self.objects2Projects;
895 for object in objectList: 914 #
896 if object.find(term)>-1: 915 # objectList= [x for x in objects.keys()]
897 retList.append(""" "%s" """%object) 916 #
898 ret="[" 917 # logging.debug("Create:"+repr(objectList))
899 ret+=",".join(retList) 918 # retList=[]
900 ret+="]" 919 # for object in objectList:
901 logging.debug("Objects:"+ret) 920 # if object.find(term)>-1:
902 if RESPONSE: 921 # retList.append(""" "%s" """%object)
903 RESPONSE.setHeader('Content-Type', "application/json") 922 # ret="["
904 return ret 923 # ret+=",".join(retList)
905 924 # ret+="]"
906 925 # logging.debug("Objects:"+ret)
907 def getHistoricalPlacesJSON(self,term="",RESPONSE=None): 926 # if RESPONSE:
908 """ get all stored historicalPlaces as json list starting with term""" 927 # RESPONSE.setHeader('Content-Type', "application/json")
909 term=term.lower(); 928 # return ret
910 logging.debug("Asking:"+term) 929 #
911 #historicalPlaceList=["baus","berg","lurg"] 930
912 historicalPlaces = self.historicalPlaces2Projects; 931 # def getHistoricalPlacesJSON(self,term="",RESPONSE=None):
913 932 # """ get all stored historicalPlaces as json list starting with term"""
914 historicalPlaceList= [x for x in historicalPlaces.keys()] 933 # term=term.lower();
915 934 # logging.debug("Asking:"+term)
916 logging.debug("Create:"+repr(historicalPlaceList)) 935 # #historicalPlaceList=["baus","berg","lurg"]
917 retList=[] 936 # historicalPlaces = self.historicalPlaces2Projects;
918 for historicalPlace in historicalPlaceList: 937 #
919 if historicalPlace.find(term)>-1: 938 # historicalPlaceList= [x for x in historicalPlaces.keys()]
920 retList.append(""" "%s" """%historicalPlace) 939 #
921 ret="[" 940 # logging.debug("Create:"+repr(historicalPlaceList))
922 ret+=",".join(retList) 941 # retList=[]
923 ret+="]" 942 # for historicalPlace in historicalPlaceList:
924 logging.debug("historicalPlaces:"+ret) 943 # if historicalPlace.find(term)>-1:
925 if RESPONSE: 944 # retList.append(""" "%s" """%historicalPlace)
926 RESPONSE.setHeader('Content-Type', "application/json") 945 # ret="["
927 return ret 946 # ret+=",".join(retList)
947 # ret+="]"
948 # logging.debug("historicalPlaces:"+ret)
949 # if RESPONSE:
950 # RESPONSE.setHeader('Content-Type', "application/json")
951 # return ret
928 952
929 953
930 def getPeriods(self): 954 def getPeriods(self):
931 955
932 self.periodes=self.getEntriesFromTxt(self.periodsTxt) 956 self.periodes=self.getEntriesFromTxt(self.periodsTxt)
946 970
947 self.knowledgeTransfers=self.getEntriesFromTxt(self.knowledgeTransfersTxt) 971 self.knowledgeTransfers=self.getEntriesFromTxt(self.knowledgeTransfersTxt)
948 return self.knowledgeTransfers 972 return self.knowledgeTransfers
949 973
950 974
951 def getObjectsFromProject(self,projectID): 975 # def getObjectsFromProject(self,projectID):
952 return self.getFromProject(self.projectObjects,projectID); 976 # return self.getFromProject(self.projectObjects,projectID);
953 977 #
954 def getHistoricalPlacesFromProject(self,projectID): 978 # def getHistoricalPlacesFromProject(self,projectID):
955 return self.getFromProject(self.projectHistoricalPlaces,projectID); 979 # return self.getFromProject(self.projectHistoricalPlaces,projectID);
956 980
957 def getSuggestedTagsFromProject(self,projectID): 981 def getSuggestedTagsFromProject(self,projectID):
958 return self.getFromProject(self.projectSuggestedTags,projectID); 982 return self.getFromProject(self.projectSuggestedTags,projectID);
959 983
960 984
961 def getPersonsFromProject(self,projectID): 985 # def getPersonsFromProject(self,projectID):
962 #hole alle personenID die zu einem Projekt gehoeren. 986 # #hole alle personenID die zu einem Projekt gehoeren.
963 #zurueckgegeben wird ein OOSet() 987 # #zurueckgegeben wird ein OOSet()
964 return self.getFromProject(self.projectPersons,projectID); 988 # return self.getFromProject(self.projectPersons,projectID);
965 989 #
966 def getFromProject(self,objects,projectID): 990 def getFromProject(self,objects,projectID):
967 #holt die zu projectID gehoerigen objekte aus dem objects-set. 991 #holt die zur projectID gehoerigen objekte aus dem objects-set.
968 #oder legt einen neuen leeren Satz zu dieser ProjektID an. 992 #oder legt einen neuen leeren Satz zu dieser ProjektID an.
969 #zuruecgegeben wird ein OOSet() 993 #zuruecgegeben wird ein OOSet()
970 if objects.has_key(projectID): #wenn zu der ProjektID schon etwas abgespeichter ist, gieb es zurueck 994 if objects.has_key(projectID): #wenn zu der ProjektID schon etwas abgespeichter ist, gibt es zurueck
971 logging.debug("key exists:"+projectID) 995 logging.debug("key exists:"+projectID)
972 persons=objects.get(projectID); 996 entries=objects.get(projectID);
973 else: # andernfalls lege einen neuen Satz an. 997 else: # andernfalls lege einen neuen Satz an.
974 persons=OOSet() 998 entries=OOSet()
975 objects.update({projectID:persons}) 999 objects.update({projectID:entries})
976 logging.debug("key does not exists:"+projectID) 1000 logging.debug("key does not exists:"+projectID)
977 1001
978 1002
979 return persons 1003 return entries
980 1004
981 def getHistoricalPlacesFromProjectAsHTML(self,projectID): 1005 # def getHistoricalPlacesFromProjectAsHTML(self,projectID):
982 """gertobjects""" 1006 # """gertobjects"""
983 return self.getFromProjectAsHTML(self.projectHistoricalPlaces, projectID, "HistoricalPlace"); 1007 # return self.getFromProjectAsHTML(self.projectHistoricalPlaces, projectID, "HistoricalPlace");
984 1008
985 def getObjectsFromProjectAsHTML(self,projectID): 1009 def getObjectsFromProjectAsHTML(self,projectID):
986 """gertobjects""" 1010 """gertobjects"""
987 return self.getFromProjectAsHTML(self.projectObjects, projectID, "Object"); 1011 return self.getFromProjectAsHTML( projectID, "object");
988 1012
989 def getPersonsFromProjectAsHTML(self,projectID): 1013 def getPersonsFromProjectAsHTML(self,projectID):
990 """getpersons""" 1014 """getpersons"""
991 return self.getFromProjectAsHTML(self.projectPersons, projectID, "Person"); 1015 return self.getFromProjectAsHTML(projectID, "person");
992 1016
993 1017
994 def getFromProjectAsHTML(self,objects,projectID,type): 1018 def getLabel(self,tag,tagType):
995 """getpersons""" 1019
1020 qsSelect = "select tag_label from thesaurus_tags where tag_type = %s and tag_name= %s"
1021
1022 ids = self.executeZSQL(qsSelect,[tagType,tag]) #ids holen
1023
1024
1025 if len(ids)==0: #sollte eigentlich nicht sein
1026 return None
1027
1028 #es sollte nur genau einen geben, alle anderen werden ignoriert-
1029
1030 if ids[0].tag_label is None or ids[0].tag_label == '':
1031 return tag
1032
1033 else:
1034 return ids[0].tag_label
1035
1036
1037
1038
1039
1040 def addLabel(self,tagID,label):
1041 """Fuege zu einem tag mit tagID den Label hinzu"""
1042 qs = "update thesaurus_tags set tag_label=%s where id=%s"
1043
1044 self.executeZSQL(qs,[label,tagID]) # anlegen
1045 transaction.commit()
1046
1047
1048
1049
1050
1051
1052 def getFromProjectAsHTML(self,projectID,tagType):
1053 """Hole die Tags vom entsprechenden Tag-Type aus der Datenbank"""
996 ret="" 1054 ret=""
997 if objects.has_key(projectID): 1055
998 persons=objects.get(projectID); 1056 tags = self.getTagsFromDB(projectID, tagType, None);
999 else: 1057
1000 persons=OOSet() 1058 for tag in tags:
1001 1059
1002 1060 tagLabel = self.getLabel(tag,tagType)
1003 for person in persons: 1061
1004 ret+="""<div class="removeButton"> 1062 ret+="""<div class="removeButton">
1005 <span>%s </span><div style="display:inline" class="remove%s"><span style="display:none" class="removeValue">%s</span>remove</div> 1063 <span>%s </span><div style="display:inline" class="remove%s"><span style="display:none" class="removeValue">%s</span>remove</div>
1006 </div>"""%(person[1],type,person[0]) 1064 </div>"""%(tagLabel,tagType,tag)
1007 1065
1008 1066
1009 # ret+="""<div> 1067 # ret+="""<div>
1010 # <input type="checkbox" name="persons_remove" 1068 # <input tagType="checkbox" name="persons_remove"
1011 # value="%s"> 1069 # value="%s">
1012 # <span>%s</span> 1070 # <span>%s</span>
1013 # </div>"""%(person[0],person[1]) 1071 # </div>"""%(person[0],person[1])
1014 # 1072 #
1015 logging.debug(type+":"+ret) 1073 logging.debug(tagType+":"+ret)
1016 return ret 1074 return ret
1017 1075
1018 security.declareProtected('View management screens','removeHistoricalPlaceFromProject') 1076 # security.declareProtected('View management screens','removeHistoricalPlaceFromProject')
1019 def removeHistoricalPlaceFromProject(self,projectID,value): 1077 # def removeHistoricalPlaceFromProject(self,projectID,value):
1020 """remove""" 1078 # """remove"""
1021 logging.debug("removeHP:"+projectID+":"+value); 1079 # logging.debug("removeHP:"+projectID+":"+value);
1022 1080 #
1023 HistoricalPlaces = self.getHistoricalPlacesFromProject(projectID) 1081 # HistoricalPlaces = self.getHistoricalPlacesFromProject(projectID)
1024 for HistoricalPlace in HistoricalPlaces.keys(): 1082 # for HistoricalPlace in HistoricalPlaces.keys():
1025 1083 #
1026 logging.debug("trying:"+repr(HistoricalPlace[0])+"::"+repr(value)+"__") 1084 # logging.debug("trying:"+repr(HistoricalPlace[0])+"::"+repr(value)+"__")
1027 if HistoricalPlace[0]==value: 1085 # if HistoricalPlace[0]==value:
1028 logging.debug("---removed!") 1086 # logging.debug("---removed!")
1029 HistoricalPlaces.remove(HistoricalPlace) 1087 # HistoricalPlaces.remove(HistoricalPlace)
1030 1088 #
1031 self.projectHistoricalPlaces.update({projectID:HistoricalPlaces}) 1089 # self.projectHistoricalPlaces.update({projectID:HistoricalPlaces})
1032 retstring = self.getHistoricalPlacesFromProjectAsHTML(projectID) 1090 # retstring = self.getHistoricalPlacesFromProjectAsHTML(projectID)
1033 logging.debug(retstring) 1091 # logging.debug(retstring)
1034 return retstring 1092 # return retstring
1035 1093 #
1036 security.declareProtected('View management screens','removeObjectFromProject') 1094 security.declareProtected('View management screens','removeObjectFromProject')
1037 def removeObjectFromProject(self,projectID,value): 1095 def removeObjectFromProject(self,projectID,value):
1038 """remove""" 1096 """remove an object from the list"""
1039 logging.debug("remove:"+projectID+":"+value); 1097 logging.debug("remove:"+projectID+":"+value);
1040 1098
1041 1099
1042 self.storeChange("removeObject",projectID,value) 1100 self.storeChange("removeObject",projectID,value)
1043 1101
1044 objects = self.getObjectsFromProject(projectID) 1102 self.deleteTagInDB(projectID, "object", value)
1045 for object in objects.keys(): 1103
1046
1047 logging.debug("trying:"+repr(object[0])+"::"+repr(value)+"__")
1048 if object[0]==value:
1049 logging.debug("---removed!")
1050 objects.remove(object)
1051
1052 #now also delete the project from the object.
1053 objectsOfPerson=self.objects2Projects.get(object[0])
1054
1055
1056 if projectID in list(objectsOfPerson):
1057 objectsOfPerson.remove(projectID)
1058 #self.persons2Projects.update({person:projectsList})
1059 if (len(objectsOfPerson)==0): #loesche person aus der liste wenn keine Projekte dazu existieren.
1060 del self.objects2Projects[object[0]]
1061
1062 self.projectObjects.update({projectID:objects})
1063 retstring = self.getObjectsFromProjectAsHTML(projectID) 1104 retstring = self.getObjectsFromProjectAsHTML(projectID)
1064 logging.debug(retstring) 1105 logging.debug(retstring)
1065 return retstring 1106 return retstring
1107
1066 1108
1067 security.declareProtected('View management screens','removePersonFromProject') 1109 security.declareProtected('View management screens','removePersonFromProject')
1068 def removePersonFromProject(self,projectID,value): 1110 def removePersonFromProject(self,projectID,value):
1069 """remove a person from the projeckt""" 1111 """remove a person from the projeckt"""
1070 logging.debug("remove:"+projectID+":"+value); 1112 logging.debug("remove:"+projectID+":"+value);
1071 self.storeChange("removePerson",projectID,value) 1113 self.storeChange("removePerson",projectID,value)
1072 1114
1073 persons = self.getPersonsFromProject(projectID) # hole alle personen die mit dem Projekt verbunden sind. 1115
1074 for person in persons.keys(): 1116 self.deleteTagInDB(projectID, "person", value)
1075 1117
1076 logging.debug("trying:"+repr(person[0])+"::"+repr(value)+"__")
1077 if person[0]==value:#person ist die zuloeschende, dann raus damit
1078
1079 logging.debug("---removed!")
1080 persons.remove(person)
1081
1082 #now also delete the project from the person.
1083 projectsOfPerson=self.persons2Projects.get(person[0])
1084 logging.debug(projectsOfPerson)
1085 if projectID in list(projectsOfPerson):
1086 projectsOfPerson.remove(projectID)
1087 #self.persons2Projects.update({person:projectsList})
1088 if (len(projectsOfPerson)==0): #loesche person aus der liste wenn keine Projekte dazu existieren.
1089 del self.persons2Projects[person[0]]
1090
1091
1092 #self.projectPersons.update({projectID:persons})
1093 retstring = self.getPersonsFromProjectAsHTML(projectID) 1118 retstring = self.getPersonsFromProjectAsHTML(projectID)
1094 logging.debug(retstring) 1119 logging.debug(retstring)
1095 return retstring 1120 return retstring
1096 1121
1097 1122
1109 security.declareProtected('View management screens','addPersonToProject') 1134 security.declareProtected('View management screens','addPersonToProject')
1110 def addPersonToProject(self,projectID,value,label): 1135 def addPersonToProject(self,projectID,value,label):
1111 """ add a person so the project""" 1136 """ add a person so the project"""
1112 self.storeChange("addPerson",projectID,value+":"+label) 1137 self.storeChange("addPerson",projectID,value+":"+label)
1113 1138
1114 persons=self.getPersonsFromProject(projectID); 1139
1115
1116 logging.debug("adding:"+projectID+":"+value+":"+label); 1140 logging.debug("adding:"+projectID+":"+value+":"+label);
1117 1141
1118 persons.insert([value,label]) 1142 personID = self.addTagToDB(projectID, tagType="person", tag=value) ##lege neue Person an oder gib exitierende ID
1119 self.projectPersons.update({projectID:persons}) 1143
1120 1144 self.addLabel(personID,label)
1121 for personTuple in persons: 1145
1122 #hole die abgespeicherten Projekte zu einer Person 1146
1123 person=personTuple[0] #hole die ID
1124
1125
1126 if getattr(self,"persons2Projects",None)==None:
1127 setattr(self,"persons2Projects",OOBTree())
1128
1129 projects = self.persons2Projects.get(person,None)
1130 logging.debug("found projects:"+ repr(projects))
1131 if projects is None: #person hatte noch keine projekte
1132 projects=OOSet();
1133
1134 projects.insert(projectID )
1135 logging.debug("update:"+person)
1136 self.persons2Projects.update({person:projects})
1137
1138 self.addPersonAndFirstNameFromTripleStore(person)
1139 self.generateSortingOrderForPersonIDs();
1140
1141 self.addNameTOPersonIDNames(value,label)
1142 retstring = self.getPersonsFromProjectAsHTML(projectID) 1147 retstring = self.getPersonsFromProjectAsHTML(projectID)
1143 logging.debug(retstring) 1148 logging.debug(retstring)
1144 transaction.commit() 1149 transaction.commit()
1145 return retstring 1150 return retstring
1146 1151
1147 1152
1148 1153
1149 def rearangePersonIDsHTML(self,REQUEST=None): 1154 # def rearangePersonIDsHTML(self,REQUEST=None):
1150 """setze neue ID zu personen""" 1155 # """setze neue ID zu personen"""
1151 ret=[] 1156 # ret=[]
1152 for personID in self.persons2Projects.keys(): 1157 # for personID in self.persons2Projects.keys():
1153 logging.debug(personID) 1158 # logging.debug(personID)
1154 1159 #
1155 masterID,name=self.findMasterIDAndName(personID.rstrip().lstrip()) 1160 # masterID,name=self.findMasterIDAndName(personID.rstrip().lstrip())
1156 logging.debug(" masterID -appending") 1161 # logging.debug(" masterID -appending")
1157 logging.debug(repr(name)) 1162 # logging.debug(repr(name))
1158 if len(name)==0: 1163 # if len(name)==0:
1159 name=[''] 1164 # name=['']
1160 ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,name)[0])) 1165 # ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,name)[0]))
1161 1166 #
1162 1167 #
1163 if REQUEST: 1168 # if REQUEST:
1164 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','rearrangePersons.zpt')).__of__(self) 1169 # pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','rearrangePersons.zpt')).__of__(self)
1165 return pt(changeList=ret,lookupUrl=self.PERSONS_LOOKUP_URL,editURL=self.EDIT_URL); 1170 # return pt(changeList=ret,lookupUrl=self.PERSONS_LOOKUP_URL,editURL=self.EDIT_URL);
1166 else: 1171 # else:
1167 return ret; 1172 # return ret;
1168 1173 #
1169 def rearangePersonIDs(self,REQUEST): 1174 # def rearangePersonIDs(self,REQUEST):
1170 """unify a list of persons""" 1175 # """unify a list of persons"""
1171 1176 #
1172 argv=REQUEST.form; 1177 # argv=REQUEST.form;
1173 logging.debug(repr(argv)) 1178 # logging.debug(repr(argv))
1174 changes=argv['changes'] 1179 # changes=argv['changes']
1175 if isinstance(changes,str): 1180 # if isinstance(changes,str):
1176 changes=[changes] 1181 # changes=[changes]
1177 1182 #
1178 changeList=self.rearangePersonIDsHTML() 1183 # changeList=self.rearangePersonIDsHTML()
1179 personToMaster={} 1184 # personToMaster={}
1180 logging.debug("changelist:"+repr(changeList)) 1185 # logging.debug("changelist:"+repr(changeList))
1181 #aendere person2project 1186 # #aendere person2project
1182 for change in changes: 1187 # for change in changes:
1183 changeItem=changeList[int(change)]; 1188 # changeItem=changeList[int(change)];
1184 masterID=argv['newID_'+change].lstrip().rstrip() #make sure no spaces 1189 # masterID=argv['newID_'+change].lstrip().rstrip() #make sure no spaces
1185 personID=changeItem[0] 1190 # personID=changeItem[0]
1186 1191 #
1187 personToMaster[personID]=masterID 1192 # personToMaster[personID]=masterID
1188 masterIDProjects = self.persons2Projects.get(masterID,None); 1193 # masterIDProjects = self.persons2Projects.get(masterID,None);
1189 if masterIDProjects==None: 1194 # if masterIDProjects==None:
1190 masterIDProjects=OOSet(); 1195 # masterIDProjects=OOSet();
1191 #ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,[''])[0])) 1196 # #ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,[''])[0]))
1192 1197 #
1193 oldProjects= self.persons2Projects.get(personID) 1198 # oldProjects= self.persons2Projects.get(personID)
1194 logging.debug("personID:"+repr(personID)) 1199 # logging.debug("personID:"+repr(personID))
1195 logging.debug("masterID:"+repr(masterID)) 1200 # logging.debug("masterID:"+repr(masterID))
1196 logging.debug("keys:"+repr(self.persons2Projects.keys())) 1201 # logging.debug("keys:"+repr(self.persons2Projects.keys()))
1197 logging.debug("oldProjects:"+repr(oldProjects)) 1202 # logging.debug("oldProjects:"+repr(oldProjects))
1198 masterIDProjects.update(oldProjects) 1203 # masterIDProjects.update(oldProjects)
1199 self.persons2Projects.update({masterID:masterIDProjects}) 1204 # self.persons2Projects.update({masterID:masterIDProjects})
1200 self.persons2Projects.pop(personID) 1205 # self.persons2Projects.pop(personID)
1201 1206 #
1202 self.addPersonAndFirstNameFromTripleStore(masterID) #addpersontotiplestore 1207 # self.addPersonAndFirstNameFromTripleStore(masterID) #addpersontotiplestore
1203 1208 #
1204 logging.debug("Change:" +personID+":"+ masterID) 1209 # logging.debug("Change:" +personID+":"+ masterID)
1205 1210 #
1206 if personID!=masterID: 1211 # if personID!=masterID:
1207 self.addSameAsRelationToTripleStore(personID,masterID) 1212 # self.addSameAsRelationToTripleStore(personID,masterID)
1208 1213 #
1209 #aendere nun projectperson 1214 # #aendere nun projectperson
1210 logging.debug(personToMaster) 1215 # logging.debug(personToMaster)
1211 for project in self.projectPersons.keys(): 1216 # for project in self.projectPersons.keys():
1212 personsNew=OOSet() 1217 # personsNew=OOSet()
1213 1218 #
1214 persons=self.projectPersons.get(project) 1219 # persons=self.projectPersons.get(project)
1215 for person in persons: 1220 # for person in persons:
1216 personsNew.insert([personToMaster.get(person[0],person[0]),person[1]]) 1221 # personsNew.insert([personToMaster.get(person[0],person[0]),person[1]])
1217 logging.debug("REPLACE in:"+project+":" +repr(person)+" by "+ repr(personToMaster.get(person[0],person[0]))) 1222 # logging.debug("REPLACE in:"+project+":" +repr(person)+" by "+ repr(personToMaster.get(person[0],person[0])))
1218 self.projectPersons.update({project:personsNew}) 1223 # self.projectPersons.update({project:personsNew})
1219 1224 #
1220 self.generateSortingOrderForPersonIDs(); #now sort the new names 1225 # self.generateSortingOrderForPersonIDs(); #now sort the new names
1221 return personToMaster 1226 # return personToMaster
1222 #fuehre personen zusammen die ueber owl:sameAs verbunden sind 1227 # #fuehre personen zusammen die ueber owl:sameAs verbunden sind
1223 def getUnifyPersonsList(self,REQUEST=None): 1228 # def getUnifyPersonsList(self,REQUEST=None):
1224 """vereinheitlichung der personen auf eine ID aus der GND, wenn moeglich""" 1229 # """vereinheitlichung der personen auf eine ID aus der GND, wenn moeglich"""
1225 ret=[] 1230 # ret=[]
1226 for personID in self.persons2Projects.keys(): 1231 # for personID in self.persons2Projects.keys():
1227 masterID,name=self.findMasterIDAndName(personID) 1232 # masterID,name=self.findMasterIDAndName(personID)
1228 logging.debug("masterID:"+masterID) 1233 # logging.debug("masterID:"+masterID)
1229 if (masterID is not None) and (masterID is not "") and (not personID==masterID): 1234 # if (masterID is not None) and (masterID is not "") and (not personID==masterID):
1230 #masterIDProjects = self.persons2Projects.get(masterID,None); 1235 # #masterIDProjects = self.persons2Projects.get(masterID,None);
1231 ##if masterIDProjects==None: 1236 # ##if masterIDProjects==None:
1232 # masterIDProjects=OOSet(); 1237 # # masterIDProjects=OOSet();
1233 logging.debug(" masterID -appending") 1238 # logging.debug(" masterID -appending")
1234 logging.debug(repr(name)) 1239 # logging.debug(repr(name))
1235 1240 #
1236 1241 #
1237 ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,name)[0])) 1242 # ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,name)[0]))
1238 #masterIDProjects.update(self.persons2Projects.get(personID)); 1243 # #masterIDProjects.update(self.persons2Projects.get(personID));
1239 #self.persons2Projects.update({masterID:masterIDProjects}); 1244 # #self.persons2Projects.update({masterID:masterIDProjects});
1240 1245 #
1241 1246 #
1242 if REQUEST: 1247 # if REQUEST:
1243 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','unifyPersons.zpt')).__of__(self) 1248 # pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','unifyPersons.zpt')).__of__(self)
1244 return pt(changeList=ret); 1249 # return pt(changeList=ret);
1245 1250 #
1246 else: 1251 # else:
1247 return ret; 1252 # return ret;
1248 1253 #
1249 def unifyPersons(self,changes,REQUEST=None): 1254 # def unifyPersons(self,changes,REQUEST=None):
1250 """unify a list of persons""" 1255 # """unify a list of persons"""
1251 1256 #
1252 if isinstance(changes,str): 1257 # if isinstance(changes,str):
1253 changes=[changes] 1258 # changes=[changes]
1254 1259 #
1255 changeList=self.getUnifyPersonsList(); 1260 # changeList=self.getUnifyPersonsList();
1256 personToMaster={} 1261 # personToMaster={}
1257 logging.debug("changelist:"+repr(changeList)) 1262 # logging.debug("changelist:"+repr(changeList))
1258 #aendere person2project 1263 # #aendere person2project
1259 for change in changes: 1264 # for change in changes:
1260 changeItem=changeList[int(change)]; 1265 # changeItem=changeList[int(change)];
1261 masterID=changeItem[2] 1266 # masterID=changeItem[2]
1262 personID=changeItem[0] 1267 # personID=changeItem[0]
1263 1268 #
1264 personToMaster[personID]=masterID 1269 # personToMaster[personID]=masterID
1265 masterIDProjects = self.persons2Projects.get(masterID,None); 1270 # masterIDProjects = self.persons2Projects.get(masterID,None);
1266 if masterIDProjects==None: 1271 # if masterIDProjects==None:
1267 masterIDProjects=OOSet(); 1272 # masterIDProjects=OOSet();
1268 #ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,[''])[0])) 1273 # #ret.append((personID,self.personIDtoNames.get(personID,[''])[0],masterID,self.personIDtoNames.get(masterID,[''])[0]))
1269 1274 #
1270 oldProjects= self.persons2Projects.get(personID) 1275 # oldProjects= self.persons2Projects.get(personID)
1271 logging.debug("personID:"+repr(personID)) 1276 # logging.debug("personID:"+repr(personID))
1272 logging.debug("masterID:"+repr(masterID)) 1277 # logging.debug("masterID:"+repr(masterID))
1273 logging.debug("keys:"+repr(self.persons2Projects.keys())) 1278 # logging.debug("keys:"+repr(self.persons2Projects.keys()))
1274 logging.debug("oldProjects:"+repr(oldProjects)) 1279 # logging.debug("oldProjects:"+repr(oldProjects))
1275 masterIDProjects.update(oldProjects) 1280 # masterIDProjects.update(oldProjects)
1276 self.persons2Projects.update({masterID:masterIDProjects}) 1281 # self.persons2Projects.update({masterID:masterIDProjects})
1277 self.persons2Projects.pop(personID) 1282 # self.persons2Projects.pop(personID)
1278 1283 #
1279 self.addPersonAndFirstNameFromTripleStore(masterID) #addpersontotiplestore 1284 # self.addPersonAndFirstNameFromTripleStore(masterID) #addpersontotiplestore
1280 1285 #
1281 logging.debug("Change:" +personID+":"+ masterID) 1286 # logging.debug("Change:" +personID+":"+ masterID)
1282 1287 #
1283 #aendere nun projectperson 1288 # #aendere nun projectperson
1284 logging.debug(personToMaster) 1289 # logging.debug(personToMaster)
1285 for project in self.projectPersons.keys(): 1290 # for project in self.projectPersons.keys():
1286 personsNew=OOSet() 1291 # personsNew=OOSet()
1287 1292 #
1288 persons=self.projectPersons.get(project) 1293 # persons=self.projectPersons.get(project)
1289 for person in persons: 1294 # for person in persons:
1290 personsNew.insert([personToMaster.get(person[0],person[0]),person[1]]) 1295 # personsNew.insert([personToMaster.get(person[0],person[0]),person[1]])
1291 logging.debug("REPLACE in:"+project+":" +repr(person)+" by "+ repr(personToMaster.get(person[0],person[0]))) 1296 # logging.debug("REPLACE in:"+project+":" +repr(person)+" by "+ repr(personToMaster.get(person[0],person[0])))
1292 self.projectPersons.update({project:personsNew}) 1297 # self.projectPersons.update({project:personsNew})
1293 1298 #
1294 self.generateSortingOrderForPersonIDs(); #now sort the new names 1299 # self.generateSortingOrderForPersonIDs(); #now sort the new names
1295 return personToMaster 1300 # return personToMaster
1296 1301 #
1297 1302 #
1298 1303
1299 def findMasterIDAndName(self,ressourceID): 1304 def findMasterIDAndName(self,ressourceID):
1300 queryString="""select * 1305 queryString="""select *
1301 FROM <file://mpiwg_persons_dnb.rdf> 1306 FROM <file://mpiwg_persons_dnb.rdf>
1302 FROM <file://mpiwg_persons_2.rdf> 1307 FROM <file://mpiwg_persons_2.rdf>
1319 if len(entries)>0: 1324 if len(entries)>0:
1320 return entries[0][0],entries[0][5:8] #nur den ersten Treffer und nur die personID 1325 return entries[0][0],entries[0][5:8] #nur den ersten Treffer und nur die personID
1321 1326
1322 1327
1323 return None,None 1328 return None,None
1324 1329
1330
1331
1332 def getPersonsWithProjectsSortedkeys(self):
1333
1334 def sortF(x,y):
1335 return cmp(x.lower(),y.lower())
1336 keys = [x for x in self.getPersonsWithProjects().keys()]
1337 keys.sort(sortF)
1338 return keys
1339
1325 security.declareProtected('View','getPersonsWithProjectIDs') 1340 security.declareProtected('View','getPersonsWithProjectIDs')
1326 def getPersonsWithProjectIDs(self,check=False): 1341
1342 def getPersonsWithProjects(self,check=False):
1327 """holt die getaggted Personen mit Projekten""" 1343 """holt die getaggted Personen mit Projekten"""
1344
1345
1346 objs = self.getTagsFromDB(None, "person", "")
1347
1348 ret={}
1349 #fuege jetzt die projekt informationen an
1350 for obj in objs:
1351 obs = self.getProjectsWithTag("person", obj)
1352 if len(obs)> 0:
1353 ret[obj]=obs
1354
1355 return ret
1356
1357
1358
1359
1360
1328 persons = self.persons2Projects; 1361 persons = self.persons2Projects;
1329 ret={} 1362 ret={}
1330 1363
1331 logging.debug("Check Person:"+repr(persons.keys())) 1364 logging.debug("Check Person:"+repr(persons.keys()))
1332 personsList=[x for x in persons.keys()] 1365 personsList=[x for x in persons.keys()]
1382 1415
1383 logging.debug("AFTERSORT-ret***") 1416 logging.debug("AFTERSORT-ret***")
1384 logging.debug(ret.keys()) 1417 logging.debug(ret.keys())
1385 return ret,personsList 1418 return ret,personsList
1386 1419
1387 def getHistoricalPlacesWithProjectIDs(self): 1420 # def getHistoricalPlacesWithProjectIDs(self):
1388 """holt die getaggted Personen mit Projekten""" 1421 # """holt die getaggted Personen mit Projekten"""
1389 HistoricalPlaces = self.HistoricalPlaces2Projects; 1422 # HistoricalPlaces = self.HistoricalPlaces2Projects;
1390 ret={} 1423 # ret={}
1391 logging.debug("Check HistoricalPlace:"+repr(HistoricalPlaces.keys())) 1424 # logging.debug("Check HistoricalPlace:"+repr(HistoricalPlaces.keys()))
1392 for HistoricalPlace in HistoricalPlaces.keys(): 1425 # for HistoricalPlace in HistoricalPlaces.keys():
1393 logging.debug("Check:"+HistoricalPlace) 1426 # logging.debug("Check:"+HistoricalPlace)
1394 #TODO: HistoricalPlace muss duch den namen von provuder geholt werden 1427 # #TODO: HistoricalPlace muss duch den namen von provuder geholt werden
1395 list=[] 1428 # list=[]
1396 for projectID in HistoricalPlaces.get(HistoricalPlace): 1429 # for projectID in HistoricalPlaces.get(HistoricalPlace):
1397 list.append(self.getProjectDetails(projectID)) 1430 # list.append(self.getProjectDetails(projectID))
1398 1431 #
1399 ret[HistoricalPlace]=list[0:] 1432 # ret[HistoricalPlace]=list[0:]
1400 return ret 1433 # return ret
1401 1434 #
1402 def getObjectsWithProjectIDsSortedkeys(self): 1435 def getObjectsWithProjectsSortedkeys(self):
1403 1436
1404 def sortF(x,y): 1437 def sortF(x,y):
1405 return cmp(x.lower(),y.lower()) 1438 return cmp(x.lower(),y.lower())
1406 keys = [x for x in self.getObjectsWithProjectIDs().keys()] 1439 keys = [x for x in self.getObjectsWithProjects().keys()]
1407 keys.sort(sortF) 1440 keys.sort(sortF)
1408 return keys 1441 return keys
1409 1442
1410 def getObjectsWithProjectIDs(self): 1443 def getObjectsWithProjects(self):
1411 """holt die getagten Personen mit Projekten""" 1444 """holt die getagten Objekte mit Projekten"""
1412 objects = self.objects2Projects; 1445
1446 #hole all objekte
1447 objs = self.getTagsFromDB(None, "object", "")
1448
1413 ret={} 1449 ret={}
1414 logging.debug("Check Object:"+repr(objects.keys())) 1450 #fuege jetzt die projekt informationen an
1415 for object in objects.keys(): 1451 for obj in objs:
1416 logging.debug("Check:"+object) 1452 obs = self.getProjectsWithTag("object", obj)
1417 #TODO: object muss duch den namen von provuder geholt werden 1453 if len(obs)> 0:
1418 list=[] 1454 ret[obj]=obs
1419 for projectID in objects.get(object): 1455
1420 list.append(self.getProjectDetails(projectID))
1421
1422 ret[object]=list[0:]
1423
1424 logging.debug(ret)
1425 return ret 1456 return ret
1457
1458
1426 1459
1427 security.declareProtected('View management screens','listAllSuggestedTags') 1460 security.declareProtected('View management screens','listAllSuggestedTags')
1428 def listAllSuggestedTags(self): 1461 def listAllSuggestedTags(self):
1429 """list all tags""" 1462 """list all tags"""
1430 ret="<html><body>" 1463 ret="<html><body>"
1477 1510
1478 1511
1479 1512
1480 #return retstring 1513 #return retstring
1481 1514
1482 security.declareProtected('View management screens','addHistoricalPlaceToProject') 1515 # security.declareProtected('View management screens','addHistoricalPlaceToProject')
1483 def addHistoricalPlaceToProject(self,projectID,value): 1516 # def addHistoricalPlaceToProject(self,projectID,value):
1484 """ add a person so the project""" 1517 # """ add a person so the project"""
1485 HistoricalPlaces=self.getHistoricalPlacesFromProject(projectID); 1518 # HistoricalPlaces=self.getHistoricalPlacesFromProject(projectID);
1486 1519 #
1487 logging.debug("adding:"+projectID+":"+value); 1520 # logging.debug("adding:"+projectID+":"+value);
1488 1521 #
1489 1522 #
1490 #TODO: Im moment noch keine Zuordnung zu einer ID. 1523 # #TODO: Im moment noch keine Zuordnung zu einer ID.
1491 HistoricalPlaces.insert([value,value]) 1524 # HistoricalPlaces.insert([value,value])
1492 self.projectHistoricalPlaces.update({projectID:HistoricalPlaces}) 1525 # self.projectHistoricalPlaces.update({projectID:HistoricalPlaces})
1493 1526 #
1494 1527 #
1495 1528 #
1496 for HistoricalPlaceTuple in HistoricalPlaces: 1529 # for HistoricalPlaceTuple in HistoricalPlaces:
1497 #hole die abgespeicherten Projekte zu einer Person 1530 # #hole die abgespeicherten Projekte zu einer Person
1498 person=HistoricalPlaceTuple[0] #hile die ID 1531 # person=HistoricalPlaceTuple[0] #hile die ID
1499 1532 #
1500 1533 #
1501 if getattr(self,"HistoricalPlaces2Projects",None)==None: 1534 # if getattr(self,"HistoricalPlaces2Projects",None)==None:
1502 setattr(self,"HistoricalPlaces2Projects",OOBTree()) 1535 # setattr(self,"HistoricalPlaces2Projects",OOBTree())
1503 1536 #
1504 projects = self.HistoricalPlaces2Projects.get(person,None) 1537 # projects = self.HistoricalPlaces2Projects.get(person,None)
1505 1538 #
1506 if projects==None: 1539 # if projects==None:
1507 projects=OOSet(); 1540 # projects=OOSet();
1508 1541 #
1509 projects.insert(projectID ) 1542 # projects.insert(projectID )
1510 logging.debug("update:"+person) 1543 # logging.debug("update:"+person)
1511 self.HistoricalPlaces2Projects.update({person:projects}) 1544 # self.HistoricalPlaces2Projects.update({person:projects})
1512 1545 #
1513 1546 #
1514 1547 #
1515 retstring = self.getHistoricalPlacesFromProjectAsHTML(projectID) 1548 # retstring = self.getHistoricalPlacesFromProjectAsHTML(projectID)
1516 logging.debug(retstring) 1549 # logging.debug(retstring)
1517 1550 #
1518 1551 #
1519 1552 #
1520 return retstring 1553 # return retstring
1521 1554 #
1522 security.declareProtected('View management screens','addObjectToProject') 1555 security.declareProtected('View management screens','addObjectToProject')
1523 def addObjectToProject(self,projectID,value): 1556 def addObjectToProject(self,projectID,value):
1524 """ add a person so the project""" 1557 """ add a person so the project"""
1525 objects=self.getObjectsFromProject(projectID); 1558 #objects=self.getObjectsFromProject(projectID);
1526 1559 logging.debug("adding:"+projectID+":"+value);
1527 logging.debug("adding:"+projectID+":"+value);
1528
1529 self.storeChange("addObject",projectID,value) 1560 self.storeChange("addObject",projectID,value)
1530 1561
1531 #TODO: Im moment noch keine Zuordnung zu einer ID. 1562 #TODO: Im moment noch keine Zuordnung zu einer ID.
1532 objects.insert([value,value])
1533 self.projectObjects.update({projectID:objects})
1534
1535
1536
1537 for objectTuple in objects:
1538 #hole die abgespeicherten Projekte zu einer Person
1539 person=objectTuple[0] #hile die ID
1540
1541
1542 if getattr(self,"objects2Projects",None)==None:
1543 setattr(self,"objects2Projects",OOBTree())
1544 1563
1545 projects = self.objects2Projects.get(person,None) 1564 self.addTagToDB(projectID, tagType="object", tag=value)
1546 1565
1547 if projects==None:
1548 projects=OOSet();
1549
1550 projects.insert(projectID )
1551 logging.debug("update:"+person)
1552 self.objects2Projects.update({person:projects})
1553
1554
1555
1556 retstring = self.getObjectsFromProjectAsHTML(projectID) 1566 retstring = self.getObjectsFromProjectAsHTML(projectID)
1557 logging.debug(retstring) 1567 logging.debug(retstring)
1558 1568
1559 1569
1560
1561 return retstring 1570 return retstring
1562 1571
1563 1572
1564 def getProjectsWithTag(self,tagType,tagName): 1573 def getProjectsWithTag(self,tagType,tagName):
1565 tags = getattr(self,"tags",None) 1574 """hole alle projekte mit tags vom typ tagType and tagName"""
1566 if tags is None: 1575
1567 logging.debug("can't find Tags") 1576 qs = """select distinct project_id from thesaurus_projects_tags where tag_id in
1568 return [] 1577 (select id as tag_id from thesaurus_tags where tag_type = %s and tag_name = %s)
1569 1578 """
1570 tagsStored=tags.get(tagType,None) 1579
1571 if tagsStored is None: 1580
1572 logging.debug("can't find Tag:"+tagType) 1581 #hole alle projecte
1573 return []
1574
1575 projects = tagsStored.get(tagName,None)
1576 if projects is None:
1577 logging.debug("can't find any projects for Tag:"+tagName+"("+tagType+")")
1578 return []
1579 1582
1580 ret=[] 1583 ret=[]
1581 for project in projects: 1584 for projectRes in self.executeZSQL(qs,[tagType,tagName]):
1585
1586 project = projectRes.project_id
1587
1582 logging.debug("found:"+project) 1588 logging.debug("found:"+project)
1583 proj =self.getProjectDetails(project); 1589 proj =self.getProjectDetails(project);
1584 if proj is not None: 1590 if proj is not None:
1585 ret.append(proj) 1591 ret.append(proj)
1586 1592