--- MPIWGWeb/MPIWGProjects.py 2004/02/04 10:03:33 1.1
+++ MPIWGWeb/MPIWGProjects.py 2004/05/24 10:29:15 1.7
@@ -1,4 +1,7 @@
-"""This files contains the class MPIWG Projects"""
+"""This files contains the class MPIWG Projects
+for organizing and maintaining the different projectspages
+
+"""
from Products.PageTemplates.PageTemplateFile import PageTemplateFile
from Products.PageTemplates.PageTemplate import PageTemplate
from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
@@ -6,6 +9,7 @@ from Products.PageTemplates.ZopePageTemp
import MPIWGStaff
import string
import re
+from types import *
import xmlhelper # Methoden zur Verwaltung der projekt xmls
from OFS.SimpleItem import SimpleItem
@@ -16,9 +20,32 @@ definedFields=['WEB_title','xdata_01','x
checkFields = ['xdata_01']
def sortF(x,y):
-
+
return cmp(x[1],y[1])
+def sortI(x,y):
+ xsplit=x[1].split(".")
+ ysplit=y[1].split(".")
+ xret=""
+ yret=""
+ try:
+ for i in range(5):
+ try:
+ yret=yret+"%04i"%int(xsplit[i])
+ except:
+ yret=yret+"%04i"%0
+
+ try:
+ xret=xret+"%04i"%int(ysplit[i])
+ except:
+ xret=xret+"%04i"%0
+
+
+ return cmp(int(yret),int(xret))
+ except:
+ return cmp(x[1],y[1])
+
+
class MPIWGRoot(Folder):
"""Stammordner für den Web-Server"""
@@ -30,7 +57,7 @@ class MPIWGRoot(Folder):
self.id=id
self.title=title
- def getProjectFields(self,fieldName,folder=None):
+ def getProjectFields(self,fieldName,folder=None,sort=None):
"""getListofFieldNames"""
ret=[]
#print "FN",fieldName
@@ -40,18 +67,41 @@ class MPIWGRoot(Folder):
obj=getattr(folder,object)
if hasattr(obj,'meta_type'):
-
+ #print obj.meta_type
if obj.meta_type=='MPIWGProject':
+ if fieldName=="WEB_title_or_short":
+ #print "HI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+ #print len(obj.getContent('xdata_07'))
+ if len(obj.getContent('xdata_07'))<3: # hack weil z.Z. manchmal noch ein Trennzeichen ; oder , im Feld statt leer
+ fieldNameTmp="WEB_title"
+ else:
+ fieldNameTmp="xdata_07"
+ else:
+ fieldNameTmp=fieldName
- ret.append((obj,obj.getContent(fieldName)))
+ ret.append((obj,obj.getContent(fieldNameTmp)))
+
if obj.meta_type in self.folders:
ret += self.getProjectFields(fieldName,obj)
-
- ret.sort(sortF)
+
+ if sort=="int":
+ ret.sort(sortI)
+ else:
+ ret.sort(sortF)
return ret
+ def showNewProjects(self):
+ projects=[]
+ for objs in self.getProjectFields('WEB_title_or_short'): # Get all Projets
+ if objs[0].xdata_05[0] == "":
+
+ projects.append(objs)
+
+ return projects
+
+
manage_options = Folder.manage_options+(
{'label':'Import Persons','action':'importNamesForm'},
)
@@ -66,7 +116,7 @@ class MPIWGRoot(Folder):
project=getattr(self,folderName)
for line in fileupload.readlines():
- print line
+ #print line
splitted=line.split(",")
if not (splitted[0]==""):
newObj=MPIWGStaff.MPIWGStaff(splitted[0],splitted[1],splitted[2])
@@ -77,46 +127,192 @@ class MPIWGRoot(Folder):
if RESPONSE is not None:
RESPONSE.redirect('manage_main')
+ def getAllMembers(self):
+ """give list of all members"""
+ ret=[]
+
+ for x in self.members.objectValues('MPIWGStaff'):
+ #print x.title
+ ret.append(x.title)
+
+ ret.sort()
+ return ret
+
+ def makeList(self,entry):
+ """makes a list out of one entry or repeat a list"""
+ if type(entry) is StringType:
+ return [entry]
+ else:
+ return entry
+
+
+ def getTree(self):
+ """generate Tree from project list"""
+ returnList=[]
+ for project in self.getProjectFields('xdata_05',sort="int"): # get Projects sorted by xdata_05
+ for idNr in project[1].split(";"): # more than one number
+ if not idNr=="":
+ splittedId=idNr.split(".")
+ depth=len(splittedId)
+ nr=idNr
+ title=project[0].WEB_title
+ returnList.append((depth,nr,title,project[0]))
+
+ return returnList
+
+ def changePosition(self,treeId,select,RESPONSE=None):
+ """Change Postion Entry"""
+ numbers=[]
+
+ # Suche hoechste bisherige nummer
+ projects=self.getProjectFields('xdata_05') # get Projects sorted by xdata_05
+ print "pj",projects
+ for project in projects: #suche alle subtrees der treeId
+ #print treeId
+
+ founds=re.match(treeId+"\.(.*)",project[1].split(";")[0])
+ if founds:
+ #print "x",founds.group(0),len(founds.group(0).split("."))
+ if len(founds.group(0).split("."))==len(treeId.split("."))+1: # nur ein punkt mehr, d.h. untere ebene
+ try:
+ numbers.append(int(founds.group(0).split(".")[len(founds.group(0).split("."))-1]))
+ except:
+ numbers.append(int(0))
+
+ try:
+ highest=max(numbers)
+ except:
+ highest=0
+ projects=self.showNewProjects()
+ for i in self.makeList(select):
+ highest+=10
+ projects[int(i)][0].xdata_05=treeId+"."+str(highest)
+
+
+ if RESPONSE is not None:
+ RESPONSE.redirect('showTree')
+
+ def changeTree(self,RESPONSE=None):
+ """change the complete tree"""
+ form=self.REQUEST.form
+ hashList={}
+ fields=self.getTree()
+
+
+ for idNr in form.keys():
+ fields[int(idNr)][3].xdata_05=form[idNr]
+
+
+
+ if RESPONSE is not None:
+ RESPONSE.redirect('showTree')
+
+ def getProjectWithId(self,id):
+ fields=self.getProjectFields('xdata_05')
+ for field in fields:
+ if field[1]==id:
+ return field[0]
+
+ return None
+
+
+
+
+
+
+ def getUrlFromPerson(self,list):
+ """get urls to person list"""
+ ret=[]
+ persons=list.split(";")
+ for person in persons:
+
+ splitted=person.split(",")
+ if len(splitted)==1:
+ splitted=person.split(" ")
+ splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted]
+ if splittedNew[0]=='':
+ del splittedNew[0]
+ search=string.join(splittedNew,' AND ')
+ if not search=='':
+
+ try:
+ proj=self.MembersCatalog({'title':search})
+ except:
+ proj=None
+
+ if proj:
+ ret.append("%s"%(proj[0].absolute_url,person))
+ else:
+ ret.append("%s"%person)
+ return string.join(ret,";")
+
+ def getProjectsOfMembers(self):
+ """give tuple member /projects"""
+ ret=[]
+ members=self.getAllMembers()
+ for x in members:
+ splitted=x.split(",")
+
+ proj=self.ProjectCatalog({'xdata_01':string.join(splitted,' AND')})
+ if proj:
+ ret.append((x,proj))
+ return ret
def givePersonList(self,name):
"""check if person is in personfolder and return list of person objects"""
-
-
+
+ splitted=name.split(",")
+ if len(splitted)==1:
+ splitted=name.split(" ")
+ splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted]
+ if splittedNew[0]=='':
+ del splittedNew[0]
+ search=string.join(splittedNew,' AND ')
+ if not search=='':
+ proj=self.MembersCatalog({'title':search})
+
+ if proj:
+ return [[x.lastName,x.firstName] for x in proj]
+ else:
+ return []
- splitted=name.split(",") # version nachname, vorname...
- if len(splitted)>1:
- lastName=splitted[0]
- firstName=splitted[1]
- else:
- splitted=name.split(" ") #version vorname irgenwas nachnamae
-
- lastName=splitted[len(splitted)-1]
- firstName=string.join(splitted[0:len(splitted)-1])
-
- objs=[]
-
- print self.members
- for x in self.members.__dict__:
- obj=getattr(self.members,x)
- if hasattr(obj,'lastName') and hasattr(obj,'firstName'):
+## splitted=name.split(",") # version nachname, vorname...
+## if len(splitted)>1:
+## lastName=splitted[0]
+## firstName=splitted[1]
+## else:
+## splitted=name.split(" ") #version vorname irgenwas nachnamae
+
+## lastName=splitted[len(splitted)-1]
+## firstName=string.join(splitted[0:len(splitted)-1])
+
+## objs=[]
+
+ #print self.members
+ ## for x in self.members.__dict__:
+## obj=getattr(self.members,x)
+## if hasattr(obj,'lastName') and hasattr(obj,'firstName'):
- if (re.match(".*"+obj.lastName+".*",lastName) or re.match(".*"+lastName+".*",obj.lastName)) and (re.match(obj.firstName+".*",firstName) or re.match(firstName+".*",obj.firstName)):
+## if (re.match(".*"+obj.lastName+".*",lastName) or re.match(".*"+lastName+".*",obj.lastName)) and (re.match(".*"+obj.firstName+".*",firstName) or re.match(".*"+firstName+".*",obj.firstName)):
- objs.append((obj,lastName+", "+firstName))
+## objs.append((obj,lastName+", "+firstName))
+
return objs
def personCheck(self,names):
"""all persons for list"""
- print "names",names
+ #print "names",names
splitted=names.split(";")
ret={}
for name in splitted:
if not (name==""):
- ret[name]=self.givePersonList(name)
-
- print "RET",ret
+ try:
+ ret[name]=self.givePersonList(name)
+ except:
+ """NOTHIHN"""
+ #print "RET",ret
return ret
def giveCheckList(self,person,fieldname):
@@ -155,7 +351,25 @@ class MPIWGProject(Folder):
meta_type='MPIWGProject'
-
+ def crossLinker(self):
+ """experimental crosslinker"""
+ splitted=self.WEB_project_description[0].split()
+ new=[]
+ for split in splitted:
+ try:
+ found=self.DescriptionCatalog({'fulltext':split})
+
+ if len(found)>1:
+
+ new.append("%s"%(split,split))
+ else:
+ new.append(split)
+ except:
+ new.append(split)
+ return string.join(new)
+
+
+
def generateTemplate(self,RESPONSE=None):
"""Erzeuge Template für defined fields not_used"""
@@ -172,15 +386,21 @@ class MPIWGProject(Folder):
if RESPONSE is not None:
RESPONSE.redirect('manage_main')
- def __init__(self, id, argv):
+ def __init__(self, id, argv=None):
"""initieriere classe"""
self.id=id
self.title=id
- for arg in definedFields:
+ if argv:
+ for arg in definedFields:
+ try:
+ setattr(self,arg,argv[arg])
+ except:
+ setattr(self,arg,"")
+ else:
+ for arg in definedFields:
+ setattr(self,arg,'')
- setattr(self,arg,argv[arg])
- """NP"""
manage_options = Folder.manage_options+(
{'label':'Load New File','action':'loadNewFileForm'},
{'label':'Edit ProjectInfo','action':'editMPIWGProjectForm'},
@@ -219,7 +439,7 @@ class MPIWGProject(Folder):
text =x
except:
text="ERROR"
- #print "TEXT",text
+ #print "TEXT",text.encode('ascii','ignore')
return text
def show_html(self):
@@ -291,16 +511,18 @@ def manage_addMPIWGProjectForm(self):
def manage_addMPIWGProject(self,id,RESPONSE=None):
"""method to add a project"""
#print argv
- fileupload=self.REQUEST['fileupload']
- if fileupload:
- file_name=fileupload.filename
- filedata=fileupload.read()
-
- argv=xmlhelper.proj2hash(filedata)
+ if self.REQUEST.has_key('fileupload'):
+ fileupload=self.REQUEST['fileupload']
+ if fileupload:
+ file_name=fileupload.filename
+ filedata=fileupload.read()
- #print argv
+ argv=xmlhelper.proj2hash(filedata)
- newObj=MPIWGProject(id,argv)
+ #print argv
+ newObj=MPIWGProject(id,argv)
+ else:
+ newObj=MPIWGProject(id)
self._setObject(id,newObj)