File:  [Repository] / MPIWGWeb / MPIWGProjects.py
Revision 1.5: download - view: text, annotated - select for diffs - revision graph
Wed Mar 10 09:17:31 2004 UTC (20 years, 3 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
Tree added, admin added

    1: """This files contains the class MPIWG Projects"""
    2: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
    3: from Products.PageTemplates.PageTemplate import PageTemplate
    4: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
    5: 
    6: import MPIWGStaff
    7: import string
    8: import re
    9: from types import *
   10: 
   11: import xmlhelper # Methoden zur Verwaltung der projekt xmls
   12: from OFS.SimpleItem import SimpleItem
   13: from OFS.Folder import Folder
   14: 
   15: 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']
   16: 
   17: checkFields = ['xdata_01']
   18: 
   19: def sortF(x,y):
   20:     
   21:     return cmp(x[1],y[1])
   22: 
   23: def sortI(x,y):
   24:     xsplit=x[1].split(".")
   25:     ysplit=y[1].split(".")
   26:     xret=""
   27:     yret=""
   28:     try:
   29:         for i in range(5):
   30:             try:
   31:                 yret=yret+"%04i"%int(xsplit[i])
   32:             except:
   33:                 yret=yret+"%04i"%0
   34: 
   35:             try:
   36:                 xret=xret+"%04i"%int(ysplit[i])
   37:             except:
   38:                 xret=xret+"%04i"%0
   39:                 
   40:         
   41:         return cmp(int(yret),int(xret))
   42:     except:
   43:         return cmp(x[1],y[1])
   44: 
   45:     
   46: class MPIWGRoot(Folder):
   47:     """Stammordner für den Web-Server"""
   48: 
   49:     folders=['MPIWGProject','Folder']
   50:     meta_type='MPIWGRoot'
   51:     
   52:     def __init__(self, id, title):
   53:         """init"""
   54:         self.id=id
   55:         self.title=title
   56: 
   57:     def getProjectFields(self,fieldName,folder=None,sort=None):
   58:         """getListofFieldNames"""
   59:         ret=[]
   60:         #print "FN",fieldName
   61:         if not folder:
   62:             folder=self
   63:         for object in folder.__dict__:
   64: 
   65:             obj=getattr(folder,object)
   66:             if hasattr(obj,'meta_type'):
   67:                 #print obj.meta_type
   68:                 if obj.meta_type=='MPIWGProject':
   69:                     if fieldName=="WEB_title_or_short":
   70:                         #print "HI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
   71:                         #print len(obj.getContent('xdata_07'))
   72:                         if len(obj.getContent('xdata_07'))<3: # hack weil z.Z. manchmal noch ein Trennzeichen ; oder , im Feld statt leer
   73:                             fieldNameTmp="WEB_title"
   74:                         else:
   75:                             fieldNameTmp="xdata_07"
   76:                     else:
   77:                         fieldNameTmp=fieldName
   78:                     
   79:                     ret.append((obj,obj.getContent(fieldNameTmp)))
   80: 
   81:                 if obj.meta_type in self.folders:
   82:                     
   83:                     ret += self.getProjectFields(fieldName,obj)
   84: 
   85:         if sort=="int":
   86:             ret.sort(sortI)
   87:         else:
   88:             ret.sort(sortF)
   89:         
   90:         return ret
   91: 
   92:     def showNewProjects(self):
   93:         projects=[]
   94:         for objs in self.getProjectFields('WEB_title_or_short'): # Get all Projets
   95:             if objs[0].xdata_05[0] == "":
   96:                 
   97:                 projects.append(objs)
   98:                 
   99:         return projects
  100:     
  101:         
  102:     manage_options = Folder.manage_options+(
  103:         {'label':'Import Persons','action':'importNamesForm'},
  104:         )
  105:     
  106:     def importNamesForm(self):
  107:         """Form"""
  108:         pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGNamesForm.zpt').__of__(self)
  109:         return pt()
  110: 
  111:     def importNames(self,fileupload,folderName,RESPONSE=None):
  112:         """import komma-sep list email,lastName,firstName"""
  113:         project=getattr(self,folderName)
  114:         
  115:         for line in fileupload.readlines():
  116:             #print line
  117:             splitted=line.split(",")
  118:             if not (splitted[0]==""):
  119:                 newObj=MPIWGStaff.MPIWGStaff(splitted[0],splitted[1],splitted[2])
  120:                 try:
  121:                     project._setObject(splitted[0],newObj)
  122:                 except:
  123:                     print "not done:",splitted[0]
  124:         if RESPONSE is not None:
  125:             RESPONSE.redirect('manage_main')
  126: 
  127:     def getAllMembers(self):
  128:         """give list of all members"""
  129:         ret=[]
  130: 
  131:         for x in self.members.objectValues('MPIWGStaff'):
  132:             #print x.title
  133:             ret.append(x.title)
  134:             
  135:         ret.sort()
  136:         return ret
  137: 
  138:     def makeList(self,entry):
  139:         """makes a list out of one entry or repeat a list"""
  140:         if type(entry) is StringType:
  141:             return [entry]
  142:         else:
  143:             return entry
  144: 
  145: 
  146:     def getTree(self):
  147:         """generate Tree from project list"""
  148:         returnList=[]
  149:         for project in self.getProjectFields('xdata_05',sort="int"): # get Projects sorted by xdata_05
  150:             for idNr in project[1].split(";"): # more than one number
  151:                 if not idNr=="":
  152:                     splittedId=idNr.split(".")
  153:                     depth=len(splittedId)
  154:                     nr=idNr
  155:                     title=project[0].WEB_title
  156:                     returnList.append((depth,nr,title,project[0]))
  157:         
  158:         return returnList
  159: 
  160:     def changePosition(self,treeId,select,RESPONSE=None):
  161:         """Change Postion Entry"""
  162:         numbers=[]
  163: 
  164:         # Suche hoechste bisherige nummer
  165:         projects=self.getProjectFields('xdata_05') # get Projects sorted by xdata_05
  166:         for project in projects: #suche alle subtrees der treeId
  167:             #print treeId
  168:             
  169:             founds=re.match(treeId+"\.(.*)",project[1].split(";")[0])
  170:             if founds:
  171:                 #print "x",founds.group(0),len(founds.group(0).split("."))
  172:                 if len(founds.group(0).split("."))==len(treeId.split("."))+1: # nur ein punkt mehr, d.h. untere ebene
  173:                     try:
  174:                         numbers.append(int(founds.group(0).split(".")[len(founds.group(0).split("."))-1]))
  175:                     except:
  176:                         numbers.append(0)
  177:         numbers.sort()
  178:         highest=int(numbers[len(numbers)-1])
  179:         projects=self.showNewProjects()
  180:         for i in self.makeList(select):
  181:             highest+=10
  182:             projects[int(i)][0].xdata_05=treeId+"."+str(highest)
  183: 
  184: 
  185:         if RESPONSE is not None:
  186:             RESPONSE.redirect('showTree')
  187:         
  188:     def changeTree(self,RESPONSE=None):
  189:         """change the complete tree"""
  190:         form=self.REQUEST.form
  191:         hashList={}
  192:         fields=self.getTree()
  193: 
  194:         
  195:         for idNr in form.keys():
  196:             fields[int(idNr)][3].xdata_05=form[idNr]
  197: 
  198:         
  199: 
  200:         if RESPONSE is not None:
  201:             RESPONSE.redirect('showTree')
  202: 
  203:     def getProjectWithId(self,id):
  204:         fields=self.getProjectFields('xdata_05')
  205:         for field in fields:
  206:             if field[1]==id:
  207:                 return field[0]
  208: 
  209:         return None
  210:             
  211:         
  212:             
  213:         
  214:         
  215:             
  216:     def getUrlFromPerson(self,list):
  217:         """get urls to person list"""
  218:         ret=[]
  219:         persons=list.split(";")
  220:         for person in persons:
  221:             
  222:             splitted=person.split(",")
  223:             if len(splitted)==1:
  224:                 splitted=person.split(" ")
  225:             splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted]
  226:             if splittedNew[0]=='':
  227:                 del splittedNew[0]
  228:             search=string.join(splittedNew,' AND ')
  229:             if not search=='':
  230:                 
  231:                 try:
  232:                     proj=self.MembersCatalog({'title':search})
  233:                 except:
  234:                     proj=None
  235:         
  236:             if proj:
  237:                 ret.append("<a href=%s >%s</a>"%(proj[0].absolute_url,person))
  238:             else:
  239:                 ret.append("%s"%person)
  240:         return string.join(ret,";")
  241:                          
  242:     def getProjectsOfMembers(self):
  243:         """give tuple member /projects"""
  244:         ret=[]
  245:         members=self.getAllMembers()
  246:         for x in members:
  247:             splitted=x.split(",")
  248:             
  249:             proj=self.ProjectCatalog({'xdata_01':string.join(splitted,' AND')})
  250:             if proj:
  251:               ret.append((x,proj))
  252:         return ret
  253:     def givePersonList(self,name):
  254:         """check if person is in personfolder and return list of person objects"""
  255:         
  256:         splitted=name.split(",")
  257:         if len(splitted)==1:
  258:             splitted=name.split(" ")
  259:         splittedNew=[re.sub(r'\s(.*)','$1',split) for split in splitted]
  260:         if splittedNew[0]=='':
  261:             del splittedNew[0]
  262:         search=string.join(splittedNew,' AND ')
  263:         if not search=='':
  264:             proj=self.MembersCatalog({'title':search})
  265: 
  266:         if proj:
  267:             return [[x.lastName,x.firstName] for x in proj]
  268:         else:
  269:             return []
  270:             
  271: ##         splitted=name.split(",") # version nachname, vorname...
  272: ##         if len(splitted)>1:
  273: ##             lastName=splitted[0] 
  274: ##             firstName=splitted[1]
  275: ##         else: 
  276: ##             splitted=name.split(" ") #version vorname irgenwas nachnamae
  277:         
  278: ##             lastName=splitted[len(splitted)-1]
  279: ##             firstName=string.join(splitted[0:len(splitted)-1])
  280: 
  281: ##         objs=[]
  282: 
  283:         #print  self.members 
  284:       ##   for x in self.members.__dict__:
  285: ##             obj=getattr(self.members,x)
  286: ##             if hasattr(obj,'lastName') and hasattr(obj,'firstName'):
  287:                 
  288: ##                 if (re.match(".*"+obj.lastName+".*",lastName) or re.match(".*"+lastName+".*",obj.lastName)) and (re.match(".*"+obj.firstName+".*",firstName) or re.match(".*"+firstName+".*",obj.firstName)):
  289:                     
  290: ##                     objs.append((obj,lastName+", "+firstName))
  291: 
  292:         
  293:         return objs
  294: 
  295: 
  296:     def personCheck(self,names):
  297:         """all persons for list"""
  298:         #print "names",names
  299:         splitted=names.split(";")
  300:         ret={}
  301:         for name in splitted:
  302: 
  303:             if not (name==""):
  304:                 try:
  305:                     ret[name]=self.givePersonList(name)
  306:                 except:
  307:                     """NOTHIHN"""
  308:         #print "RET",ret
  309:         return ret
  310: 
  311:     def giveCheckList(self,person,fieldname):
  312:         """return checklist"""
  313:         #print "GCL",fieldname
  314:         if fieldname=='xdata_01':
  315:             x=self.personCheck(person.getContent(fieldname))
  316:             #print "GCLBACKX",x
  317:             return x
  318:         
  319: 
  320:     def isCheckField(self,fieldname):
  321:         """return chechfield"""
  322:         
  323:         return (fieldname in checkFields)
  324: 
  325:     
  326:     
  327:         
  328: def manage_addMPIWGRootForm(self):
  329:     """form for adding the root"""
  330:     pt=PageTemplateFile('Products/MPIWGWeb/zpt/addMPIWGRootForm.zpt').__of__(self)
  331:     return pt()
  332: 
  333: def manage_addMPIWGRoot(self,id,title,RESPONSE=None):
  334:     """add a root folder"""
  335:     newObj=MPIWGRoot(id,title)
  336:     self._setObject(id,newObj)
  337: 
  338:     if RESPONSE is not None:
  339:         RESPONSE.redirect('manage_main')
  340:         
  341: 
  342: class MPIWGProject(Folder):
  343:     """Class for Projects"""
  344: 
  345:     meta_type='MPIWGProject'
  346: 
  347:     def crossLinker(self):
  348:         """experimental crosslinker"""
  349:         splitted=self.WEB_project_description[0].split()
  350:         new=[]
  351:         for split in splitted:
  352:             try:
  353:                 found=self.DescriptionCatalog({'fulltext':split})
  354:           
  355:                 if len(found)>1:
  356:              
  357:                     new.append("<a href=%s>%s</a>"%(split,split))
  358:                 else:
  359:                     new.append(split)
  360:             except:
  361:                 new.append(split)
  362:         return string.join(new)
  363:             
  364:             
  365: 
  366: 
  367:     def generateTemplate(self,RESPONSE=None):
  368:         """Erzeuge Template für defined fields not_used"""
  369: 
  370:         id="index_html"
  371:         title=id
  372:         if self._getOb('index_html'):
  373:             self._delObject('index_html')
  374: 
  375:         
  376:         newObj=ZopePageTemplate(id,'TEXT')
  377:         self._setObject(id,newObj)
  378:         #self.manage_addPageTemplate(id,title)
  379:         if RESPONSE is not None:
  380:             RESPONSE.redirect('manage_main')
  381:             
  382:     def __init__(self, id, argv=None):
  383:         """initieriere classe"""
  384:         
  385:         self.id=id
  386:         self.title=id
  387:         if argv:
  388:             for arg in definedFields:
  389:                 setattr(self,arg,argv[arg])
  390:         else:
  391:             for arg in definedFields:
  392:                 setattr(self,arg,'')
  393:             
  394:     manage_options = Folder.manage_options+(
  395:         {'label':'Load New File','action':'loadNewFileForm'},
  396:         {'label':'Edit ProjectInfo','action':'editMPIWGProjectForm'},
  397:         {'label':'Edit BasisInfo','action':'editMPIWGBasisForm'},
  398:         {'label':'Edit Publications','action':'editMPIWGRelatedPublicationsForm'},
  399:         )
  400: 
  401:     def getDataFields(self):
  402:         """giveListofDatafields"""
  403:         ret=[]
  404:         for x in range(1,14):
  405:             ret.append('xdata_%02i'%x)
  406:         return ret
  407:             
  408:     def getDefinedFields(self):
  409:         """show all defined fields"""
  410:         
  411:         return definedFields
  412: 
  413:     def getAttribute(self,field):
  414:         """get attrbiute"""
  415:         return getattr(self,field)
  416: 
  417:     def getContent(self,field):
  418:         """Inhalt des Feldes"""
  419:         
  420:         text=u''
  421:         #print "FIELD",field
  422:         for x in getattr(self,field):
  423:             #print "HIHIIII"
  424:             
  425:             try:
  426:                 text +=x
  427:             except:
  428:                 try:
  429:                     text =x
  430:                 except:
  431:                     text="ERROR"
  432:         #print "TEXT",text.encode('ascii','ignore')  
  433:         return text
  434:     
  435:     def show_html(self):
  436:         """simple index"""
  437:         #return "HI"
  438:         pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGProject_index.zpt').__of__(self)
  439:         return pt()
  440: 
  441:     def editMPIWGProjectForm(self):
  442:         """editform"""
  443:         pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGProject.zpt').__of__(self)
  444:         return pt()
  445: 
  446:     def editMPIWGBasisForm(self):
  447:         """editform"""
  448:         pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGBasis.zpt').__of__(self)
  449:         return pt()
  450:     def editMPIWGRelatedPublicationsForm(self):
  451:         """Edit related Publications"""
  452:         pt=PageTemplateFile('Products/MPIWGWeb/zpt/edit_MPIWGRelatedPublications.zpt').__of__(self)
  453:         return pt()
  454:         
  455:     def editMPIWGProject(self,RESPONSE=None):
  456:         """edit the project"""
  457:         
  458:         #return self.REQUEST
  459:         for x in definedFields:
  460:             if self.REQUEST.has_key(x):
  461:                 
  462:                 setattr(self,x,[self.REQUEST[x]])
  463:             
  464:         if RESPONSE is not None:
  465:             RESPONSE.redirect('manage_main')
  466: 
  467:         
  468:     def loadNewFileForm(self):
  469:         """Neues XML-File einlesen"""
  470:         pt=PageTemplateFile('Products/MPIWGWeb/zpt/MPIWGProject_newfile.zpt').__of__(self)
  471:         return pt()
  472: 
  473:     def loadNewFile(self,RESPONSE=None):
  474:         """einlesen des neuen files"""
  475:         fileupload=self.REQUEST['fileupload']
  476:         if fileupload:
  477:             file_name=fileupload.filename
  478:             filedata=fileupload.read()
  479: 
  480:             argv=xmlhelper.proj2hash(filedata)
  481:             #print argv.keys()
  482:             for arg in definedFields:
  483:                 
  484:                 #print arg,argv[arg],getattr(self,arg)
  485:                 try:
  486:                     temp=argv[arg][0:]
  487:                     #old=getattr(self,arg)
  488:                     setattr(self,arg,temp)
  489:                     #print old,getattr(self,arg)
  490:                 except:
  491:                     """nothing"""
  492:                     
  493:         if RESPONSE is not None:
  494:             RESPONSE.redirect('manage_main')
  495: 
  496: def manage_addMPIWGProjectForm(self):
  497:     """form for adding the project"""
  498:     pt=PageTemplateFile('Products/MPIWGWeb/zpt/addMPIWGProjectForm.zpt').__of__(self)
  499:     return pt()
  500: 
  501: def manage_addMPIWGProject(self,id,RESPONSE=None):
  502:     """method to add a project"""
  503:     #print argv
  504:     if self.REQUEST.has_key('fileupload'):
  505:         fileupload=self.REQUEST['fileupload']
  506:         if fileupload:
  507:             file_name=fileupload.filename
  508:             filedata=fileupload.read()
  509: 
  510:             argv=xmlhelper.proj2hash(filedata)
  511: 
  512:             #print argv
  513:         newObj=MPIWGProject(id,argv)
  514:     else:
  515:         newObj=MPIWGProject(id)
  516: 
  517:     self._setObject(id,newObj)
  518: 
  519: 
  520:     if RESPONSE is not None:
  521:         RESPONSE.redirect('manage_main')

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