--- MPIWGWeb/MPIWGProjects.py 2004/05/28 16:45:06 1.8 +++ MPIWGWeb/MPIWGProjects.py 2004/08/16 14:19:42 1.21 @@ -1,11 +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 @@ -15,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(".") @@ -46,16 +58,66 @@ 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 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,y): + 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] @@ -83,7 +145,15 @@ class MPIWGRoot(Folder): """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""" @@ -102,7 +172,7 @@ class MPIWGRoot(Folder): 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] + project[1].xdata_03[0]=project[1].xdata_03[0][0:lg] @@ -112,16 +182,16 @@ class MPIWGRoot(Folder): for person in project[1].xdata_03[0].split(";"): personNormal=normalize(person) if personNormal in list.keys(): - list[personNormal].append(project[1]) + list[urllib.quote(personNormal)][1].append(project[1]) else: - list[personNormal]=[project[1]] + list[urllib.quote(personNormal)]=(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]) + if urllib.quote(personNormal) in list.keys(): + list[urllib.quote(personNormal)][1].append(project[1]) else: - list[personNormal]=[project[1]] + list[urllib.quote(personNormal)]=(personNormal,[project[1]]) except: print "ERROR",project @@ -133,16 +203,26 @@ class MPIWGRoot(Folder): self.personDict={} personDict=self.harvestHistoricalPersons() for person in personDict.keys(): - for project in personDict[person]: + for project in personDict[person][1]: if person in self.personDict.keys(): - self.personDict[person].append((project.absolute_url(),project.WEB_title[0],project.xdata_01[0])) + self.personDict[person][1].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])] + 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) @@ -179,10 +259,42 @@ class MPIWGRoot(Folder): 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""" @@ -232,6 +344,7 @@ 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'}, ) @@ -243,16 +356,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') @@ -260,13 +380,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: @@ -284,11 +418,24 @@ 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 + return """"""%(element[3].absolute_url(),element[3].getContent('WEB_title'))
+
+ elif element[0]==3:
+ return """%s
"""%(element[3].absolute_url(),element[3].getContent('WEB_title'))
+
def changePosition(self,treeId,select,RESPONSE=None):
"""Change Postion Entry"""
numbers=[]
@@ -347,6 +494,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,person))
+ else:
+ #ret.append("%s"%person.encode('utf-8'))
+ ret.append("%s"%person)
+ return string.join(ret,";")
def getUrlFromPerson(self,list):
@@ -355,37 +531,83 @@ 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.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,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)
- proj=self.ProjectCatalog({'xdata_01':string.join(splitted,' AND')})
- if proj:
- ret.append((x,proj))
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(",")
+ for s in splitted:
+ splitNeu.append("\""+s+"\"")
+ search=string.join(splitNeu,' AND ')
+
+ proj=self.ProjectCatalog({'xdata_01':search})
+ if proj:
+ proj2=[x for x in proj]
+ # proj2.sort(sortP)
+ # ret.append((y,proj2))
+ else:
+ proj2=[]
+
+ 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"""
@@ -458,6 +680,7 @@ class MPIWGRoot(Folder):
return (fieldname in checkFields)
+
@@ -535,13 +758,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):
@@ -562,14 +787,28 @@ 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)
+ return text2
def show_html(self):
"""simple index"""
@@ -582,15 +821,6 @@ 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"""
@@ -598,12 +828,63 @@ class MPIWGProject(Folder):
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)
@@ -640,15 +921,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)