# HG changeset patch # User dwinter # Date 1326887503 -3600 # Node ID f9a65eaaa59c1266391e1a9d5c3ab84781dc2660 # Parent a85d5f1115923725b119e357b36a636fc529bdd5 bug beim L?schen von objekte im Tagger fixed. Logger eingebaut um die Ver?nderungen beim Taggen festzuhalten, diff -r a85d5f111592 -r f9a65eaaa59c MPIWGThesaurus.py --- a/MPIWGThesaurus.py Fri Jan 13 10:58:05 2012 +0100 +++ b/MPIWGThesaurus.py Wed Jan 18 12:51:43 2012 +0100 @@ -78,14 +78,16 @@ virtuosoDAVPW="w3s45us3" virtuosoGraph="file://newpersonsFromProjects" + logpathDefault="/var/tmp/tagchanges.log" + #BTrees fuer die Tags projectPersons= OOBTree() #project --> personen IDs - projectObjects= OOBTree() + projectObjects= OOBTree() #project --> objects projectHistoricalPlaces= OOBTree() projectSuggestedTags= OOBTree() persons2Projects= OOBTree() #personenID --> projects - objects2Projects=OOBTree() + objects2Projects=OOBTree() #objects --> projects historicalPlaces2Projects=OOBTree() suggestedTags2Projects=OOBTree() personIDtoNames=OOBTree() # weist den personenIDs Klartextnamen aus dem Triplestore zu @@ -163,6 +165,7 @@ manage_options = Folder.manage_options+( {'label':'Thesaurus entries','action':'changeMPIWGThesaurusForm'}, {'label':'Manage Thesaurus','action':'manageMPIWGThesaurus'}, + {'label':'Thesaurus Log','action':'manageMPIWGThesaurusLogs'}, #{'label':'Change Publications Special','action':'changePublications_specialForm'}, ) @@ -189,6 +192,20 @@ pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageMPIWGThesaurus.zpt')).__of__(self) return pt() + security.declareProtected('View management screens','manageMPIWGThesaurusLogs') + def manageMPIWGThesaurusLogs(self): + """form for changing the project""" + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','manageMPIWGThesaurusLog.zpt')).__of__(self) + return pt() + + def changeMPIWGThesaurusLog(self,logpath,RESPONSE=None): + """change log file path""" + self.logpath=logpath + + if RESPONSE is not None: + redirect(RESPONSE,'manage_main') + + security.declareProtected('View management screens','changeMPIWGThesaurus') def changeMPIWGThesaurus(self,approachesTxt,disciplinesTxt,periodsTxt,spacesTxt,technologiesTxt,knowledgeTransfersTxt,RESPONSE=None): """change it""" @@ -201,7 +218,47 @@ if RESPONSE is not None: redirect(RESPONSE,'manage_main') - + + + def getLogpath(self): + return getattr(self,"logpath",self.logpathDefault) + + def getLogfile(self,projectID="",date=""): + + # logfile format : YYYY-MM-TT HH:mm:ss\tUSER\ttype\tprojectid\CHANGED_TAG_or_OBJECT_or_PERSON + if not os.path.exists(self.getLogpath()): + return "" + + fh = open(self.getLogpath(),"r") + lines=fh.readlines() + + if (projectID!=""): + ret=[] + for line in lines: + splitted=line.split("\t") + if splitted[3]==projectID: + ret.append(line) + + lines=ret[0:] + + if (date!=""): + ret=[] + for line in lines: + splitted=line.split("\t") + if splitted[0]>=date: + ret.append(line) + + + lines=ret[0:] + + txt= "".join(lines) + fh.close() + + + + + return txt + #In der Anzeige soll der Name der zitierten Personen in Klartext angezeigt werden, ausserdem die Varianten, wie sie tatsaechlich #in den Projekten benutzt werden @@ -450,21 +507,23 @@ for tag in tagsStored.keys(): #gehe durch alle gespeichteren tags logging.debug("checking:"+tag) - currentApproach = tagsStored.get(tag,None) - logging.debug(currentApproach) - if currentApproach is None: - currentApproach=OOSet() + projectsOfTag = tagsStored.get(tag,None) + logging.debug(projectsOfTag) + if projectsOfTag is None: + projectsOfTag=OOSet() if tag in tagList: #dieser ist getagged - currentApproach.update([projectID]); + projectsOfTag.update([projectID]); + self.storeChange("added",projectID,tag) tagList.remove(tag); else: - if currentApproach.has_key(projectID): - currentApproach.remove(projectID); - - tagsStored.update({tag:currentApproach}); + if projectsOfTag.has_key(projectID): + projectsOfTag.remove(projectID); + self.storeChange("remove",projectID,tag) + + tagsStored.update({tag:projectsOfTag}); - for tag in tagList: # alle die nich nicht abearbeitet worden muessen noch angelegt werden + for tag in tagList: # alle Tags, die nicht abgearbeitet worden sind, muessen noch angelegt werden logging.debug("adding:"+tag) newApproach=OOSet() newApproach.update([projectID]); @@ -477,14 +536,14 @@ def getTitle(self,entry): return entry.title - def getEntriesFormatted(self,entries,type): + def getEntriesFormatted(self,entries,formatType): errorString="

template with name levelFormatted does not exist in the thesaurus folder!" if not hasattr(self,'levelFormatted'): - pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','levelFormatted.zpt')).__of__(self) - return pt(level1_entries=entries,type=type) + pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','levelFormatted.zpt')).__of__(self) + return pt(level1_entries=entries,type=formatType) - return self.levelFormatted(level1_entries=entries,type=type) + return self.levelFormatted(level1_entries=entries,type=formatType) def getEntries(self,entry): return entry.entries @@ -720,6 +779,9 @@ """remove""" logging.debug("remove:"+projectID+":"+value); + + self.storeChange("removeObject",projectID,value) + objects = self.getObjectsFromProject(projectID) for object in objects.keys(): @@ -728,6 +790,16 @@ logging.debug("---removed!") objects.remove(object) + #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) @@ -737,6 +809,7 @@ 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(): @@ -777,6 +850,8 @@ security.declareProtected('View management screens','addPersonToProject') def addPersonToProject(self,projectID,value,label): """ add a person so the project""" + self.storeChange("addPerson",projectID,value+":"+label) + persons=self.getPersonsFromProject(projectID); logging.debug("adding:"+projectID+":"+value+":"+label); @@ -1074,7 +1149,7 @@ return keys def getObjectsWithProjectIDs(self): - """holt die getaggted Personen mit Projekten""" + """holt die getagten Personen mit Projekten""" objects = self.objects2Projects; ret={} logging.debug("Check Object:"+repr(objects.keys())) @@ -1190,6 +1265,7 @@ logging.debug("adding:"+projectID+":"+value); + self.storeChange("addObject",projectID,value) #TODO: Im moment noch keine Zuordnung zu einer ID. objects.insert([value,value]) @@ -1366,6 +1442,20 @@ return + + # self.storeChange("removePerson",projectID,value) + def storeChange(self,typeString,projectID,value): + + from time import gmtime,strftime + + + fl = open(self.getLogpath(),"a") + person = self.REQUEST.AUTHENTICATED_USER.getId() + date = strftime("%Y-%m-%d %H:%M:%S", gmtime()) + writeString ="\t".join((date,person,typeString,projectID,value)) + fl.write(writeString+"\n") + fl.flush() + fl.close() def redirect(RESPONSE,url): """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen""" diff -r a85d5f111592 -r f9a65eaaa59c examples/main.html --- a/examples/main.html Fri Jan 13 10:58:05 2012 +0100 +++ b/examples/main.html Wed Jan 18 12:51:43 2012 +0100 @@ -1,4 +1,5 @@ +