changeset 80:b1893c4c9d2c

more display of project pages.
author casties
date Wed, 08 May 2013 19:59:25 +0200
parents 7f26c8e6c8e9
children 975a8d88e315
files MPIWGHelper.py MPIWGProjects.py MPIWGStaff.py css/mpiwg.css zpt/project/project_template.zpt
diffstat 5 files changed, 131 insertions(+), 61 deletions(-) [+]
line wrap: on
line diff
--- a/MPIWGHelper.py	Wed May 08 17:03:50 2013 +0200
+++ b/MPIWGHelper.py	Wed May 08 19:59:25 2013 +0200
@@ -148,3 +148,11 @@
     
     return subsec
 
+
+def getUrl(self, baseUrl=None):
+    """returns URL to this object"""
+    if baseUrl is None:
+        return self.absolute_url()
+
+    return '%s/%s' % (baseUrl, self.getId())
+                
--- a/MPIWGProjects.py	Wed May 08 17:03:50 2013 +0200
+++ b/MPIWGProjects.py	Wed May 08 19:59:25 2013 +0200
@@ -15,21 +15,19 @@
 import re
 import os 
 import email
-import xmlhelper  # Methoden zur Verwaltung der projekt xml
 import sys
 import logging
 import time
+import unicodedata
 
 import xml.etree.ElementTree as ET
 
 from SrvTxtUtils import getInt, unicodify, utf8ify, serialize, refreshingImageFileIndexHtml, shortenString
 from Products.ZDBInterface.ZDBInterfaceFolder import ZDBInterfaceFolder
 
+import xmlhelper  # Methoden zur Verwaltung der projekt xml
 from HashTree import HashTree
-
-import MPIWGRoot
-import MPIWGLink
-import MPIWGTemplate
+import MPIWGHelper
 
 # TODO: better names for the fields
 fieldLabels = {'WEB_title':'WEB_Title',
@@ -57,6 +55,10 @@
 # die folgenden Klassen sind jetzt in einzelne Files ausgelagert aus Kompatibilitaetsgruenden, bleiben die Klassen hier noch drin.
 # Sonst funktionieren die alten Webseiten nicht mehr.
 
+import MPIWGRoot
+import MPIWGLink
+import MPIWGTemplate
+
 class MPIWGRoot(MPIWGRoot.MPIWGRoot):
     """depricated"""
     
@@ -65,6 +67,7 @@
     
 class MPIWGTemplate(MPIWGTemplate.MPIWGTemplate):
     """depricated"""
+
     
 class MPIWGProject_publication(Folder):
     """publications object fuer project"""
@@ -122,6 +125,9 @@
         return self.bookId
     
         
+    getUrl = MPIWGHelper.getUrl
+
+
     def editPublication(self, text=None, description=None, link=None, RESPONSE=None):
         """edit a publication"""
 
@@ -151,9 +157,9 @@
     objid = None
     projectLabel = None
     
+    # templates
     editDescription = PageTemplateFile('zpt/project/related_project/edit_basic', globals())
     
-
     def redirect(self, RESPONSE, url):
         """mache ein redirect mit einem angehaengten time stamp um ein reload zu erzwingen"""
         
@@ -197,6 +203,9 @@
         return label
 
         
+    getUrl = MPIWGHelper.getUrl
+
+
     def editRelatedProject(self, link=None, RESPONSE=None):
         """edit a publication"""
 
@@ -238,6 +247,8 @@
     showImage = PageTemplateFile('zpt/project/image/projectImageView', globals())
     editForm = PageTemplateFile('zpt/project/image/edit_basic', globals())
 
+    getUrl = MPIWGHelper.getUrl
+
     def editImage(self, file=None, caption=None, RESPONSE=None):
         """edit the Image"""
         if (not file) and (not caption):
@@ -373,14 +384,21 @@
             return n
     
     
-    def getProjectTitle(self):
+    def getProjectTitle(self, forSorting=False):
         """returns the project title"""
         t = getattr(self, 'WEB_title', None)
         if isinstance(t, list):
             # compat with old lists
-            return t[0]
-        else:
-            return t
+            t = t[0]
+        
+        if forSorting and t is not None:
+            # remove stopwords and signs for sorting
+            if t.lower().startswith('a '):
+                t = t[2:]
+            elif isinstance(t, unicode) and unicodedata.category(t[0])[0] != 'L':
+                t = t[1:]
+                
+        return t
     
     
     def getLabel(self):
@@ -460,12 +478,7 @@
         return self.absolute_url()
      
               
-    def getUrl(self, baseUrl=None):
-        """returns URL to this Project"""
-        if baseUrl is None:
-            return self.absolute_url()
-
-        return '%s/%s' % (baseUrl, self.getId())
+    getUrl = MPIWGHelper.getUrl
                 
               
     def getThumbUrl(self, default=None):
@@ -491,7 +504,7 @@
         if pp > 0:
             num = num[:pp]
             
-        return self.getMPIWGRoot().getDepartment(projectNumber=num)
+        return self.en.getMPIWGRoot().getDepartment(projectNumber=num)
 
 
     def getDepartmentId(self):
@@ -1119,7 +1132,6 @@
             return self.preview(newcontent)
 
         self.copyObjectToArchive()
-        self.ZCacheable_invalidate()
         self.WEB_project_description = newcontent[0:]
        
         self.REQUEST.RESPONSE.redirect("./index.html")
@@ -1178,7 +1190,7 @@
         for resp in self.getResponsibleScientistsList():
             logging.debug("resp=%s key=%s"%(repr(resp),repr(key)))
             # TODO: we need to get ASCII keys!!
-            if utf8ify(resp.get('key', '').lower()) == utf8ify(key).lower():
+            if utf8ify(resp.get('key', '')).lower() == utf8ify(key).lower():
                 return True
         
         return False
@@ -1284,7 +1296,7 @@
             username = None
             if key:
                 # get username from db
-                member = self.getMPIWGRoot().getStaffFolder().getMember(key=key)
+                member = self.en.getMPIWGRoot().getStaffFolder().getMember(key=key)
                 if member is not None:
                     username = member.getUsername()
                     
@@ -1810,7 +1822,7 @@
                                 key = key[0]
                                 
                             # get username from db
-                            member = self.getMPIWGRoot().getStaffFolder().getMember(key=key)
+                            member = self.en.getMPIWGRoot().getStaffFolder().getMember(key=key)
                             if member is not None:
                                 username = member.getUsername()
                                 
--- a/MPIWGStaff.py	Wed May 08 17:03:50 2013 +0200
+++ b/MPIWGStaff.py	Wed May 08 19:59:25 2013 +0200
@@ -1741,13 +1741,10 @@
             logging.error(escidocid)
             logging.error(value)
             
+
     def getSelectedPublications(self):
         """hole publications aus der datenbank"""
-    
-    
         query="select * from pubmanbiblio where lower(key_main) = lower(%s) order by priority DESC"
-            
-           
         return self.executeZSQL(query,[self.getKey()])
     
     
@@ -1756,17 +1753,14 @@
         
         ret=""
         #founds=self.ZSQLInlineSearch(_table='research_interest',key_main=person.getKeyUTF8())
-        founds=self.ZSQLInlineSearch(_table='research_interest',key_main=self.getKey())
+        founds=self.executeZSQL('select * from research_interest where lower(key_main) = %s', [self.getKey().lower()])
         if founds:
             ret="<p class=\"bio_section_header\">Research interests: </p><br/>"
         for found in self.sortPriority(founds):
             ret+=found.interest+"<br/>"
-        
-        
         if (self.content.current_work) and (not self.content.current_work==""):
             ret+="<p class=\"bio_section_header\">Current work: </p><br/>"
-      
-            ret+=self.current_work+"<br/>"
+            ret+=self.content.current_work+"<br/>"
         if (self.content.cv) and (not self.content.cv==""):
             ret+="<p class=\"bio_section_header\">Curriculum Vitae: </p><br/>"
         ret+=self.formatAscii(self.content.cv)
--- a/css/mpiwg.css	Wed May 08 17:03:50 2013 +0200
+++ b/css/mpiwg.css	Wed May 08 19:59:25 2013 +0200
@@ -921,6 +921,36 @@
     margin-left: 80px;
 }
 
+
+/*
+ * figures (in project descriptions)
+ */
+div.figure {
+    float: left;
+    width: 220px;
+    padding: 0.5em 1em 0 0;
+}
+div.figure div.image img {
+    width: 220px;
+}
+div.figure div.figcaption {
+    font-size: 10px;
+    color: #9f917a;
+    margin-top: 0.5em;
+}
+
+/*
+ * project description
+ */
+h3.authors {
+    margin-top: 0.5em;
+}
+
+div.description {
+    margin-top: 0.5em;
+    line-height: 1.5;
+}
+
 /* 
  * sidebar 
  */
@@ -929,7 +959,7 @@
     width: 220px;
     border-top: 3px solid #dccbae;
     background-color: white;
-    padding: 20px 8px 20px 0;
+    padding: 20px 10px 20px 0;
 }
 
 div.sideblock h2 {
@@ -958,6 +988,34 @@
 }
 
 /*
+ * project sidebars
+ */
+div.sideblock h2 {
+    position: relative;
+}
+div.sideblock h2 .proj_state {
+    position: absolute;
+    right: 0;
+}
+
+div.sideblock .project {
+    background: url(../images/internal.png) no-repeat scroll 6px 11px #F5DAAF;
+    border-bottom: 1px solid #F3BE7C;
+    padding: 6px 6px 6px 20px;
+}
+div.sideblock .project.inactive {
+    background: url(../images/internal.png) no-repeat scroll 6px 11px #f6e6cc;
+}
+div.sideblock .project.parent {
+    background: url(../images/up.png) no-repeat scroll 6px 11px #F9F4E1;
+    border-bottom: 1px solid #DCCBAE;
+    color: #666666;
+}
+div.sideblock .project a {
+    color: #333;
+}
+
+/*
  * footer
  */
 #footer {
--- a/zpt/project/project_template.zpt	Wed May 08 17:03:50 2013 +0200
+++ b/zpt/project/project_template.zpt	Wed May 08 19:59:25 2013 +0200
@@ -14,7 +14,8 @@
 <body>
 
   <!-- middle column -->
-  <div class="center" metal:fill-slot="center">
+  <div class="center project" metal:fill-slot="center">
+    <!-- version header -->
     <h2  tal:condition="not:here/isCurrentVersion">
       This is an outdated version of this project! For the current version, please refer to 
       <a tal:define="parentUrl python:here.aq_parent.getUrl(baseUrl=proBaseUrl)" 
@@ -26,41 +27,39 @@
         <span tal:content="here/getCompletedAt"/>)
       </p>
     </tal:x>
+    <!-- /version header -->
 
     <h1 tal:content="here/getProjectTitle">History of Scientific Objectivity, 18th-19th Cs</h1>
-    <p class="maintext_authors">
+    <h3 class="authors">
       <tal:block tal:repeat="person here/getResponsibleScientistsList">
-          <a tal:define="username person/username|nothing" tal:omit-tag="python:not username or not here.getStaffFolder().isActiveMember(key=person.get('key',None))"
-            tal:attributes="href string:$root/${secmap/staff}/members/$username" tal:content="person/name"> Name of
+          <a tal:define="username person/username|nothing; key person/key|nothing;" 
+             tal:omit-tag="python:not username or not here.getStaffFolder().isActiveMember(key=key)"
+             tal:attributes="href string:$root/${secmap/staff}/members/$username" tal:content="person/name"> Name of
             responsible person</a><tal:block tal:condition="not:repeat/person/end">, </tal:block>
       </tal:block>
-    </p>
-
-    <p class="maintext_more" tal:define="others here/getInvolvedScholars" tal:condition="others">
-      Other involved scholars: <span tal:content="structure others">Scholars </span>
-    </p>
-    <p class="maintext_more" tal:define="partners here/getCooperationPartners" tal:condition="partners">
-      Cooperation Partners: <span tal:content="structure partners">Partners</span>
-    </p>
+    </h3>
 
-    <!-- inline image -->
-    <div class="pic_inline_container" tal:condition="images">
-      <tal:block tal:repeat="image python:images">
-        <div class="pic_inline">
-          <a tal:condition="image/width"
-            tal:attributes="href python:request['URL1']+'/'+image.getId()+'/showImage'" target="image"><img width="220"
-            tal:attributes="src image/absolute_url" alt=""/><!--  <img tal:replace="structure python:image.tag(scale=min(220.0/image.width,1), border='0')" /> 
-            --></a>
+    <h3 class="authors" tal:define="others here/getInvolvedScholars" tal:condition="others">
+      Other involved scholars: <span tal:content="structure others">Scholars </span>
+    </h3>
+    <h3 class="authors" tal:define="partners here/getCooperationPartners" tal:condition="partners">
+      Cooperation Partners: <span tal:content="structure partners">Partners</span>
+    </h3>
+
+    <div class="description">
+      <!-- inline image -->
+      <div class="figure" tal:condition="images" tal:repeat="image python:images">
+        <div class="image">
+          <a tal:condition="image/width" tal:attributes="href python:image.getUrl()+'/showImage'" target="_blank"><img
+            tal:attributes="src image/getUrl" alt="" /></a>
           <pre tal:condition="not:image/width">empty image</pre>
         </div>
-        <div class="caption_inline" tal:content="structure image/caption">
-          J.-A.-D. Ingres: Mme Moitessier, 1856. Oel/Lw. 120 x 92,1 cm. London, National Gallery.
-        </div>
-      </tal:block>
+        <div class="figcaption" tal:content="structure image/caption">J.-A.-D. Ingres: Mme Moitessier, 1856. Oel/Lw. 120 x 92,1
+          cm. London, National Gallery.</div>
+      </div>
+      <!-- inline image -->
+      <div tal:content="structure python:here.getDescription(filter=True)">Project description</div>
     </div>
-    <!-- inline image -->
-
-    <div tal:content="structure python:here.getDescription(filter=True)">Project description</div>
 
   </div>
 
@@ -82,7 +81,7 @@
     <!-- related projects -->
     <div class="sideblock" tal:define="projects here/getRelatedProjectList" tal:condition="projects">
       <h2>Related Projects</h2>
-      <div class="item" tal:repeat="project projects">
+      <div class="project" tal:repeat="project projects">
         <a tal:attributes="href string:$proBaseUrl/${project/getProjectId}"
           tal:content="project/getProjectLabel" />
       </div>
@@ -117,8 +116,7 @@
             <tal:x tal:condition="python:hasattr(publication, 'description')">
               <div tal:content="structure publication/description" />
             </tal:x>
-          </div>
-          <!-- end item -->
+          </div><!-- end item -->
         </tal:block>
       </div>
       <!-- sideblock -->