224 lines
9.4 KiB
Python
Executable file
224 lines
9.4 KiB
Python
Executable file
#!/usr/bin/env python
|
||
# -*- coding: iso-8859-15 -*-
|
||
# #############################################################
|
||
# ..
|
||
# .... ............ ........
|
||
# . ....... . .... ..
|
||
# . ... .. .. .. .. ..... . ..
|
||
# .. .. ....@@@. .. . ........ .
|
||
# .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. ....
|
||
# .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... ....
|
||
# @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. ..
|
||
# .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. .....
|
||
# ...@@@.... @@@ .@@.......... ........ ..... ..
|
||
# . ..@@@@.. . .@@@@. .. ....... . .............
|
||
# . .. .... .. .. . ... ....
|
||
# . . .... ............. .. ...
|
||
# .. .. ... ........ ... ...
|
||
# ................................
|
||
#
|
||
# #############################################################
|
||
# Intranet.py
|
||
#
|
||
# Classe Intranet, clase de base de l'intranet
|
||
#
|
||
# Copyright (c) 2006 by www.crans.org
|
||
# #############################################################
|
||
import crans.cp as _crans_cp
|
||
import cherrypy, os, sys
|
||
make_path = os.path.join
|
||
import crans.utils.exceptions
|
||
from ClassesIntranet.AuthorisationsManager import setDroits
|
||
from crans.mail import quickSend
|
||
|
||
class Intranet:
|
||
# ######################################################## #
|
||
# GESTION DES MODULES #
|
||
# ######################################################## #
|
||
#
|
||
#
|
||
_loaded_modules = {}
|
||
|
||
def _make_static_path_for_module(self, module_name ):
|
||
return make_path("/", module_name, "static")
|
||
|
||
def loadModule(self, un_module):
|
||
MODULES_DIR = cherrypy.config.get("crans.modules.dir")
|
||
if not (un_module.startswith(".") or un_module.startswith("_")):
|
||
# faire ici l'importation
|
||
# importer le fichier main.py
|
||
try:
|
||
#module_path = MODULES_DIR + un_module + "/main"
|
||
module_path = make_path(un_module, "main")
|
||
# import n'aime pas les chemins absolus !!
|
||
mon_module = __import__(module_path)
|
||
module_root = mon_module.main()
|
||
# on ajoute la classe a l'arborescence de cherrypy :
|
||
setattr( self, un_module, module_root)
|
||
try:
|
||
# on ajoute le module aux modules connus
|
||
cat = module_root.category()
|
||
if not self._loaded_modules.has_key(cat):
|
||
self._loaded_modules[cat] = {}
|
||
self._loaded_modules[cat][un_module] = module_root
|
||
# on ajoute les droits du module :
|
||
droits_module = module_root.droits()
|
||
setDroits("/%s" % un_module, droits_module)
|
||
except:
|
||
if cherrypy.config.get("server.environment") == "development":
|
||
_crans_cp.log("Impossible d'obtenir les parametres du module %s" % un_module)
|
||
_crans_cp.log(crans.utils.exceptions.formatExc())
|
||
except:
|
||
_crans_cp.log("Impossible de charger le module %s" % un_module)
|
||
_crans_cp.log(crans.utils.exceptions.formatExc())
|
||
# ajouter le dossier static ou il faut
|
||
staticPath = make_path(MODULES_DIR, un_module, "static")
|
||
if os.path.isdir(staticPath):
|
||
settings= { self._make_static_path_for_module(un_module):
|
||
{ 'sessionAuthenticateFilter.on': False,
|
||
'sessionFilter.on': False,
|
||
'server.output_filters.templatesEngine.on' : False,
|
||
'staticFilter.on': True,
|
||
'staticFilter.dir': staticPath,
|
||
}
|
||
}
|
||
cherrypy.config.update(settings)
|
||
if cherrypy.config.get("server.environment") == "development":
|
||
_crans_cp.log("New static : %s" % staticPath)
|
||
# fin de l'ajout du dossier static
|
||
|
||
|
||
def __init__(self):
|
||
##
|
||
#### import automatique des modules
|
||
##
|
||
MODULES_DIR = cherrypy.config.get("crans.modules.dir", False)
|
||
if MODULES_DIR:
|
||
if os.path.isdir(MODULES_DIR):
|
||
sys.path.append(MODULES_DIR)
|
||
Liste_Modules = os.listdir(MODULES_DIR)
|
||
for un_module in Liste_Modules:
|
||
if un_module != "CVS":
|
||
self.loadModule(un_module)
|
||
else:
|
||
_crans_cp.log("Dossier des modules invalide", 'LOADING', 2)
|
||
else:
|
||
_crans_cp.log("Pas de dossier de modules", 'LOADING', 2)
|
||
|
||
|
||
# ######################################################## #
|
||
# QUELQUES PAGES #
|
||
# ######################################################## #
|
||
#
|
||
#
|
||
def index(self):
|
||
items = {}
|
||
for a_category in self._loaded_modules:
|
||
items[a_category] = {}
|
||
for a_module_name in self._loaded_modules[a_category]:
|
||
module_object = self._loaded_modules[a_category][a_module_name]
|
||
if module_object.accessible():
|
||
items[a_category][a_module_name] = {}
|
||
items[a_category][a_module_name]["name"] = module_object.title()
|
||
items[a_category][a_module_name]["icon"] = self._make_static_path_for_module(a_module_name) + "/" + module_object.icon()
|
||
items[a_category][a_module_name]["url"] = "/" + a_module_name + "/"
|
||
# si la categorie est vide, on la vire
|
||
if items[a_category] == {}:
|
||
del items[a_category]
|
||
|
||
return {
|
||
'template':'accueil',
|
||
'values':{"modules":items},
|
||
'stylesheets':['css/accueil.css'],
|
||
}
|
||
index.exposed= True
|
||
|
||
def info(self):
|
||
return {
|
||
'template':'info-diverses',
|
||
'values':{},
|
||
'stylesheets':['accueil.css'],
|
||
}
|
||
info.exposed = True
|
||
|
||
def send_error_repport(self, **kw):
|
||
|
||
# on récupère tout de suite le traceback
|
||
tb = crans.utils.exceptions.formatExc()
|
||
# entêtes du mail
|
||
exp = "intranet"
|
||
dest = cherrypy.config.get("mail.bugreport", "nounous@crans.org")
|
||
subject = "Rapport de Bug"
|
||
text = """
|
||
Bonsoir,
|
||
|
||
Ceci est un rapport de bug envoye par l'intranet.
|
||
|
||
%s
|
||
""" % "\n".join( [ "%s: %s" % (str(a), str(kw[a])) for a in kw] )
|
||
|
||
#On ajoute des variables de cherrypy
|
||
text += "\n= Cherrypy vars =\n"
|
||
try:
|
||
text += "url: %s\n" % cherrypy.request.browser_url
|
||
except:
|
||
pass
|
||
try:
|
||
text += "headers: \n %s\n" % "\n".join( [" %s: %s" % (str(a), str(cherrypy.request.headers[a])) for a in cherrypy.request.headers] )
|
||
except:
|
||
pass
|
||
try:
|
||
text += "query_string: %s\n" % cherrypy.request.query_string
|
||
except:
|
||
pass
|
||
try:
|
||
text += "path: %s\n" % cherrypy.request.path
|
||
except:
|
||
pass
|
||
|
||
|
||
# on ajoute le traceback
|
||
text += "\n= Traceback =\n"
|
||
text += tb
|
||
|
||
#on signe, quand même !
|
||
text += "\n-- \nRoot.py pour l'intranet\n"
|
||
|
||
quickSend(exp, dest, subject, text)
|
||
return self.index()
|
||
|
||
send_error_repport.exposed = True
|
||
|
||
def testErreur(self):
|
||
raise Exception, "sdlfkjqmsdklj"
|
||
|
||
testErreur.exposed = True
|
||
|
||
def test(self):
|
||
return cherrypy.request.remote_addr
|
||
test.exposed = True
|
||
|
||
def _cp_on_http_error(self, status, message):
|
||
if (cherrypy.config.configMap["global"]["server.environment"] == "development") or 1:
|
||
cherrypy._cputil._cp_on_http_error(status, message)
|
||
return
|
||
if status==403:
|
||
cherrypy.response.body = {
|
||
'template':'error403',
|
||
'values':{'status':status, 'message':message },
|
||
'standalone':False,
|
||
}
|
||
elif status==404:
|
||
cherrypy.response.body = {
|
||
'template':'error',
|
||
'values':{'status':status, 'message':message },
|
||
'standalone':False,
|
||
}
|
||
elif status==500:
|
||
self.send_error_repport(status = status, message = message )
|
||
# les filtres ne sont pas appliqués, on le fait àla main...
|
||
from TemplatesManager import TemplatesFilter
|
||
TemplatesFilter().goWithThisDict({'template':'error', 'values':{'status':status, 'message':message }})
|
||
else:
|
||
self.send_error_repport(status = status, message = message)
|
||
cherrypy._cputil._cp_on_http_error(status, message)
|