changeset 20:82e72e034b0b

Merge with 1252aeadcd2939146e19e7423e5cdd856db5e152
author dwinter
date Wed, 29 Feb 2012 09:29:17 +0100
parents 5840fad81f12 (diff) 1252aeadcd29 (current diff)
children d801453fd85f
files MPIWGThesaurus.py
diffstat 7 files changed, 756 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/.pydevproject	Fri Jan 06 10:58:49 2012 +0100
+++ b/.pydevproject	Wed Feb 29 09:29:17 2012 +0100
@@ -2,7 +2,7 @@
 <?eclipse-pydev version="1.0"?>
 
 <pydev_project>
-<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">python2.4</pydev_property>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">python2.4 - zope</pydev_property>
 <pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.4</pydev_property>
 <pydev_pathproperty name="org.python.pydev.PROJECT_SOURCE_PATH">
 <path>/MPIWGThesaurus</path>
--- a/MPIWGThesaurus.py	Fri Jan 06 10:58:49 2012 +0100
+++ b/MPIWGThesaurus.py	Wed Feb 29 09:29:17 2012 +0100
@@ -27,6 +27,19 @@
 import urllib2
 import urllib
 
+
+
+class projectHolder:
+            projectHolder=""
+            projectName=""
+            projectID=""
+            persons=""
+            tags={}
+            
+            def __init__(self,ID):
+                self.projectID=ID
+                self.tags={}
+                
 #Entry beschreibt jeweils einen Tag mit dem Namen "title", entries enthaelt eine Liste von Subtags (der Klasse Entry), die diesem Tag untergeordnet sind.
 class Entry:
     """publicClass"""
@@ -78,14 +91,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 +178,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 +205,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 +231,124 @@
     
         if RESPONSE is not None:
             redirect(RESPONSE,'manage_main')
-     
+    
+    
+    def getProjectsAndTags(self):
+        """projekte und tags"""
+       
+        
+        projectTags={}
+        for tag in self.tags.keys():
+            logging.debug("getProjectsAndTags:"+tag)
+               # <div class="level1_projects" tal:repeat="proj
+               #              python:here.getProjectsWithTag('approaches',here.getTitle(level1))"><a tal:attributes="href
+               #                                                         python:proj[0]"><span  tal:content="python:proj[1]">my proj</span><tal:x define="person python:proj[2]"><span
+               #                                                                                                          class="person_projects" tal:content="person"/></tal:x></a></div>
+          #</div>
+            
+            for subTag in self.tags.get(tag):
+                projs = self.getProjectsWithTag(tag,subTag)
+                if not isinstance(projs, ListType):
+                    projs=[projs]
+                
+                for proj in projs:
+                    
+                    projectID=proj[0]
+                    logging.debug("PTS"+repr(projectTags))
+                    project=projectTags.get(projectID,projectHolder(projectID))
+                    project.projectName=proj[1]
+                    project.persons=proj[2]
+                    logging.debug(project)
+                    logging.debug(tag)
+                    logging.debug("PROTS"+repr(project.tags))
+                    tagsOfType=project.tags.get(tag,OOSet())
+                    logging.debug(tagsOfType)
+                    tagsOfType.add(subTag.decode('utf-8'))
+                                  
+                    logging.debug("Adding %s to %s"%(subTag,projectID))
+                    project.tags[tag]=tagsOfType
+                    
+                    projectTags[projectID]=project
+                    logging.debug("Saved %s to %s"%(repr(list(tagsOfType)),projectID))
+        logging.debug(projectTags)
+        
+        
+        
+        return projectTags
+    
+    def getProjectsAndTagsTSV(self):
+        """get the projects as tab"""
+        ret=""
+        
+        #genereate headers
+        headers=['date','projectPath','projectName','researchers resp']
+        headers.extend(list(self.tags.keys()))
+        ret+="\t".join(headers)+"\n"
+        
+        projectTags = self.getProjectsAndTags()
+        for projectID in projectTags.keys():
+            retarray=[]
+            splitted = projectID.split("/") # hiern nur die eingetliche ID ohne den Pfad
+            if len(splitted)>0:
+                projectIDShort=splitted[-1]
+                retarray.append(self.lastChangeInThesaurus.get(projectIDShort,''))
+            else:
+                retarray.append('')
+            retarray.append(projectID)
+            project = projectTags.get(projectID)
+            retarray.append(project.projectName)
+            retarray.append(project.persons)
+            
+            
+            
+            for tagType in self.tags.keys():
+                tags = project.tags.get(tagType,[''])
+                retarray.append(";".join(tags))
+            
+            
+            ret+="\t".join(retarray)+"\n"
+                
+        return ret
+    
+    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 +597,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,7 +626,17 @@
     def getTitle(self,entry):
         return entry.title
     
+    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=formatType)
+    
+        
+        return self.levelFormatted(level1_entries=entries,type=formatType)
+        
     def getEntries(self,entry):
+        logging.debug("GETENTRY:"+repr(entry))
         return entry.entries
     
     #nimmt ein eine Text der Form 
@@ -711,6 +870,9 @@
         """remove"""
         logging.debug("remove:"+projectID+":"+value);
         
+        
+        self.storeChange("removeObject",projectID,value)
+        
         objects = self.getObjectsFromProject(projectID)
         for object in objects.keys():
            
@@ -719,6 +881,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)
@@ -728,6 +900,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():
@@ -768,6 +941,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);
@@ -1056,8 +1231,16 @@
             ret[HistoricalPlace]=list[0:]
         return ret
     
+    def getObjectsWithProjectIDsSortedkeys(self):
+        
+        def sortF(x,y):
+            return cmp(x.lower(),y.lower())
+        keys = [x for x in self.getObjectsWithProjectIDs().keys()]
+        keys.sort(sortF)
+        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()))
@@ -1173,6 +1356,7 @@
         
         logging.debug("adding:"+projectID+":"+value);
         
+        self.storeChange("addObject",projectID,value)
      
         #TODO: Im moment noch keine Zuordnung zu einer ID.
         objects.insert([value,value])
@@ -1349,6 +1533,28 @@
                     
        
         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()
+        
+        lastChangeInThesaurus = getattr(self,'lastChangeInThesaurus',OOBTree())
+        lastChangeInThesaurus.update({projectID:date})
+        self.lastChangeInThesaurus=lastChangeInThesaurus
         
 def redirect(RESPONSE,url):
         """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/main.html	Wed Feb 29 09:29:17 2012 +0100
@@ -0,0 +1,288 @@
+<!DOCTYPE html>
+<!--  editing page for tags -->
+<html  tal:define="projectID
+		   python:here.REQUEST.get('project','') ">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html;
+charset=iso-8859-1" />
+<base tal:attributes="href python:here.MPIWGrootURL()+'/thesaurus/'"/>
+<title>Project tagger</title>
+    <link type="text/css" href="./jquery-ui/css/ui-lightness/jquery-ui-1.8.11.custom.css" rel="stylesheet" />	
+    <script type="text/javascript" src="./jquery-ui/js/jquery-1.5.1.min.js"></script>
+    <script type="text/javascript" src="./jquery-ui/js/jquery-ui-1.8.11.custom.min.js"></script>
+    <script type="text/javascript"  src="./thesaurus.js"></script>
+    <link type="text/css" href="./tagging.css" rel="stylesheet" />	
+  </head>
+  <body>
+    <h3> The MPIWG's tagger - BETA - Version </h3>
+    <form method="get" action="changeTags">
+      <input type="hidden" name="projectID" id="projectID" tal:attributes="value python:projectID"/>
+      <h1>Tagging:<tal:x content="python:projectID"/></h1>
+      <div id="tagView"> You have selected <span id="numberOfTags">0</span>
+	of <span id="maximumNumberOfTags">8</span>
+	
+	<div id="tagText">You have selected toomany tags!</div>
+	<br/><br/>
+	<div>Selected Tags: <span id="showTags"></span></div>
+	<input id="saveTags" type="submit" value="save tags"/>
+      </div>
+      <!-- Accordion -->
+      <h2 class="demoHeaders">Project Categories</h2>
+      
+      <div id="accordion">
+	<div>
+	  <h3><a href="#">Approches</a></h3>
+	  <div>
+	    <p><a href="#" id="approachesHelp_link" class="helpLink ui-state-default
+							   ui-corner-all"><span class="ui-icon
+										       ui-icon-help"></span>Help</a></p>
+	    <div class="level1"  tal:repeat="level1
+					     python:here.getApproaches()"><input class="tags approache" type="checkbox"
+										 tal:attributes="value
+												 python:here.getTitle(level1)" name="approaches"/><tal:x tal:content="python:here.getTitle(level1)">Lorem</tal:x>
+	      <tal:y condition="python:len(here.getEntries(level1))>0">
+		<div class="level2" tal:repeat="level2
+						python:here.getEntries(level1)"><input class="tags" type="checkbox"
+										       tal:attributes="value
+												       python:here.getTitle(level1)+'_'+here.getTitle(level2)" name="approaches"/><tal:x tal:content="python:here.getTitle(level2)">Lor</tal:x></div>
+	      </tal:y>
+	    </div>
+	    <!-- Dialog approaches -->
+	    <p><a href="#" id="dialog_link_approaches" class="ui-state-default
+							      ui-corner-all dialog_link"><span class="ui-icon
+												      ui-icon-newwin"></span>Suggest new tag</a></p>	
+	  </div>
+	</div>
+	<div>
+	  <div>
+	    <h3><a href="#">Disciplines</a></h3>
+
+	    <div>
+	      <div class="level1"  tal:repeat="level1
+					       python:here.getDisciplines()"><input  class="tags"
+										     type="checkbox"
+										     tal:attributes="value
+												     python:here.getTitle(level1)" name="disciplines"/><tal:x tal:content="python:here.getTitle(level1)">Lorem</tal:x>
+		<tal:y condition="python:len(here.getEntries(level1))>0">
+		  <div class="level2" tal:repeat="level2
+						  python:here.getEntries(level1)"><input type="checkbox"
+											 tal:attributes="value
+													 python:here.getTitle(level1)+'_'+here.getTitle(level2)" name="disciplines"/><tal:x tal:content="python:here.getTitle(level2)">Lor</tal:x></div>
+		</tal:y>
+		<!-- Dialog approaches -->
+		
+	      </div>
+	      <p><a href="#" id="dialog_link_disciplines" class="ui-state-default
+								 ui-corner-all dialog_link"><span class="ui-icon
+													 ui-icon-newwin"></span>Suggest new tag</a></p>	   
+	    </div>
+	    <div>
+	      
+	      <h3><a href="#">Periods</a></h3>
+
+	      <div>
+
+		<div class="level1"  tal:repeat="level1
+						 python:here.getPeriods()"><input type="checkbox"
+										  tal:attributes="value
+												  python:here.getTitle(level1)" name="periods"/><tal:x tal:content="python:here.getTitle(level1)">Lorem</tal:x>
+		  <tal:y condition="python:len(here.getEntries(level1))>0">
+		    <div class="level2" tal:repeat="level2
+						    python:here.getEntries(level1)"><input  class="tags"
+											    type="checkbox"
+											    tal:attributes="value
+													    python:here.getTitle(level1)+'_'+here.getTitle(level2)" name="periods"/><tal:x tal:content="python:here.getTitle(level2)">Lor</tal:x></div>
+		  </tal:y>
+		</div>
+		<p><a href="#" id="dialog_link_periods" class="ui-state-default
+							       ui-corner-all dialog_link"><span class="ui-icon
+												       ui-icon-newwin"></span>Suggest new tag</a></p>	
+	      </div>
+	      <div>
+		<h3><a href="#">People</a></h3>
+		<div>
+		  <p>Currently attached to the project</p>
+		  <div id="persons">replace</div>
+		  <div class="ui-widget">
+		    <label for="personAdd">Add person to the project: </label>
+		    <input id="personAdd"/>
+		    <input type="button" id="personSearchButton" value="search">
+		    <div  id="personInfo"/>
+		  </div>
+		</div>
+	      </div>
+	      <div>
+		
+		<h3><a href="#">Spaces</a></h3>
+		<div>   
+		  <p><a href="#" id="spacesHelp_link" class="helpLink ui-state-default
+							     ui-corner-all"><span class="ui-icon
+											 ui-icon-help"></span>Help</a></p>
+		  
+		  <div class="level1"  tal:repeat="level1
+						   python:here.getSpaces()"><input type="checkbox"  class="tags"
+										   tal:attributes="value
+												   python:here.getTitle(level1)" name="spaces"/><tal:x tal:content="python:here.getTitle(level1)">Lorem</tal:x>
+		    <tal:y condition="python:len(here.getEntries(level1))>0">
+		      <div class="level2" tal:repeat="level2
+						      python:here.getEntries(level1)"><input type="checkbox"  class="tags"
+											     tal:attributes="value
+													     python:here.getTitle(level1)+'_'+here.getTitle(level2)" name="spaces"/><tal:x tal:content="python:here.getTitle(level2)">Lor</tal:x></div>
+		    </tal:y>
+		  </div>
+		  <p><a href="#" id="dialog_link_spaces" class="ui-state-default
+								ui-corner-all dialog_link"><span class="ui-icon
+													ui-icon-newwin"></span>Suggest
+								new
+								tag</a></p>	
+
+		  <div>
+		    <p>Free Text for <em>Historical places</em> (only
+		  displayed if the tag <em>Historical terms</em> above
+		  is set.</p>
+		    <p>Currently attached to the project</p>
+		    <div id="historicalPlaces">replace</div>
+		    <div class="ui-widget">
+		      <label for="Add">Add place to the project: </label>
+		      <input id="historicalPlaceAdd"/>
+		      <input type="button" id="historicalPlaceAddButton" value="add">
+		    </div>
+		  </div>		    
+		</div>
+		<div>
+		  <h3><a href="#">Objects</a></h3>
+		  <div>
+		    <p><a href="#" id="objectsHelp_link" class="helpLink ui-state-default
+								ui-corner-all"><span class="ui-icon
+											    ui-icon-help"></span>Help</a></p>
+		    
+		    <p>Currently attached to the project</p>
+		    <div id="objects">replace</div>
+		    <div class="ui-widget">
+		      <label for="objectAdd">Add object to the project: </label>
+		      <input id="objectAdd"/>
+		      <input type="button" id="objectAddButton" value="add">
+		    </div>
+		  </div>
+		</div>
+
+		<div>
+		  
+		  <h3><a href="#">Technologies</a></h3>
+
+		  <div>
+		    <div class="level1"  tal:repeat="level1
+						     python:here.getTechnologies()"><input type="checkbox"  class="tags"
+											   tal:attributes="value
+													   python:here.getTitle(level1)" name="technologies"/><tal:x tal:content="python:here.getTitle(level1)">Lorem</tal:x>
+		      <tal:y condition="python:len(here.getEntries(level1))>0">
+			<div class="level2" tal:repeat="level2
+							python:here.getEntries(level1)"><input type="checkbox"  class="tags"
+											       tal:attributes="value
+													       python:here.getTitle(level1)+'_'+here.getTitle(level2)" name="technologies"/><tal:x tal:content="python:here.getTitle(level2)">Lor</tal:x></div>
+		      </tal:y>
+		    </div>
+		    <p><a href="#" id="dialog_link_technologies" class="ui-state-default
+									ui-corner-all dialog_link"><span class="ui-icon
+														ui-icon-newwin"></span>Suggest new tag</a></p>	
+		  </div>
+		  <div>
+		    
+		    <h3><a href="#">Knowledge Transfers</a></h3>
+		    <div>
+		      <p><a href="#" id="transfersHelp_link" class="helpLink ui-state-default
+								    ui-corner-all"><span class="ui-icon
+												ui-icon-help"></span>Help</a></p>
+		      
+		      <div class="level1"  tal:repeat="level1
+						       python:here.getKnowledgeTransfers()"><input type="checkbox"  class="tags"
+												   tal:attributes="value
+														   python:here.getTitle(level1)" name="transfers"/><tal:x tal:content="python:here.getTitle(level1)">Lorem</tal:x>
+			<tal:y condition="python:len(here.getEntries(level1))>0">
+			  <div class="level2" tal:repeat="level2
+							  python:here.getEntries(level1)"><input type="checkbox"  class="tags"
+												 tal:attributes="value
+														 python:here.getTitle(level1)+'_'+here.getTitle(level2)" name="transfers"/><tal:x tal:content="python:here.getTitle(level2)">Lor</tal:x></div>
+			</tal:y>
+		      </div>
+		      <p><a href="#" id="dialog_link_transfers" class="ui-state-default
+								       ui-corner-all dialog_link"><span class="ui-icon
+													       ui-icon-newwin"></span>Suggest new tag</a></p>	
+		    </div>
+		  </div>
+
+		  <!-- ui-dialog tags-->
+		  <div id="dialog" title="New Tag">
+		    <p>Suggest a new tag</p>
+		    <input type="hidden" id="suggest_newTag_type"/>
+		    <table>
+		      <tr>
+			<td>TagName:</td><td> <input size="30"
+						     id="suggest_newTag"/></td>
+		      </tr>
+		      <tr>
+			<td>Comment:</td><td> <textarea rows="10" cols="30" id="suggest_newTag_comment"></textarea></td>
+		      </tr>
+		      <tr>
+			<td>Entered by:</td><td><input type="text" id="suggest_newTag_userName"
+			   tal:attributes="value
+			   user/getUserName"/></td><td>Your MPIWG
+			   username (will not be published
+			   anywhere)</td>
+		      </tr>
+		    </table>
+		  </div>
+
+		  	  <!-- ui-dialog persons-->
+		  <div id="dialogPersons" title="New Person">
+		    <p>Create a new person</p>
+		    <table>
+		      <tr>
+			<td>Name of the Person:</td><td> <input size="30"
+						     id="suggest_newPerson"/></td>
+			<td> Write the name in the way it
+			should be displayed</td>
+		      <tr>
+			<td>Comment:</td><td> <textarea rows="10"
+			cols="30"
+			id="suggest_newPerson_comment"></textarea></td><td>Some
+			remarks to identify the person or a link to
+			a website describing the person.</td>
+		      </tr>
+		      <tr>
+			<td>Entered by:</td><td><input type="text" id="suggest_newPerson_userName"
+			   tal:attributes="value
+			   user/getUserName"/></td><td>Your MPIWG
+			   username (will not be published
+			   anywhere)</td>
+		      </tr>
+		    </table>
+		  </div>
+
+		  <div id="approachesHelp" title="Help Approaches" class="helpWindow">
+		    <h5>Methodological approaches</h5>
+		    <p>Others than History of Science</p>
+		    <h5>Historical epistemology approaches</h5>
+		    <p>This category reflects the main MPIWG-themes of the past and current research</p>
+		  </div>
+
+		  <div id="spacesHelp" title="Help Space"  class="helpWindow">
+		    <p>Is the geographical area important to your project, does it deal with specific sites, institutions or spaces of knowledge? </p>
+		  </div>
+
+		  <div id="objectsHelp" title="Help Objects"  class="helpWindow">
+		    <p>Are specific natural or artificial objects important to your research project? </p>
+		  </div>
+
+		  <div id="transfersHelp" title="Help Objects"  class="helpWindow">
+		    <p>How are scientific findings recorded, how is knowledge conveyed
+		      how does it circulate? Are these aspects important to your
+		      research topic? </p>
+		    <h5>Modes of communication</h5>
+		    <p>e.g. language, braille, etc.</p>
+		    <h5>Science education </h5>
+		    <p>e.g. academic and non-academic</p>
+		  </div>
+    </form>
+  </body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/show2.html	Wed Feb 29 09:29:17 2012 +0100
@@ -0,0 +1,197 @@
+<!DOCTYPE html>
+<!--  display the tags -->
+<html metal:use-macro="here/pro_sec_template/macros/page">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+    <title>MPIWG Tags</title>
+    <tal:block metal:fill-slot="head">
+      <!--<link type="text/css"
+      href="./jquery-ui/css/ui-lightness/jquery-ui-1.8.11.custom.css"
+      rel="stylesheet" />	-->
+      <link type="text/css" href="./jquery-mpiwg.css" rel="stylesheet" />
+      <script type="text/javascript" src="./jquery-ui/js/jquery-1.5.1.min.js"></script>
+      <script type="text/javascript" src="./jquery-ui/js/jquery-ui-1.8.11.custom.min.js"></script>
+      <script type="text/javascript">
+
+	// open and close the tags 
+
+	jQuery(document).ready(function(){
+	$('#accordion h3').click(function() {
+		$(this).next().toggle('slow');
+		return false;
+	}).next().hide();
+	});
+
+	$(function(){
+	
+
+
+	// Accordion
+	//$("#accordion").accordion({ header: "h3" });
+	
+       
+       $('.projectsWindow').hide();
+    
+    
+	//open and close the projects
+   $('.showApproach').click(function(){
+
+	var tp = 	$(this).parent();
+	var wd=   $(tp).find('div.projectsWindow');
+	wd.toggle();
+	/*$(tp).find('span.ui-icon').toggleClass('ui-icon-triangle-1-s');*/
+
+	return false;
+    });
+ 
+	});
+
+
+      </script>
+      <style type="text/css">
+	/*demo page css*/
+	body{ font: 62.5% "Trebuchet MS", sans-serif; margin: 50px;}
+
+	.level1 {
+	margin-left: 6em;
+	}
+
+	.demoHeaders {
+	margin-top: 2em;
+	}
+	
+	#dialog_link {padding: .4em 1em .4em 20px;text-decoration: none;position: relative;}
+	#dialog_link span.ui-icon {margin: 0 5px 0 0;position:
+	absolute;left: .2em;top: 50%;margin-top: -8px;}
+
+	.helpLink {padding: .4em 1em .4em 20px;text-decoration: none;position: relative;}
+	.helpLink span.ui-icon {margin: 0 5px 0 0;position:
+	absolute;left: .2em;top: 50%;margin-top: -8px;}
+
+	.level2 {margin-left:10pt}
+	ul#icons {margin: 0; padding: 0;}
+	ul#icons li {margin: 2px; position: relative; padding: 4px 0; cursor: pointer; float: left;  list-style: none;}
+	ul#icons span.ui-icon {float: left; margin: 0 4px;}
+
+	.level1_projects {margin-left: 50pt;
+	background: url(../images/arr_right.gif) no-repeat #f5daaf;
+	padding: 6px 6px 6px 20px;
+	border-bottom: 1px solid #f3be7c;
+	width:500px;
+
+	.arrowC
+}
+
+
+
+	.level2_projects {margin-left:50pt;
+	background: url(../images/arr_right.gif) no-repeat #f5daaf;
+	padding: 6px 6px 6px 20px;
+	border-bottom: 1px solid #f3be7c;
+	width:500px;
+}
+
+		
+	.level1_projects a{
+	
+
+	}
+
+
+	.person_projects {
+	padding-left:5pt;
+	font-style:italic
+	}
+
+	.showApproach {
+	color:#EA8500;
+	cursor:pointer;
+	}
+
+	.showApproach:hover {
+	text-decoration: underline;
+	}
+      </style>
+    </tal:block>
+  </head>
+  <body>
+    <div class="main" metal:fill-slot="center">
+      <div class="center_wide dept">
+
+      <!-- Accordion -->
+      <h3>This overview is currently under construction!</h3>
+      <h2 class="demoHeaders">Project Categories</h2>
+    
+      <div id="accordion">
+	<div>
+	  <h3><a href="#">Approaches</a></h3>
+	    <div>
+	   <tal:x replace="structure python:here.getEntriesFormatted(here.getApproaches(),'approaches')"/>
+	  </div>
+
+	  <h3><a href="#">Disciplines</a></h3>
+	  <div>
+	   <tal:x replace="structure python:here.getEntriesFormatted(here.getDisciplines(),'disciplines')"/>
+	  </div>
+	  
+	  
+	  <h3><a href="#">Periods</a></h3>
+	  <div>
+	   <tal:x replace="structure python:here.getEntriesFormatted(here.getPeriods(),'periods')"/>
+	  </div>
+	  
+
+	  <h3><a href="#">People</a></h3>
+	  <div>
+	    <div class="level1"  tal:repeat="level1 python:here.getPersonsWithProjectIDs()[1]"><span class="showApproach" tal:content="python:here.getNamesFromID(level1)">Lorem</span>
+	      <div class="projectsWindow">
+		<div class="level1_projects" tal:repeat="proj python:here.getPersonsWithProjectIDs()[0][level1]">
+		  <a tal:attributes="href python:proj[0]" tal:content="python:proj[1]">my proj</a>
+		  <tal:x define="person
+				 python:proj[2]"><span class="person_projects"
+						       tal:content="person"/></tal:x>
+		</div>
+	      </div>
+	      
+	    </div>
+	  </div>
+	  
+	  <h3><a href="#">Spaces</a></h3>
+	  <div>
+	    <tal:x replace="structure python:here.getEntriesFormatted(here.getSpaces(),'spaces')"/>
+	  </div>
+	 
+	  
+	  <h3><a href="#">Objects</a></h3>
+	  <div>
+	    <div class="level1"  tal:repeat="level1 python:here.getObjectsWithProjectIDsSortedkeys()"><span class="showApproach" tal:content="python:level1">Lorem</span>
+	      <div title="Projects"  class="projectsWindow">   
+		
+		<div class="level1_projects" tal:repeat="proj python:here.getObjectsWithProjectIDs()[level1]">
+		  <a tal:attributes="href python:proj[0]" tal:content="python:proj[1]">my proj</a>
+		  <tal:x define="person
+				 python:proj[2]"><span class="person_projects"
+						       tal:content="person"/></tal:x>
+		</div>
+	      </div>
+	      
+	    </div>
+	  </div>
+	  
+	  <h3><a href="#">Technologies</a></h3>
+	  <div>
+	    <tal:x replace="structure python:here.getEntriesFormatted(here.getTechnologies(),'technologies')"/>
+	  </div>
+	 
+	  
+	  <h3><a href="#">Knowledge Transfers</a></h3>
+	  <div>
+	    <tal:x replace="structure python:here.getEntriesFormatted(here.getKnowledgeTransfers(),'transfers')"/>
+	  </div>
+	
+	</div>
+      </div>
+      </div>
+    </div>
+  </body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/zpt/levelFormatted.zpt	Wed Feb 29 09:29:17 2012 +0100
@@ -0,0 +1,31 @@
+<!--  exmample for level template -->
+
+<div class="level1"  tal:repeat="level1
+					     python:options['level1_entries']">
+  <span class="showApproach" tal:content="python:here.getTitle(level1) +'('+ str(len(here.getProjectsWithTag(options['type'],here.getTitle(level1)))) +')' ">Lorem</span>
+  <div class="projectsWindow">
+    <div class="level1_projects" tal:repeat="proj
+					     python:here.getProjectsWithTag(options['type'],here.getTitle(level1))"><a tal:attributes="href
+																       python:proj[0]"><span tal:content="python:proj[1]">my proj</span></a><tal:x define="person python:proj[2]"><span 
+																														     class="person_projects" tal:content="person"/></tal:x></div>
+  </div>
+  <tal:y condition="python:len(here.getEntries(level1))>0">
+    
+    <div class="level2" tal:repeat="level2
+				    python:here.getEntries(level1)">
+      <tal:x define="subitems
+		     python:here.getProjectsWithTag(options['type'],here.getTitle(level1)+'_'+here.getTitle(level2))"
+	     condition="python:len(subitems)>0">
+	<span class="showApproach"
+	      tal:content="python:here.getTitle(level2) +'
+			   ('+str(len(subitems))+')'">Lor</span>
+	<div  class="projectsWindow">
+	  <div class="level2_projects" tal:repeat="proj python:subitems">
+	    <a tal:attributes="href python:proj[0]"><span tal:content="python:proj[1]">my proj</span></a>
+	    <tal:x define="person python:proj[2]"><span class="person_projects"  tal:content="person"/></tal:x></div>
+	</div>
+	
+      </tal:x>
+    </div>
+  </tal:y>
+</div>
\ No newline at end of file
--- a/zpt/manageMPIWGThesaurus.zpt	Fri Jan 06 10:58:49 2012 +0100
+++ b/zpt/manageMPIWGThesaurus.zpt	Wed Feb 29 09:29:17 2012 +0100
@@ -7,6 +7,9 @@
 <li><a href="getPersonsWithProjectIDs?check=bool:True">Hole all Personen mit ProjectIDs, raeumt zu gleich den Cache Persone-->ProjectID auf</a></li>
 <li><a href="rearangePersonIDsHTML">Ordne neue IDs vorhandenen Personen zu, insbesondere ersetze temporaere IDs durch GND oder andere,</a></li>
 <li><a href="getUnifyPersonsList">Ordne GND ids zu, falls bisher IDs aus anderen Kontexten vergeben wurden.</a></li>
+
+<h3>Overview</h3>
+<li><a href="getProjectsAndTagsTSV">Uebersicht ueber alle vergebenenen Tags (TAB-getrennte Liste) </a></li>
 </ul>
 </body>
 </html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/zpt/manageMPIWGThesaurusLog.zpt	Wed Feb 29 09:29:17 2012 +0100
@@ -0,0 +1,16 @@
+<html>
+<body>
+<h3>Tag log file</h3>
+<div>
+<form action="changeMPIWGThesaurusLog">
+logfile <input len="30" tal:attributes="value here/getLogpath" name="logpath"/><input type="submit"/>
+</form>
+</div>
+
+<form>
+Date: <input tal:attributes="value python:here.REQUEST.get('date','')" name="date"/> ProjectID: <input name="project"  tal:attributes="value python:here.REQUEST.get('project','')"/> <input type="submit" value="filter"/>
+</form>
+<textarea rows="40" cols="100" tal:content="python:here.getLogfile(here.REQUEST.get('project',''),here.REQUEST.get('date',''))"></textarea>
+
+</body>
+</html>
\ No newline at end of file