Annotation of ECHO_content/VLPExtension.py, revision 1.23

1.10      dwinter     1: from Products.ECHO_content.ECHO_collection import *
1.1       dwinter     2: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
                      3: from Products.PageTemplates.PageTemplate import PageTemplate
                      4: from Products.PageTemplates.ZopePageTemplate import ZopePageTemplate
1.2       dwinter     5: 
1.13      dwinter     6: try:
                      7:    from Products.zogiLib import zogiLib
                      8: except:
                      9:    print "Zogilib not installed, VLP_resource will not work"
                     10: 
1.11      dwinter    11: import xml.dom.minidom
                     12: import urllib
1.20      dwinter    13: import xmlrpclib
1.1       dwinter    14: 
1.20      dwinter    15: 
                     16: 
                     17: 
                     18: def lemmatize(str):
                     19:    """takes a str and addes links the dictionary service"""
                     20:    server = xmlrpclib.ServerProxy("http://archimedes.fas.harvard.edu/cgi-bin/donatus-rpc")
                     21:    if server:
                     22:        splitted=str.split(" ")
                     23:        wordlist=["<w>%s</w>"%split for split in splitted].join()
                     24:    return wordlist
                     25: 
                     26:        
                     27: 
                     28:        
1.14      dwinter    29: def makeXML(str):
                     30:        try:
                     31:            dom=xml.dom.minidom.parseString(str)
                     32:            return str
                     33:        except:
1.20      dwinter    34:            
1.15      dwinter    35:            return """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><page>
                     36:                      %s
                     37:                  </page>"""%str
1.14      dwinter    38:        
1.20      dwinter    39:        
1.1       dwinter    40: def getText(nodelist):
                     41: 
                     42:     rc = ""
                     43:     for node in nodelist:
                     44:        if node.nodeType == node.TEXT_NODE:
                     45:            rc = rc + node.data
                     46:     return rc
                     47: 
1.6       dwinter    48: class VLP_essay(Folder):
                     49:     """classe für VLP essays"""
                     50: 
                     51:     meta_type="VLP_essay"
                     52: 
1.8       dwinter    53:     manage_options = Folder.manage_options+(
                     54:        {'label':'Main Config','action':'ConfigVLP_essayForm'},
1.17      dwinter    55:        {'label':'Generate Essay Template','action':'generateEssayTemplateHTML'},
1.8       dwinter    56:                 )
                     57: 
1.9       dwinter    58:     def content_html(self,type='collection'):
                     59:         """template fuer content"""
                     60:         #templates = self.ZopeFind(self.aq_parent,obj_ids=[type+"_template"])
                     61:         #
                     62:         #if templates:
                     63:         #    return templates[0][1]()
                     64:    
                     65:         if hasattr(self,type+"_template"):
                     66:             obj=getattr(self,type+"_template")
                     67:             return obj()
                     68:         else:
                     69:             pt=PageTemplateFile('Products/ECHO_content/zpt/ECHO_%s_template_standard.zpt'%type).__of__(self)
                     70:             pt.content_type="text/html"
                     71:             return pt()
                     72: 
1.8       dwinter    73:     def ConfigVLP_essayForm(self):
                     74:         """Form for adding"""
                     75:         pt=PageTemplateFile('Products/ECHO_content/vlp/ChangeVLP_essay.zpt').__of__(self)
                     76:         return pt()
                     77: 
                     78:     def ChangeVLP_essay(self,title,label,description,RESPONSE=None):
                     79:         """Change vlp_essay"""
                     80:         self.title=title
                     81:         self.label=label
                     82:         self.description=description
                     83: 
                     84:         if RESPONSE is not None:
                     85:             RESPONSE.redirect('manage_main')
                     86: 
1.6       dwinter    87:     def __init__(self,id,title,label):
                     88:         """init"""
                     89:         self.id=id
                     90:         self.title=title
                     91:         self.label=label
                     92: 
1.17      dwinter    93:     def index_html(self):
                     94:    
                     95:        """show the rendered file"""
                     96:        
1.18      dwinter    97:        if hasattr(self,'essayTemplate.html'):
                     98:            return getattr(self,'essayTemplate.html')()
1.17      dwinter    99: 
                    100:        pt=PageTemplateFile('Products/ECHO_content/vlp/essay_template.zpt').__of__(self)
                    101:        pt.content_type="text/html"
                    102:        return pt()
                    103: 
                    104:     def generateEssayTemplateHTML(self,RESPONSE=None):
                    105:         """lege standard index.html an"""
                    106: 
                    107:    if not hasattr(self,'essayTemplate.html'):
                    108:             zt=ZopePageTemplate('essayTemplate.html')
                    109:             self._setObject('essayTemplate.html',zt)
                    110:             default_content_fn = os.path.join(package_home(globals()),
                    111:                                                'vlp/essay_template.zpt')
                    112:             text = open(default_content_fn).read()
                    113:             zt.pt_edit(text, 'text/html')
                    114: 
                    115:         else:
                    116:             return "already exists!"
                    117:         
                    118:         if RESPONSE is not None:
                    119:             RESPONSE.redirect('manage_main')
                    120: 
                    121: 
1.6       dwinter   122:     def getPage(self,pagenum):
                    123:         """gibt essay page mit num aus"""
                    124:         def sortFind(x,y):
                    125:             return cmp(x[0],y[0])
1.16      dwinter   126:         pages=[]
                    127:         pagestmp=self.ZopeFind(self,obj_metatypes=['DTML Document','File'])
                    128:    for page in pagestmp:
                    129:        if not (page[1].getId()[0]=="."):
                    130:            pages.append(page)
                    131:            
1.6       dwinter   132:         pages.sort(sortFind)
                    133:         #print str(pages[int(pagenum)][1]())
                    134:         if pages[int(pagenum)-1][1].meta_type=='File':
1.20      dwinter   135:        #return makeXML(str(pages[int(pagenum)-1][1]))
                    136:        print "A"
                    137:        return self.xml2html(makeXML(str(pages[int(pagenum)-1][1])),quote="no")
1.6       dwinter   138:         else:
1.20      dwinter   139:        print "B"
                    140:        #return makeXML(str(pages[int(pagenum)-1][1]))
                    141:        return self.xml2html(makeXML(pages[int(pagenum)-1][1]()),quote="no")
1.6       dwinter   142:         
                    143:     def nextPage(self,pagenum,url):
1.7       dwinter   144:         pages=len(self.ZopeFind(self,obj_metatypes=['DTML Document','File'])) # teste ob performance ok, sonst in variable
1.6       dwinter   145:         if int(pagenum)+1 <= pages:
                    146:             retstr=url+"?p="+str(int(pagenum)+1)
                    147:             return """<td align="right" <a href="%s">next</a></td>"""%retstr
                    148:         
                    149:     def previousPage(self,pagenum,url):
1.7       dwinter   150:         
1.6       dwinter   151:         if int(pagenum)-1 > 0:
                    152:             retstr=url+"?p="+str(int(pagenum)-1)
                    153:             return """<td align="left" <a href="%s">previous</a></td>"""%retstr
                    154:         
1.19      dwinter   155:     def nextURL(self,pagenum,url):
                    156:         pages=len(self.ZopeFind(self,obj_metatypes=['DTML Document','File'])) # teste ob performance ok, sonst in variable
                    157:         if int(pagenum)+1 <= pages:
                    158:             retstr=url+"?p="+str(int(pagenum)+1)
                    159:             return retstr
                    160:         
                    161:     def previousURL(self,pagenum,url):
                    162:         
                    163:         if int(pagenum)-1 > 0:
                    164:             retstr=url+"?p="+str(int(pagenum)-1)
                    165:             return retstr
                    166:         
1.6       dwinter   167:         
                    168: def manage_addVLP_essayForm(self):
                    169:     """Form for adding"""
                    170:     pt=PageTemplateFile('Products/ECHO_content/vlp/AddVLP_essay.zpt').__of__(self)
                    171:     return pt()
                    172: 
                    173: def manage_addVLP_essay(self, id,title,label,RESPONSE=None):
                    174:    """add the copyright"""
                    175: 
                    176:    
                    177:    self._setObject(id, VLP_essay(id, title,label))
                    178: 
                    179:    if RESPONSE is not None:
                    180:        RESPONSE.redirect('manage_main')
                    181:    
                    182: 
                    183: 
1.2       dwinter   184: class VLP_collection(ECHO_collection):
                    185:     """VLP spezifische Erweiterung der Collection"""
                    186: 
1.3       dwinter   187:     meta_type="VLP_collection"
                    188:     manage_options=ECHO_collection.manage_options+(
                    189:         {'label':'Change Path','action':'VLP_path_configForm'},
                    190:         {'label':'Update Library','action':'updateCollection'},
                    191:         {'label':'Update Metadata','action':'updateCollectionMD'},
                    192:         )
                    193: 
                    194:     def VLP_path_configForm(self):
1.5       dwinter   195:         """change pt"""
                    196:         path=PageTemplateFile('Products/ECHO_content/vlp/ChangeVLPPath.zpt').__of__(self)
1.3       dwinter   197:         return pt()
                    198: 
                    199:     def VLP_path_config(self,path,RESPONSE=None):
                    200:         """config"""
                    201:         self.path=path
                    202:         if RESPONSE is not None:
                    203:             RESPONSE.redirect('manage_main')
                    204: 
                    205:     def updateCollection(self,RESPONSE=None):
                    206:         """liest verzeichnisse aus dem pfad und legt sie dann als objekte in den ordner"""
                    207:         files=os.listdir(self.path)
                    208:         for fileName in files:
                    209:             
                    210:             if fileName[0:3]=="lit":
                    211:                 
                    212:                 metalink=self.REQUEST['URL1']+"/"+fileName+"/index_meta"
                    213:                 newObj=VLP_resource(fileName,'',metalink,fileName,fileName,fileName,'generated','book','','','','','','')
                    214:                 self._setObject(fileName,newObj)
                    215:                 
                    216:                 genObj=getattr(self,fileName)
                    217:                 genObj.createIndexFile()
                    218:                 
                    219:                 
                    220:         if RESPONSE is not None:
                    221:             RESPONSE.redirect('manage_main')
                    222: 
                    223:     def updateCollectionMD(self,RESPONSE=None):
                    224:         """updateMD"""
                    225:         files=os.listdir(self.path)
                    226:         for fileName in files:
1.4       dwinter   227:             if fileName[0:3]=="lit":
1.3       dwinter   228:                 genObj=getattr(self,fileName)
                    229:                 genObj.copyIndex_meta2echo_resource()
                    230:                 genObj.generate_title()
                    231: 
                    232:         if RESPONSE is not None:
                    233:             RESPONSE.redirect('manage_main')
                    234: 
1.20      dwinter   235:     def copyFullTextsFromDB(self,RESPONSE=None):
                    236:        """copy fulltext aus DB"""
1.2       dwinter   237: 
1.20      dwinter   238:        ress=self.ZopeFind(self,obj_metatypes=['VLP_resource'])
                    239:        ret=""
                    240:        for res in ress:
                    241:            tmp=res[1].copyTranscriptionFromDB()
                    242:            ret+=tmp
                    243: 
                    244:            if RESPONSE:
                    245:                RESPONSE.write(tmp+"\n")
                    246:        if not RESPONSE:            
                    247:            return ret
                    248:        else:
                    249:            RESPONSE.write("END\n")
                    250:            
                    251:        
1.2       dwinter   252: def manage_addVLP_collectionForm(self):
                    253:         """Form for adding a ressource"""
                    254:         pt=PageTemplateFile('Products/ECHO_content/vlp/AddVLP_collectionForm.zpt').__of__(self)
                    255:         return pt()
                    256: 
                    257: 
                    258: 
1.3       dwinter   259: def manage_addVLP_collection(self,id,title,label,description,contentType,responsible,weight,sortfield,path,coords="",secondaryLinkTitle="",secondaryLink="",credits=None,RESPONSE=None,imageTag="",bgcolour=""):
1.2       dwinter   260:     """add a echo collection"""
                    261:     
                    262: 
                    263:     newObj=VLP_collection(id,title,label,description,contentType,responsible,credits,weight,sortfield,coords,secondaryLinkTitle=secondaryLinkTitle,secondaryLink=secondaryLink,imageTag=imageTag,bgcolour="")
                    264: 
                    265:     self._setObject(id,newObj)
1.3       dwinter   266:     setattr(newObj,'path',path)
1.2       dwinter   267: 
                    268:     if RESPONSE is not None:
                    269:         RESPONSE.redirect('manage_main')
                    270: 
                    271: 
1.1       dwinter   272: 
                    273: class VLP_resource(ECHO_resource):
                    274:     """VLP spezifische Erweiterung"""
                    275: 
                    276:     meta_type="VLP_resource"
                    277: 
                    278:     vlp_basis="/mpiwg/online/permanent/vlp"
                    279: 
                    280:     
                    281:     referencetypes=[]
                    282: 
                    283:     manage_options=ECHO_resource.manage_options+(
                    284:         {'label':'Update Index','action':'createIndexFile'},
                    285:         {'label':'Reset MetaLink','action':'resetMetaLink'},
                    286:         {'label':'Generate Title','action':'generate_title'},
1.14      dwinter   287:    {'label':'Generate Library Template','action':'generateLibraryTemplateHTML'},
1.1       dwinter   288:         )
                    289: 
1.20      dwinter   290:     
                    291:     def transcription(self):
                    292:        """show the rendered transcriptiofile"""
                    293:        
                    294:        if hasattr(self,'libraryTranscriptionTemplate.html'):
                    295:            return getattr(self,'libraryTranscriptionTemplate.html')()
                    296: 
                    297:        pt=PageTemplateFile('Products/ECHO_content/vlp/library_transcriptionTemplate.zpt').__of__(self)
                    298:        pt.content_type="text/html"
                    299:        return pt()
                    300: 
                    301: 
                    302: 
                    303:     def copyTranscriptionFromDB(self):
                    304:        """checks if transcription exits in DB"""
                    305:        founds=self.search(var='select * from vl_transcript where source=\''+self.resourceID+'\' order by id')
                    306: 
                    307:        
                    308:        ret="""<?xml version="1.0" encoding="utf-8"?>
                    309:                <text>"""
                    310:         
                    311:        if founds:
                    312:            
                    313:            for found in founds:
                    314:                text=found.transcript
                    315:                if not text: text=""
                    316:                ret+="<page><pb/>"+text+"</page>"
                    317: 
                    318:            ret+="</text>"
                    319:            re2=ret[0:]
                    320:            re3=re2.decode('latin-1')
                    321:            
                    322:            ft=self.ZopeFind(self,obj_metatypes=['ECHO_fullText'])
                    323:            
                    324:            if ft:
                    325:            
                    326:                ft[0][1].pt_edit(re3.encode('utf-8','ignore'),'text/xml')
                    327:            
                    328:            else:
                    329:                self._setObject('fulltext',ECHO_fullText(id,re3))
                    330:            
                    331:            return "FT: %s"%self.getId()
                    332:        else:
                    333:            return "no: %s"%self.getId()
                    334:        
1.1       dwinter   335:     def resetMetaLink(self,all="no",RESPONSE=None):
                    336:         """resets metalink to standard resp. in case of server change it sets to the new server url"""
                    337:         if all=="yes":
                    338:             self.metalink=self.absolute_url()+"/index_meta"
                    339:         else:
                    340:             splitted=self.metalink.split("/")
                    341:             if (len(splitted)>1) and (splitted[len(splitted)-1]=="index_meta") and (splitted[len(splitted)-2]==self.getId()): # heuristic nur generische Metadatafiles andern
                    342:                 self.metalink=self.absolute_url()+"/index_meta"
                    343: 
                    344:         if RESPONSE:
                    345:             return "done"
                    346:             
                    347:     def show(self):
                    348:         """show the rendered file"""
1.11      dwinter   349: 
                    350:         if self.REQUEST.get('p',None):
                    351:             self.REQUEST.set('pn',self.file2page(self.REQUEST.get('p',None)))
1.12      dwinter   352:            
1.14      dwinter   353:    if hasattr(self,'libraryTemplate.html'):
                    354:        return getattr(self,'libraryTemplate.html')()
                    355:    
1.1       dwinter   356:         pt=PageTemplateFile('Products/ECHO_content/vlp/library_template.zpt').__of__(self)
                    357:         pt.content_type="text/html"
                    358:         return pt()
                    359:     
1.3       dwinter   360:     index_html=show
1.14      dwinter   361: 
                    362:     def generateLibraryTemplateHTML(self,RESPONSE=None):
                    363:         """lege standard index.html an"""
                    364: 
                    365:    if not hasattr(self,'libraryTemplate.html'):
                    366:             zt=ZopePageTemplate('libraryTemplate.html')
                    367:             self._setObject('libraryTemplate.html',zt)
                    368:             default_content_fn = os.path.join(package_home(globals()),
                    369:                                                'vlp/library_template.zpt')
                    370:             text = open(default_content_fn).read()
                    371:             zt.pt_edit(text, 'text/html')
                    372: 
                    373:         else:
                    374:             return "already exists!"
                    375:         
                    376:         if RESPONSE is not None:
                    377:             RESPONSE.redirect('manage_main')
                    378: 
                    379: 
1.1       dwinter   380:     def index_meta(self):
                    381:         """index_meta"""
1.11      dwinter   382:         
1.1       dwinter   383:         pt=PageTemplateFile('Products/ECHO_content/vlp/index_meta.zpt').__of__(self)
                    384:         pt.content_type="text/html"
                    385:         return pt()
1.11      dwinter   386: 
                    387:     def file2page(self,p):
                    388:         """converts filename to pagenumber"""
1.21      dwinter   389:         dom=xml.dom.minidom.parse(ECHO_helpers.urlopen(getattr(self,'index.xml').absolute_url()))
1.11      dwinter   390:         
                    391:         for page in dom.getElementsByTagName('page'):
1.23    ! dwinter   392:         # pageummer mit lo oder hi sind aequivalent
        !           393:         if (page.getAttribute('file')==p) or ("%slo"%page.getAttribute('file')==p) or ("%shi"%page.getAttribute('file')==p):
        !           394:             return page.getAttribute('nr')
1.11      dwinter   395:             
                    396:         return 0
1.1       dwinter   397:     
                    398:     def dir2index(self):
                    399:         """dir to index"""
                    400: 
                    401:         def calculateName(str):
                    402:             ret="%s: %s"%(str[0],str[1:5])
                    403:             return ret
1.2       dwinter   404: 
                    405:         try:
                    406:             ret=os.listdir(os.path.join(self.vlp_basis,self.resourceID,'pageimg'))
                    407:             self.imagePath='pageimg'
                    408:         except:
                    409:             ret=os.listdir(os.path.join(self.vlp_basis,self.resourceID,'pagesHi'))
                    410:             self.imagePath='pagesHi'
1.1       dwinter   411:         temp=[]
                    412:         for x in ret:
                    413:             if not (x[0]=="."):
                    414:                 
1.11      dwinter   415:                 temp.append((calculateName(x),os.path.splitext(x)[0]))
1.1       dwinter   416:         return temp
                    417: 
1.11      dwinter   418:     
1.1       dwinter   419:     def firstPage(self,url=None):
                    420:         """showlink to the first image"""
                    421:         if self.REQUEST.get('pn')=="1": #erste seinte dann kein a tag
                    422:             return """<img src="../../images/first.gif" alt="first" width="14" height="14" border="0"><br>first"""
                    423: 
                    424:         else:
                    425:             return """<a href=%s>
                    426:                          <img src="../../images/first.gif" alt="first" width="14" height="14" border="0"><br>first
                    427:                          </a>
                    428:                          """%(self.REQUEST['URL']+"?pn=1")
                    429: 
                    430:     def lastPage(self,url=None):
                    431:         """showlink to the first image"""
                    432:         pages=self.readIndexFile(url)
                    433:         if pages:
                    434:             ln=len(pages)
                    435:         
                    436:         if self.REQUEST.get('pn')==str(ln): #letzte seite dann kein a tag
                    437:             return """<img src="../../images/last.gif" alt="last" width="14" height="14" border="0"><br>last"""
                    438: 
                    439:         else:
                    440:             return """<a href=%s>
                    441:                          <img src="../../images/last.gif" alt="last" width="14" height="14" border="0"><br>last
                    442:                          </a>
                    443:                          """%(self.REQUEST['URL']+"?pn="+str(ln))
                    444:             
                    445:     def prevPage(self,url=None):
                    446:         """showlink to the first image"""
                    447:         
                    448: 
                    449:         nn = int(self.REQUEST.get('pn','1'))-1
                    450:         if nn < 1: #letzte  seite dann kein a tag
1.22      dwinter   451:             return """<img src="../../images/lisePrev.gif" alt="prev" width="14" height="14" border="0"><br>prev"""
1.1       dwinter   452: 
                    453:         else:
                    454:             return """<a href=%s>
1.22      dwinter   455:                          <img src="../../images/lisePrev.gif" alt="prev" width="14" height="14" border="0"><br>prev
1.1       dwinter   456:                          </a>
                    457:                          """%(self.REQUEST['URL']+"?pn="+str(nn))
                    458: 
                    459:     def nextPage(self,url=None):
                    460:         """showlink to the first image"""
                    461:         pages=self.readIndexFile(url)
                    462:         if pages:
                    463:             ln=len(pages)
                    464: 
                    465:         nn = int(self.REQUEST.get('pn','1'))+1
                    466:         if nn>int(ln): #letzte  seite dann kein a tag
1.22      dwinter   467:             return """<img src="../../images/liseNext.gif" alt="next" width="14" height="14" border="0"><br>next"""
1.1       dwinter   468: 
                    469:         else:
                    470:             return """<a href=%s>
1.22      dwinter   471:                          <img src="../../images/liseNext.gif" alt="next" width="14" height="14" border="0"><br>next
1.1       dwinter   472:                          </a>
                    473:                          """%(self.REQUEST['URL']+"?pn="+str(nn))
                    474:         
                    475:     
                    476:     def readIndexFile(self,url=None):
                    477:         """reads the indexfile. presently url not None isn't implemented. In the future url can be defined."""
                    478:         pagelist=[]
                    479:         if not url:
                    480:             url=self.absolute_url()+"/index.xml"
                    481: 
1.21      dwinter   482:         fh=ECHO_helpers.urlopen(url)
1.1       dwinter   483:         dom=xml.dom.minidom.parse(fh)
                    484:         
                    485:         
                    486:         for page in dom.getElementsByTagName('page'):
                    487:             text=getText(page.childNodes)
                    488:             pageNum=page.getAttribute('nr')
1.22      dwinter   489:        fileName=page.getAttribute('file')
                    490:             pagelist.append((pageNum,text,fileName))
1.1       dwinter   491: 
                    492:         return pagelist
1.22      dwinter   493: 
                    494:     def getFileName(self):
                    495:       """getNameOfCurrentFile"""
                    496:       pn=int(self.REQUEST.get('pn','1'))
                    497:       pageinfo=self.readIndexFile()[pn-1]
                    498:       return pageinfo[2]
                    499:    
1.1       dwinter   500:     def createIndexFile(self,RESPONSE=None):
                    501:         """create index file"""
                    502: 
                    503:         
                    504:         pt=PageTemplateFile('Products/ECHO_content/vlp/index_template.zpt').__of__(self)()
                    505: 
                    506: 
                    507:         
                    508:         if not hasattr(self,'index.xml'):
                    509:             zt=ZopePageTemplate('index.xml')
                    510:             self._setObject('index.xml',zt)
                    511:         else:
                    512:             zt=getattr(self,'index.xml')
                    513:             
                    514:             
                    515:         zt.pt_edit(pt, 'text/xml')
                    516: 
                    517:         if RESPONSE is not None:
                    518:             RESPONSE.redirect('manage_main')
                    519: 
                    520:         
                    521: def manage_addVLP_resourceForm(self):
                    522:         """Form for adding a ressource"""
                    523:         pt=PageTemplateFile('Products/ECHO_content/vlp/AddVLP_resourceForm.zpt').__of__(self)
                    524:         return pt()
                    525: 
                    526: 
                    527: 
                    528: def manage_addVLP_resource(self,id,title,label,description,responsible,link,metalink,weight,resourceID=None,contentType=None,renderingType=None,credits=None,coords=None,RESPONSE=None):
                    529:     """addaresource"""
                    530: 
                    531:     
1.2       dwinter   532:     if metalink=='':
                    533:         metalink=self.absolute_url()+"/"+id+"/index_meta"
                    534:             
1.1       dwinter   535:     newObj=VLP_resource(id,link,metalink,resourceID,title,label,description,contentType,renderingType,responsible,credits,weight,coords)
                    536: 
                    537:     self._setObject(id,newObj)
                    538: 
                    539:     if RESPONSE is not None:
                    540:         RESPONSE.redirect('manage_main')
                    541:  

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