changeset 52:1ed79b33200c

more work on projects and cleanup.
author casties
date Tue, 30 Apr 2013 16:00:56 +0200
parents d456fe185649
children 4600e31a0431
files HashTree.py MPIWGProjects.py MPIWGProjects_removed.py MPIWGRoot.py MPIWGRoot_deleted_methods.py zpt/project/edit_related_projects.zpt
diffstat 6 files changed, 149 insertions(+), 144 deletions(-) [+]
line wrap: on
line diff
--- a/HashTree.py	Tue Apr 30 12:49:26 2013 +0200
+++ b/HashTree.py	Tue Apr 30 16:00:56 2013 +0200
@@ -76,7 +76,7 @@
     keyFn = None
     
     def __init__(self, keySeparator='.', keyFn=None):
-        """creates a HashTree.
+        """Create a HashTree.
         
         @param keySeparator string by which key strings are split into parts
         @param keyFn function applied to key parts (e.g. int if key parts are numbers)
@@ -87,7 +87,7 @@
     
 
     def _splitkey(self, key):
-        """returns a list of key parts"""
+        """Return a list of key parts"""
         if isinstance(key, basestring):
             # its a string - split
             keys = key.split(self.keySeparator)
@@ -106,7 +106,8 @@
 
 
     def getNode(self, key):
-        """gets node under key from the tree.
+        """Return node under key from the tree.
+        
         key can be sequence of key string or a single string using keySeparator.
         If key is None, returns root node.
         """
@@ -125,7 +126,8 @@
 
 
     def get(self, key):
-        """gets value under key from the tree.
+        """Return value under key from the tree.
+        
         key can be sequence of key string or a single string using keySeparator.
         """
         node = self.getNode(key)
@@ -136,7 +138,8 @@
 
      
     def add(self, key, value):
-        """adds value under key to the tree.
+        """Add value under key to the tree.
+        
         key can be sequence of key string or a single string using keySeparator.
         """
         keys = self._splitkey(key)
@@ -153,7 +156,7 @@
 
         
     def getChildrenOf(self, key):
-        """returns the list of child (values) of the node under key."""
+        """Return the list of child (values) of the node under key."""
         node = self.getNode(key)
         if node.children is None:
             return []
@@ -165,8 +168,9 @@
 
 
     def getAncestorsOf(self, key):
-        """returns the list of ancestor (values) of the node under key.
-        ordered from root up."""
+        """Return the list of ancestor (values) of the node under key.
+        
+        Order: root element first."""
         keys = self._splitkey(key)
         node = self.root
         ancestors = []
--- a/MPIWGProjects.py	Tue Apr 30 12:49:26 2013 +0200
+++ b/MPIWGProjects.py	Tue Apr 30 16:00:56 2013 +0200
@@ -239,10 +239,9 @@
         self.orginallink = link[0:]
         self.objid = objid[0:]
     
-        self.projectWEB_title = object.getContent('WEB_title')[0:]
+        self.projectWEB_title = object.getProjectTitle()
        
         self.enabled = True;
-        self.ZCacheable_invalidate()
        
         if RESPONSE:
             self.redirect(RESPONSE, "../manageRelatedProjects")
@@ -308,6 +307,7 @@
     edit_basic = PageTemplateFile('zpt/project/edit_basic', globals())
     editForm = PageTemplateFile('zpt/project/edit_description', globals())
     edit_template = PageTemplateFile('zpt/project/edit_template', globals())
+    edit_related_projects = PageTemplateFile('zpt/project/edit_related_projects', globals())
     # management templates
     loadNewFileForm = PageTemplateFile('zpt/project/manage_newfile', globals())
     description_only_html = PageTemplateFile('zpt/project/description_only_html', globals())
@@ -464,15 +464,15 @@
         """returns the URL of the project thumbnail image"""
         thumb = self.projectThumb
         if thumb is None:
-            # get thumb from list
+            # get thumb from list (thumb is last image)
             imgs = self.getImageList()
             url = default
             if len(imgs) > 0:
-                thumb = imgs[0]
+                thumb = imgs[-1]
                 self.projectThumb = thumb
 
         if thumb is None:
-            return None
+            return default
         
         return thumb.absolute_url()
 
@@ -530,7 +530,7 @@
         items = self.objectValues(spec='MPIWGProject_relatedProject')
         # sort by place
         items.sort(key=lambda x:int(getattr(x, 'place', 0)))
-        return items          
+        return items
         
 
     def getRelatedPublications(self):
@@ -616,7 +616,7 @@
         return pt()
     
     def manageRelatedProjects(self, pubName=None, op=None):
-        """managage relatedProjectd"""
+        """manage related projects"""
         if pubName and op:
             if op == 'up':
                 relatedProjects = self.getRelatedProjects()
@@ -638,7 +638,7 @@
                         pass
 
 
-        pt = PageTemplateFile('zpt/project/edit_related_projects', globals()).__of__(self)
+        pt = self.edit_related_projects
         return pt()
     
     
@@ -1223,14 +1223,6 @@
         return pt()
     
 
-    def getPathStyle(self, path, selected, style=""):
-        """returns a string with the given style + 'sel' if path == selected."""
-
-        if path == selected:
-            return style + 'sel'
-        else:
-            return style    
-
     def getBreadcrumbs(self):
         """return list of breadcrumbs from here to the root"""
         crumbs = []
@@ -1247,28 +1239,19 @@
             baseUrl = "/en/research/projects/"
             
         # add in the internal project hierarchy
-        
-        ct = self.getContexts(parents=self.getContent('xdata_05'))
+        tree = self.getProjectTree()
+        ap = tree.getAncestorsOf(self.getNumber())
         # start with grandparents
-        ct.reverse()
-        for c in ct:
-            label = shortenString(c[0].getLabel(), 13)
-            crumbs.append((label, baseUrl + c[0].getId(), c[0]))            
+        for p in ap:
+            label = shortenString(p.getLabel(), 13)
+            crumbs.append((label, p.getUrl(baseUrl=baseUrl), p))            
 
         # add this project
-        crumbs.append((self.getLabel(), baseUrl + self.getId(), self))
+        crumbs.append((self.getLabel(), self.getUrl(baseUrl=baseUrl), self))
             
         return crumbs
 
-    def getRootProject(self):
-        """returns the root (=top level) project of the current project"""
-        ct = self.getContexts(parents=self.getContent('xdata_05'))
-        if len(ct) > 0:
-            return ct[-1][0]
-        else:
-            return self        
-
-
+    # TODO: is this used?
     def preview(self, description):
         """preview"""
         # logging.debug("preview description=%s"%description)
@@ -1464,28 +1447,10 @@
         return
     
     
-    def copyPublicationsToList(self, RESPONSE=None):
-        """copy publications in to list"""
-
-        publicationTxt = self.getContent('WEB_related_pub')
-
-        pubSplits = publicationTxt.split("<p>")
-
-        for pubSplit in pubSplits:
-            pubSplit = pubSplit.replace("</p>", "")
-            self.addPublication(pubSplit)
-
-        setattr(self, "WEB_related_pub_copied", True);
-        
-        if RESPONSE:
-                
-            self.redirect(RESPONSE, 'managePublications')
-        
     def hasRelatedPublicationsOldVersion(self):
-        """teste ob es related publications gibt"""
-        
+        """teste ob es related publications gibt"""        
         ret = True;
-        if (self.getContent('WEB_related_pub') == ''):
+        if (self.getRelatedPublications() == ''):
             ret = False;  # nichts im alten feld
         logging.debug("webrel:" + repr(ret))
         if (getattr(self, 'WEB_related_pub_copied', False)):
@@ -1503,6 +1468,23 @@
         return ret;
 
 
+    def copyPublicationsToList(self, RESPONSE=None):
+        """copy publications in to list"""
+        publicationTxt = self.getRelatedPublications()
+
+        pubSplits = publicationTxt.split("<p>")
+
+        for pubSplit in pubSplits:
+            pubSplit = pubSplit.replace("</p>", "")
+            self.addPublication(pubSplit)
+
+        setattr(self, "WEB_related_pub_copied", True);
+        
+        if RESPONSE:
+                
+            self.redirect(RESPONSE, 'managePublications')
+        
+
     def hasInlineImage(self):
         """Return the number of inline images in the description."""
         text = self.getDescription()
@@ -1820,6 +1802,48 @@
         if RESPONSE is not None:
             RESPONSE.redirect(self.en.MPIWGrootURL()+'/admin/showTree')
 
+
+    # TODO: it's broken. is this used?
+    def getAllProjectsAndTagsAsCSV(self,archived=1,RESPONSE=None):
+        """alle projekte auch die nicht getaggten"""
+        retList=[]
+        headers=['projectId','sortingNumber','projectName','scholars','startedAt','completedAt','lastChangeThesaurusAt','lastChangeProjectAt','projectCreatedAt','persons','places','objects']
+        headers.extend(list(self.thesaurus.tags.keys()))
+        retList.append("\t".join(headers))
+        if not hasattr(self,'thesaurus'):
+            return "NON thesaurus (there have to be a MPIWGthesaurus object, with object ID thesaurus)"
+        
+        projectTags = self.thesaurus.getProjectsAndTags()
+        for project in self.getProjectFields('WEB_title_or_short'):
+            proj = project[0]
+            p_name = project[1]
+            retProj=[]
+            #if (not proj.isArchivedProject() and archived==1) or (proj.isArchivedProject() and archived==2):
+            retProj.append(self.utf8ify(proj.getId()))
+            retProj.append(self.utf8ify(proj.getContent('xdata_05')))
+            retProj.append(self.utf8ify(p_name))  
+            retProj.append(self.utf8ify(proj.getContent('xdata_01')))
+            retProj.append(self.utf8ify(proj.getStartedAt()))
+            retProj.append(self.utf8ify(proj.getCompletedAt()))
+            changeDate=self.thesaurus.lastChangeInThesaurus.get(proj.getId(),'') 
+            n = re.sub("[:\- ]","",str(changeDate))
+            retProj.append(n)
+            retProj.append(self.utf8ify(getattr(proj,'creationTime','20050101000000')))  
+            retProj.append("")#TODO: project created at   
+            retProj.append(";".join([person[1] for person in self.thesaurus.getPersonsFromProject(proj.getId())]))
+            retProj.append(";".join([person[1] for person in self.thesaurus.getHistoricalPlacesFromProject(proj.getId())]))
+            retProj.append(";".join([person[1] for person in self.thesaurus.getObjectsFromProject(proj.getId())]))
+            retProj+=self.thesaurus.getTags(proj.getId(),projectTags)
+            retList.append("\t".join(retProj))
+        
+        if RESPONSE:
+            
+            RESPONSE.setHeader('Content-Disposition','attachment; filename="ProjectsAndTags.tsv"')
+            RESPONSE.setHeader('Content-Type', "application/octet-stream")
+      
+        return "\n".join(retList);
+    
+    
         
     security.declareProtected('View management screens', 'updateAllProjectMembers')
     def updateAllProjectMembers(self, updateResponsibleScientistsList=False):
--- a/MPIWGProjects_removed.py	Tue Apr 30 12:49:26 2013 +0200
+++ b/MPIWGProjects_removed.py	Tue Apr 30 16:00:56 2013 +0200
@@ -239,3 +239,14 @@
                 return 1
         return 0
 
+
+    def getRootProject(self):
+        """returns the root (=top level) project of the current project"""
+        ct = self.getContexts(parents=self.getContent('xdata_05'))
+        if len(ct) > 0:
+            return ct[-1][0]
+        else:
+            return self        
+
+
+
--- a/MPIWGRoot.py	Tue Apr 30 12:49:26 2013 +0200
+++ b/MPIWGRoot.py	Tue Apr 30 16:00:56 2013 +0200
@@ -217,6 +217,13 @@
         else:
             return style    
 
+    def getPathStyle(self, path, selected, style=""):
+        """returns a string with the given style + 'sel' if path == selected."""
+        if path == selected:
+            return style + 'sel'
+        else:
+            return style    
+
     def getFeatures(self, num=None):
         """returns a list of the last num Features"""
         dir = getattr(self, 'features', None)
@@ -394,84 +401,6 @@
         if RESPONSE is not None:
             RESPONSE.redirect('manage_main')
 
-
-    def getContexts(self,childs=None,parents=None,depth=None,date=None,onlyActive=True):
-        """childs alle childs, alle parents"""
-        ret=[]
-    
-        if parents:
-            pnums=parents.split(".")
-            while len(pnums) > 1:
-                pnums.pop()
-                parentId=string.join(pnums,".")
-        
-                for project in self.getProjectFields('xdata_05',sort='int',date=date):
-                    if project[1]==parentId:
-                        ret.append(project)
-                
-                if (depth is not None) and (len(ret) >= depth):
-                    break
-
-        if childs:
-            for project in self.getProjectFields('xdata_05',sort='int',date=date):
-                searchStr=childs+"(\..*)"
-               
-                if (onlyActive and project[0].isActiveProject()) or (not onlyActive):
-                    if re.match(searchStr,project[1]):
-                        
-                        if depth:
-    
-                            if int(depth)>=len(project[1].split("."))-len(childs.split(".")):
-                        
-                                ret.append(project)
-                        else:
-                            ret.append(project)
-        
-        #logging.debug("getContexts: childs=%s parents=%s depth=%s => %s"%(childs,parents,depth,repr(ret)))
-     
-        return ret
-
-
-    def getAllProjectsAndTagsAsCSV(self,archived=1,RESPONSE=None):
-        """alle projekte auch die nicht getaggten"""
-        retList=[]
-        headers=['projectId','sortingNumber','projectName','scholars','startedAt','completedAt','lastChangeThesaurusAt','lastChangeProjectAt','projectCreatedAt','persons','places','objects']
-        headers.extend(list(self.thesaurus.tags.keys()))
-        retList.append("\t".join(headers))
-        if not hasattr(self,'thesaurus'):
-            return "NON thesaurus (there have to be a MPIWGthesaurus object, with object ID thesaurus)"
-        
-        projectTags = self.thesaurus.getProjectsAndTags()
-        for project in self.getProjectFields('WEB_title_or_short'):
-            proj = project[0]
-            p_name = project[1]
-            retProj=[]
-            #if (not proj.isArchivedProject() and archived==1) or (proj.isArchivedProject() and archived==2):
-            retProj.append(self.utf8ify(proj.getId()))
-            retProj.append(self.utf8ify(proj.getContent('xdata_05')))
-            retProj.append(self.utf8ify(p_name))  
-            retProj.append(self.utf8ify(proj.getContent('xdata_01')))
-            retProj.append(self.utf8ify(proj.getStartedAt()))
-            retProj.append(self.utf8ify(proj.getCompletedAt()))
-            changeDate=self.thesaurus.lastChangeInThesaurus.get(proj.getId(),'') 
-            n = re.sub("[:\- ]","",str(changeDate))
-            retProj.append(n)
-            retProj.append(self.utf8ify(getattr(proj,'creationTime','20050101000000')))  
-            retProj.append("")#TODO: project created at   
-            retProj.append(";".join([person[1] for person in self.thesaurus.getPersonsFromProject(proj.getId())]))
-            retProj.append(";".join([person[1] for person in self.thesaurus.getHistoricalPlacesFromProject(proj.getId())]))
-            retProj.append(";".join([person[1] for person in self.thesaurus.getObjectsFromProject(proj.getId())]))
-            retProj+=self.thesaurus.getTags(proj.getId(),projectTags)
-            retList.append("\t".join(retProj))
-        
-        if RESPONSE:
-            
-            RESPONSE.setHeader('Content-Disposition','attachment; filename="ProjectsAndTags.tsv"')
-            RESPONSE.setHeader('Content-Type', "application/octet-stream")
-      
-        return "\n".join(retList);
-    
-    
     
         
     def updatePublicationDB(self,personId=None):
--- a/MPIWGRoot_deleted_methods.py	Tue Apr 30 12:49:26 2013 +0200
+++ b/MPIWGRoot_deleted_methods.py	Tue Apr 30 16:00:56 2013 +0200
@@ -812,4 +812,41 @@
         return ""
     
         
+    def getContexts(self,childs=None,parents=None,depth=None,date=None,onlyActive=True):
+        """childs alle childs, alle parents"""
+        ret=[]
+    
+        if parents:
+            pnums=parents.split(".")
+            while len(pnums) > 1:
+                pnums.pop()
+                parentId=string.join(pnums,".")
+        
+                for project in self.getProjectFields('xdata_05',sort='int',date=date):
+                    if project[1]==parentId:
+                        ret.append(project)
+                
+                if (depth is not None) and (len(ret) >= depth):
+                    break
+
+        if childs:
+            for project in self.getProjectFields('xdata_05',sort='int',date=date):
+                searchStr=childs+"(\..*)"
+               
+                if (onlyActive and project[0].isActiveProject()) or (not onlyActive):
+                    if re.match(searchStr,project[1]):
+                        
+                        if depth:
+    
+                            if int(depth)>=len(project[1].split("."))-len(childs.split(".")):
+                        
+                                ret.append(project)
+                        else:
+                            ret.append(project)
+        
+        #logging.debug("getContexts: childs=%s parents=%s depth=%s => %s"%(childs,parents,depth,repr(ret)))
+     
+        return ret
+
+
       
--- a/zpt/project/edit_related_projects.zpt	Tue Apr 30 12:49:26 2013 +0200
+++ b/zpt/project/edit_related_projects.zpt	Tue Apr 30 16:00:56 2013 +0200
@@ -10,14 +10,14 @@
     <tal:block tal:repeat="publication here/getRelatedProjects">
       <tr>
         <td>
-          <a tal:attributes="href python:here.absolute_url()+'/manageRelatedProjects?pubName='+publication[0]+'&op=up'">up</a><br>
-          <a tal:attributes="href python:here.absolute_url()+'/manageRelatedProjects?pubName='+publication[0]+'&op=down'">down</a>
+          <a tal:attributes="href python:here.absolute_url()+'/manageRelatedProjects?pubName='+publication.getId()+'&op=up'">up</a><br>
+          <a tal:attributes="href python:here.absolute_url()+'/manageRelatedProjects?pubName='+publication.getId()+'&op=down'">down</a>
         </td>
-        <td tal:content="structure python:getattr(publication[1],'objid','')" />
-        <td tal:content="structure python:getattr(publication[1],'projectWEB_title','')" />
+        <td tal:content="structure python:getattr(publication,'objid','')" />
+        <td tal:content="structure python:getattr(publication,'projectWEB_title','')" />
         <td>
-          <a tal:attributes="href python:publication[1].getId()+'/editRelatedProject'">Edit</a><br/> 
-          <a tal:attributes="href python:'deleteRelatedProject?id='+publication[1].getId()">Delete</a>
+          <a tal:attributes="href python:publication.getId()+'/editRelatedProject'">Edit</a><br/> 
+          <a tal:attributes="href python:'deleteRelatedProject?id='+publication.getId()">Delete</a>
         </td>
       </tr>
     </tal:block>