comparison MPIWGThesaurus.py @ 15:f9a65eaaa59c

bug beim L?schen von objekte im Tagger fixed. Logger eingebaut um die Ver?nderungen beim Taggen festzuhalten,
author dwinter
date Wed, 18 Jan 2012 12:51:43 +0100
parents 51ed6ad43383
children 8e2ddcef1e8d
comparison
equal deleted inserted replaced
14:a85d5f111592 15:f9a65eaaa59c
76 virtuosoDAV="/DAV/home/websiteuser/" 76 virtuosoDAV="/DAV/home/websiteuser/"
77 virtuosoDAVUser="websiteuser" 77 virtuosoDAVUser="websiteuser"
78 virtuosoDAVPW="w3s45us3" 78 virtuosoDAVPW="w3s45us3"
79 virtuosoGraph="file://newpersonsFromProjects" 79 virtuosoGraph="file://newpersonsFromProjects"
80 80
81 logpathDefault="/var/tmp/tagchanges.log"
82
81 #BTrees fuer die Tags 83 #BTrees fuer die Tags
82 84
83 projectPersons= OOBTree() #project --> personen IDs 85 projectPersons= OOBTree() #project --> personen IDs
84 projectObjects= OOBTree() 86 projectObjects= OOBTree() #project --> objects
85 projectHistoricalPlaces= OOBTree() 87 projectHistoricalPlaces= OOBTree()
86 projectSuggestedTags= OOBTree() 88 projectSuggestedTags= OOBTree()
87 persons2Projects= OOBTree() #personenID --> projects 89 persons2Projects= OOBTree() #personenID --> projects
88 objects2Projects=OOBTree() 90 objects2Projects=OOBTree() #objects --> projects
89 historicalPlaces2Projects=OOBTree() 91 historicalPlaces2Projects=OOBTree()
90 suggestedTags2Projects=OOBTree() 92 suggestedTags2Projects=OOBTree()
91 personIDtoNames=OOBTree() # weist den personenIDs Klartextnamen aus dem Triplestore zu 93 personIDtoNames=OOBTree() # weist den personenIDs Klartextnamen aus dem Triplestore zu
92 personsIDForSort=[] # liste personenID sortiert nach dem tupel (nachname,vorname) 94 personsIDForSort=[] # liste personenID sortiert nach dem tupel (nachname,vorname)
93 personsIDForSortFull=[] # liste (personenID,(nachname,vorname)) nicht sortiert! 95 personsIDForSortFull=[] # liste (personenID,(nachname,vorname)) nicht sortiert!
161 163
162 164
163 manage_options = Folder.manage_options+( 165 manage_options = Folder.manage_options+(
164 {'label':'Thesaurus entries','action':'changeMPIWGThesaurusForm'}, 166 {'label':'Thesaurus entries','action':'changeMPIWGThesaurusForm'},
165 {'label':'Manage Thesaurus','action':'manageMPIWGThesaurus'}, 167 {'label':'Manage Thesaurus','action':'manageMPIWGThesaurus'},
168 {'label':'Thesaurus Log','action':'manageMPIWGThesaurusLogs'},
166 #{'label':'Change Publications Special','action':'changePublications_specialForm'}, 169 #{'label':'Change Publications Special','action':'changePublications_specialForm'},
167 ) 170 )
168 171
169 def __init__(self,id): 172 def __init__(self,id):
170 """init""" 173 """init"""
187 def manageMPIWGThesaurus(self): 190 def manageMPIWGThesaurus(self):
188 """form for changing the project""" 191 """form for changing the project"""
189 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageMPIWGThesaurus.zpt')).__of__(self) 192 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageMPIWGThesaurus.zpt')).__of__(self)
190 return pt() 193 return pt()
191 194
195 security.declareProtected('View management screens','manageMPIWGThesaurusLogs')
196 def manageMPIWGThesaurusLogs(self):
197 """form for changing the project"""
198 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageMPIWGThesaurusLog.zpt')).__of__(self)
199 return pt()
200
201 def changeMPIWGThesaurusLog(self,logpath,RESPONSE=None):
202 """change log file path"""
203 self.logpath=logpath
204
205 if RESPONSE is not None:
206 redirect(RESPONSE,'manage_main')
207
208
192 security.declareProtected('View management screens','changeMPIWGThesaurus') 209 security.declareProtected('View management screens','changeMPIWGThesaurus')
193 def changeMPIWGThesaurus(self,approachesTxt,disciplinesTxt,periodsTxt,spacesTxt,technologiesTxt,knowledgeTransfersTxt,RESPONSE=None): 210 def changeMPIWGThesaurus(self,approachesTxt,disciplinesTxt,periodsTxt,spacesTxt,technologiesTxt,knowledgeTransfersTxt,RESPONSE=None):
194 """change it""" 211 """change it"""
195 self.approachesTxt=approachesTxt 212 self.approachesTxt=approachesTxt
196 self.disciplinesTxt=disciplinesTxt 213 self.disciplinesTxt=disciplinesTxt
199 self.technologiesTxt=technologiesTxt 216 self.technologiesTxt=technologiesTxt
200 self.knowledgeTransfersTxt=knowledgeTransfersTxt 217 self.knowledgeTransfersTxt=knowledgeTransfersTxt
201 218
202 if RESPONSE is not None: 219 if RESPONSE is not None:
203 redirect(RESPONSE,'manage_main') 220 redirect(RESPONSE,'manage_main')
204 221
222
223 def getLogpath(self):
224 return getattr(self,"logpath",self.logpathDefault)
225
226 def getLogfile(self,projectID="",date=""):
227
228 # logfile format : YYYY-MM-TT HH:mm:ss\tUSER\ttype\tprojectid\CHANGED_TAG_or_OBJECT_or_PERSON
229 if not os.path.exists(self.getLogpath()):
230 return ""
231
232 fh = open(self.getLogpath(),"r")
233 lines=fh.readlines()
234
235 if (projectID!=""):
236 ret=[]
237 for line in lines:
238 splitted=line.split("\t")
239 if splitted[3]==projectID:
240 ret.append(line)
241
242 lines=ret[0:]
243
244 if (date!=""):
245 ret=[]
246 for line in lines:
247 splitted=line.split("\t")
248 if splitted[0]>=date:
249 ret.append(line)
250
251
252 lines=ret[0:]
253
254 txt= "".join(lines)
255 fh.close()
256
257
258
259
260 return txt
261
205 #In der Anzeige soll der Name der zitierten Personen in Klartext angezeigt werden, ausserdem die Varianten, wie sie tatsaechlich 262 #In der Anzeige soll der Name der zitierten Personen in Klartext angezeigt werden, ausserdem die Varianten, wie sie tatsaechlich
206 #in den Projekten benutzt werden 263 #in den Projekten benutzt werden
207 264
208 265
209 def addPersonAndFirstNameFromTripleStore(self, personID): 266 def addPersonAndFirstNameFromTripleStore(self, personID):
448 505
449 506
450 507
451 for tag in tagsStored.keys(): #gehe durch alle gespeichteren tags 508 for tag in tagsStored.keys(): #gehe durch alle gespeichteren tags
452 logging.debug("checking:"+tag) 509 logging.debug("checking:"+tag)
453 currentApproach = tagsStored.get(tag,None) 510 projectsOfTag = tagsStored.get(tag,None)
454 logging.debug(currentApproach) 511 logging.debug(projectsOfTag)
455 if currentApproach is None: 512 if projectsOfTag is None:
456 currentApproach=OOSet() 513 projectsOfTag=OOSet()
457 514
458 if tag in tagList: #dieser ist getagged 515 if tag in tagList: #dieser ist getagged
459 currentApproach.update([projectID]); 516 projectsOfTag.update([projectID]);
517 self.storeChange("added",projectID,tag)
460 tagList.remove(tag); 518 tagList.remove(tag);
461 else: 519 else:
462 if currentApproach.has_key(projectID): 520 if projectsOfTag.has_key(projectID):
463 currentApproach.remove(projectID); 521 projectsOfTag.remove(projectID);
464 522 self.storeChange("remove",projectID,tag)
465 tagsStored.update({tag:currentApproach}); 523
466 524 tagsStored.update({tag:projectsOfTag});
467 for tag in tagList: # alle die nich nicht abearbeitet worden muessen noch angelegt werden 525
526 for tag in tagList: # alle Tags, die nicht abgearbeitet worden sind, muessen noch angelegt werden
468 logging.debug("adding:"+tag) 527 logging.debug("adding:"+tag)
469 newApproach=OOSet() 528 newApproach=OOSet()
470 newApproach.update([projectID]); 529 newApproach.update([projectID]);
471 tagsStored.insert(tag, newApproach); 530 tagsStored.insert(tag, newApproach);
472 531
475 transaction.commit() 534 transaction.commit()
476 535
477 def getTitle(self,entry): 536 def getTitle(self,entry):
478 return entry.title 537 return entry.title
479 538
480 def getEntriesFormatted(self,entries,type): 539 def getEntriesFormatted(self,entries,formatType):
481 errorString="<H1>template with name <em>levelFormatted</em> does not exist in the thesaurus folder!" 540 errorString="<H1>template with name <em>levelFormatted</em> does not exist in the thesaurus folder!"
482 if not hasattr(self,'levelFormatted'): 541 if not hasattr(self,'levelFormatted'):
483 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','levelFormatted.zpt')).__of__(self) 542 pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','levelFormatted.zpt')).__of__(self)
484 return pt(level1_entries=entries,type=type) 543 return pt(level1_entries=entries,type=formatType)
485 544
486 545
487 return self.levelFormatted(level1_entries=entries,type=type) 546 return self.levelFormatted(level1_entries=entries,type=formatType)
488 547
489 def getEntries(self,entry): 548 def getEntries(self,entry):
490 return entry.entries 549 return entry.entries
491 550
492 #nimmt ein eine Text der Form 551 #nimmt ein eine Text der Form
718 security.declareProtected('View management screens','removeObjectFromProject') 777 security.declareProtected('View management screens','removeObjectFromProject')
719 def removeObjectFromProject(self,projectID,value): 778 def removeObjectFromProject(self,projectID,value):
720 """remove""" 779 """remove"""
721 logging.debug("remove:"+projectID+":"+value); 780 logging.debug("remove:"+projectID+":"+value);
722 781
782
783 self.storeChange("removeObject",projectID,value)
784
723 objects = self.getObjectsFromProject(projectID) 785 objects = self.getObjectsFromProject(projectID)
724 for object in objects.keys(): 786 for object in objects.keys():
725 787
726 logging.debug("trying:"+repr(object[0])+"::"+repr(value)+"__") 788 logging.debug("trying:"+repr(object[0])+"::"+repr(value)+"__")
727 if object[0]==value: 789 if object[0]==value:
728 logging.debug("---removed!") 790 logging.debug("---removed!")
729 objects.remove(object) 791 objects.remove(object)
730 792
793 #now also delete the project from the object.
794 objectsOfPerson=self.objects2Projects.get(object[0])
795
796
797 if projectID in list(objectsOfPerson):
798 objectsOfPerson.remove(projectID)
799 #self.persons2Projects.update({person:projectsList})
800 if (len(objectsOfPerson)==0): #loesche person aus der liste wenn keine Projekte dazu existieren.
801 del self.objects2Projects[object[0]]
802
731 self.projectObjects.update({projectID:objects}) 803 self.projectObjects.update({projectID:objects})
732 retstring = self.getObjectsFromProjectAsHTML(projectID) 804 retstring = self.getObjectsFromProjectAsHTML(projectID)
733 logging.debug(retstring) 805 logging.debug(retstring)
734 return retstring 806 return retstring
735 807
736 security.declareProtected('View management screens','removePersonFromProject') 808 security.declareProtected('View management screens','removePersonFromProject')
737 def removePersonFromProject(self,projectID,value): 809 def removePersonFromProject(self,projectID,value):
738 """remove a person from the projeckt""" 810 """remove a person from the projeckt"""
739 logging.debug("remove:"+projectID+":"+value); 811 logging.debug("remove:"+projectID+":"+value);
812 self.storeChange("removePerson",projectID,value)
740 813
741 persons = self.getPersonsFromProject(projectID) # hole alle personen die mit dem Projekt verbunden sind. 814 persons = self.getPersonsFromProject(projectID) # hole alle personen die mit dem Projekt verbunden sind.
742 for person in persons.keys(): 815 for person in persons.keys():
743 816
744 logging.debug("trying:"+repr(person[0])+"::"+repr(value)+"__") 817 logging.debug("trying:"+repr(person[0])+"::"+repr(value)+"__")
775 self.personIDtoNames.update({personID:personName}) 848 self.personIDtoNames.update({personID:personName})
776 849
777 security.declareProtected('View management screens','addPersonToProject') 850 security.declareProtected('View management screens','addPersonToProject')
778 def addPersonToProject(self,projectID,value,label): 851 def addPersonToProject(self,projectID,value,label):
779 """ add a person so the project""" 852 """ add a person so the project"""
853 self.storeChange("addPerson",projectID,value+":"+label)
854
780 persons=self.getPersonsFromProject(projectID); 855 persons=self.getPersonsFromProject(projectID);
781 856
782 logging.debug("adding:"+projectID+":"+value+":"+label); 857 logging.debug("adding:"+projectID+":"+value+":"+label);
783 858
784 persons.insert([value,label]) 859 persons.insert([value,label])
1072 keys = [x for x in self.getObjectsWithProjectIDs().keys()] 1147 keys = [x for x in self.getObjectsWithProjectIDs().keys()]
1073 keys.sort(sortF) 1148 keys.sort(sortF)
1074 return keys 1149 return keys
1075 1150
1076 def getObjectsWithProjectIDs(self): 1151 def getObjectsWithProjectIDs(self):
1077 """holt die getaggted Personen mit Projekten""" 1152 """holt die getagten Personen mit Projekten"""
1078 objects = self.objects2Projects; 1153 objects = self.objects2Projects;
1079 ret={} 1154 ret={}
1080 logging.debug("Check Object:"+repr(objects.keys())) 1155 logging.debug("Check Object:"+repr(objects.keys()))
1081 for object in objects.keys(): 1156 for object in objects.keys():
1082 logging.debug("Check:"+object) 1157 logging.debug("Check:"+object)
1188 """ add a person so the project""" 1263 """ add a person so the project"""
1189 objects=self.getObjectsFromProject(projectID); 1264 objects=self.getObjectsFromProject(projectID);
1190 1265
1191 logging.debug("adding:"+projectID+":"+value); 1266 logging.debug("adding:"+projectID+":"+value);
1192 1267
1268 self.storeChange("addObject",projectID,value)
1193 1269
1194 #TODO: Im moment noch keine Zuordnung zu einer ID. 1270 #TODO: Im moment noch keine Zuordnung zu einer ID.
1195 objects.insert([value,value]) 1271 objects.insert([value,value])
1196 self.projectObjects.update({projectID:objects}) 1272 self.projectObjects.update({projectID:objects})
1197 1273
1364 return 1440 return
1365 1441
1366 1442
1367 1443
1368 return 1444 return
1445
1446 # self.storeChange("removePerson",projectID,value)
1447 def storeChange(self,typeString,projectID,value):
1448
1449 from time import gmtime,strftime
1450
1451
1452 fl = open(self.getLogpath(),"a")
1453 person = self.REQUEST.AUTHENTICATED_USER.getId()
1454 date = strftime("%Y-%m-%d %H:%M:%S", gmtime())
1455 writeString ="\t".join((date,person,typeString,projectID,value))
1456 fl.write(writeString+"\n")
1457 fl.flush()
1458 fl.close()
1369 1459
1370 def redirect(RESPONSE,url): 1460 def redirect(RESPONSE,url):
1371 """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen""" 1461 """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen"""
1372 1462
1373 timeStamp=time.time() 1463 timeStamp=time.time()