File:  [Repository] / MPIWGWeb / MPIWGProjects.py
Revision 1.35: download - view: text, annotated - select for diffs - revision graph
Mon Oct 11 14:49:46 2004 UTC (19 years, 7 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
minors

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

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>