changeset 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 a85d5f111592
children c8f78f50e097
files MPIWGThesaurus.py examples/main.html
diffstat 2 files changed, 109 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- 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="<H1>template with name <em>levelFormatted</em> 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"""
--- 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 @@
 <!DOCTYPE html>
+<!--  editing page for tags -->
 <html  tal:define="projectID
 		   python:here.REQUEST.get('project','') ">
   <head>