def createContent(self): # prevent recursion, if createContent has not been overriden if isinstance(self.parent,BaseController): return self._pspPath = currentPath self.header = HeaderController(self.req,parent=self) self.footer = FooterController(self.req,parent=self) self.nav = NavController(self.req,parent=self) Content = self.overrideContent if not Content: Content = self.nav.getActiveController() try: self.content = Content(self.req,parent=self) except: self.content = ErrorController(self.req,parent=self) if self.findExportTable(self.getField('exportTable'),self.content): return self.nav.updateItem(self.content) if isinstance(self.content,InputController) and self.content.hasInputs(): self.inputHidden = StringToBool(self.getField('filterhide',self.inputHidden)) self.inputBox = InputController.getContent(self.content,filename=InputController._filename,pspPath=InputController._pspPath) self.inputHidden = min(self.inputHidden,self.content.inputHidden,not self.content.hasBadInput) if isinstance(self.content,BaseController): if self.content._filename == self._filename and self.content._pspPath == self._pspPath: # prevent unreadable errors if filename not overriden self.content._filename = None self._extraSheets += self.content._extraSheets #self.testpop = PopUpMenuController(self.req,'eisbock.basis.is',pop=PU.DOWN_RIGHT,items=['eisbock.basis.is','maibock.basis.is','doppelbock.basis.is']) self.header.title = self.getTitle() self.header.inputBox = self.inputBox self.header.inputHidden = self.inputHidden
class BaseController(InputController): """Controller with generic nav/content template""" _title = 'Base Controller' _navTitle = None _filename = 'psp/base.psp' _highlightController = None _status = None def __init__(self, req,createContent=True,parent=None): self._alerts = [] self._splitAlerts = 1 self._extraSheets = [] self._exportTable = None # used in psp self.injectedContent = '' self.content = None self.overrideContent = None self.inputHidden = True self.inputBox = None InputController.__init__(self,req,parent=parent) if isinstance(parent,BaseController): # safe time and increase consistency self.now = self.parent.now self.weekago = self.parent.weekago self.yesterday = self.parent.yesterday self.today = self.parent.today self.testAlerts = self.parent.testAlerts self.debugAlerts = self.parent.debugAlerts else: self.now = datetime.datetime.now() self.today = datetime.datetime( *self.now.timetuple()[0:3] ) self.weekago = self.today-datetime.timedelta(days=7) self.yesterday = self.today-datetime.timedelta(days=1) self.today = self.today self.testAlerts = StringToBool(self.getField('testAlerts')) self.debugAlerts = StringToBool(self.getField('debugAlerts')) BytesToText.setFixed(StringToBool(self.getField('fixedUnit'),default=None,empty=None,none=None)) BytesToText.setShowUnit(StringToBool(self.getField('showUnit',True),default=True,none=None)) BytesToText.setBase(self.getField('baseUnit')) BytesToText.setPrecision(self.getField('precisionUnit')) try: self.testAlerts = int(self.testAlerts) except: pass homePrefix = self.getHomePrefix() baselayout = self.getBaseLayout() self.addStyleSheet(homePrefix+'css/outer-baselayout.css','outer','baselayout','screen',active=baselayout=='outer') self.addStyleSheet(homePrefix+'css/inner-baselayout.css','inner','baselayout','screen',active=baselayout=='inner') self.addStyleSheet(homePrefix+'css/print-baselayout.css','print','baselayout','print') self.addStyleSheet(homePrefix+'css/core.css','std','core') theme = self.getColorTheme() for name,file in _themes: self.addStyleSheet(homePrefix+file,name,'color-theme',active=theme==name) shadows = self.getShadows() if shadows: self.addStyleSheet(homePrefix+'css/half-shadows.css','half','shadows',active=shadows=='half') self.addStyleSheet(homePrefix+'css/full-shadows.css','full','shadows',active=shadows=='full') StandardController._noshadowdops = False else: StandardController._noshadowdops = True if not createContent: return self.preCreate() self.createContent() self.postCreate() def createContent(self): # prevent recursion, if createContent has not been overriden if isinstance(self.parent,BaseController): return self._pspPath = currentPath self.header = HeaderController(self.req,parent=self) self.footer = FooterController(self.req,parent=self) self.nav = NavController(self.req,parent=self) Content = self.overrideContent if not Content: Content = self.nav.getActiveController() try: self.content = Content(self.req,parent=self) except: self.content = ErrorController(self.req,parent=self) if self.findExportTable(self.getField('exportTable'),self.content): return self.nav.updateItem(self.content) if isinstance(self.content,InputController) and self.content.hasInputs(): self.inputHidden = StringToBool(self.getField('filterhide',self.inputHidden)) self.inputBox = InputController.getContent(self.content,filename=InputController._filename,pspPath=InputController._pspPath) self.inputHidden = min(self.inputHidden,self.content.inputHidden,not self.content.hasBadInput) if isinstance(self.content,BaseController): if self.content._filename == self._filename and self.content._pspPath == self._pspPath: # prevent unreadable errors if filename not overriden self.content._filename = None self._extraSheets += self.content._extraSheets #self.testpop = PopUpMenuController(self.req,'eisbock.basis.is',pop=PU.DOWN_RIGHT,items=['eisbock.basis.is','maibock.basis.is','doppelbock.basis.is']) self.header.title = self.getTitle() self.header.inputBox = self.inputBox self.header.inputHidden = self.inputHidden def getContent(self,filename=None,pspPath=None): if self._exportTable: self._exportTable.__class__ = CVSTableController return self._exportTable return InputController.getContent(self,filename,pspPath) def findExportTable(self,exportTable,object): if type(object) == list: items = object elif type(object) == dict: items = object.values() else: items = vars(object).values() for item in items: if isinstance(item,TableController): item.setExportable(True) if exportTable and item.getName() == exportTable: self._exportTable = item return True elif type(item) in (list,dict) and self.findExportTable(exportTable,item): return True return False def getControllerByURI(self,notFound=NotFoundController,forbidden=ForbiddenController,overrideFound=None): filename=os.path.abspath(self.req.filename+self.req.path_info) if _uri2Controller[filename]: items = _uri2Controller[filename] for item in items: if item.accessLevel and not self.getAccessLevel() & item.accessLevel: continue if item.controller: if overrideFound != None: return overrideFound return item.controller return forbidden return NotFoundController def getSuffix(self,cwd=None): if not cwd: cwd = currentPath prefix = os.path.commonprefix((cwd,rootPath)) rootSuffix = rootPath.replace(prefix,'') #cwdSuffix = cwd.replace(prefix,'') suffix = rootSuffix+(self.req.filename+self.req.path_info).replace(rootPath,'') return ('../'*suffix.count('/'))+suffix def getHomePrefix(self,cwd=None): if not cwd: cwd = currentPath prefix = os.path.commonprefix((cwd,rootPath)) rootSuffix = rootPath.replace(prefix,'') cwdSuffix = cwd.replace(prefix,'') suffix = rootSuffix+(self.req.filename+self.req.path_info).replace(rootPath,'') return ('../'*suffix.count('/'))+cwdSuffix def homePrefixIt(self,string,cwd=None): return os.path.normpath(self.getHomePrefix(cwd)+string) def getBasepath(self): uri=os.path.dirname(self.req.parsed_uri[apache.URI_PATH]) path=os.path.abspath(uri+'/'+self.getHomePrefix()+'/..') return path def getControllerURI(self,controller,fail=None,homePrefix=True): if not _controller2URI.has_key(controller) and fail: return fail assert(_controller2URI.has_key(controller) and _controller2URI[controller].uri) if not homePrefix: return _controller2URI[controller].uri return self.getHomePrefix(_controller2URI[controller].root)+_controller2URI[controller].uri def getTitle(self,active=False,reverseOrder=False,navTitle=False): content = self.content if navTitle and self._navTitle: return self._navTitle if isinstance(content,BaseController) and content.getTitle() != self._title: if reverseOrder: return '%s - %s' % (content.getTitle(),self._title) return '%s - %s' % (self._title, content.getTitle()) return self._title def getRegisteredControllers(self): return _controller2URI.values() def getToggleClass(self,id,value): name = id+'.'+value hideValue = self.getField(name) hideValue = self.getCookie(name,hideValue,init=True,force=True) if hideValue and hideValue != '0': return value return '' def getPrintLayout(self): return StringToBool(self.getField('printLayout')) def getBaseLayout(self,value=None,validate=False): if validate: if value not in ('inner','outer'): if self.getBrowserVersion()[0] == 'MSIE': #and self.getBrowserVersion()[1] < 7.0: return 'inner' return 'outer' return value return self.processSetting('baselayout-sheet',self.getBaseLayout) def getColorTheme(self,value=None,validate=False): if validate: names = map(lambda x:x[0],_themes)+[False] if value not in names: return 'default' return value return self.processSetting('color-theme-sheet',self.getColorTheme,true='default') def getShadows(self,value=None,validate=False): if validate: if value not in ('full','half',False): if self.getBrowserVersion()[0] == 'MSIE': if self.getBrowserVersion()[1] >= 7.0: return 'full' return False value = 'half' return value return self.processSetting('shadows-sheet',self.getShadows,true='full') def processSetting(self,name,validator,true=True): value = self.getField(name) if value==None and self.getCookie(name) != None: value = self.getCookie(name) self.deleteCookie(name) if value==None: value = self.getSessionValue(name) value = StringToBool(value,default=None,none=None,true=true) value = validator(value,validate=True) self.setSessionValue(name,value) return value def addStyleSheet(self,sheetHref,sheetId=None,sheetClass='general',sheetMedia='screen, print',active=None): if not sheetId: sheetId = sheetHref.split('/')[-1].split('.')[0] if self.getPrintLayout(): sheetMedia = sheetMedia.replace('screen','noscreen').replace('print','screen') if active == None: active=True sheetRel = 'stylesheet' sheetMisc = '' if not active: sheetRel = 'alternate stylesheet' sheetMisc = 'title="%s-%s"' % (sheetId,sheetClass) self._extraSheets.append( (sheetRel, sheetHref,sheetId+'-'+sheetClass,sheetClass,sheetMedia,sheetMisc) ) def createAlerts(self,local=False): pass def getAlerts(self,local=False): self.createAlerts(local) if local: dt = datetime.datetime.now()-self.now time = dt.seconds+dt.microseconds/10.0**6 c = 'good' if time >= 0.5 and time < 1.0: c = 'poor' elif time >= 1.0: c = 'bad' self.addDebug('%s - Creation Time: <span class="varible %s">%3.2f sec</span>' % (self.getControllerURI(self.__class__,'Unknown',False).title(), c, time)) return self._alerts def addDebug(self,message): self.addAlert(True,'D',message) def addMessage(self,message,shown=True): if shown: self.addAlert(True,'I',message) def addAlert(self,condition,severity,message,priority=None): if self.testAlerts: if condition: message += ' <span class="alertTrue">True</span>' else: message += ' <span class="alertFalse">False</span>' if severity == 'D' and not self.debugAlerts: return if condition or self.testAlerts: alert = {} alert['severity'] = severity alert['message'] = message alert['priority'] = priority self._alerts.append(alert) def getAccessLevel(self,default=0): return self.getSessionValue('accessLevel',default) def setStatus(self,status): self._status = status def getStatus(self): if not self._status: return '' return self._status def getNavItems(self,ignoreAccess=False): global _navItems items = [] for item in _navItems: if not ignoreAccess and item.accessLevel and not self.getAccessLevel() & item.accessLevel: continue items.append(item) return items