Diff for /MPIWGWeb/MPIWGProjects.py between versions 1.47.2.74 and 1.47.2.80

version 1.47.2.74, 2007/04/19 13:32:35 version 1.47.2.80, 2008/06/18 11:29:25
Line 110  def sortI(x,y): Line 110  def sortI(x,y):
     except:      except:
         return cmp(x[1],y[1])          return cmp(x[1],y[1])
   
   
   def unicodify(str):
       """decode str (utf-8 or latin-1 representation) into unicode object"""
       if not str:
           return ""
       if type(str) is StringType:
           try:
               return str.decode('utf-8')
           except:
               return str.decode('latin-1')
       else:
           return str
   
   def utf8ify(str):
       """encode unicode object or string into byte string in utf-8 representation"""
       if not str:
           return ""
       if type(str) is StringType:
           return str
       else:
           return str.encode('utf-8')
   
   
 class MPIWGLink(SimpleItem):  class MPIWGLink(SimpleItem):
     """create a symbolic link to another page"""      """create a symbolic link to another page"""
   
Line 335  class MPIWGRoot(ZSQLExtendFolder): Line 358  class MPIWGRoot(ZSQLExtendFolder):
         except:          except:
         return str.decode('latin-1')          return str.decode('latin-1')
         else:          else:
               
             return str              return str
   
   
       def getat(self,array,idx=0,default=None):
           """return array element idx or default (but no exception)"""
           if len(array) <= idx:
               return default
           else:
               return array[idx]
           
   
     def browserCheck(self):      def browserCheck(self):
     """check the browsers request to find out the browser type"""      """check the browsers request to find out the browser type"""
     bt = {}      bt = {}
Line 500  class MPIWGRoot(ZSQLExtendFolder): Line 530  class MPIWGRoot(ZSQLExtendFolder):
         """returns the current section name"""          """returns the current section name"""
         root = self.absolute_url()          root = self.absolute_url()
         url = self.REQUEST['URL']          url = self.REQUEST['URL']
           if not url:
               return None
         path = string.replace(url, root, '')          path = string.replace(url, root, '')
         paths = path.split('/')          paths = path.split('/')
         if len(paths) > 0:          if len(paths) > 0:
Line 830  class MPIWGRoot(ZSQLExtendFolder): Line 862  class MPIWGRoot(ZSQLExtendFolder):
                 #create the object                  #create the object
                 e_mail=args[key]                  e_mail=args[key]
                 try:                  try:
                     newObj=MPIWGStaff.MPIWGStaff(e_mail,res.last_name.encode('utf-8'),res.first_name.encode('utf-8'),k)                      newObj=MPIWGStaff.MPIWGStaff(e_mail,res.last_name,res.first_name,k)
                     memberFolder._setObject(e_mail,newObj)                      memberFolder._setObject(e_mail,newObj)
                     obj=getattr(memberFolder,e_mail)                      obj=getattr(memberFolder,e_mail)
                     obj.reindex_object()                      obj.reindex_object()
                     ret+="Created %s \n"%e_mail                      ret+="Created %s \n"%e_mail
                     created=True                      created=True
                 except:                  except:
   
                     msg="Cannot create new user %s (%s %s)"%(e_mail,sys.exc_info()[0],sys.exc_info()[1])                      msg="Cannot create new user %s (%s %s)"%(e_mail,sys.exc_info()[0],sys.exc_info()[1])
                     logging.error(msg)                      logging.error(msg)
                     ret+=msg+"\n"                      ret+=msg+"\n"
                     created=False                      created=False
                                   
                 if created:                  if created:
                     qstr="update personal_www set web_object_created='yes',e_mail='%s' where key=%s"%(e_mail,self.ZSQLQuote(k))                      qstr="update personal_www set web_object_created='yes',e_mail='%s@mpiwg-berlin.mpg.de' where key=%s"%(e_mail,self.ZSQLQuote(k))
                     self.ZSQLQuery(qstr)                      self.ZSQLQuery(qstr)
                   
         return ret          return ret
Line 917  class MPIWGRoot(ZSQLExtendFolder): Line 948  class MPIWGRoot(ZSQLExtendFolder):
         #    self.ZSQLQuery(queryStr)          #    self.ZSQLQuery(queryStr)
                   
         return True,msg          return True,msg
   
   
     def updatePersonalwww_doIt(self):      def updatePersonalwww_doIt(self):
         """do the update"""          """do the update"""
         args=self.REQUEST.form          args=self.REQUEST.form
Line 927  class MPIWGRoot(ZSQLExtendFolder): Line 960  class MPIWGRoot(ZSQLExtendFolder):
         # generate the new entry          # generate the new entry
               
         if news and (len(news)>0):          if news and (len(news)>0):
             ret+="<h2>HinzugefŸgt</h2>"              ret+="<h2>Hinzugef&uuml;gt</h2>"
             ret+="<p>NeueintrŠge erscheinen erst auf der Homepage, wenn ihnen eine e-mail Adresse zugeordnet wurde.</p>"              ret+="<p>Neueintr&auml;ge erscheinen erst auf der Homepage, wenn ihnen eine e-mail Adresse zugeordnet wurde.</p>"
             ret+="<ul>"              ret+="<ul>"
         for new in news:          for new in news:
               
Line 940  class MPIWGRoot(ZSQLExtendFolder): Line 973  class MPIWGRoot(ZSQLExtendFolder):
                 else:                  else:
                     ret+="<li>OK: %s"%(new.encode('utf-8'))                      ret+="<li>OK: %s"%(new.encode('utf-8'))
         if news and (len(news)>0):          if news and (len(news)>0):
             ret+="<p>NeueintrŠge erscheinen erst auf der Homepage, wenn ihnen eine e-mail Adresse zugeordnet wurde.</p>"              ret+="<p>Neueintr&auml;ge erscheinen erst auf der Homepage, wenn ihnen eine e-mail Adresse zugeordnet wurde.</p>"
             ret+="</ul>"                   ret+="</ul>"     
                   
         # update          # update
   
         if len(conflicts.keys())>0:          if len(conflicts.keys())>0:
             ret+="<h2>Bei €nderung belassen</h2>"              ret+="<h2>&Auml;nderung des Benutzers &uuml;bernehmen</h2>"
             ret+="<p>Bitte die Filemaker-db entsprehchend Šndern</p>"              ret+="<p>Wenn n&ouml;tig in Filemaker-db &auml;ndern:</p>"
                           
         # konflicte             # konflicte   
         for conflict in conflicts.keys():          for conflict in conflicts.keys():
Line 975  class MPIWGRoot(ZSQLExtendFolder): Line 1008  class MPIWGRoot(ZSQLExtendFolder):
                  self.updatePersonEntry(resultSet[key])                   self.updatePersonEntry(resultSet[key])
         return ret+"</body></html>"          return ret+"</body></html>"
                                             
   
     def updateInstitutsbiliography(self):      def updateInstitutsbiliography(self):
         """update the Institutsbibliogrpahy"""          """update the Institutsbibliogrpahy"""
         self.upDateSQL('personalwww.xml')          self.upDateSQL('personalwww.xml')
         return "<html><body>DONE</body></html>"          return "<html><body>DONE</body></html>"
   
   
     def updatePersonalwww_html(self):      def updatePersonalwww_html(self):
         """update form for the homepages web form"""          """update form for the homepages web form"""
         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','updatePersonalwww.zpt')).__of__(self)          pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','updatePersonalwww.zpt')).__of__(self)
         return pt()          return pt()
           
       
     def updatePersonalwww(self,uploadfile):      def updatePersonalwww(self,uploadfile):
         """update personalwww          """update personalwww
         @param uploadfile: file handle auf das file          @param uploadfile: file handle auf das file
Line 1049  class MPIWGRoot(ZSQLExtendFolder): Line 1086  class MPIWGRoot(ZSQLExtendFolder):
             return entry              return entry
   
   
     def getTree(self,dep=None,date=None,onlyActive=None):      def getTree(self,dep=None,date=None,onlyActive=0,onlyArchived=0):
         """generate Tree from project list"""          """generate Tree from project list
           als Liste, jeder Eintrag ist ein Tupel ,(Tiefe, ProjektNummer,ProjektObject
           onlyActive = 0  : alle Projekte
           onlyActive = 1 : nur active Projekte
           onlyActive = 2: nur inactive Projekte
           
           onlyArchived=0: alle Projekte
           onlyArchived= 1 : nur aktuelle Projekte
           onlyArchived = 2: nur archivierte Projekte
           """
   
           returnListTmp=[]
         returnList=[]          returnList=[]
           
         for project in self.getProjectFields('xdata_05',sort="int",date=date): # get Projects sorted by xdata_05          for project in self.getProjectFields('xdata_05',sort="int",date=date): # get Projects sorted by xdata_05
   
             for idNr in project[1].split(";"): # more than one number              for idNr in project[1].split(";"): # more than one number
Line 1068  class MPIWGRoot(ZSQLExtendFolder): Line 1116  class MPIWGRoot(ZSQLExtendFolder):
                         project[0].setActiveFlag(False)                          project[0].setActiveFlag(False)
                                         
                     if (not dep) or (idNr[0]==dep): #falls dep gesetzt ist nur dieses hinzufuegen.                      if (not dep) or (idNr[0]==dep): #falls dep gesetzt ist nur dieses hinzufuegen.
                         if onlyActive and project[0].isActiveProject(): #nur active projekte                          
                            returnList.append((depth,nr,title,project[0]))                          if (onlyActive==0):
                         elif not onlyActive:                              returnListTmp.append((depth,nr,title,project[0]))
                           returnList.append((depth,nr,title,project[0]))                          elif (onlyActive==1) and project[0].isActiveProject(): #nur active projekte
                               returnListTmp.append((depth,nr,title,project[0]))
                           elif (onlyActive==2) and (not project[0].isActiveProject()): #nur active projekte
                               returnListTmp.append((depth,nr,title,project[0]))
                      
                      
           #filter jetzt die Liste nach Archived oder nicht
           for entry in returnListTmp:
                       if (onlyArchived==0):
                               returnList.append(entry)
                       elif (onlyArchived==1) and (not entry[3].isArchivedProject()): #nur active projekte
                               returnList.append(entry)
                       elif (onlyArchived==2) and (entry[3].isArchivedProject()): #nur active projekte
                               returnList.append(entry)
                      
           
         return returnList          return returnList
   
   
Line 1112  class MPIWGRoot(ZSQLExtendFolder): Line 1175  class MPIWGRoot(ZSQLExtendFolder):
         """change the complete tree"""          """change the complete tree"""
         form=self.REQUEST.form          form=self.REQUEST.form
         hashList={}          hashList={}
         fields=self.getTree()          onlyArchived=int(form.get("onlyArchived",0))
           onlyActive=int(form.get("onlyActive",0))
   
                   
         for idNr in form.keys():          fields=self.getTree(onlyArchived=onlyArchived,onlyActive=onlyActive)
                           
             splitted=idNr.split('_')          logging.info("GOT TREE!----------------------------------------------------")
           for field in form.keys():
                           
             if len(splitted)==1: # name des Feldes = idNr, dann Aendere id_nr              splitted=field.split('_')
                 if not (fields[int(idNr)][3].xdata_05==form[idNr]):              if (len(splitted)>1) and (splitted[1]=="runningNumber"): #feld hat die Form Nummer_name und runnignNumber
                     fields[int(idNr)][3].xdata_05=form[idNr]  
                     fields[int(idNr)][3].copyObjectToArchive()  
                                           
                 if form.has_key(idNr+'_active'): # active flag is set  
                                       
                     fields[int(splitted[0])][3].setActiveFlag(True)                  nr=int(splitted[0]) # nummer des Datensatzes
                   currentEntry = fields[nr]
               
                   if form.has_key(str(nr)+'_active'): # active flag is set
                       fields[nr][3].setActiveFlag(True)
                 else:                  else:
                       fields[nr][3].setActiveFlag(False)
                       
                   #nummer hat sich geŠndert
                   
                   entryChanged = False;
                   
                   
                   if not (fields[nr][3].xdata_05==form[str(nr)+'_number']):
                       logging.info("Changed!Number+++++++++++++++++++++++++++++++++")
                       fields[nr][3].xdata_05=form[str(nr)+'_number']
                       entryChanged = True
                       
                   #completed har sich geaendert
                               
                   if not (fields[nr][3].getCompletedAt()==fields[nr][3].transformDate(form[str(nr)+'_completed'])):
                       fields[nr][3].setCompletedAt(form[str(nr)+'_completed'])
                       logging.info("Changed!Completed+++++++++++++++++++++++++++++++++")
                       entryChanged = True
                   
                   
                   if entryChanged:
                       logging.info("Changed!+++++++++++++++++++++++++++++++++")
                       fields[nr][3].copyObjectToArchive()
                                       
                     fields[int(splitted[0])][3].setActiveFlag(False)  
                                           
         if RESPONSE is not None:          if RESPONSE is not None:
             RESPONSE.redirect('showTree')              RESPONSE.redirect('showTree')
Line 1192  class MPIWGRoot(ZSQLExtendFolder): Line 1280  class MPIWGRoot(ZSQLExtendFolder):
                                   
                 if not search=='':                  if not search=='':
                     try:                      try:
                          
                         member=self.MembersCatalog({'title':search})                          member=self.MembersCatalog({'title':search})
                     
                     except:                      except:
                         member=None                          member=None
                   if member:
                      logging.error("search publ %s:"%member[0].getObject().isPublished())
                 if member and (member[0].getObject().isPublished()):                  if member and (member[0].getObject().isPublished()):
                     if person =="Otto Sibum" : person="H. Otto Sibum"                      if person =="Otto Sibum" : person="H. Otto Sibum"
                     if person =="Norton Wise" : person="M. Norton Wise"                      if person =="Norton Wise" : person="M. Norton Wise"
                       
                     #memberlist.append("<a href=%s >%s</a>"%(member[0].absolute_url,person.encode('utf-8')))                      #memberlist.append("<a href=%s >%s</a>"%(member[0].absolute_url,person.encode('utf-8')))
                     memberlist.append((person, member[0].getObject().getId()))                      memberlist.append((person, member[0].getObject().getId()))
                 else:                  else:
Line 1254  class MPIWGRoot(ZSQLExtendFolder): Line 1346  class MPIWGRoot(ZSQLExtendFolder):
                           
         return ret          return ret
   
     def getProjectsOfMember(self,name=None,key=None,date=None):      def getProjectsOfMember(self,name=None,key=None,date=None,onlyArchived=1):
         """get projects of a member          """get projects of a member
         @param name: (optional)Vorname + Nachname          @param name: (optional)Vorname + Nachname
         @param key: (optional) Key zur Idenfikation des Benutzer          @param key: (optional) Key zur Idenfikation des Benutzer
         @param date: (optional) Version die zum Zeitpunkt date gueltig war          @param date: (optional) Version die zum Zeitpunkt date gueltig war
           @param onlyArchived: 
           onlyArchived=0: alle Projekte
           onlyArchived= 1 : nur aktuelle Projekte
           onlyArchived = 2: nur archivierte Projekte
         """          """
         # TODO: Die ganze Lšsung          # TODO: Die ganze Loesung
         def sortP(x,y):          def sortP(x,y):
             """sort by sorting number"""              """sort by sorting number"""
             #print x.xdata_05,y.xdata_05  
             return cmp(x.WEB_title,y.WEB_title)              return cmp(x.WEB_title,y.WEB_title)
                   
          
         ret=[]          ret=[]
         logging.error("XXXXXXXXXXXXXXXXX")  
         if key:          if key:
                           
             #members=self.ZopeFind(self.members,obj_metatypes=['MPIWGStaff'],obj_ids=[email],search_sub=1)  
             members=self.MembersCatalog({'getKey':key})              members=self.MembersCatalog({'getKey':key})
             if len(members)==0:              if len(members)==0:
                 return ret                  return ret
               
             splitted =  [members[0].lastName,members[0].firstName]              splitted =  [members[0].lastName,members[0].firstName]
                   
         elif name:          elif name:
Line 1284  class MPIWGRoot(ZSQLExtendFolder): Line 1375  class MPIWGRoot(ZSQLExtendFolder):
         else:          else:
             return ret # name oder key mussen definiert sein              return ret # name oder key mussen definiert sein
                   
         #XXXX       
         splitNeu=["\'"+splitted[1]+" "+splitted[0]+"\'"]          splitNeu=["\'"+splitted[1]+" "+splitted[0]+"\'"]
                   
         #for s in splitted:  
         #    splitNeu.append("\""+s+"\"")  
         search=string.join(splitNeu,' AND ')          search=string.join(splitNeu,' AND ')
                   
         proj=self.ProjectCatalog({'xdata_01':search})          proj=self.ProjectCatalog({'xdata_01':search})
         logging.error("XXXXXXXXXXX %s"%proj)      
         if proj:          if proj:
             proj2=[]              proj2=[]
             for x in proj:              for x in proj:
Line 1315  class MPIWGRoot(ZSQLExtendFolder): Line 1404  class MPIWGRoot(ZSQLExtendFolder):
   
         proj2.sort(sortP)          proj2.sort(sortP)
   
         if len(proj2)>0:          projectListe=[]
             ret.append((name,proj2))          
           for proj in proj2:   
               obj=proj.getObject()
               if onlyArchived==1: #nur aktuell projecte
                   if not obj.isArchivedProject():
                       projectListe.append(proj)
               elif onlyArchived==2: #nur archivierte
                   if obj.isArchivedProject():
                       projectListe.append(proj)
               else: #alle
                   projectListe.append(proj)
                       
                       
                   
           if len(projectListe)>0:
               ret.append((name,projectListe))
   
         return ret          return ret
             
Line 1582  class MPIWGProject(CatalogAware,Folder): Line 1686  class MPIWGProject(CatalogAware,Folder):
     meta_type='MPIWGProject'      meta_type='MPIWGProject'
     default_catalog='ProjectCatalog'      default_catalog='ProjectCatalog'
   
       def decode(self,str):
           """return unicode object"""
           return unicodify(str)
     
     def sortedByPlace(self,metatype):      def sortedByPlace(self,metatype):
         """find metatype and sort by place"""          """find metatype and sort by place"""
Line 1811  class MPIWGProject(CatalogAware,Folder): Line 1918  class MPIWGProject(CatalogAware,Folder):
             RESPONSE.redirect('manageImages')              RESPONSE.redirect('manageImages')
   
     
     def hasChildren(self,date=None,onlyActive=True):      def hasChildren(self,date=None,onlyActive=1,onlyArchived=1):
         """check if project has children"""          """check if project has children"""
         ct=self.getContexts(childs=self.getContent('xdata_05'),          ct=self.getContexts(childs=self.getContent('xdata_05'),
                                  depth=1,date=date,onlyActive=onlyActive)                                   depth=1,date=date,onlyActive=onlyActive)
Line 2006  class MPIWGProject(CatalogAware,Folder): Line 2113  class MPIWGProject(CatalogAware,Folder):
         """check if the project is still active, default is true, set to false is the project is accomplished"""          """check if the project is still active, default is true, set to false is the project is accomplished"""
         return getattr(self,'isActiveFlag',True)          return getattr(self,'isActiveFlag',True)
                   
       def isArchivedProject(self):
           """check if the project is archived"""
           
           completed=getattr(self,'completedAt',0)
          
          #completed leer 
           if completed=="" :
               return False;
           if completed == 0:
               return False;
           
           
           return True
           
           
     def setActiveFlag(self,status=True):      def setActiveFlag(self,status=True):
         """set the active flag"""          """set the active flag"""
         self.isActiveFlag=status          self.isActiveFlag=status
                   
       def setCompletedAt(self,date):
           """set the date of completion, date should be in the form DD.MM.YYYY or MM.YYYY or YYYY"""
           logging.info("DATE:"+repr(date))
           transformedDate=self.transformDate(date);
           logging.info("transformed"+repr(transformedDate))
           if transformedDate is not None:
               setattr(self,"completedAt",transformedDate)
               return True;
           else:
               return False;
       
       def getCompletedAt(self):
           """gibt das transformierte Datum zurŸck"""
           date=getattr(self,'completedAt','')
           if date:
               return self.reTransformDate(date);
           else:
               return '';
           
       def reTransformDate(self,date):
           """transformiert , transformdate zurueck"""
           year=int(date/10000)
           month=int((date-year*10000)/100)
           day=int((date-year*10000-month*100))
           return """%s.%s.%s"""%(day,month,year);
           
           
       def transformDate(self,date):
           """transformiert ein Datum von DD.MM.YYYY, MM.YYYY,YYYY nach  YYYYMMDD, alle nicht angebebenn Werte
           werden auf 0 gesetzt, es wird null zurŸckgegeben falls das Datum ungueltig ist""" 
           
           if (date=="" ) :
               return "";
           
           if (date==None):
               return None;
           
           splitted=date.split(".")
           length=len(splitted)
           year=0
           month=0
           day=0
           if length > 3:
               return "";
           if length==3:
               day = int(splitted[0])
           if length>1:
               month=int(splitted[length-2])
           
           if length > 0:
               try:
                   year = int(splitted[length-1])
               except:
                   pass
           
          ## logging.info("month:"+(month))
           if not (0<=month<13):
               return None;
           
           if not(0<=day<32):
               return None;
           
           if (year>0) and (year<1900): #jahr nicht vierstellig eingegeben
               year=2000+year;
           return year*10000+month*100+day
           
           
       
     def checkDate(self,date):      def checkDate(self,date):
         """teste ob zum Zeitpunkt date eine andere version existierte"""          """teste ob zum Zeitpunkt date eine andere version existierte"""
                   
Line 2268  class MPIWGProject(CatalogAware,Folder): Line 2458  class MPIWGProject(CatalogAware,Folder):
     if (text5=="<br>") or (text5=="<br/>"):      if (text5=="<br>") or (text5=="<br/>"):
         text5=""          text5=""
   
         return text5.encode('utf-8')      logging.debug("getcontent: field=%s filter=%s -> %s"%(field,filter,repr(text5)))
           #return unicodify(text5)
           return utf8ify(text5) # return as utf-8 byte string
   
   
     def showImagesOfPage(self,imageUrl=None):      def showImagesOfPage(self,imageUrl=None):
         """show Images of project"""          """show Images of project"""
Line 2388  class MPIWGProject(CatalogAware,Folder): Line 2581  class MPIWGProject(CatalogAware,Folder):
                 setattr(self,x,[self.REQUEST[x].decode('utf-8')])                  setattr(self,x,[self.REQUEST[x].decode('utf-8')])
   
   
           completedAt = self.REQUEST.get('completedAt')
           if not self.setCompletedAt(completedAt):
               RESPONSE.redirect('./editMPIWGBasisEditor?error="dateWrong')
           
         if self.REQUEST.has_key('historicalNames'):          if self.REQUEST.has_key('historicalNames'):
             self.en.changeHistoricalNames(self.getId(),self.REQUEST['historicalNames'].split("\n"))              self.en.changeHistoricalNames(self.getId(),self.REQUEST['historicalNames'].split("\n"))
                   

Removed from v.1.47.2.74  
changed lines
  Added in v.1.47.2.80


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