File:  [Repository] / MPIWGWeb / MPIWGProjects.py
Revision 1.34: download - view: text, annotated - select for diffs - revision graph
Mon Oct 11 10:01:38 2004 UTC (19 years, 7 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
updateSQL 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: 
   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 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:                     #ret.append("<a href=%s >%s</a>"%(proj[0].absolute_url,person.encode('utf-8')))
  583:                     ret.append("<a href=%s >%s</a>"%(proj[0].absolute_url+"/index.html",person))
  584:                 else:
  585:                     #ret.append("%s"%person.encode('utf-8'))
  586:                     ret.append("%s"%person)
  587:         return string.join(ret,";")
  588:                          
  589:     def getProjectsOfMembers(self):
  590:         """give tuple member /projects"""
  591:         ret=[]
  592:         members=self.getAllMembers()
  593:         #return str(members)
  594:         for x in members:
  595:             ret+=self.getProjectsOfMember(name=x)
  596:             
  597:         return ret
  598: 
  599:     def getProjectsOfMember(self,name=None,email=None):
  600:         """get project of a member"""
  601:         def sortP(x,y):
  602:             """sort by sorting number"""
  603:             #print x.xdata_05,y.xdata_05
  604:             return cmp(x.WEB_title,y.WEB_title)
  605:         
  606:        
  607:         ret=[]
  608:         splitNeu=[]
  609:         if email:
  610:             members=self.ZopeFind(self.members,obj_metatypes=['MPIWGStaff'],obj_ids=[email])
  611:             name =  members[0][1].title.decode('utf-8')
  612: 
  613:         y=name
  614:         splitted=y.split(",")
  615:         #XXXX
  616:         splitNeu=["\'"+splitted[1]+" "+splitted[0]+"\'"]
  617:         
  618:         #for s in splitted:
  619:         #    splitNeu.append("\""+s+"\"")
  620:         search=string.join(splitNeu,' AND ')
  621:         
  622:         proj=self.ProjectCatalog({'xdata_01':search})
  623: 
  624:         if proj:
  625:             proj2=[]
  626:             for x in proj:
  627:              
  628:                 if not((splitted[1]==" Christoph") and (splitted[0]=="Hoffmann") and (str(x.WEB_title).find('Einstein')>0)):
  629:                        
  630:                        #print repr(splitted[1]),repr(splitted[0]),repr(x.WEB_title)
  631:                        proj2.append(x)
  632:         #    proj2.sort(sortP)
  633:         #    ret.append((y,proj2))
  634:         else:
  635:             proj2=[]
  636:             
  637:         proj=self.ProjectCatalog({'xdata_08':search})
  638:         if proj:
  639:             names=[x.WEB_title for x in proj]
  640:             for x in proj:
  641:                 if not x.WEB_title in names:
  642:                     proj2.append(x)
  643: 
  644: 
  645:         proj2.sort(sortP)
  646: 
  647:         if len(proj2)>0:
  648:             ret.append((y,proj2))
  649: 
  650:         return ret
  651:      
  652:     def givePersonList(self,name):
  653:         """check if person is in personfolder and return list of person objects"""
  654:         
  655:         splitted=name.split(",")
  656:         if len(splitted)==1:
  657:             splitted=name.lstrip().rstrip().split(" ")
  658:         splittedNew=[split.lstrip() for split in splitted]
  659:         
  660:         if splittedNew[0]=='':
  661:             del splittedNew[0]
  662:         search=string.join(splittedNew,' AND ')
  663:         if not search=='':
  664:             proj=self.MembersCatalog({'title':search})
  665: 
  666:         if proj:
  667:             return [[x.lastName,x.firstName] for x in proj]
  668:         else:
  669:             return []
  670:             
  671: ##         splitted=name.split(",") # version nachname, vorname...
  672: ##         if len(splitted)>1:
  673: ##             lastName=splitted[0] 
  674: ##             firstName=splitted[1]
  675: ##         else: 
  676: ##             splitted=name.split(" ") #version vorname irgenwas nachnamae
  677:         
  678: ##             lastName=splitted[len(splitted)-1]
  679: ##             firstName=string.join(splitted[0:len(splitted)-1])
  680: 
  681: ##         objs=[]
  682: 
  683:         #print  self.members 
  684:       ##   for x in self.members.__dict__:
  685: ##             obj=getattr(self.members,x)
  686: ##             if hasattr(obj,'lastName') and hasattr(obj,'firstName'):
  687:                 
  688: ##                 if (re.match(".*"+obj.lastName+".*",lastName) or re.match(".*"+lastName+".*",obj.lastName)) and (re.match(".*"+obj.firstName+".*",firstName) or re.match(".*"+firstName+".*",obj.firstName)):
  689:                     
  690: ##                     objs.append((obj,lastName+", "+firstName))
  691: 
  692:         
  693:         return objs
  694: 
  695: 
  696:     def personCheck(self,names):
  697:         """all persons for list"""
  698:         #print "names",names
  699:         splitted=names.split(";")
  700:         ret={}
  701:         for name in splitted:
  702: 
  703:             if not (name==""):
  704:                 try:
  705:                     ret[name]=self.givePersonList(name)
  706:                 except:
  707:                     """NOTHIHN"""
  708:         #print "RET",ret
  709:         return ret
  710: 
  711:     def giveCheckList(self,person,fieldname):
  712:         """return checklist"""
  713:         #print "GCL",fieldname
  714:         if fieldname=='xdata_01':
  715:             x=self.personCheck(person.getContent(fieldname))
  716:             #print "GCLBACKX",x
  717:             return x
  718:         
  719: 
  720:     def isCheckField(self,fieldname):
  721:         """return chechfield"""
  722:         
  723:         return (fieldname in checkFields)
  724: 
  725: 
  726:     
  727:     
  728:         
  729: def manage_addMPIWGRootForm(self):
  730:     """form for adding the root"""
  731:     pt=PageTemplateFile('Products/MPIWGWeb/zpt/addMPIWGRootForm.zpt').__of__(self)
  732:     return pt()
  733: 
  734: def manage_addMPIWGRoot(self,id,title,RESPONSE=None):
  735:     """add a root folder"""
  736:     newObj=MPIWGRoot(id,title)
  737:     self._setObject(id,newObj)
  738: 
  739:     if RESPONSE is not None:
  740:         RESPONSE.redirect('manage_main')
  741:         
  742: 
  743: class MPIWGProject(Folder):
  744:     """Class for Projects"""
  745: 
  746:     meta_type='MPIWGProject'
  747: 
  748:     def crossLinker(self):
  749:         """experimental crosslinker"""
  750:         splitted=self.WEB_project_description[0].split()
  751:         new=[]
  752:         for split in splitted:
  753:             try:
  754:                 found=self.DescriptionCatalog({'fulltext':split})
  755:           
  756:                 if len(found)>1:
  757:              
  758:                     new.append("<a href=%s>%s</a>"%(split,split))
  759:                 else:
  760:                     new.append(split)
  761:             except:
  762:                 new.append(split)
  763:         return string.join(new)
  764:             
  765:             
  766: 
  767: 
  768:     def generateTemplate(self,RESPONSE=None):
  769:         """Erzeuge Template für defined fields not_used"""
  770: 
  771:         id="index_html"
  772:         title=id
  773:         if self._getOb('index_html'):
  774:             self._delObject('index_html')
  775: 
  776:         
  777:         newObj=ZopePageTemplate(id,'TEXT')
  778:         self._setObject(id,newObj)
  779:         #self.manage_addPageTemplate(id,title)
  780:         if RESPONSE is not None:
  781:             RESPONSE.redirect('manage_main')
  782:             
  783:     def __init__(self, id, argv=None):
  784:         """initieriere classe"""
  785:         
  786:         self.id=id
  787:         self.title=id
  788:         if argv:
  789:             for arg in definedFields:
  790: 		try:
  791:                 	setattr(self,arg,argv[arg])
  792: 		except:
  793: 			setattr(self,arg,"")
  794:         else:
  795:             for arg in definedFields:
  796:                 setattr(self,arg,'')
  797:             
  798:     manage_options = Folder.manage_options+(
  799:         {'label':'Load New File','action':'loadNewFileForm'},
  800:         {'label':'Edit ProjectInfo','action':'editMPIWGProjectForm'},
  801:         {'label':'Edit BasisInfo','action':'editMPIWGBasisForm'},
  802:         {'label':'Edit Publications','action':'editMPIWGRelatedPublicationsForm'},
  803:         {'label':'Edit Themes & Disciplines','action':'editMPIWGDisciplinesThemesForm'},
  804:         )
  805: 
  806: 
  807:     def index_html(self):
  808:         """show homepage"""
  809: 	ext=self.ZopeFind(self.aq_parent,obj_ids=["project_main"])
  810: 
  811:         if ext:
  812:             return getattr(self,ext[0][1].getId())()
  813: 
  814:         pt=PageTemplateFile('Products/MPIWGWeb/zpt/project_main').__of__(self)
  815:         return pt()
  816: 
  817:     def getDataFields(self):
  818:         """giveListofDatafields"""
  819:         ret=[]
  820:         for x in range(1,14):
  821:             if not x in [6,10,9]: # not used fields
  822:                 ret.append('xdata_%02i'%x)
  823:         return ret
  824:             
  825:     def getDefinedFields(self):
  826:         """show all defined fields"""
  827:         
  828:         return definedFields
  829: 
  830:     def getAttribute(self,field):
  831:         """get attrbiute"""
  832:         return getattr(self,field)
  833: 
  834:     def getContent(self,field):
  835:         """Inhalt des Feldes"""
  836:         
  837:         text=u''
  838:         #print "FIELD",field
  839:         for x in getattr(self,field):
  840:             #print "HIHIIII"
  841:             
  842:             try:
  843:                 text +=x.encode('utf-8')
  844:             except:
  845:                 try:
  846:                     text =x.encode('utf-8')
  847:                 except:
  848:                     text=x.decode('latin-1').encode('utf-8')
  849:         
  850:         #delete separator (;) if  is there is one
  851:         ## try:
  852: ##             print text, text[len(text)-1]
  853: ##         except:
  854: ##             print "error:",text
  855:         try:
  856:             if text[len(text)-1]==";":
  857:                 text=text[0:len(text)-1]
  858:           
  859:                 
  860:         except:
  861:             """nothing"""
  862: 
  863:         text2=re.sub(r';([^\s])','; \g<1>',text)
  864:         #teste ob ergebnis leer und header dann nehme title
  865:         
  866:         if (text2=='') and (field=='WEB_project_header'):
  867:             return self.getContent('WEB_title')
  868: 
  869:         #teste ob WEB_project_description und keine führenden p tags
  870:         if (len(text2)>4) and (not text2[0:3]=='<p>') and (field=='WEB_project_description'):
  871:             return "<p>"+text2+"</p>"
  872:         
  873:         return text2
  874:     
  875:     def show_html(self):
  876:         """simple index"""
  877:         #return "HI"
  878:         pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGProject_index.zpt').__of__(self)
  879:         return pt()
  880: 
  881:     def editMPIWGProjectForm(self):
  882:         """editform"""
  883:         pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGProject.zpt').__of__(self)
  884:         return pt()
  885: 
  886:     def editMPIWGProject(self,RESPONSE=None):
  887:         """edit the project"""
  888: 
  889:         #return self.REQUEST
  890:         for x in definedFields:
  891:             if self.REQUEST.has_key(x):
  892:                 
  893:                 setattr(self,x,[self.REQUEST[x].decode('utf-8')])
  894:             
  895:         if RESPONSE is not None:
  896:             RESPONSE.redirect('manage_main')
  897: 
  898:     def editMPIWGDisciplinesThemesForm(self):
  899:         """edit the disciplines and themes Form"""
  900:         pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGDisciplinesThemes.zpt').__of__(self)
  901:         return pt()
  902: 
  903:     def editMPIWGDisciplinesThemes(self,disciplines=None,themes=None,RESPONSE=None):
  904:         """edit disciplin and form"""
  905:         if disciplines:
  906:             if type(disciplines) is StringType:
  907:                 self.xdata_09=disciplines
  908:             else:
  909:                 self.xdata_09=string.join(disciplines,";")
  910:         else:
  911:                 self.xdata_09=""
  912:         if themes:
  913:             if type(themes) is StringType:
  914:                 self.xdata_10=themes
  915:             else:
  916:                 self.xdata_10=string.join(themes,";")
  917:         else:
  918:             self.xdata_10=""
  919:             
  920:         if RESPONSE is not None:
  921:             RESPONSE.redirect('manage_main')
  922: 
  923: 
  924:     def isChecked(self,wert,list):
  925:         """check if wert is in ; seperated list"""
  926:         print "W:",wert
  927:         print "L:",list,type(list)
  928:         #felder sind manchmnal als liste mit einem element definiert
  929:         if type(list) is StringType or UnicodeType: 
  930:             splitted=list.split(";")
  931:         else:
  932:             splitted=list[0].split(";")
  933: 
  934:         print splitted
  935:         for x in splitted:
  936:             if (not x==u'') and x in wert:
  937:                 return 1
  938:         return 0
  939:     
  940:     def editMPIWGBasisForm(self):
  941:         """editform"""
  942:         pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGBasis.zpt').__of__(self)
  943:         return pt()
  944:     def editMPIWGRelatedPublicationsForm(self):
  945:         """Edit related Publications"""
  946:         pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGRelatedPublications.zpt').__of__(self)
  947:         return pt()
  948:         
  949:     
  950:     def loadNewFileForm(self):
  951:         """Neues XML-File einlesen"""
  952:         pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGProject_newfile.zpt').__of__(self)
  953:         return pt()
  954: 
  955:     def loadNewFile(self,RESPONSE=None):
  956:         """einlesen des neuen files"""
  957:         fileupload=self.REQUEST['fileupload']
  958:         if fileupload:
  959:             file_name=fileupload.filename
  960:             filedata=fileupload.read()
  961: 
  962:             argv=xmlhelper.proj2hash(filedata)
  963:             #print argv.keys()
  964:             for arg in definedFields:
  965:                 
  966:                 #print arg,argv[arg],getattr(self,arg)
  967:                 try:
  968:                     temp=argv[arg][0:]
  969:                     #old=getattr(self,arg)
  970:                     setattr(self,arg,temp)
  971:                     #print old,getattr(self,arg)
  972:                 except:
  973:                     """nothing"""
  974:                     
  975:         if RESPONSE is not None:
  976:             RESPONSE.redirect('manage_main')
  977: 
  978: def manage_addMPIWGProjectForm(self):
  979:     """form for adding the project"""
  980:     pt=PageTemplateFile('Products/MPIWGWeb/zpt/addMPIWGProjectForm.zpt').__of__(self)
  981:     return pt()
  982: 
  983: def manage_addMPIWGProject(self,id,RESPONSE=None):
  984:     """method to add a project"""
  985:     #print argv
  986:     fileupload=self.REQUEST.get('fileupload',None)
  987:     if fileupload:
  988:         print fileupload
  989:         file_name=fileupload.filename
  990:         filedata=fileupload.read()
  991:         
  992:         argv=xmlhelper.proj2hash(filedata)
  993:         
  994:         #print argv
  995:         newObj=MPIWGProject(id,argv)
  996:     else:
  997:         newObj=MPIWGProject(id)
  998: 
  999:     self._setObject(id,newObj)
 1000: 
 1001: 
 1002:     if RESPONSE is not None:
 1003:         RESPONSE.redirect('manage_main')

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