Annotation of MPIWGWeb/MPIWGProjects.py, revision 1.5

1.1       dwinter     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
1.5     ! dwinter     9: from types import *
1.1       dwinter    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):
1.5     ! dwinter    20:     
        !            21:     return cmp(x[1],y[1])
1.1       dwinter    22: 
1.5     ! dwinter    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])
1.1       dwinter    44: 
1.5     ! dwinter    45:     
1.1       dwinter    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: 
1.5     ! dwinter    57:     def getProjectFields(self,fieldName,folder=None,sort=None):
1.1       dwinter    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'):
1.5     ! dwinter    67:                 #print obj.meta_type
1.1       dwinter    68:                 if obj.meta_type=='MPIWGProject':
1.5     ! dwinter    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
1.1       dwinter    78:                     
1.5     ! dwinter    79:                     ret.append((obj,obj.getContent(fieldNameTmp)))
        !            80: 
1.1       dwinter    81:                 if obj.meta_type in self.folders:
                     82:                     
                     83:                     ret += self.getProjectFields(fieldName,obj)
1.5     ! dwinter    84: 
        !            85:         if sort=="int":
        !            86:             ret.sort(sortI)
        !            87:         else:
        !            88:             ret.sort(sortF)
1.1       dwinter    89:         
                     90:         return ret
                     91: 
1.5     ! dwinter    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:         
1.1       dwinter   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():
1.4       dwinter   116:             #print line
1.1       dwinter   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: 
1.3       dwinter   127:     def getAllMembers(self):
                    128:         """give list of all members"""
                    129:         ret=[]
                    130: 
                    131:         for x in self.members.objectValues('MPIWGStaff'):
1.4       dwinter   132:             #print x.title
1.3       dwinter   133:             ret.append(x.title)
                    134:             
                    135:         ret.sort()
                    136:         return ret
                    137: 
1.5     ! dwinter   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:             
1.3       dwinter   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=='':
1.4       dwinter   230:                 
                    231:                 try:
                    232:                     proj=self.MembersCatalog({'title':search})
                    233:                 except:
                    234:                     proj=None
1.3       dwinter   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
1.1       dwinter   253:     def givePersonList(self,name):
                    254:         """check if person is in personfolder and return list of person objects"""
1.3       dwinter   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=[]
1.1       dwinter   282: 
1.3       dwinter   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'):
1.1       dwinter   287:                 
1.3       dwinter   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)):
1.1       dwinter   289:                     
1.3       dwinter   290: ##                     objs.append((obj,lastName+", "+firstName))
1.1       dwinter   291: 
1.3       dwinter   292:         
1.1       dwinter   293:         return objs
                    294: 
                    295: 
                    296:     def personCheck(self,names):
                    297:         """all persons for list"""
1.4       dwinter   298:         #print "names",names
1.1       dwinter   299:         splitted=names.split(";")
                    300:         ret={}
                    301:         for name in splitted:
                    302: 
                    303:             if not (name==""):
1.3       dwinter   304:                 try:
                    305:                     ret[name]=self.givePersonList(name)
                    306:                 except:
                    307:                     """NOTHIHN"""
1.4       dwinter   308:         #print "RET",ret
1.1       dwinter   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))
1.4       dwinter   316:             #print "GCLBACKX",x
1.1       dwinter   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: 
1.3       dwinter   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: 
1.1       dwinter   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:             
1.5     ! dwinter   382:     def __init__(self, id, argv=None):
1.1       dwinter   383:         """initieriere classe"""
                    384:         
                    385:         self.id=id
                    386:         self.title=id
1.5     ! dwinter   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,'')
1.1       dwinter   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"
1.5     ! dwinter   432:         #print "TEXT",text.encode('ascii','ignore')  
1.1       dwinter   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
1.5     ! dwinter   504:     if self.REQUEST.has_key('fileupload'):
        !           505:         fileupload=self.REQUEST['fileupload']
        !           506:         if fileupload:
        !           507:             file_name=fileupload.filename
        !           508:             filedata=fileupload.read()
1.1       dwinter   509: 
1.5     ! dwinter   510:             argv=xmlhelper.proj2hash(filedata)
1.1       dwinter   511: 
1.5     ! dwinter   512:             #print argv
        !           513:         newObj=MPIWGProject(id,argv)
        !           514:     else:
        !           515:         newObj=MPIWGProject(id)
1.1       dwinter   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>