Diff for /MPIWGWeb/MPIWGProjects.py between versions 1.47.2.91 and 1.47.2.107

version 1.47.2.91, 2008/08/27 12:12:48 version 1.47.2.107, 2008/10/23 07:53:50
Line 20  from OFS.SimpleItem import SimpleItem Line 20  from OFS.SimpleItem import SimpleItem
 from OFS.Folder import Folder  from OFS.Folder import Folder
 from OFS.Image import Image  from OFS.Image import Image
 from AccessControl import ClassSecurityInfo  from AccessControl import ClassSecurityInfo
   from AccessControl import getSecurityManager
 from bibliography import *  from bibliography import *
 import time  import time
   from OFS.Cache import Cacheable
 #import xml.dom.minidom  #import xml.dom.minidom
 import sys  import sys
 #from Ft.Xml.XPath import Evaluate  #from Ft.Xml.XPath import Evaluate
Line 39  import MPIWGRoot Line 41  import MPIWGRoot
 import MPIWGLink  import MPIWGLink
 import MPIWGTemplate  import MPIWGTemplate
   
 # die folgenden Klassen sind jetzt in einzelne Files ausgelagert aus KompatibilitŠtsgrŸnden, bleiben die Klassen hier noch drin.  # die folgenden Klassen sind jetzt in einzelne Files ausgelagert aus Kompatibilitaetsgruenden, bleiben die Klassen hier noch drin.
 # Sonst funktionieren die alten Webseiten nicht mehr.  # Sonst funktionieren die alten Webseiten nicht mehr.
   
 class MPIWGRoot(MPIWGRoot.MPIWGRoot):  class MPIWGRoot(MPIWGRoot.MPIWGRoot):
Line 111  class MPIWGProject_image(Image): Line 113  class MPIWGProject_image(Image):
         if RESPONSE:          if RESPONSE:
             RESPONSE.redirect("../manageImages")              RESPONSE.redirect("../manageImages")
   
 class MPIWGProject(CatalogAware,Folder):  class MPIWGProject(CatalogAware,Folder,Cacheable):
     """Class for Projects"""      """Class for Projects"""
   
   
Line 369  class MPIWGProject(CatalogAware,Folder): Line 371  class MPIWGProject(CatalogAware,Folder):
                   
     def deleteImage(self,id,RESPONSE=None):      def deleteImage(self,id,RESPONSE=None):
         """delete Image id"""          """delete Image id"""
           try:
         self.manage_delObjects([id])          self.manage_delObjects([id])
           except:
                   logging.error("ERROR MPIWG: %s %s"%sys.exc_info()[0:2])
         if RESPONSE:          if RESPONSE:
             RESPONSE.redirect('manageImages')              RESPONSE.redirect('manageImages')
   
Line 573  class MPIWGProject(CatalogAware,Folder): Line 578  class MPIWGProject(CatalogAware,Folder):
     def isArchivedProject(self):      def isArchivedProject(self):
         """check if the project is archived"""          """check if the project is archived"""
                   
         completed=getattr(self,'completedAt',0)          completed=self.getCompletedAt()
                 
        #completed leer          #completed leer 
         if completed=="" :          if completed=="" :
Line 591  class MPIWGProject(CatalogAware,Folder): Line 596  class MPIWGProject(CatalogAware,Folder):
                   
     def setCompletedAt(self,date):      def setCompletedAt(self,date):
         """set the date of completion, date should be in the form DD.MM.YYYY or MM.YYYY or YYYY"""          """set the date of completion, date should be in the form DD.MM.YYYY or MM.YYYY or YYYY"""
         logging.info("DATE:"+repr(date))          #logging.info("DATE:"+repr(date))
         transformedDate=self.transformDate(date);          transformedDate=self.transformDate(date);
         logging.info("transformed"+repr(transformedDate))          #logging.info("transformed"+repr(transformedDate))
         if transformedDate is not None:          if transformedDate is not None:
             setattr(self,"completedAt",transformedDate)              setattr(self,"completedAt",transformedDate)
             return True;              return True;
Line 602  class MPIWGProject(CatalogAware,Folder): Line 607  class MPIWGProject(CatalogAware,Folder):
           
     def setStartedAt(self,date):      def setStartedAt(self,date):
         """set the date of start, date should be in the form DD.MM.YYYY or MM.YYYY or YYYY"""          """set the date of start, date should be in the form DD.MM.YYYY or MM.YYYY or YYYY"""
         logging.info("DATE:"+repr(date))          #logging.info("DATE:"+repr(date))
         transformedDate=self.transformDate(date);          transformedDate=self.transformDate(date);
         logging.info("transformed"+repr(transformedDate))          #logging.info("transformed"+repr(transformedDate))
         if transformedDate is not None:          if transformedDate is not None:
             setattr(self,"startedAt",transformedDate)              setattr(self,"startedAt",transformedDate)
             return True;              return True;
         else:          else:
             return False;              return False;
   
     def getCompletedAt(self):      def getCompletedAt(self):
         """gibt das transformierte Datum zurueck, an dem das Projekt beendet wurde."""          """gibt das transformierte Datum zurueck, an dem das Projekt beendet wurde."""
         date=getattr(self,'completedAt','')          date=getattr(self,'completedAt','')
         if date:          if date:
             return self.reTransformDate(date);              return self.reTransformDate(date);
         else:          else:
               # test ob parent abgeschlossen ist
           try:          #TODO: ersetzte try except durch vernuenftige abfrage  
                   ct=self.getContexts(parents=self.getContent('xdata_05'),depth=1)
                   if (len(ct)>0): #is there are parent
                   
                       return ct[0][0].getCompletedAt()
                   return '';
           except:
             return '';              return '';
                   
     def getStartedAt(self):      def getStartedAt(self):
Line 722  class MPIWGProject(CatalogAware,Folder): Line 736  class MPIWGProject(CatalogAware,Folder):
         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','no_project')).__of__(self)          pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','no_project')).__of__(self)
         return pt()          return pt()
             
     def getGetNeighbourhood(self,wordStr, length=100,tagging=True):  
         """finde umgebung um die worte in wordStr, zurueckgegeben wird eine Array mit den Umgebungen von Fundstellen der Worte  
         alle Tags werden entfernt, die Fundstellen werden mit <span class="found">XX</span> getaggt, die Umgebungen werden   
         case insensitive gesucht  
         @param wordStr: string mit Worten getrennt durch Leerzeichen, Phrasen sind mit " gekennzeichnet  
                         "eine phrase", "*"  bezeichnet wildcards und wird ignoriert"  
         @param length: optional, default wert 100, 2*length ist die groesse der Umgebung  
         @param tagging: optional default wert true, kein span tag wird erzweugt falls tag=false  
         """  
                   
         ret=[] # nimmt das Array auf, dass spaeter zurueckgegeben wird      def harvest_page(self,context=None):
         ranges=[] #Array mit tupeln x,y wobei x die Position des Anfang und y des Endes der i-ten Umgebung angiebt          """seite fuer harvesting fuer die Projektsuche"""
           if not context:
               context=self
                   
         def isInRanges(nr,length):          if self.isActiveProject() and self.isActual():
             """test ob eine gegeben Position nr schon irgendwo in einer Umgebung ist, gibt den Index des ersten Wertes aus ranges zurueck,                ext=getattr(self,"harvest_main",None)
             -1, wenn kein Treffer               if ext:
                    return getattr(self,ext.getId())()
                           
             @param nr: Position die geprueft werden soll               pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','harvest_main')).__of__(context)    
             @param length: Laenge des Wortes das geprueft werden soll  
             """  
             for x in ranges:  
                 if (x[0]<=nr) and (nr < (x[1]-length)):  
                     return ranges.index(x)  
             return -1  
                   
         # deal with phrases, in Phrasen werden die Leerzeichen durch "_" ersetzt.  
         def rep_empty(str):  
             x= re.sub(" ","_",str.group(0))  
             return re.sub("\"","",x)  
               
         wordStr=re.sub("\".*?\"", rep_empty,wordStr)#ersetze leerzeichen in " " durch "_" und loesche "  
           
         #deal with wildcards, for our purposes it is enough to delete the wildcard   
         wordStr=wordStr.replace("*","")  
           
         words=wordStr.split(" ")  
         #if not words is ListType:  
         #   words=[words]  
                           
         txt=self.harvest_page()  
         if not txt:  
             return ret  
         txt=re.sub("<.*?>", "", txt) # loesche alle Tags  
         for word in words:  
             word=re.sub("_"," ",word) # ersetze zurueck "_" durch " "  
             pos=0  
                           
             n=txt.lower().count(word.lower()) # wie oft tritt das Wort auf               return pt()
   
             for i in range(n):      def index_html(self,request=True,context=None):
                 pos=txt.lower().find(word.lower(),pos)          """show homepage"""
   
                 if pos > 0:          bound_names={}
                     x=max(0,pos-length)  
                     y=min(len(txt),pos+length)  
                                       
           if not context:
               context=self
           if request:
               if self.REQUEST.has_key('date') and self.REQUEST.SESSION.get('MPI_redirected',None)==None:
                   self.REQUEST.SESSION['MPI_redirected']=1
                   self.REQUEST.RESPONSE.redirect(self.checkDate(self.REQUEST['date'])+"?date="+self.REQUEST['date'])
               else:
                   self.REQUEST.SESSION['MPI_redirected']=None
                                           
                     #is word already in one of the results          #ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"])
                     nr=isInRanges(pos,len(word))  
                     if nr >=0:# word ist in einer schon gefunden Umgebung, dann vergroessere diese  
                         x=min(ranges[nr][0],x)  
                         y=max(ranges[nr][1],y)  
                               
                     str=txt[x:y]  
                                   
                     if nr >=0: # word ist in einer schon gefunden Umgebung          request2=getattr(self,'REQUEST',None)
                         ranges[nr]=(x,y) # neue Position der Umgebung  
   
                         ret[nr]=str # neue Umgebung          if request2 is not None:
                     else: # andernfalls neue Umgebung hinzufuegen              response = request2.response
                         ranges.append((x,y))              if not response.headers.has_key('content-type'):
                   response.setHeader('content-type', 'text/html')
   
                         ret.append(str)          security = getSecurityManager()
           bound_names['user'] = security.getUser()
                                           
                     pos=pos+len(word)  
                 else:  
                     break;  
                                   
         # now highlight everything                  # Retrieve the value from the cache.
         if tagging:          keyset = None
             for x in range(len(ret)):          if self.ZCacheable_isCachingEnabled():
                 for word in words:  
                     repl=re.compile(word,re.IGNORECASE)  
                     ret[x]=repl.sub(""" <span class="found">%s</span>"""%word.upper(),ret[x])  
   
         return ret              # Prepare a cache key.
               keyset = {'here': self, 'params':request2['QUERY_STRING']}
                                                                   
     def harvest_page(self,context=None):              result = self.ZCacheable_get(keywords=keyset)
         """seite fuer harvesting fuer die Projektsuche"""  
         if not context:  
             context=self  
                           
         if self.isActiveProject() and self.isActual():              if result is not None:
              ext=getattr(self,"harvest_main",None)                  # Got a cached value.
              if ext:                  return result
                  return getattr(self,ext.getId())()  
   
              pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','harvest_main')).__of__(context)              pt = getTemplate(self, "project_main")
            # Execute the template in a new security context.
           security.addContext(self)
   
           try:
               result = pt.pt_render(extra_context=bound_names)
               if keyset is not None:
                   # Store the result in the cache.
                   self.ZCacheable_set(result, keywords=keyset)
   
              return pt()              return result
           finally:
               security.removeContext(self)
                     
     def index_html(self,request=True,context=None):  
         
       def index_html_old(self,request=True,context=None):
         """show homepage"""          """show homepage"""
         if not context:          if not context:
             context=self              context=self
Line 836  class MPIWGProject(CatalogAware,Folder): Line 821  class MPIWGProject(CatalogAware,Folder):
                 self.REQUEST.SESSION['MPI_redirected']=None                  self.REQUEST.SESSION['MPI_redirected']=None
                   
         #ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"])          #ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"])
         
         ext=getattr(self,"project_main",None)          ext=getattr(self,"project_main",None)
         if ext:          if ext:
             return getattr(self,ext.getId())()              return getattr(self,ext.getId())()
Line 865  class MPIWGProject(CatalogAware,Folder): Line 851  class MPIWGProject(CatalogAware,Folder):
     def getContent(self,field,filter=None):      def getContent(self,field,filter=None):
         """Inhalt des Feldes"""          """Inhalt des Feldes"""
                   
       if field=="short_title":
           text = self.getContent("xdata_07")
           if text=="":
               text = self.getContent("WEB_title")
           return text
   
         text=u''          text=u''
   
         for x in getattr(self,field):          for x in getattr(self,field):
Line 884  class MPIWGProject(CatalogAware,Folder): Line 876  class MPIWGProject(CatalogAware,Folder):
         except:          except:
             pass              pass
                   
         if text=='':          if text=='': ## wozu die folgenden Zeilen??
             text2=text              text2=text
         else:          else:
             text2=re.sub(r';([^\s])','; \g<1>',text)              text2=re.sub(r';([^\s])','; \g<1>',text)
   
           if field=="WEB_project_description":##Jedenfalls darf letzteres nicht gemacht werden, falls normaler text
               text2=text
               
         #teste ob ergebnis leer und header dann nehme title          #teste ob ergebnis leer und header dann nehme title
                   
         if (text2=='') and (field=='WEB_project_header'):          if (text2=='') and (field=='WEB_project_header'):
Line 939  class MPIWGProject(CatalogAware,Folder): Line 934  class MPIWGProject(CatalogAware,Folder):
         if (text5=="<br>") or (text5=="<br/>"):          if (text5=="<br>") or (text5=="<br/>"):
             text5=""              text5=""
   
         logging.debug("getcontent: field=%s filter=%s -> %s"%(field,filter,repr(text5)))          #logging.debug("getcontent: field=%s filter=%s -> %s"%(field,filter,repr(text5)))
         return unicodify(text5)          return unicodify(text5)
         #return utf8ify(text5) # return as utf-8 byte string          #return utf8ify(text5) # return as utf-8 byte string
   
Line 977  class MPIWGProject(CatalogAware,Folder): Line 972  class MPIWGProject(CatalogAware,Folder):
             return self.preview(newcontent)              return self.preview(newcontent)
   
         self.copyObjectToArchive()          self.copyObjectToArchive()
           self.ZCacheable_invalidate()
         self.WEB_project_description=newcontent[0:]          self.WEB_project_description=newcontent[0:]
   
         self.REQUEST.RESPONSE.redirect("./index.html")          self.REQUEST.RESPONSE.redirect("./index.html")
Line 1003  class MPIWGProject(CatalogAware,Folder): Line 999  class MPIWGProject(CatalogAware,Folder):
         else:          else:
             return style                  return style    
   
       def getLabel(self):
           """returns label (or title) of this project"""
           l = self.getContent('xdata_07')
           if l:
               return l
           l = self.getContent('WEB_title')
           if l:
               return l
           return self.title
   
       def getBreadcrumbs(self):
           """return list of breadcrumbs from here to the root"""
           crumbs = []
           # skip direct parent Folder /projects/
           parent = self.aq_parent.aq_parent
           # get parents breadcrumbs
           if hasattr(parent, 'getBreadcrumbs'):
               crumbs = parent.getBreadcrumbs()
           
           # try to get acquisition URL from parent
           if hasattr(parent, 'absolute_url'):
               baseUrl = "%s/%s/"%(parent.absolute_url(), 'projects')
           else:
               baseUrl = "/en/research/projects/"
               
           # add in the internal project hierarchy
           ct=self.getContexts(parents=self.getContent('xdata_05'))
           # start with grandparents
           ct.reverse()
           for c in ct:
               label = shortenString(c[0].getLabel(), 13)
               crumbs.append((label, baseUrl+c[0].getId(), c[0]))            
   
           # add this project
           crumbs.append((self.getLabel(), baseUrl+self.getId(), 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        
   
   
     def preview(self,description):      def preview(self,description):
         """preview"""          """preview"""
         tmpPro=getattr(self,"previewTemplate",None)          tmpPro=getattr(self,"previewTemplate",None)
Line 1054  class MPIWGProject(CatalogAware,Folder): Line 1097  class MPIWGProject(CatalogAware,Folder):
         #logging.info("XXXXXXXXXXXXX"+repr(self.responsibleScientistsList))          #logging.info("XXXXXXXXXXXXX"+repr(self.responsibleScientistsList))
       
                   
         keys = [x[1] for x in getattr(self,"responsibleScientistsList",[])]          keys = [unicodify(x[1]) for x in getattr(self,"responsibleScientistsList",[])]
           #logging.error("RESP. SCIEN:%s"%getattr(self,"responsibleScientistsList",[]))
           #logging.error("RESP. SCIEN:%s"%unicodify(key))
                           
         if key in keys:          if unicodify(key) in keys:
             return True              return True
         else:          else:
             return False              return False
                   
     def getPersonKeyList(self):      def getPersonKeyList(self):
         """gibt die key Lister der beteiligten Personen zurŸck"""          """gibt die key Liste der beteiligten Personen zurŸck (utf8 codiert)"""
         return [x[1] for x in getattr(self,'responsibleScientistsList',[])]          #logging.error("getPersonKeyList:%s"%getattr(self,'responsibleScientistsList',[]))
           try:
               return [utf8ify(x[1]) for x in getattr(self,'responsibleScientistsList',[])]
           except:
               return[]
           
          
       def myCapitalize(self,txt):
           """kapitalisiere auch Namen mit -"""
           splitted=[x.capitalize() for x in txt.split("-")]
           return "-".join(splitted)
       
       def getNamesOrdered(self,list):
           """Sortiert die Liste nach der Reihenfolge in xdata_01"""
           
           nameList=self.getContent('xdata_01')
           if nameList.find(";")>-1: # rate Trenner ist ;
               names=nameList.split(";")  
           else:
               names=nameList.split(",")
               
               self._v_names=[]
               for name in names:
                   self._v_names.append(name.rstrip().lstrip())
               
               
           def sort(x,y):
               try:
                   return cmp(self._v_names.index(x[0]),self._v_names.index(y[0]))
               except:
                   return 0
               
           list.sort(sort)
           
           return list
           
           ##nameList=nameList.replace(";",",") # falls ; als Trenner ersetze    
                 
                   
                 
Line 1073  class MPIWGProject(CatalogAware,Folder): Line 1154  class MPIWGProject(CatalogAware,Folder):
         und ordnet diese dann Mitarbeiter IDs zu falls es schone eine Liste gibt wird im Projekte gibt wird diese Upgedated.          und ordnet diese dann Mitarbeiter IDs zu falls es schone eine Liste gibt wird im Projekte gibt wird diese Upgedated.
         @param nameList          @param nameList
         """          """
         nameList=nameList.replace(";",",") # falls ; als Trenner ersetze          
           if nameList.find(";")>-1: # rate Trenner ist ;
             names=nameList.split(";")  
             
           else:
         names=nameList.split(",")          names=nameList.split(",")
                   
           ##nameList=nameList.replace(";",",") # falls ; als Trenner ersetze    
         returnNamesDict={}          returnNamesDict={}
   
                 
Line 1091  class MPIWGProject(CatalogAware,Folder): Line 1177  class MPIWGProject(CatalogAware,Folder):
                 lastname=nameSplitted[0]                  lastname=nameSplitted[0]
                                 
             #finde Mitarbeiter mit den entsprechenden Name              #finde Mitarbeiter mit den entsprechenden Name
             logging.info("Search: %s %s %s"%(name,firstname,lastname))              
             firstname=firstname.capitalize()              firstname=self.myCapitalize(firstname).encode('utf-8')
             lastname=lastname.capitalize()              lastname=self.myCapitalize(lastname).encode('utf-8')
               logging.info("Search: %s %s %s"%(name,repr(firstname),repr(lastname)))
             try:              try:
                 cataloggedNames=self.MembersCatalog(firstName=firstname,lastName=lastname)                  cataloggedNames=self.MembersCatalog(firstName=firstname,lastName=lastname)
             except:              except:
                 cataloggedNames=[]                  cataloggedNames=[]
                   logging.error("ERROR: identifyNames %s %s"%sys.exc_info()[0:2])
               
             #Teste ob die ensprechenden Namen schon der Liste zu geordnet sind              #Teste ob die ensprechenden Namen schon der Liste zu geordnet sind
             #if not hasattr(self,'responsibleScientistsList'):              #if not hasattr(self,'responsibleScientistsList'):
             #     self.responsibleScientistsList={}              #     self.responsibleScientistsList={}
Line 1109  class MPIWGProject(CatalogAware,Folder): Line 1198  class MPIWGProject(CatalogAware,Folder):
             else:              else:
                 returnNamesDict[name]=[]                  returnNamesDict[name]=[]
                 
           logging.error("id: %s"%repr(returnNamesDict))
         return returnNamesDict          return returnNamesDict
                   
     def editMPIWGProject(self,RESPONSE=None,fromEdit=None):      def editMPIWGProject(self,RESPONSE=None,fromEdit=None):
         """edit the project and archive the old version"""          """edit the project and archive the old version"""
                   
         self.copyObjectToArchive() # archive the object          self.copyObjectToArchive() # archive the object
           self.ZCacheable_invalidate()
   
         for x in definedFields:          for x in definedFields:
             if self.REQUEST.has_key(x):              if self.REQUEST.has_key(x):
Line 1156  class MPIWGProject(CatalogAware,Folder): Line 1246  class MPIWGProject(CatalogAware,Folder):
                     keys[nr]=self.REQUEST[key]                      keys[nr]=self.REQUEST[key]
                                   
                     
         for nr in names.keys():          for nr in names.keys():#schreibe keys und namen in die Liste, stelle ausserdem sicher, dass name unicode
              tmpList.append((names[nr],keys.get(nr,"")))               tmpList.append((unicodify(names[nr]),unicodify(keys.get(nr,""))))
                             
         self.responsibleScientistsList=tmpList          self.responsibleScientistsList=tmpList
         if fromEdit and (RESPONSE is not None):          if fromEdit and (RESPONSE is not None):
             #RESPONSE.redirect('./editMPIWGBasisEditor')              #RESPONSE.redirect('./editMPIWGBasisEditor')
             return self.editMPIWGBasisEditor(identifiedNames=self.identifyNames(self.REQUEST.get('xdata_01','')))              return self.editMPIWGBasisEditor(identifiedNames=self.identifyNames(self.decode(self.REQUEST.get('xdata_01',''))))
                           
         else:          else:
             if RESPONSE is not None:              if RESPONSE is not None:
Line 1233  class MPIWGProject(CatalogAware,Folder): Line 1323  class MPIWGProject(CatalogAware,Folder):
             identifiedNames=self.identifyNames(self.getContent('xdata_01'))              identifiedNames=self.identifyNames(self.getContent('xdata_01'))
            # identifiedNames=self.getFullNameEntries()             # identifiedNames=self.getFullNameEntries()
                           
           logging.error("IdentifiedNames: %s"% repr(identifiedNames))
         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGBasisNeu.zpt')).__of__(self)          pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','edit_MPIWGBasisNeu.zpt')).__of__(self)
         return pt(identifiedNames=identifiedNames)          return pt(identifiedNames=identifiedNames)
   

Removed from v.1.47.2.91  
changed lines
  Added in v.1.47.2.107


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>