--- MPIWGWeb/MPIWGProjects.py 2004/03/10 09:17:31 1.5 +++ MPIWGWeb/MPIWGProjects.py 2004/09/10 19:59:28 1.30 @@ -1,8 +1,13 @@ -"""This files contains the class MPIWG Projects""" +"""This 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 +from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder +import urllib import MPIWGStaff import string import re @@ -12,14 +17,24 @@ import xmlhelper # Methoden zur Verwaltu from OFS.SimpleItem import SimpleItem from OFS.Folder import Folder +from bibliography import * + definedFields=['WEB_title','xdata_01','xdata_02','xdata_03','xdata_04','xdata_05','xdata_06','xdata_07','xdata_08','xdata_09','xdata_10','xdata_11','xdata_12','xdata_13','WEB_project_header','WEB_project_description','WEB_related_pub'] checkFields = ['xdata_01'] + + def sortF(x,y): + try: + return cmp(x[1],y[1]) + except: + try: + return cmp(str(x[1]),str(y[1])) + except: + print "error",x[1],y[1] + return 0 - return cmp(x[1],y[1]) - def sortI(x,y): xsplit=x[1].split(".") ysplit=y[1].split(".") @@ -43,17 +58,250 @@ def sortI(x,y): return cmp(x[1],y[1]) -class MPIWGRoot(Folder): +class MPIWGRoot(ZSQLExtendFolder): """Stammordner für den Web-Server""" + fieldLabels={'WEB_title':'WEB_Title','xdata_01':'Responsible Scientists','xdata_02':'Department', + 'xdata_03':'Historical Persons','xdata_04':'Time period', + 'xdata_05':'Sorting number','xdata_06':'Keywords','xdata_07':'Short title', + 'xdata_08':'Other involved scholars' ,'xdata_09':'Part of','xdata_10':'Covered by', + 'xdata_11':'Object Digitallibrary','xdata_12':'Cooperation partners', + 'xdata_13':'Funding institutions','WEB_project_header':'WEB_project_header', + 'WEB_project_description':'WEB_project_description','WEB_related_pub':'WEB_related_pub'} + folders=['MPIWGProject','Folder'] meta_type='MPIWGRoot' + + def replaceNotEmpty(self,format,field): + """replace not empty""" + if field and (not field==''): + return format%field + else: + return "" + + + def redirectIndex_html(self,request): + #return request['URL1']+'/index_html' + + return urllib.urlopen(request['URL1']+'/index_html').read() + + + def formatBibliography(self,here,found): + """format""" + return formatBibliography(here,found) + + def getValue(self,fieldStr): + """Inhalt des Feldes""" + + if type(fieldStr)==StringType: + field=fieldStr + else: + field=fieldStr[0] + try: + if field[len(field)-1]==";": + field=field[0:len(field)-1] + except: + + """nothing""" + field=re.sub(r';([^\s])','; \g<1>',field) + return field.encode('utf-8') + + + + def sortedNames(self,list): + """sort names""" + + def sortLastName(x_c,y_c): + try: + x=urllib.unquote(x_c).encode('utf-8','ignore') + except: + x=urllib.unquote(x_c) + + try: + y=urllib.unquote(y_c).encode('utf-8','ignore') + except: + x=urllib.unquote(y_c) + + + + 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 urlQuote(self,str): + """quote""" + return urllib.quote(str) + + def urlUnQuote(self,str): + """quote""" + return urllib.unquote(str) + + 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] + + + + + 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[urllib.quote(personNormal)][1].append(project[1]) + else: + list[urllib.quote(personNormal)]=(personNormal,[project[1]]) + else: #guess , is sepeator + for person in project[1].xdata_03[0].split(","): + personNormal=normalize(person) + if urllib.quote(personNormal) in list.keys(): + list[urllib.quote(personNormal)][1].append(project[1]) + else: + list[urllib.quote(personNormal)]=(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][1]: + if person in self.personDict.keys(): + self.personDict[person][1].append((project.absolute_url(),project.WEB_title[0],project.xdata_01[0])) + else: + self.personDict[person]=(personDict[person][0],[(project.absolute_url(),project.WEB_title[0],project.xdata_01[0])]) + + if RESPONSE is not None: + RESPONSE.redirect("showHistoricalPersons") + + + def getPersonDict(self,name): + """name von dict""" + + try: + return self.personDict[name][0].encode('utf-8') + except: + return self.personDict[name][0] + return self.personDict[name][0].decode('latin-1').encode('utf-8') + + + 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 getDisciplineList(self): + """get disciplines as list""" + return self.disciplineList.split("\n") + + def getThemeList(self): + """get themes as list""" + return self.themesList.split("\n") + + def test(self): + """test""" + return self.getProjectsByFieldContent('xdata_09',['biology'])[0].absolute_url + + def getContexts(self,childs=None,parents=None,depth=None): + """childs alle childs, alle parents""" + ret=[] + if parents: + splitted=parents.split(".") + parentId=string.join(splitted[0:len(splitted)-1],".") + + for project in self.getProjectFields('xdata_05',sort='int'): + if project[1]==parentId: + ret.append(project) + + if childs: + for project in self.getProjectFields('xdata_05',sort='int'): + searchStr=childs+"(\..*)" + if re.match(searchStr,project[1]): + + if depth: + + if int(depth)>=len(project[1].split("."))-len(childs.split(".")): + + ret.append(project) + else: + ret.append(project) + return ret + def getProjectFields(self,fieldName,folder=None,sort=None): """getListofFieldNames""" ret=[] @@ -101,6 +349,9 @@ class MPIWGRoot(Folder): manage_options = Folder.manage_options+( {'label':'Import Persons','action':'importNamesForm'}, + {'label':'Main config','action':'changeMPIWGRootForm'}, + {'label':'Edit Historical Persons','action':'editHistoricalPersonsForm'}, + {'label':'Store Historical Persons','action':'storeHistoricalPersons'}, ) def importNamesForm(self): @@ -111,16 +362,23 @@ class MPIWGRoot(Folder): def importNames(self,fileupload,folderName,RESPONSE=None): """import komma-sep list email,lastName,firstName""" project=getattr(self,folderName) + load=fileupload.read() - for line in fileupload.readlines(): - #print line + for line in load.split('\r'): + + splitted=line.split(",") + # print splitted + if not (splitted[0]==""): newObj=MPIWGStaff.MPIWGStaff(splitted[0],splitted[1],splitted[2]) + try: project._setObject(splitted[0],newObj) + #print "done:",splitted[0] except: print "not done:",splitted[0] + if RESPONSE is not None: RESPONSE.redirect('manage_main') @@ -128,13 +386,27 @@ class MPIWGRoot(Folder): """give list of all members""" ret=[] - for x in self.members.objectValues('MPIWGStaff'): + #for x in self.members.objectValues('MPIWGStaff'): #print x.title - ret.append(x.title) + # ret.append(x.title.decode('utf-8')) + + for x in self.ZopeFind(self.members,obj_metatypes=['MPIWGStaff']): + ret.append(x[1].title.decode('utf-8')) ret.sort() + #print ret + return ret + def printAllMembers(self): + """prin""" + members=self.getAllMembers() + ret="" + for x in members: + ret+="

%s

"%x + return ret + + def makeList(self,entry): """makes a list out of one entry or repeat a list""" if type(entry) is StringType: @@ -152,17 +424,37 @@ class MPIWGRoot(Folder): splittedId=idNr.split(".") depth=len(splittedId) nr=idNr - title=project[0].WEB_title + #title=project[0].WEB_title + title=[project[0].getContent('WEB_title')] + #print title returnList.append((depth,nr,title,project[0])) return returnList + def formatElementForOverview(self,element): + """format the element for output in overview""" + if element[0]==1: #department + #print element[3].getContent('xdata_05') + if element[3].getContent('xdata_05') == "4": + return """

Ind. Research Group I: %s

"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title')) + if element[3].getContent('xdata_05') == "5": + return """

Ind. Research Group II: %s

"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title')) + + return """

Department %s: %s

"""%(element[3].absolute_url()+"/index.html",element[3].getContent('xdata_05'),element[3].getContent('WEB_title')) + + elif element[0]==2: #mainprojects + return """

%s

"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title')) + + elif element[0]==3: + return """

%s

"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title')) + 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 @@ -173,9 +465,12 @@ class MPIWGRoot(Folder): try: numbers.append(int(founds.group(0).split(".")[len(founds.group(0).split("."))-1])) except: - numbers.append(0) - numbers.sort() - highest=int(numbers[len(numbers)-1]) + numbers.append(int(0)) + + try: + highest=max(numbers) + except: + highest=0 projects=self.showNewProjects() for i in self.makeList(select): highest+=10 @@ -211,6 +506,35 @@ class MPIWGRoot(Folder): + def getRelativeUrlFromPerson(self,list): + """get urls to person list""" + ret=[] + persons=list.split(";") + for person in persons: + + if len(person)>1: #nicht nur Trennzeichen + 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.encode('utf-8'))) + ret.append("%s"%('members/'+proj[0].id+'/index.html',person)) + else: + #ret.append("%s"%person.encode('utf-8')) + ret.append("%s"%person) + return string.join(ret,";") def getUrlFromPerson(self,list): @@ -219,44 +543,101 @@ class MPIWGRoot(Folder): 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=='': + if len(person)>1: #nicht nur Trennzeichen + splitted=person.split(",") + if len(splitted)==1: + splitted=person.lstrip().rstrip().split(" ") + splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted] + if splittedNew[0]=='': + del splittedNew[0] + search=string.join(splittedNew,' AND ') - try: - proj=self.MembersCatalog({'title':search}) - except: - proj=None - - if proj: - ret.append("%s"%(proj[0].absolute_url,person)) - else: - ret.append("%s"%person) + if not search=='': + + try: + proj=self.MembersCatalog({'title':search}) + except: + proj=None + + if proj: + #ret.append("%s"%(proj[0].absolute_url,person.encode('utf-8'))) + ret.append("%s"%(proj[0].absolute_url+"/index.html",person)) + else: + #ret.append("%s"%person.encode('utf-8')) + ret.append("%s"%person) return string.join(ret,";") def getProjectsOfMembers(self): """give tuple member /projects""" ret=[] members=self.getAllMembers() + #return str(members) for x in members: - splitted=x.split(",") + ret+=self.getProjectsOfMember(name=x) + + return ret + + def getProjectsOfMember(self,name=None,email=None): + """get project of a member""" + def sortP(x,y): + """sort by sorting number""" + #print x.xdata_05,y.xdata_05 + return cmp(x.WEB_title,y.WEB_title) + + + ret=[] + splitNeu=[] + if email: + members=self.ZopeFind(self.members,obj_metatypes=['MPIWGStaff'],obj_ids=[email]) + name = members[0][1].title.decode('utf-8') + + y=name + splitted=y.split(",") + #XXXX + splitNeu=["\'"+splitted[1]+" "+splitted[0]+"\'"] + + #for s in splitted: + # splitNeu.append("\""+s+"\"") + search=string.join(splitNeu,' AND ') + + proj=self.ProjectCatalog({'xdata_01':search}) + + if proj: + proj2=[] + for x in proj: + + if not((splitted[1]==" Christoph") and (splitted[0]=="Hoffmann") and (str(x.WEB_title).find('Einstein')>0)): + + #print repr(splitted[1]),repr(splitted[0]),repr(x.WEB_title) + proj2.append(x) + # proj2.sort(sortP) + # ret.append((y,proj2)) + else: + proj2=[] - proj=self.ProjectCatalog({'xdata_01':string.join(splitted,' AND')}) - if proj: - ret.append((x,proj)) + proj=self.ProjectCatalog({'xdata_08':search}) + if proj: + names=[x.WEB_title for x in proj] + for x in proj: + if not x.WEB_title in names: + proj2.append(x) + + + proj2.sort(sortP) + + if len(proj2)>0: + ret.append((y,proj2)) + 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] + splitted=name.lstrip().rstrip().split(" ") + splittedNew=[split.lstrip() for split in splitted] + if splittedNew[0]=='': del splittedNew[0] search=string.join(splittedNew,' AND ') @@ -322,6 +703,7 @@ class MPIWGRoot(Folder): return (fieldname in checkFields) + @@ -386,7 +768,10 @@ class MPIWGProject(Folder): self.title=id if argv: for arg in definedFields: - setattr(self,arg,argv[arg]) + try: + setattr(self,arg,argv[arg]) + except: + setattr(self,arg,"") else: for arg in definedFields: setattr(self,arg,'') @@ -396,13 +781,15 @@ class MPIWGProject(Folder): {'label':'Edit ProjectInfo','action':'editMPIWGProjectForm'}, {'label':'Edit BasisInfo','action':'editMPIWGBasisForm'}, {'label':'Edit Publications','action':'editMPIWGRelatedPublicationsForm'}, + {'label':'Edit Themes & Disciplines','action':'editMPIWGDisciplinesThemesForm'}, ) def getDataFields(self): """giveListofDatafields""" ret=[] for x in range(1,14): - ret.append('xdata_%02i'%x) + if not x in [6,10,9]: # not used fields + ret.append('xdata_%02i'%x) return ret def getDefinedFields(self): @@ -423,14 +810,37 @@ class MPIWGProject(Folder): #print "HIHIIII" try: - text +=x + text +=x.encode('utf-8') except: try: - text =x + text =x.encode('utf-8') except: - text="ERROR" - #print "TEXT",text.encode('ascii','ignore') - return text + text=x.decode('latin-1').encode('utf-8') + + #delete separator (;) if is there is one + ## try: +## print text, text[len(text)-1] +## except: +## print "error:",text + try: + if text[len(text)-1]==";": + text=text[0:len(text)-1] + + + except: + """nothing""" + + text2=re.sub(r';([^\s])','; \g<1>',text) + #teste ob ergebnis leer und header dann nehme title + + if (text2=='') and (field=='WEB_project_header'): + return self.getContent('WEB_title') + + #teste ob WEB_project_description und keine führenden p tags + if (len(text2)>4) and (not text2[0:3]=='

') and (field=='WEB_project_description'): + return "

"+text2+"

" + + return text2 def show_html(self): """simple index""" @@ -443,28 +853,70 @@ class MPIWGProject(Folder): pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGProject.zpt').__of__(self) return pt() - def editMPIWGBasisForm(self): - """editform""" - pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGBasis.zpt').__of__(self) - return pt() - def editMPIWGRelatedPublicationsForm(self): - """Edit related Publications""" - pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGRelatedPublications.zpt').__of__(self) - return pt() - def editMPIWGProject(self,RESPONSE=None): """edit the project""" - + #return self.REQUEST for x in definedFields: if self.REQUEST.has_key(x): - setattr(self,x,[self.REQUEST[x]]) + setattr(self,x,[self.REQUEST[x].decode('utf-8')]) if RESPONSE is not None: RESPONSE.redirect('manage_main') + def editMPIWGDisciplinesThemesForm(self): + """edit the disciplines and themes Form""" + pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGDisciplinesThemes.zpt').__of__(self) + return pt() + + def editMPIWGDisciplinesThemes(self,disciplines=None,themes=None,RESPONSE=None): + """edit disciplin and form""" + if disciplines: + if type(disciplines) is StringType: + self.xdata_09=disciplines + else: + self.xdata_09=string.join(disciplines,";") + else: + self.xdata_09="" + if themes: + if type(themes) is StringType: + self.xdata_10=themes + else: + self.xdata_10=string.join(themes,";") + else: + self.xdata_10="" + + if RESPONSE is not None: + RESPONSE.redirect('manage_main') + + + def isChecked(self,wert,list): + """check if wert is in ; seperated list""" + print "W:",wert + print "L:",list,type(list) + #felder sind manchmnal als liste mit einem element definiert + if type(list) is StringType or UnicodeType: + splitted=list.split(";") + else: + splitted=list[0].split(";") + + print splitted + for x in splitted: + if (not x==u'') and x in wert: + return 1 + return 0 + + def editMPIWGBasisForm(self): + """editform""" + pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGBasis.zpt').__of__(self) + return pt() + def editMPIWGRelatedPublicationsForm(self): + """Edit related Publications""" + pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGRelatedPublications.zpt').__of__(self) + return pt() + def loadNewFileForm(self): """Neues XML-File einlesen""" pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGProject_newfile.zpt').__of__(self) @@ -501,15 +953,15 @@ def manage_addMPIWGProjectForm(self): def manage_addMPIWGProject(self,id,RESPONSE=None): """method to add a project""" #print argv - if self.REQUEST.has_key('fileupload'): - fileupload=self.REQUEST['fileupload'] - if fileupload: - file_name=fileupload.filename - filedata=fileupload.read() - - argv=xmlhelper.proj2hash(filedata) - - #print argv + fileupload=self.REQUEST.get('fileupload',None) + if fileupload: + print fileupload + file_name=fileupload.filename + filedata=fileupload.read() + + argv=xmlhelper.proj2hash(filedata) + + #print argv newObj=MPIWGProject(id,argv) else: newObj=MPIWGProject(id)