Annotation of MPIWGWeb/MPIWGProjects.py, revision 1.6

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

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