Esempio n. 1
0
	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
Esempio n. 2
0
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