changeset 63:fd6931bd49c8

more cleaning up projects.
author casties
date Fri, 03 May 2013 11:30:41 +0200
parents 64be5db08495
children b5ff783027d6 c86ee1081b62
files MPIWGProjects.py zpt/project/edit_basic.zpt zpt/project/edit_publications.zpt zpt/project/edit_template.zpt zpt/project/project_template.zpt
diffstat 5 files changed, 211 insertions(+), 232 deletions(-) [+]
line wrap: on
line diff
--- a/MPIWGProjects.py	Fri May 03 10:16:47 2013 +0200
+++ b/MPIWGProjects.py	Fri May 03 11:30:41 2013 +0200
@@ -97,7 +97,7 @@
     link = None
     bookId = None
     
-    editForm = PageTemplateFile('zpt/project/related_publication/edit_basic', globals())
+    editDescription = PageTemplateFile('zpt/project/related_publication/edit_basic', globals())
     
     
     def redirect(self, RESPONSE, url):
@@ -147,7 +147,7 @@
         """edit a publication"""
 
         if (not text) and (not description):
-            pt = self.editForm
+            pt = self.editDescription
             return pt()
        
         if text:
@@ -172,7 +172,7 @@
     objid = None
     projectLabel = None
     
-    editForm = PageTemplateFile('zpt/project/related_project/edit_basic', globals())
+    editDescription = PageTemplateFile('zpt/project/related_project/edit_basic', globals())
     
 
     def redirect(self, RESPONSE, url):
@@ -222,7 +222,7 @@
         """edit a publication"""
 
         if (not link):
-            pt = self.editForm
+            pt = self.editDescription
             return pt()
         
         # hole die id des projektes
@@ -285,7 +285,7 @@
     
     manage_options = Folder.manage_options + (
         {'label':'Load New File', 'action':'loadNewFileForm'},
-        {'label':'Edit', 'action':'editForm'},
+        {'label':'Edit', 'action':'editDescription'},
         )
         # {'label':'Edit ProjectInfo','action':'editMPIWGProjectForm'},
         # {'label':'Edit BasisInfo','action':'editMPIWGBasisForm'},
@@ -308,8 +308,9 @@
     # make css refreshable for development
     edit_css.index_html = refreshingImageFileIndexHtml
     # user-accessible editing templates
-    edit_basic = PageTemplateFile('zpt/project/edit_basic', globals())
-    editForm = PageTemplateFile('zpt/project/edit_description', globals())
+    security.declareProtected('View management screens', 'editBasic')
+    editBasic = PageTemplateFile('zpt/project/edit_basic', globals())
+    editDescription = PageTemplateFile('zpt/project/edit_description', globals())
     edit_template = PageTemplateFile('zpt/project/edit_template', globals())
     editRelatedProjectsForm = PageTemplateFile('zpt/project/edit_related_projects', globals())
     editRelatedProjectsError = PageTemplateFile('zpt/project/edit_related_projects_error', globals())
@@ -317,6 +318,8 @@
     editPublicationsForm = PageTemplateFile('zpt/project/edit_publications', globals())
     editAdditionalPublicationsForm = PageTemplateFile('zpt/project/pubman/change_publications', globals())
     editAddAdditionalPublications = PageTemplateFile('zpt/project/pubman/add_publications', globals())
+    security.declareProtected('View management screens', 'edit')
+    edit = editDescription
     # management templates
     loadNewFileForm = PageTemplateFile('zpt/project/manage_newfile', globals())
     description_only_html = PageTemplateFile('zpt/project/description_only_html', globals())
@@ -508,13 +511,6 @@
         return thumb.absolute_url()
 
               
-    def getImageList(self):
-        """returns the sorted list of images for this project"""
-        items = self.objectValues(spec='MPIWGProject_image')
-        # sort by place
-        return sorted(items, key=lambda x:int(getattr(x, 'place', 0)))
-
-
     def getDepartment(self):
         """returns the department of this project"""
         num = self.getNumber()
@@ -556,22 +552,6 @@
         return [p for p in tree.getChildrenOf(self.getNumber()) if p.checkActive(active)]
     
               
-    def getRelatedProjectList(self):
-        """returns the list of related projects"""
-        items = self.objectValues(spec='MPIWGProject_relatedProject')
-        # sort by place
-        items.sort(key=lambda x:int(getattr(x, 'place', 0)))
-        return items
-        
-
-    def getPublicationList(self):
-        """returns the list of related publications"""
-        items = self.objectValues(spec='MPIWGProject_publication')
-        # sort by place
-        items.sort(key=lambda x:int(getattr(x, 'place', 0)))
-        return items          
-        
-    
     def getRelatedDigitalSources(self):
         """returns the related digital sources"""
         t = getattr(self, 'xdata_11', None)
@@ -592,7 +572,7 @@
             return t
 
               
-    def moveObjectPlace(self, objectList, objectId, direction):
+    def _moveObjectPlace(self, objectList, objectId, direction):
         """Move object with objectId from objectList in direction 
         by changing its place attribute."""
         if not objectId or not direction:
@@ -615,9 +595,50 @@
                         
                 return
                       
+
+    def getImageList(self):
+        """returns the sorted list of images for this project"""
+        items = self.objectValues(spec='MPIWGProject_image')
+        # sort by place
+        return sorted(items, key=lambda x:int(getattr(x, 'place', 0)))
+
+
+    def addImage(self, fileHd, caption, RESPONSE=None, filename=None):
+        """add an MPIWG_Project_image"""
+
+        if not filename:
+            filename = fileHd.filename
+
+        if not fileHd:
+            fileHd = file(os.path.join(package_home(globals()), 'blank.gif'))
+            
+        newImage = MPIWGProject_image(filename, filename, fileHd)
+
+        self._setObject(filename, newImage)
+        obj = getattr(self, filename)
+        obj.caption = caption[:]
+        obj.enabled = True;
+        obj.place = self._getLastImageNumber() + 1
+        obj.id = filename
+
+        # invalidate thumbnail
+        self.projectThumb = None
+        
+        if RESPONSE is not None:            
+            self.redirect(RESPONSE, 'manageImages')
+
+
+    def _getLastImageNumber(self):
+        items = self.getImageList()
+        if not items:
+            return 0
+        else:
+            return getattr(items[-1], 'place', 0)
+
+        
     def manageImages(self, name=None, op=None):
         """manage images"""
-        self.moveObjectPlace(self.getImageList(), name, op)
+        self._moveObjectPlace(self.getImageList(), name, op)
  
         # invalidate thumbnail
         self.projectThumb = None
@@ -626,25 +647,31 @@
         return pt()
 
 
-    def managePublications(self, name=None, op=None):
-        """manage publications"""
-        self.moveObjectPlace(self.getPublicationList(), name, op)
+    def deleteImage(self, id, RESPONSE=None):
+        """delete Image id"""
+        try:
+            self.manage_delObjects([id])
+        except:
+            logging.error("ERROR MPIWG: %s %s" % sys.exc_info()[0:2])
+                
+        # invalidate thumbnail
+        self.projectThumb = None
+        
+        if RESPONSE:
+            self.redirect(RESPONSE, 'manageImages')
 
-        pt = self.editPublicationsForm
-        return pt()
-
+ 
+    def getPublicationList(self):
+        """returns the list of related publications"""
+        items = self.objectValues(spec='MPIWGProject_publication')
+        # sort by place
+        items.sort(key=lambda x:int(getattr(x, 'place', 0)))
+        return items          
+        
     
-    def manageRelatedProjects(self, name=None, op=None):
-        """manage related projects"""
-        self.moveObjectPlace(self.getRelatedProjectList(), name, op)
-
-        pt = self.editRelatedProjectsForm
-        return pt()    
-
-
     def addPublication(self, text, RESPONSE=None):
         """add an MPIWG_Publication"""
-        number = self.getLastPublicationNumber() + 1
+        number = self._getLastPublicationNumber() + 1
         name = "publication_" + str(number)
         while hasattr(self, name):
             number += 1
@@ -656,21 +683,46 @@
         obj = getattr(self, name)
         obj.text = text[0:]
         obj.enabled = True;
-        obj.place = self.getLastPublicationNumber() + 1
+        obj.place = self._getLastPublicationNumber() + 1
         obj.id = name
         if RESPONSE is not None:
             self.redirect(RESPONSE, 'managePublications')
 
 
-    def errorRelatedProjects(self, link):
-        """error creating a related project"""
-        pt = self.editRelatedProjectsError
-        return pt(link=link)
+    def _getLastPublicationNumber(self):
+        items = self.getPublicationList()
+        if not items:
+            return 0
+        else:
+            return getattr(items[-1], 'place', 0)
+
+        
+    def managePublications(self, name=None, op=None):
+        """manage publications"""
+        self._moveObjectPlace(self.getPublicationList(), name, op)
+
+        pt = self.editPublicationsForm
+        return pt()
 
+    
+    def deletePublication(self, id, RESPONSE=None):
+            """delete Publication id"""
+            self.manage_delObjects([id])
+            if RESPONSE:
+                self.redirect(RESPONSE, 'managePublications')
+              
+
+    def getRelatedProjectList(self):
+        """returns the list of related projects"""
+        items = self.objectValues(spec='MPIWGProject_relatedProject')
+        # sort by place
+        items.sort(key=lambda x:int(getattr(x, 'place', 0)))
+        return items
+        
 
     def addRelatedProject(self, link, RESPONSE=None):
         """add a MPIWGProject_relatedProject"""
-        number = self.getLastRelatedProjectNumber() + 1
+        number = self._getLastRelatedProjectNumber() + 1
         name = "related_project_" + str(number)
         while hasattr(self, name):
             number += 1
@@ -700,29 +752,13 @@
         obj.projectWEB_title = object.getProjectTitle()
         logging.debug("add relobj:webtitle" + repr(obj.projectWEB_title))
         obj.enabled = True;
-        obj.place = self.getLastRelatedProjectNumber() + 1
+        obj.place = self._getLastRelatedProjectNumber() + 1
         obj.id = name
         if RESPONSE is not None:
             self.redirect(RESPONSE, 'manageRelatedProjects')
 
      
-    def getLastImageNumber(self):
-        items = self.getImageList()
-        if not items:
-            return 0
-        else:
-            return getattr(items[-1], 'place', 0)
-
-        
-    def getLastPublicationNumber(self):
-        items = self.getPublicationList()
-        if not items:
-            return 0
-        else:
-            return getattr(items[-1], 'place', 0)
-
-        
-    def getLastRelatedProjectNumber(self):
+    def _getLastRelatedProjectNumber(self):
         items = self.getRelatedProjectList()
         if not items:
             return 0
@@ -730,58 +766,108 @@
             return getattr(items[-1], 'place', 0)
 
         
-    def deletePublication(self, id, RESPONSE=None):
-            """delete Publication id"""
-            self.manage_delObjects([id])
-            if RESPONSE:
-                self.redirect(RESPONSE, 'managePublications')
+    def manageRelatedProjects(self, name=None, op=None):
+        """manage related projects"""
+        self._moveObjectPlace(self.getRelatedProjectList(), name, op)
+
+        pt = self.editRelatedProjectsForm
+        return pt()    
+
+
+    def deleteRelatedProject(self, id, RESPONSE=None):
+        """delete Publication id"""
+        self.manage_delObjects([id])
+        if RESPONSE:
+            self.redirect(RESPONSE, 'manageRelatedProjects')
+
 
-              
-    def deleteRelatedProject(self, id, RESPONSE=None):
-            """delete Publication id"""
-            self.manage_delObjects([id])
-            if RESPONSE:
-                self.redirect(RESPONSE, 'manageRelatedProjects')
+    def errorRelatedProjects(self, link):
+        """error creating a related project"""
+        pt = self.editRelatedProjectsError
+        return pt(link=link)
+
+
+    def getAdditionalPublicationList(self):
+        """hole publications aus der datenbank"""
+        query="select * from pubmanbiblio_projects where lower(key_main) = lower(%s) order by priority DESC"
+        return self.executeZSQL(query,[self.getId()])
+
+        
+    def hasAdditionalPublications(self):
+        """test if extended publication list exists"""
+        query="select count(*) from pubmanbiblio_projects where lower(key_main) = lower(%s)"
+        res= self.executeZSQL(query,[self.getId()])        
+        if res[0].count > 0:
+            return True
+        else:
+            return False
 
 
-    def deleteImage(self, id, RESPONSE=None):
-        """delete Image id"""
-        try:
-            self.manage_delObjects([id])
-        except:
-            logging.error("ERROR MPIWG: %s %s" % sys.exc_info()[0:2])
+    def addAdditionalPublicationsFromPubman(self,REQUEST):
+        """addPublications from pubman"""
+        data=REQUEST.form
+        if data.get("method",None) is None:
+            pt = self.editAddAdditionalPublications
+            return pt()
+        
+        if data.get("method") == "search":
+            entries= self.mpiwgPubman.search(data)
+            pt = self.editAddAdditionalPublications
+            return pt(values=entries)
+        
+        if data.get("method") == "add":
+            return self.addEntriesToAdditionalPublicationList(data)
+            #pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/staff/pubman','add_publications.zpt')).__of__(self)
+
+         
+    def addEntriesToAdditionalPublicationList(self,data):
+        """fuege eintrage aus data zur publications liste.
+        
+        @param data Map mit escidocID --> value
+        value muss "add" sein damit hinzugefuegt wird"""
+        for key in data.keys():
+            if key.startswith('escidoc:'):
+                query="INSERT INTO pubmanbiblio_projects (key_main,escidocId) values (%s,%s)"
+                if data.get(key)=="add":
+                    self.executeZSQL(query,[self.getId(),key])
+        
+        if hasattr(self,'REQUEST'):
+            return self.REQUEST.response.redirect("changeAdditionalPublications")
+
+    
+    def changeAdditionalPublications(self,REQUEST):
+        """change published publications"""
+        data=REQUEST.form       
+        if data.get("method","change"):
+            for key in data.keys():
+                splitted=key.split("__") #format escidoc_id__p fuer priority, nur escidocid
+                value=data[key]
+                if len(splitted)==1:
+                    self.deleteFromAdditionalPublicationList(key);
                 
-        # invalidate thumbnail
-        self.projectThumb = None
-        
-        if RESPONSE:
-            self.redirect(RESPONSE, 'manageImages')
+                elif(splitted[1]) == "p":
+                    self.setAdditionalPublicationPriority(splitted[0],value);
+                    
+        pt = self.editAdditionalPublicationsForm
+        return pt()
+
+    
+    def deleteFromAdditionalPublicationList(self,escidocid):
+        """Loessche publication with escidoc id from publication list"""
+        query ="DELETE FROM pubmanbiblio_projects WHERE escidocid=%s and key_main=%s"
+        self.executeZSQL(query,[escidocid,self.getId()]);
 
  
-    def addImage(self, fileHd, caption, RESPONSE=None, filename=None):
-        """add an MPIWG_Project_image"""
-
-        if not filename:
-            filename = fileHd.filename
-
-        if not fileHd:
-            fileHd = file(os.path.join(package_home(globals()), 'blank.gif'))
-            
-        newImage = MPIWGProject_image(filename, filename, fileHd)
-
-        self._setObject(filename, newImage)
-        obj = getattr(self, filename)
-        obj.caption = caption[:]
-        obj.enabled = True;
-        obj.place = self.getLastImageNumber() + 1
-        obj.id = filename
-
-        # invalidate thumbnail
-        self.projectThumb = None
+    def setAdditionalPublicationPriority(self,escidocid,value):
+        query="update pubmanbiblio_projects set priority=%s where escidocid=%s and key_main=%s"
+        try:
+            value = int(value)
+            self.executeZSQL(query,[value,escidocid,self.getId()]);
+        except:
+            logging.error("couldn't change:")
+            logging.error(escidocid)
+            logging.error(value)
         
-        if RESPONSE is not None:            
-            self.redirect(RESPONSE, 'manageImages')
-
 
     def getActualVersion(self, date=None):
         """actuelle version"""
@@ -1032,6 +1118,7 @@
         """save content aus preview"""
         self.WEB_project_description = self.previewTemplate.WEB_project_description[0:]
         self.REQUEST.RESPONSE.redirect("./index.html")
+
         
     def saveEditedContent(self, kupu=None, preview=None):
         """save Edited content"""
@@ -1056,17 +1143,6 @@
         return True
 
 
-    security.declareProtected('View management screens', 'edit')
-    def edit(self, western=None):
-        """Edit pages"""
-        if western:
-            self.REQUEST.RESPONSE.setCookie("MP_debug_code", "western", path="/")
-
-        # pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGProjectNeu.zpt')).__of__(self)
-        pt = self.editForm
-        return pt()
-    
-
     def getBreadcrumbs(self):
         """return list of breadcrumbs from here to the root"""
         crumbs = []
@@ -1113,18 +1189,12 @@
         # return self.REQUEST.RESPONSE.redirect(self.REQUEST['URL1']+"/previewTemplate")
         
 
-    def editMPIWGProjectForm(self):
-        """editform"""
-        pt = PageTemplateFile(os.path.join(package_home(globals()), 'zpt', 'edit_MPIWGProject.zpt')).__of__(self)
-        return pt()
-
-
     def isResponsibleScientist(self, key):
         """teste ob eine Person in der Liste der respl. scientists auftaucht"""
-        #key = utf8ify(key)
         for resp in self.getResponsibleScientistsList():
             logging.debug("resp=%s key=%s"%(repr(resp),repr(key)))
-            if resp.get('key', '').lower() == key.lower():
+            # TODO: we need to get ASCII keys!!
+            if utf8ify(resp.get('key', '').lower()) == utf8ify(key).lower():
                 return True
         
         return False
@@ -1248,17 +1318,6 @@
             RESPONSE.redirect('manage_main')
 
 
-    security.declareProtected('View management screens', 'editBasic')
-    def editBasic(self, identifiedNames=None):
-        """editform"""
-        if not identifiedNames:
-            identifiedNames = self.identifyNames(self.getResponsibleScientists())
-        
-        logging.debug("editBasic: IdentifiedNames=%s" % repr(identifiedNames))
-        pt = self.edit_basic
-        return pt(identifiedNames=identifiedNames)
-
-
     def getContent(self, field, filter=None):
         """Inhalt des Feldes"""
         val = getattr(self, field, '')
@@ -1456,85 +1515,6 @@
             self.executeZSQL("insert into projects_members (project_id, member_key) values (%s, %s)", (pid, memberKey))
     
     
-    def addPublicationsFromPubman(self,REQUEST):
-        """addPublications from pubman"""
-        data=REQUEST.form
-        if data.get("method",None) is None:
-            pt = self.editAddAdditionalPublications
-            return pt()
-        
-        if data.get("method") == "search":
-            entries= self.mpiwgPubman.search(data)
-            pt = self.editAddAdditionalPublications
-            return pt(values=entries)
-        
-        if data.get("method") == "add":
-            return self.addEntriesToAdditionalPublicationList(data)
-            #pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/staff/pubman','add_publications.zpt')).__of__(self)
-         
-    def addEntriesToAdditionalPublicationList(self,data):
-        """fuege eintrage aus data zur publications liste.
-        
-        @param data Map mit escidocID --> value
-        value muss "add" sein damit hinzugefuegt wird"""
-        for key in data.keys():
-            if key.startswith('escidoc:'):
-                query="INSERT INTO pubmanbiblio_projects (key_main,escidocId) values (%s,%s)"
-                if data.get(key)=="add":
-                    self.executeZSQL(query,[self.getId(),key])
-        
-        if hasattr(self,'REQUEST'):
-            return self.REQUEST.response.redirect("changeAdditionalPublications")
-
-    
-    def changeAdditionalPublications(self,REQUEST):
-        """change published publications"""
-        data=REQUEST.form       
-        if data.get("method","change"):
-            for key in data.keys():
-                splitted=key.split("__") #format escidoc_id__p fuer priority, nur escidocid
-                value=data[key]
-                if len(splitted)==1:
-                    self.deleteFromAdditionalPublicationList(key);
-                
-                elif(splitted[1]) == "p":
-                    self.setAdditionalPublicationPriority(splitted[0],value);
-                    
-        pt = self.editAdditionalPublicationsForm
-        return pt()
-
-    
-    def deleteFromAdditionalPublicationList(self,escidocid):
-        """Loessche publication with escidoc id from publication list"""
-        query ="DELETE FROM pubmanbiblio_projects WHERE escidocid=%s and key_main=%s"
-        self.executeZSQL(query,[escidocid,self.getId()]);
-
- 
-    def setAdditionalPublicationPriority(self,escidocid,value):
-        query="update pubmanbiblio_projects set priority=%s where escidocid=%s and key_main=%s"
-        try:
-            value = int(value)
-            self.executeZSQL(query,[value,escidocid,self.getId()]);
-        except:
-            logging.error("couldn't change:")
-            logging.error(escidocid)
-            logging.error(value)
-        
-
-    def getAdditionalPublicationList(self):
-        """hole publications aus der datenbank"""
-        query="select * from pubmanbiblio_projects where lower(key_main) = lower(%s) order by priority DESC"
-        return self.executeZSQL(query,[self.getId()])
-
-        
-    def hasAdditionalPublications(self):
-        """test if extended publication list exists"""
-        query="select count(*) from pubmanbiblio_projects where lower(key_main) = lower(%s)"
-        res= self.executeZSQL(query,[self.getId()])        
-        if res[0].count > 0:
-            return True
-        else:
-            return False
 
         
 def manage_addMPIWGProjectForm(self):
--- a/zpt/project/edit_basic.zpt	Fri May 03 10:16:47 2013 +0200
+++ b/zpt/project/edit_basic.zpt	Fri May 03 11:30:41 2013 +0200
@@ -46,16 +46,15 @@
                    value python:here.getCompletedAt()"
             type="text" len="15" /> (format dd.mm.yyyy or mm.yyyy or yyyy)</td>
         </tr>
-
       </table>
 
-
       <h2>Names</h2>
-      <table tal:define="global count python:0">
+      <table tal:define="global count python:0;
+        identifiedNames python:here.identifyNames(here.getResponsibleScientists());">
         <tr>
           <th>Name in project</th><th>MPIWG member object</th>
         </tr>
-        <tr tal:repeat="identifiedName python:options.get('identifiedNames',{}).items()">
+        <tr tal:condition="identifiedNames" tal:repeat="identifiedName identifiedNames/items">
           <tal:x tal:define="global count python:count+1" />
           <td><input type="hidden"
             tal:attributes="value python:identifiedName[0]; name python:'responsibleScientist_name_%s'%count" /> <span
--- a/zpt/project/edit_publications.zpt	Fri May 03 10:16:47 2013 +0200
+++ b/zpt/project/edit_publications.zpt	Fri May 03 11:30:41 2013 +0200
@@ -40,7 +40,7 @@
     </ul>
   </tal:block>
 
-  <h3><a tal:attributes="href string:$root/addPublicationsFromPubman"> Add publication to additional publication list</a></h3>
+  <h3><a tal:attributes="href string:$root/addAdditionalPublicationsFromPubman"> Add publication to additional publication list</a></h3>
   <h3><a tal:attributes="href string:$root/changePublications"> Change additional publication list</a></h3>
 </tal:block>
 </body>
--- a/zpt/project/edit_template.zpt	Fri May 03 10:16:47 2013 +0200
+++ b/zpt/project/edit_template.zpt	Fri May 03 11:30:41 2013 +0200
@@ -13,7 +13,7 @@
   <metal:block metal:define-slot="navsel"/>
   <div class="mainnav">
     <span tal:attributes="class python:test('basic'==menusel, 'mainmenusel', 'mainmenu')"><a tal:attributes="href string:$root/editBasic">Basic information</a></span>
-    <span tal:attributes="class python:test('description'==menusel, 'mainmenusel', 'mainmenu')"><a tal:attributes="href string:$root/edit">Project description</a></span>
+    <span tal:attributes="class python:test('description'==menusel, 'mainmenusel', 'mainmenu')"><a tal:attributes="href string:$root/editDescription">Project description</a></span>
     <span tal:attributes="class python:test('images'==menusel, 'mainmenusel', 'mainmenu')"><a tal:attributes="href string:$root/manageImages">Images</a></span>
     <span tal:attributes="class python:test('publications'==menusel, 'mainmenusel', 'mainmenu')"><a tal:attributes="href string:$root/managePublications">Publications</a></span>
     <span tal:attributes="class python:test('relatedProjects'==menusel, 'mainmenusel', 'mainmenu')"><a tal:attributes="href string:$root/manageRelatedProjects">Related Projects</a></span>
--- a/zpt/project/project_template.zpt	Fri May 03 10:16:47 2013 +0200
+++ b/zpt/project/project_template.zpt	Fri May 03 11:30:41 2013 +0200
@@ -114,7 +114,7 @@
                 <a tal:attributes="href bookurl" tal:content="structure publication/text" />
               </tal:x>
             </tal:y>
-            <tal:x tal:condition="python:hasattr(publication,'description')">
+            <tal:x tal:condition="python:hasattr(publication, 'description')">
               <div tal:content="structure publication/description" />
             </tal:x>
           </div>