예제 #1
0
class PyBack:
	
	# C'est le point d'entrée du programme.
	def run(self):
		self.load() # Load les controllers/models/...
		self.Routing = Routing(self.controllers)
		self.Server = Server(self.Routing, self.databaseConfig)
		self.init() # S'occupe d'initialiser les controllers/models/...
		self.Server.run()
		
	
	####################################################################
	#	   Chargement des configs/models/controllers/compnents         #
	####################################################################
	
	def load(self):
		self.loadConfig()
		self.loadModels()
		self.loadComponents()
		self.loadController()
		
		
	# Charge et instancie les models contenu dans App/Models
	# Pour cela on ajoute le dossier App/Model au PATH et ensuite on liste
	# l'ensemble des fichiers .py pour pouvoir charger à la volé les models.
	# Cette method instancie les models
	def loadModels(self):
		self.models = {}
		sys.path.append("App/Models/")
		filesModel = glob.glob("App/Models/*.py")
		for f in filesModel:
			f = f.replace(".py", "")
			f = f.split("/")
			_className = f[len(f)-1]
			_class = getattr(__import__(_className), _className)
			_className = _className.replace("Model", "")
			self.models[_className] = _class()
	
	
	# Charge les components contenus dans App/Controllers/Components
	# Comme pour models sauf que les components ne sont pas instancié
	def loadComponents(self):
		self.components = {}
		sys.path.append("App/Controllers/Components")
		filesComponents = glob.glob("App/Controllers/Components/*.py")
		for f in filesComponents:
			f = f.replace(".py", "")
			f = f.split("/")
			_className = f[len(f)-1]
			_class = getattr(__import__(_className), _className)
			self.components[_className] = _class
	
	
	# Charge l'ensemble des controllers. Comme les models, les controllers
	# sont persistants tout au long du programme.
	def loadController(self):
		self.controllers = {}
		sys.path.append("App/Controllers/")
		filesController = glob.glob("App/Controllers/*.py")
		for f in filesController:
			f = f.replace(".py", "")
			f = f.split("/")
			_className = f[len(f)-1]
			_class = getattr(__import__(_className), _className)
			_className = _className.replace("Controller", "")
			self.controllers[_className] = _class(self.models, self.components)
	

	# S'occupe d'appeller les fonctions qui chargent les informations
	# de configuration. 
	# S'occupe d'enregistrer ces configurations dans des attributs de la
	# classe.
	# 
	# @param config Instance de la classe contenant les configurations
	# @return Dictionnaire contenant les infos de connexion de la DB
	def loadConfig(self):
		sys.path.append("App/Config/")
		_class = getattr(__import__("Config"), "Config")
		_config = _class()
		self.databaseConfig = self.loadDatabaseConfig(_config)
		self.networkConfig = self.loadNetworkConfig(_config)
		self.logsConfig = self.loadLogsConfig(_config)
		self.logEmailConfig = self.loadLogEmailConfig(_config)


	# Charge les informations de la base de données. Si certaines infos
	# ne sont pas fournies c'est celle par default qui seront utilisées
	# 
	# @param config Instance de la classe contenant les configurations
	# @return Dictionnaire contenant les infos de connexion de la DB
	def loadDatabaseConfig(self, config):
		_config = {
			"driver": "mysql", 
			"host": "localhost", 
			"username": "******", 
			"password": "", 
			"database": "pyBack", 
			"prefix": ""
			}
		_config.update(config.database())
		return _config

		
	# Charge les informations pour les sockets. Si certaines infos ne 
	# sont pas fournies c'est les infos par default qui seront choisies
	# 
	# @param config Instance de la classe contenant les configurations
	# @return Dictionnaire contenant les infos du réseau
	def loadNetworkConfig(self, config):
		_config = {
			"port": "8080",
			"listen": 5
			}
		_config.update(config.network())
		return _config
	
	def loadLogsConfig(self, config):
		_config = {
			"env": "prod",
			"folder": "./",
			"file": "logpyback.log"
			}
		_config.update(config.logs())
		return _config
	
	
	# Charge les emails auquels doivent-être envoyés les mails des logs
	# 
	# @param config Instance de la classe contenant les configurations
	# @return Dictionnaire contenant les emails pour les logs
	def loadLogEmailConfig(self, config):
		_config = {}
		_config.update(config.logEmail())
		return _config
		
	
	####################################################################
	#	   Init des controllers 									   #
	####################################################################
	
	# S'occupe d'envoyer au controller l'objet Server.
	def init(self):
		for key in self.controllers:
			getattr(self.controllers[key], 'setInfos')(self.Server)
	
	####################################################################
	#	  Tools for testing                                            #
	####################################################################
	
	# Permet d'afficher les configurations pour les tests
	def writeConfig(self):
		print self.databaseConfig
		print self.networkConfig
		print self.logsConfig
		print self.logEmailConfig