--- MPIWGWeb/MPIWGProjects.py 2004/02/04 10:03:33 1.1 +++ MPIWGWeb/MPIWGProjects.py 2004/05/28 16:45:06 1.8 @@ -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,21 +20,171 @@ 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""" folders=['MPIWGProject','Folder'] meta_type='MPIWGRoot' + + def sortedNames(self,list): + """sort names""" + + def sortLastName(x,y): + try: + last_x=x.split()[len(x.split())-1] + last_y=y.split()[len(y.split())-1] + + except: + + last_x="" + last_y="" + + + + if last_xlast_y: + return -1 + else: + return 0 + + list.sort(sortLastName) + list.reverse() + + return list def __init__(self, id, title): """init""" self.id=id self.title=title + + def harvestHistoricalPersons(self): + """erstelle liste aller erwaehnten actors""" + + def normalize(str): + """loesche fuhrendes space""" + if (len(str)>1) and (str[0]==" "): + ret=str[1:] + else: + ret=str + return ret + + list={} + projects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject']) + + for project in projects: + lg=len(project[1].xdata_03[0])-1 + + if (lg>1) and (project[1].xdata_03[0][lg]==";"): + project[1].xdata_03[0]=project[1].xdata_03[0][0:lg-1] + + + + + try: + if len(project[1].xdata_03[0].split(";"))>1: # guess if separator is ; + for person in project[1].xdata_03[0].split(";"): + personNormal=normalize(person) + if personNormal in list.keys(): + list[personNormal].append(project[1]) + else: + list[personNormal]=[project[1]] + else: #guess , is sepeator + for person in project[1].xdata_03[0].split(","): + personNormal=normalize(person) + if personNormal in list.keys(): + list[personNormal].append(project[1]) + else: + list[personNormal]=[project[1]] + + except: + print "ERROR",project + + return list + + def storeHistoricalPersons(self,RESPONSE=None): + """store persons""" + self.personDict={} + personDict=self.harvestHistoricalPersons() + for person in personDict.keys(): + for project in personDict[person]: + if person in self.personDict.keys(): + self.personDict[person].append((project.absolute_url(),project.WEB_title[0],project.xdata_01[0])) + else: + self.personDict[person]=[(project.absolute_url(),project.WEB_title[0],project.xdata_01[0])] + + if RESPONSE is not None: + RESPONSE.redirect("showHistoricalPersons") + + + def showHistoricalPersons(self): + """show persons""" + pt=PageTemplateFile('Products/MPIWGWeb/zpt/showHistoricalPersons').__of__(self) + return pt() + + + def editHistoricalPersonsForm(self): + """edit historical persons for consistency""" + pt=PageTemplateFile('Products/MPIWGWeb/zpt/editHistoricalPersonsForm').__of__(self) + return pt() + + def getProjectsByFieldContent(self,fieldName,fieldContentsEntry): + """gib alle Projekte aus mit Value von field mit fieldName enthält ein Element der Liste fieldContents""" + if type(fieldContentsEntry) is StringType: + fieldContents=[fieldContentsEntry] + else: + fieldContents=fieldContentsEntry + + projects=self.ProjectCatalog({fieldName:string.join(fieldContents,' OR')}) + #print projects + return projects + + def changeMPIWGRootForm(self): + """edit""" + pt=PageTemplateFile('Products/MPIWGWeb/zpt/changeMPIWGRootForm').__of__(self) + return pt() + + def changeMPIWGRoot(self,title,disciplineList,themesList,RESPONSE=None): + """change""" + self.title=title + self.disciplineList=disciplineList + self.themesList=themesList + + if RESPONSE is not None: + RESPONSE.redirect('manage_main') - def getProjectFields(self,fieldName,folder=None): + + def test(self): + """test""" + return self.getProjectsByFieldContent('xdata_09',['biology'])[0].absolute_url + + def getProjectFields(self,fieldName,folder=None,sort=None): """getListofFieldNames""" ret=[] #print "FN",fieldName @@ -40,20 +194,45 @@ 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'}, + {'label':'Main config','action':'changeMPIWGRootForm'}, + {'label':'Store Historical Persons','action':'storeHistoricalPersons'}, ) def importNamesForm(self): @@ -66,7 +245,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 +256,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 +480,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 +515,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 +568,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 +640,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)