![]() ![]() | ![]() |
invisible field and manageversion tab added
1: """This contains the class MPIWG Projects 2: for organizing and maintaining the different projectspages 3: 4: """ 5: from Products.PageTemplates.PageTemplateFile import PageTemplateFile 6: from Products.PageTemplates.PageTemplate import PageTemplate 7: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate 8: from Products.ZSQLExtend.ZSQLExtend import ZSQLExtendFolder 9: from Globals import package_home 10: import urllib 11: import MPIWGStaff 12: import string 13: import re 14: import os 15: from types import * 16: import zLOG 17: import xmlhelper # Methoden zur Verwaltung der projekt xmls 18: from OFS.SimpleItem import SimpleItem 19: from OFS.Folder import Folder 20: 21: from bibliography import * 22: 23: 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'] 24: 25: checkFields = ['xdata_01'] 26: 27: 28: 29: def sortF(x,y): 30: try: 31: return cmp(x[1],y[1]) 32: except: 33: try: 34: return cmp(str(x[1]),str(y[1])) 35: except: 36: print "error",x[1],y[1] 37: return 0 38: 39: def sortI(x,y): 40: xsplit=x[1].split(".") 41: ysplit=y[1].split(".") 42: xret="" 43: yret="" 44: try: 45: for i in range(5): 46: try: 47: yret=yret+"%04i"%int(xsplit[i]) 48: except: 49: yret=yret+"%04i"%0 50: 51: try: 52: xret=xret+"%04i"%int(ysplit[i]) 53: except: 54: xret=xret+"%04i"%0 55: 56: 57: return cmp(int(yret),int(xret)) 58: except: 59: return cmp(x[1],y[1]) 60: 61: class MPIWGTemplate(ZopePageTemplate): 62: """Create a layout Template for different purposes""" 63: 64: meta_type="MPIWGTemplate" 65: 66: def __init__(self, id, text=None, content_type=None,MPIWGType=None): 67: self.id = str(id) 68: 69: 70: 71: self.ZBindings_edit(self._default_bindings) 72: if text is None: 73: self._default_content_fn = os.path.join(package_home(globals()), 74: 'zpt/MPIWG_%s_template_standard.zpt'%MPIWGType) 75: text = open(self._default_content_fn).read() 76: self.pt_edit(text, content_type) 77: 78: 79: """change form""" 80: 81: 82: def manage_addMPIWGTemplateForm(self): 83: """Form for adding""" 84: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt/AddMPIWGTemplate.zpt')).__of__(self) 85: return pt() 86: 87: from urllib import quote 88: 89: 90: def manage_addMPIWGTemplate(self, MPIWGType,id, title=None,REQUEST=None): 91: "Add a Page Template with optional file content." 92: if type(MPIWGType)==StringType: 93: MPIWGTypes=[MPIWGType] 94: else: 95: MPIWGTypes=MPIWGType 96: 97: for singleType in MPIWGTypes: 98: 99: 100: if REQUEST is None: 101: self._setObject(id, MPIWGTemplate(id, text,EchoType=singleType)) 102: ob = getattr(self, id) 103: 104: if title: 105: ob.pt_setTitle(title) 106: return ob 107: else: 108: file = REQUEST.form.get('file') 109: headers = getattr(file, 'headers', None) 110: if headers is None or not file.filename: 111: zpt = MPIWGTemplate(id,MPIWGType=singleType) 112: else: 113: zpt = MPIWGTemplate(id, file, headers.get('content_type')) 114: 115: self._setObject(id, zpt) 116: ob = getattr(self, id) 117: if title: 118: ob.pt_setTitle(title) 119: 120: try: 121: u = self.DestinationURL() 122: except AttributeError: 123: u = REQUEST['URL1'] 124: 125: 126: REQUEST.RESPONSE.redirect(u+'/manage_main') 127: return '' 128: 129: 130: class MPIWGRoot(ZSQLExtendFolder): 131: """Stammordner für den Web-Server""" 132: 133: fieldLabels={'WEB_title':'WEB_Title','xdata_01':'Responsible Scientists','xdata_02':'Department', 134: 'xdata_03':'Historical Persons','xdata_04':'Time period', 135: 'xdata_05':'Sorting number','xdata_06':'Keywords','xdata_07':'Short title', 136: 'xdata_08':'Other involved scholars' ,'xdata_09':'Part of','xdata_10':'Covered by', 137: 'xdata_11':'Object Digitallibrary','xdata_12':'Cooperation partners', 138: 'xdata_13':'Funding institutions','WEB_project_header':'WEB_project_header', 139: 'WEB_project_description':'WEB_project_description','WEB_related_pub':'WEB_related_pub'} 140: 141: folders=['MPIWGProject','Folder','ECHO_Navigation'] 142: meta_type='MPIWGRoot' 143: 144: def upDateSQL(self,fileName): 145: """updates SQL databases using fm.jar""" 146: fmJarPath=os.path.join(package_home(globals()), 'updateSQL/fm.jar') 147: xmlPath=os.path.join(package_home(globals()), "updateSQL/%s"%fileName) 148: zLOG.LOG("MPIWG Web",zLOG.INFO,"java -classpath %s -Djava.awt.headless=true Convert %s"%(fmJarPath,xmlPath)) 149: ret=os.popen("java -classpath %s -Djava.awt.headless=true Convert %s"%(fmJarPath,xmlPath),"r").read() 150: zLOG.LOG("MPIWG Web",zLOG.INFO,"result convert: %s"%ret) 151: return 1 152: 153: def patchProjects(self,RESPONSE): 154: """patch""" 155: projects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject']) 156: for project in projects: 157: tmp=project[1].WEB_project_description[0].replace("/CD/projects/","")[0:] 158: setattr(project[1],'WEB_project_description',[tmp[0:]]) 159: RESPONSE.write("<p>%s</p>\n"%project[0]) 160: 161: def replaceNotEmpty(self,format,field): 162: """replace not empty""" 163: if field and (not field==''): 164: return format%field 165: else: 166: return "" 167: 168: 169: def redirectIndex_html(self,request): 170: #return request['URL1']+'/index_html' 171: 172: return urllib.urlopen(request['URL1']+'/index_html').read() 173: 174: 175: def formatBibliography(self,here,found): 176: """format""" 177: return formatBibliography(here,found) 178: 179: def getValue(self,fieldStr): 180: """Inhalt des Feldes""" 181: 182: if type(fieldStr)==StringType: 183: field=fieldStr 184: else: 185: field=fieldStr[0] 186: try: 187: if field[len(field)-1]==";": 188: field=field[0:len(field)-1] 189: except: 190: 191: """nothing""" 192: field=re.sub(r';([^\s])','; \g<1>',field) 193: return field.encode('utf-8') 194: 195: 196: 197: def sortedNames(self,list): 198: """sort names""" 199: 200: def sortLastName(x_c,y_c): 201: try: 202: x=urllib.unquote(x_c).encode('utf-8','ignore') 203: except: 204: x=urllib.unquote(x_c) 205: 206: try: 207: y=urllib.unquote(y_c).encode('utf-8','ignore') 208: except: 209: x=urllib.unquote(y_c) 210: 211: 212: 213: try: 214: last_x=x.split()[len(x.split())-1] 215: last_y=y.split()[len(y.split())-1] 216: 217: except: 218: 219: last_x="" 220: last_y="" 221: 222: 223: 224: if last_x<last_y: 225: return 1 226: elif last_x>last_y: 227: return -1 228: else: 229: return 0 230: 231: list.sort(sortLastName) 232: list.reverse() 233: 234: return list 235: 236: def __init__(self, id, title): 237: """init""" 238: self.id=id 239: self.title=title 240: 241: def urlQuote(self,str): 242: """quote""" 243: return urllib.quote(str) 244: 245: def urlUnQuote(self,str): 246: """quote""" 247: return urllib.unquote(str) 248: 249: def harvestHistoricalPersons(self): 250: """erstelle liste aller erwaehnten actors""" 251: 252: def normalize(str): 253: """loesche fuhrendes space""" 254: if (len(str)>1) and (str[0]==" "): 255: ret=str[1:] 256: else: 257: ret=str 258: return ret 259: 260: list={} 261: projects=self.ZopeFind(self.projects,obj_metatypes=['MPIWGProject']) 262: 263: for project in projects: 264: lg=len(project[1].xdata_03[0])-1 265: 266: if (lg>1) and (project[1].xdata_03[0][lg]==";"): 267: project[1].xdata_03[0]=project[1].xdata_03[0][0:lg] 268: 269: 270: 271: 272: try: 273: if len(project[1].xdata_03[0].split(";"))>1: # guess if separator is ; 274: for person in project[1].xdata_03[0].split(";"): 275: personNormal=normalize(person) 276: if personNormal in list.keys(): 277: list[urllib.quote(personNormal)][1].append(project[1]) 278: else: 279: list[urllib.quote(personNormal)]=(personNormal,[project[1]]) 280: else: #guess , is sepeator 281: for person in project[1].xdata_03[0].split(","): 282: personNormal=normalize(person) 283: if urllib.quote(personNormal) in list.keys(): 284: list[urllib.quote(personNormal)][1].append(project[1]) 285: else: 286: list[urllib.quote(personNormal)]=(personNormal,[project[1]]) 287: 288: except: 289: print "ERROR",project 290: 291: return list 292: 293: def storeHistoricalPersons(self,RESPONSE=None): 294: """store persons""" 295: self.personDict={} 296: personDict=self.harvestHistoricalPersons() 297: for person in personDict.keys(): 298: for project in personDict[person][1]: 299: if person in self.personDict.keys(): 300: self.personDict[person][1].append((project.absolute_url(),project.WEB_title[0],project.xdata_01[0])) 301: else: 302: self.personDict[person]=(personDict[person][0],[(project.absolute_url(),project.WEB_title[0],project.xdata_01[0])]) 303: 304: if RESPONSE is not None: 305: RESPONSE.redirect("showHistoricalPersons") 306: 307: 308: def getPersonDict(self,name): 309: """name von dict""" 310: 311: try: 312: return self.personDict[name][0].encode('utf-8') 313: except: 314: return self.personDict[name][0] 315: return self.personDict[name][0].decode('latin-1').encode('utf-8') 316: 317: 318: def showHistoricalPersons(self): 319: """show persons""" 320: pt=PageTemplateFile('Products/MPIWGWeb/zpt/showHistoricalPersons').__of__(self) 321: return pt() 322: 323: 324: def editHistoricalPersonsForm(self): 325: """edit historical persons for consistency""" 326: pt=PageTemplateFile('Products/MPIWGWeb/zpt/editHistoricalPersonsForm').__of__(self) 327: return pt() 328: 329: def getProjectsByFieldContent(self,fieldName,fieldContentsEntry): 330: """gib alle Projekte aus mit Value von field mit fieldName enthält ein Element der Liste fieldContents""" 331: if type(fieldContentsEntry) is StringType: 332: fieldContents=[fieldContentsEntry] 333: else: 334: fieldContents=fieldContentsEntry 335: 336: projects=self.ProjectCatalog({fieldName:string.join(fieldContents,' OR')}) 337: #print projects 338: return projects 339: 340: def changeMPIWGRootForm(self): 341: """edit""" 342: pt=PageTemplateFile('Products/MPIWGWeb/zpt/changeMPIWGRootForm').__of__(self) 343: return pt() 344: 345: def changeMPIWGRoot(self,title,disciplineList,themesList,RESPONSE=None): 346: """change""" 347: self.title=title 348: self.disciplineList=disciplineList 349: self.themesList=themesList 350: 351: if RESPONSE is not None: 352: RESPONSE.redirect('manage_main') 353: 354: def getDisciplineList(self): 355: """get disciplines as list""" 356: return self.disciplineList.split("\n") 357: 358: def getThemeList(self): 359: """get themes as list""" 360: return self.themesList.split("\n") 361: 362: def test(self): 363: """test""" 364: return self.getProjectsByFieldContent('xdata_09',['biology'])[0].absolute_url 365: 366: def getContexts(self,childs=None,parents=None,depth=None): 367: """childs alle childs, alle parents""" 368: ret=[] 369: if parents: 370: splitted=parents.split(".") 371: parentId=string.join(splitted[0:len(splitted)-1],".") 372: 373: for project in self.getProjectFields('xdata_05',sort='int'): 374: if project[1]==parentId: 375: ret.append(project) 376: 377: if childs: 378: for project in self.getProjectFields('xdata_05',sort='int'): 379: searchStr=childs+"(\..*)" 380: if re.match(searchStr,project[1]): 381: 382: if depth: 383: 384: if int(depth)>=len(project[1].split("."))-len(childs.split(".")): 385: 386: ret.append(project) 387: else: 388: ret.append(project) 389: return ret 390: 391: def getProjectFields(self,fieldName,folder=None,sort=None): 392: """getListofFieldNames""" 393: ret=[] 394: 395: objects=self.ZopeFind(self,obj_metatypes=['MPIWGProject'],search_sub=1) 396: 397: 398: for object in objects: 399: obj=object[1] 400: 401: if not getattr(obj,'invisible',None): 402: if fieldName=="WEB_title_or_short": 403: 404: if len(obj.getContent('xdata_07'))<3: # hack weil z.Z. manchmal noch ein Trennzeichen ; oder , im Feld statt leer 405: fieldNameTmp="WEB_title" 406: else: 407: fieldNameTmp="xdata_07" 408: else: 409: fieldNameTmp=fieldName 410: 411: ret.append((obj,obj.getContent(fieldNameTmp))) 412: 413: 414: if sort=="int": 415: ret.sort(sortI) 416: else: 417: ret.sort(sortF) 418: 419: return ret 420: 421: def showNewProjects(self): 422: projects=[] 423: for objs in self.getProjectFields('WEB_title_or_short'): # Get all Projets 424: if objs[0].xdata_05[0] == "": 425: 426: projects.append(objs) 427: 428: return projects 429: 430: 431: manage_options = Folder.manage_options+( 432: {'label':'Update Personal Homepages','action':'updateHomepages'}, 433: {'label':'Main config','action':'changeMPIWGRootForm'}, 434: {'label':'Edit Historical Persons','action':'editHistoricalPersonsForm'}, 435: {'label':'Store Historical Persons','action':'storeHistoricalPersons'}, 436: ) 437: 438: def importNamesForm(self): 439: """Form""" 440: pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGNamesForm.zpt').__of__(self) 441: return pt() 442: 443: def importNames(self,fileupload,folderName,RESPONSE=None): 444: """import komma-sep list email,lastName,firstName""" 445: project=getattr(self,folderName) 446: load=fileupload.read() 447: 448: for line in load.split('\r'): 449: 450: 451: splitted=line.split(",") 452: # print splitted 453: 454: if not (splitted[0]==""): 455: newObj=MPIWGStaff.MPIWGStaff(splitted[0],splitted[1],splitted[2]) 456: 457: try: 458: project._setObject(splitted[0],newObj) 459: #print "done:",splitted[0] 460: except: 461: print "not done:",splitted[0] 462: 463: if RESPONSE is not None: 464: RESPONSE.redirect('manage_main') 465: 466: def updateHomepages(self,RESPONSE): 467: """lege members an""" 468: 469: self.upDateSQL('personalwww.xml') 470: founds=self.ZSQLInlineSearch(_table='personal_www',publish_the_data='yes') 471: project=getattr(self,'members') 472: for found in founds: 473: 474: if not (found.e_mail==""): 475: newObj=MPIWGStaff.MPIWGStaff(found.username,found.name,found.vorname) 476: 477: try: 478: project._setObject(found.username,newObj) 479: RESPONSE.write("<p>new:%s</p>\n"%found.username) 480: except: 481: RESPONSE.write("<p>old:%s (%s,%s)</p>\n"%(found.username,found.name,found.vorname)) 482: 483: 484: #delete non existing 485: 486: 487: foundUserNames=[x.username for x in founds] 488: for member in self.ZopeFind(self,obj_metatypes=["MPIWGStaff"],search_sub=1): 489: 490: if member[1].getId() not in foundUserNames: 491: member[1].aq_parent.manage_delObjects(ids=[member[1].getId()]) 492: RESPONSE.write("<p>deleted:%s</p>\n"%member[1].getId()) 493: 494: self.MembersCatalog.manage_catalogReindex(self.REQUEST,RESPONSE,self.REQUEST['URL1']) 495: 496: 497: 498: if RESPONSE is not None: 499: RESPONSE.redirect('manage_main') 500: 501: 502: def getAllMembers(self): 503: """give list of all members""" 504: ret=[] 505: 506: #for x in self.members.objectValues('MPIWGStaff'): 507: #print x.title 508: # ret.append(x.title.decode('utf-8')) 509: 510: for x in self.ZopeFind(self.members,obj_metatypes=['MPIWGStaff']): 511: ret.append(x[1].title.decode('utf-8')) 512: 513: ret.sort() 514: #print ret 515: 516: return ret 517: 518: def printAllMembers(self): 519: """prin""" 520: members=self.getAllMembers() 521: ret="" 522: for x in members: 523: ret+="<p>%s</p>"%x 524: return ret 525: 526: 527: def makeList(self,entry): 528: """makes a list out of one entry or repeat a list""" 529: if type(entry) is StringType: 530: return [entry] 531: else: 532: return entry 533: 534: 535: def getTree(self): 536: """generate Tree from project list""" 537: returnList=[] 538: for project in self.getProjectFields('xdata_05',sort="int"): # get Projects sorted by xdata_05 539: 540: for idNr in project[1].split(";"): # more than one number 541: if not idNr=="": 542: splittedId=idNr.split(".") 543: depth=len(splittedId) 544: nr=idNr 545: #title=project[0].WEB_title 546: title=[project[0].getContent('WEB_title')] 547: #print title 548: returnList.append((depth,nr,title,project[0])) 549: 550: return returnList 551: 552: 553: def formatElementForOverview(self,element): 554: """format the element for output in overview""" 555: if element[0]==1: #department 556: #print element[3].getContent('xdata_05') 557: if element[3].getContent('xdata_05') == "4": 558: return """<h2 class="hier"><a href="%s">Ind. Research Group I: %s</a></h2>"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title')) 559: if element[3].getContent('xdata_05') == "5": 560: return """<h2 class="hier"><a href="%s">Ind. Research Group II: %s</a></h2>"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title')) 561: 562: return """<h2 class="hier"><a href="%s">Department %s: %s</a></h2>"""%(element[3].absolute_url()+"/index.html",element[3].getContent('xdata_05'),element[3].getContent('WEB_title')) 563: 564: elif element[0]==2: #mainprojects 565: return """<h3 class="hier"><a href="%s">%s</a></h3><p>"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title')) 566: 567: elif element[0]==3: 568: return """<p class="hier"><a href="%s">%s</a></p>"""%(element[3].absolute_url()+"/index.html",element[3].getContent('WEB_title')) 569: 570: 571: def changePosition(self,treeId,select,RESPONSE=None): 572: """Change Postion Entry""" 573: numbers=[] 574: 575: # Suche hoechste bisherige nummer 576: projects=self.getProjectFields('xdata_05') # get Projects sorted by xdata_05 577: #print "pj",projects 578: for project in projects: #suche alle subtrees der treeId 579: #print treeId 580: 581: founds=re.match(treeId+"\.(.*)",project[1].split(";")[0]) 582: if founds: 583: #print "x",founds.group(0),len(founds.group(0).split(".")) 584: if len(founds.group(0).split("."))==len(treeId.split("."))+1: # nur ein punkt mehr, d.h. untere ebene 585: try: 586: numbers.append(int(founds.group(0).split(".")[len(founds.group(0).split("."))-1])) 587: except: 588: numbers.append(int(0)) 589: 590: try: 591: highest=max(numbers) 592: except: 593: highest=0 594: projects=self.showNewProjects() 595: for i in self.makeList(select): 596: highest+=10 597: projects[int(i)][0].xdata_05=treeId+"."+str(highest) 598: 599: 600: if RESPONSE is not None: 601: RESPONSE.redirect('showTree') 602: 603: def changeTree(self,RESPONSE=None): 604: """change the complete tree""" 605: form=self.REQUEST.form 606: hashList={} 607: fields=self.getTree() 608: 609: 610: for idNr in form.keys(): 611: fields[int(idNr)][3].xdata_05=form[idNr] 612: 613: 614: 615: if RESPONSE is not None: 616: RESPONSE.redirect('showTree') 617: 618: def getProjectWithId(self,id): 619: fields=self.getProjectFields('xdata_05') 620: for field in fields: 621: if field[1]==id: 622: return field[0] 623: 624: return None 625: 626: 627: 628: 629: def getRelativeUrlFromPerson(self,list): 630: """get urls to person list""" 631: ret=[] 632: persons=list.split(";") 633: for person in persons: 634: 635: if len(person)>1: #nicht nur Trennzeichen 636: splitted=person.split(",") 637: if len(splitted)==1: 638: splitted=person.split(" ") 639: splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted] 640: if splittedNew[0]=='': 641: del splittedNew[0] 642: search=string.join(splittedNew,' AND ') 643: 644: if not search=='': 645: 646: try: 647: proj=self.MembersCatalog({'title':search}) 648: except: 649: proj=None 650: 651: if proj: 652: #ret.append("<a href=%s >%s</a>"%(proj[0].absolute_url,person.encode('utf-8'))) 653: ret.append("<a href=%s >%s</a>"%('members/'+proj[0].id+'/index.html',person)) 654: else: 655: #ret.append("%s"%person.encode('utf-8')) 656: ret.append("%s"%person) 657: return string.join(ret,";") 658: 659: 660: def getUrlFromPerson(self,list): 661: """get urls to person list""" 662: ret=[] 663: persons=list.split(";") 664: for person in persons: 665: 666: if len(person)>1: #nicht nur Trennzeichen 667: splitted=person.split(",") 668: if len(splitted)==1: 669: splitted=person.lstrip().rstrip().split(" ") 670: splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted] 671: if splittedNew[0]=='': 672: del splittedNew[0] 673: search=string.join(splittedNew,' AND ') 674: 675: if not search=='': 676: 677: try: 678: proj=self.MembersCatalog({'title':search}) 679: except: 680: proj=None 681: 682: if proj: 683: if person =="Otto Sibum" : person="H. Otto Sibum" 684: if person =="Norton Wise" : person="M. Norton Wise" 685: #ret.append("<a href=%s >%s</a>"%(proj[0].absolute_url,person.encode('utf-8'))) 686: ret.append("<a href=%s >%s</a>"%(proj[0].absolute_url+"/index.html",person)) 687: else: 688: #ret.append("%s"%person.encode('utf-8')) 689: ret.append("%s"%person) 690: return string.join(ret,";") 691: 692: def getProjectsOfMembers(self): 693: """give tuple member /projects""" 694: ret=[] 695: members=self.getAllMembers() 696: #return str(members) 697: for x in members: 698: ret+=self.getProjectsOfMember(name=x) 699: 700: return ret 701: 702: def getProjectsOfMember(self,name=None,email=None): 703: """get project of a member""" 704: def sortP(x,y): 705: """sort by sorting number""" 706: #print x.xdata_05,y.xdata_05 707: return cmp(x.WEB_title,y.WEB_title) 708: 709: 710: ret=[] 711: splitNeu=[] 712: if email: 713: #print "IIII:",self.getId() 714: members=self.ZopeFind(self,obj_metatypes=['MPIWGStaff'],obj_ids=[email],search_sub=1) 715: name = members[0][1].title.decode('utf-8') 716: 717: y=name 718: splitted=y.split(",") 719: #XXXX 720: splitNeu=["\'"+splitted[1]+" "+splitted[0]+"\'"] 721: 722: #for s in splitted: 723: # splitNeu.append("\""+s+"\"") 724: search=string.join(splitNeu,' AND ') 725: 726: proj=self.ProjectCatalog({'xdata_01':search}) 727: 728: if proj: 729: proj2=[] 730: for x in proj: 731: 732: if not getattr(x.getObject(),'invisible',None): 733: if not((splitted[1]==" Christoph") and (splitted[0]=="Hoffmann") and (str(x.WEB_title).find('Einstein')>0)): 734: proj2.append(x) 735: 736: else: 737: proj2=[] 738: 739: proj=self.ProjectCatalog({'xdata_08':search}) 740: if proj: 741: names=[x.WEB_title for x in proj] 742: for x in proj: 743: 744: if not x.WEB_title in names: 745: proj2.append(x) 746: 747: 748: proj2.sort(sortP) 749: 750: if len(proj2)>0: 751: ret.append((y,proj2)) 752: 753: return ret 754: 755: def givePersonList(self,name): 756: """check if person is in personfolder and return list of person objects""" 757: 758: splitted=name.split(",") 759: if len(splitted)==1: 760: splitted=name.lstrip().rstrip().split(" ") 761: splittedNew=[split.lstrip() for split in splitted] 762: 763: if splittedNew[0]=='': 764: del splittedNew[0] 765: search=string.join(splittedNew,' AND ') 766: if not search=='': 767: proj=self.MembersCatalog({'title':search}) 768: 769: if proj: 770: return [[x.lastName,x.firstName] for x in proj] 771: else: 772: return [] 773: 774: ## splitted=name.split(",") # version nachname, vorname... 775: ## if len(splitted)>1: 776: ## lastName=splitted[0] 777: ## firstName=splitted[1] 778: ## else: 779: ## splitted=name.split(" ") #version vorname irgenwas nachnamae 780: 781: ## lastName=splitted[len(splitted)-1] 782: ## firstName=string.join(splitted[0:len(splitted)-1]) 783: 784: ## objs=[] 785: 786: #print self.members 787: ## for x in self.members.__dict__: 788: ## obj=getattr(self.members,x) 789: ## if hasattr(obj,'lastName') and hasattr(obj,'firstName'): 790: 791: ## if (re.match(".*"+obj.lastName+".*",lastName) or re.match(".*"+lastName+".*",obj.lastName)) and (re.match(".*"+obj.firstName+".*",firstName) or re.match(".*"+firstName+".*",obj.firstName)): 792: 793: ## objs.append((obj,lastName+", "+firstName)) 794: 795: 796: return objs 797: 798: 799: def personCheck(self,names): 800: """all persons for list""" 801: #print "names",names 802: splitted=names.split(";") 803: ret={} 804: for name in splitted: 805: 806: if not (name==""): 807: try: 808: ret[name]=self.givePersonList(name) 809: except: 810: """NOTHIHN""" 811: #print "RET",ret 812: return ret 813: 814: def giveCheckList(self,person,fieldname): 815: """return checklist""" 816: #print "GCL",fieldname 817: if fieldname=='xdata_01': 818: x=self.personCheck(person.getContent(fieldname)) 819: #print "GCLBACKX",x 820: return x 821: 822: 823: def isCheckField(self,fieldname): 824: """return chechfield""" 825: 826: return (fieldname in checkFields) 827: 828: 829: 830: 831: 832: def manage_addMPIWGRootForm(self): 833: """form for adding the root""" 834: pt=PageTemplateFile('Products/MPIWGWeb/zpt/addMPIWGRootForm.zpt').__of__(self) 835: return pt() 836: 837: def manage_addMPIWGRoot(self,id,title,RESPONSE=None): 838: """add a root folder""" 839: newObj=MPIWGRoot(id,title) 840: self._setObject(id,newObj) 841: 842: if RESPONSE is not None: 843: RESPONSE.redirect('manage_main') 844: 845: 846: class MPIWGProject(Folder): 847: """Class for Projects""" 848: 849: meta_type='MPIWGProject' 850: 851: def versionManageForm(self): 852: """version Manage form:currently only set to invisible""" 853: pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','MPIWGProject_versionManageForm.zpt')).__of__(self) 854: return pt() 855: 856: def versionManage(self,invisible=None,RESPONSE=None): 857: """version Manage form:currently only set to invisible""" 858: self.invisible=invisible 859: 860: if RESPONSE is not None: 861: RESPONSE.redirect('manage_main') 862: 863: 864: def crossLinker(self): 865: """experimental crosslinker""" 866: splitted=self.WEB_project_description[0].split() 867: new=[] 868: for split in splitted: 869: try: 870: found=self.DescriptionCatalog({'fulltext':split}) 871: 872: if len(found)>1: 873: 874: new.append("<a href=%s>%s</a>"%(split,split)) 875: else: 876: new.append(split) 877: except: 878: new.append(split) 879: return string.join(new) 880: 881: 882: 883: 884: def generateTemplate(self,RESPONSE=None): 885: """Erzeuge Template für defined fields not_used""" 886: 887: id="index_html" 888: title=id 889: if self._getOb('index_html'): 890: self._delObject('index_html') 891: 892: 893: newObj=ZopePageTemplate(id,'TEXT') 894: self._setObject(id,newObj) 895: #self.manage_addPageTemplate(id,title) 896: if RESPONSE is not None: 897: RESPONSE.redirect('manage_main') 898: 899: def __init__(self, id, argv=None): 900: """initieriere classe""" 901: 902: self.id=id 903: self.title=id 904: if argv: 905: for arg in definedFields: 906: try: 907: setattr(self,arg,argv[arg]) 908: except: 909: setattr(self,arg,"") 910: else: 911: for arg in definedFields: 912: setattr(self,arg,'') 913: 914: manage_options = Folder.manage_options+( 915: {'label':'Load New File','action':'loadNewFileForm'}, 916: {'label':'Edit ProjectInfo','action':'editMPIWGProjectForm'}, 917: {'label':'Edit BasisInfo','action':'editMPIWGBasisForm'}, 918: {'label':'Edit Publications','action':'editMPIWGRelatedPublicationsForm'}, 919: {'label':'Edit Themes & Disciplines','action':'editMPIWGDisciplinesThemesForm'}, 920: {'label':'Versionmanager','action':'versionManageForm'}, 921: ) 922: 923: 924: def index_html(self): 925: """show homepage""" 926: ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"]) 927: 928: if ext: 929: return getattr(self,ext[0][1].getId())() 930: 931: pt=PageTemplateFile('Products/MPIWGWeb/zpt/project_main').__of__(self) 932: return pt() 933: 934: 935: def getDataFields(self): 936: """giveListofDatafields""" 937: ret=[] 938: for x in range(1,14): 939: if not x in [6,10,9]: # not used fields 940: ret.append('xdata_%02i'%x) 941: return ret 942: 943: def getDefinedFields(self): 944: """show all defined fields""" 945: 946: return definedFields 947: 948: def getAttribute(self,field): 949: """get attrbiute""" 950: return getattr(self,field) 951: 952: def getContent(self,field): 953: """Inhalt des Feldes""" 954: 955: text=u'' 956: #print "FIELD",field 957: for x in getattr(self,field): 958: #print "HIHIIII" 959: 960: try: 961: text +=x.encode('utf-8') 962: except: 963: try: 964: text =x.encode('utf-8') 965: except: 966: text=x.decode('latin-1').encode('utf-8') 967: 968: #delete separator (;) if is there is one 969: ## try: 970: ## print text, text[len(text)-1] 971: ## except: 972: ## print "error:",text 973: try: 974: if text[len(text)-1]==";": 975: text=text[0:len(text)-1] 976: 977: 978: except: 979: """nothing""" 980: 981: text2=re.sub(r';([^\s])','; \g<1>',text) 982: #teste ob ergebnis leer und header dann nehme title 983: 984: if (text2=='') and (field=='WEB_project_header'): 985: return self.getContent('WEB_title') 986: 987: #teste ob WEB_project_description und keine führenden p tags 988: if (len(text2)>4) and (not text2[0:3]=='<p>') and (field=='WEB_project_description'): 989: return "<p>"+text2+"</p>" 990: #if text2=="Otto Sibum": 991: #text2="H. Otto Sibum" 992: return text2 993: 994: def show_html(self): 995: """simple index""" 996: #return "HI" 997: pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGProject_index.zpt').__of__(self) 998: return pt() 999: 1000: def editMPIWGProjectForm(self): 1001: """editform""" 1002: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGProject.zpt').__of__(self) 1003: return pt() 1004: 1005: def editMPIWGProject(self,RESPONSE=None): 1006: """edit the project""" 1007: 1008: #return self.REQUEST 1009: for x in definedFields: 1010: if self.REQUEST.has_key(x): 1011: 1012: setattr(self,x,[self.REQUEST[x].decode('utf-8')]) 1013: 1014: if RESPONSE is not None: 1015: RESPONSE.redirect('manage_main') 1016: 1017: def editMPIWGDisciplinesThemesForm(self): 1018: """edit the disciplines and themes Form""" 1019: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGDisciplinesThemes.zpt').__of__(self) 1020: return pt() 1021: 1022: def editMPIWGDisciplinesThemes(self,disciplines=None,themes=None,RESPONSE=None): 1023: """edit disciplin and form""" 1024: if disciplines: 1025: if type(disciplines) is StringType: 1026: self.xdata_09=disciplines 1027: else: 1028: self.xdata_09=string.join(disciplines,";") 1029: else: 1030: self.xdata_09="" 1031: if themes: 1032: if type(themes) is StringType: 1033: self.xdata_10=themes 1034: else: 1035: self.xdata_10=string.join(themes,";") 1036: else: 1037: self.xdata_10="" 1038: 1039: if RESPONSE is not None: 1040: RESPONSE.redirect('manage_main') 1041: 1042: 1043: def isChecked(self,wert,list): 1044: """check if wert is in ; seperated list""" 1045: print "W:",wert 1046: print "L:",list,type(list) 1047: #felder sind manchmnal als liste mit einem element definiert 1048: if type(list) is StringType or UnicodeType: 1049: splitted=list.split(";") 1050: else: 1051: splitted=list[0].split(";") 1052: 1053: print splitted 1054: for x in splitted: 1055: if (not x==u'') and x in wert: 1056: return 1 1057: return 0 1058: 1059: def editMPIWGBasisForm(self): 1060: """editform""" 1061: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGBasis.zpt').__of__(self) 1062: return pt() 1063: def editMPIWGRelatedPublicationsForm(self): 1064: """Edit related Publications""" 1065: pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGRelatedPublications.zpt').__of__(self) 1066: return pt() 1067: 1068: 1069: def loadNewFileForm(self): 1070: """Neues XML-File einlesen""" 1071: pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGProject_newfile.zpt').__of__(self) 1072: return pt() 1073: 1074: def loadNewFile(self,RESPONSE=None): 1075: """einlesen des neuen files""" 1076: fileupload=self.REQUEST['fileupload'] 1077: if fileupload: 1078: file_name=fileupload.filename 1079: filedata=fileupload.read() 1080: 1081: argv=xmlhelper.proj2hash(filedata) 1082: #print argv.keys() 1083: for arg in definedFields: 1084: 1085: #print arg,argv[arg],getattr(self,arg) 1086: try: 1087: temp=argv[arg][0:] 1088: #old=getattr(self,arg) 1089: setattr(self,arg,temp) 1090: #print old,getattr(self,arg) 1091: except: 1092: """nothing""" 1093: 1094: if RESPONSE is not None: 1095: RESPONSE.redirect('manage_main') 1096: 1097: def manage_addMPIWGProjectForm(self): 1098: """form for adding the project""" 1099: pt=PageTemplateFile('Products/MPIWGWeb/zpt/addMPIWGProjectForm.zpt').__of__(self) 1100: return pt() 1101: 1102: def manage_addMPIWGProject(self,id,RESPONSE=None): 1103: """method to add a project""" 1104: #print argv 1105: fileupload=self.REQUEST.get('fileupload',None) 1106: if fileupload: 1107: print fileupload 1108: file_name=fileupload.filename 1109: filedata=fileupload.read() 1110: 1111: argv=xmlhelper.proj2hash(filedata) 1112: 1113: #print argv 1114: newObj=MPIWGProject(id,argv) 1115: else: 1116: newObj=MPIWGProject(id) 1117: 1118: self._setObject(id,newObj) 1119: 1120: 1121: if RESPONSE is not None: 1122: RESPONSE.redirect('manage_main')