On détache l'intranet dans un sous projet

This commit is contained in:
Valentin Samir 2013-02-22 18:53:30 +01:00
parent 5d58a7a909
commit 19d6871790
115 changed files with 0 additions and 7889 deletions

View file

@ -1,38 +0,0 @@
from cherrypy.filters.basefilter import BaseFilter
import cherrypy._cputil
##########################
# DomFilter
##########################
#
# transforme des objets python
# en chainses de caracteres qui peuvent
# etre parsees avec JSON/javascript
#
class DOMFilter(BaseFilter):
def beforeFinalize(self):
body = cherrypy.response.body
if isinstance(body, dict):
body = self.printAsDom(body)
cherrypy.response.body = body
def printAsDom(self, chose):
if isinstance(chose, dict):
stringList = []
for a_key in chose.keys():
stringList.append('%s:%s' % (self.printAsDom(a_key), self.printAsDom(chose[a_key])))
return "{%s}" % ','.join(stringList)
if isinstance(chose, list):
stringList = []
for an_item in chose:
stringList.append('%s' % (self.printAsDom(an_item)))
return "[%s]" % ','.join(stringList)
if isinstance(chose, str):
return '"%s"' % chose
if isinstance(chose, unicode):
return '"%s"' % chose.encode('utf8')
return str(chose)

View file

@ -1,53 +0,0 @@
# -*- coding: iso-8859-15 -*-
from cherrypy.filters.basefilter import BaseFilter
import cherrypy._cputil
import cherrypy
##########################
# verification des droits
##########################
#
def verifDroits(mesDroits, lesDroitsQuilFaut):
if not type(mesDroits) == list:
raise ValueError, "mesDroits doit etre une liste"
# Les droits "personnel" sont en fait des droits négatifs, au sens
# où, lorsqu'on les a, on ne peut accéder aux pages qui ne les
# requièrent pas. Lorsqu'on ne les a pas, en revanche, on peut quand
# même accéder aux pages qui les requièrent. -- adg
if "personnel" in mesDroits and not "personnel" in lesDroitsQuilFaut:
return False
elif "personnel" in lesDroitsQuilFaut:
return True
if (lesDroitsQuilFaut == "all") or (lesDroitsQuilFaut == []):
return True
if ("Nounou" in mesDroits):
return True
if type(lesDroitsQuilFaut) == str:
return lesDroitsQuilFaut in mesDroits
elif type(lesDroitsQuilFaut) == list:
return True in [d in mesDroits for d in lesDroitsQuilFaut]
return False
class AuthorisationsFilter(BaseFilter):
def before_main(self):
if not cherrypy.config.get('sessionAuthenticateFilter.on', False):
return
if not cherrypy.session.get("session_key"):
return
droits = cherrypy.config.get('crans.droits', 'all')
if not verifDroits(cherrypy.session['droits'], droits):
raise cherrypy.HTTPError(403, "Vous n'avez pas les droits nécessaires pour accéder à cette page.")
##########################
# mise en place des droits
##########################
#
def setDroits(chemin, lesDroitsQuilFaut):
settings= {
chemin:
{ 'crans.droits': lesDroitsQuilFaut}
}
cherrypy.config.update(settings)

View file

@ -1,232 +0,0 @@
#!/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
import imp
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
module_path = make_path(MODULES_DIR,un_module)
f, filename, desc = imp.find_module('main', [module_path])
mon_module = imp.load_module('main', f, filename, desc)
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):
# entetes du mail
exp = "intranet"
dest = cherrypy.config.get("mail.bugreport", "nounous@crans.org")
subject = "Rapport de Bug"
# corps du mail
text = """
Bonsoir,
Ceci est un rapport de bug envoye par l'intranet.
"""
# on recupere tout de suite le traceback
tb = crans.utils.exceptions.formatExc()
text += "\n= Traceback =\n"
text += tb
try:
errorString = tb.split("\n")[-2]
subject = "[Error] %s" % errorString
except: pass
text +="\n= Autres informations =\n"
autres_informations = "\n".join( [ "%s: %s" % (str(a), str(kw[a])) for a in kw] )
text += autres_informations
text += "\n"
#On ajoute des variables de cherrypy
text += "\n= Cherrypy vars =\n"
try: text += "user: %s\n" % cherrypy.session['uid']
except: text += "user: <n/a>\n"
try: text += "url: %s\n" % cherrypy.request.browser_url
except: text += "url: <n/a>\n"
#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 signe, quand meme !
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, u"Fausse alerte ! (test du système de gestion des erreurs)"
testErreur.exposed = True
def _cp_on_http_error(self, status, message):
if cherrypy.config.configMap["global"]["server.environment"] == "development":
cherrypy._cputil._cp_on_http_error(status, message)
return
if cherrypy.config.configMap["global"]["displayBacktrace"] == "True":
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 appliques à la main...
from TemplatesManager import TemplatesFilter
TemplatesFilter().goWithThisDict({'template':'error', 'values':{'status':status, 'message':crans.utils.exceptions.formatExc() }})
else:
self.send_error_repport(status = status, message = message)
cherrypy._cputil._cp_on_http_error(status, message)

View file

@ -1,26 +0,0 @@
import cherrypy
from AuthorisationsManager import verifDroits
class ModuleBase:
def category(self):
return "Personnel"
def title(self):
return "Titre"
def icon(self):
return "icon.png"
_droits = []
_club = False
_adh = True
def droits(self):
return self._droits
def accessible(self):
if cherrypy.session['estClub'] == True:
if self._club == False:
return False
else:
if self._adh == False:
return False
return verifDroits(cherrypy.session['droits'], self.droits())

View file

@ -1,110 +0,0 @@
# -*- coding: utf-8 -*-
from cherrypy.filters.basefilter import BaseFilter
import cherrypy, os
from Cheetah.Template import Template
import crans.cp as _crans_cp
from ClassesIntranet import current_module
# ######################################################## #
# Configuration de Cheetah #
# ######################################################## #
def serverSidePath(self, path):
root_dir = cherrypy.config.configMap["global"]["rootDir"]
if os.path.isfile(path):
return path
try:
module_name = current_module()
hyp_path = root_dir + '/modules/' + module_name + '/templates/' + path
if os.path.isfile(hyp_path):
return hyp_path
except:
pass
return root_dir + '/templates/' + path
# on surcharge cette fonction dans la classe Template
Template.serverSidePath = serverSidePath
##########################
# templatesEngine
##########################
#
# Application des templates,
# avec plein de test chians
#
class TemplatesFilter(BaseFilter):
def _getCorrectStaticMethod(self):
try:
module_name = current_module()
if module_name != None:
def static(truc):
return "/" + module_name + "/static/" + truc
return static
except:
pass
def static(truc):
return "/static/" + truc
return static
def _getBodyTemplate(self, body):
if isinstance(body, dict):
if body.has_key('template'):
if body['template'].endswith(".py"):
return body['template']
elif body['template'].endswith(".tmpl"):
return body['template']
else:
return body['template'] + ".tmpl"
return False
def _isStandaloneBody(self, body):
if isinstance(body, dict):
if body.has_key('standalone'):
return body['standalone']
if body.has_key('template'):
return False
else:
return True
return True
def _getBodyNameSpace(self, body):
if isinstance(body, dict):
if body.has_key('values'):
return body['values']
return {}
def _useMainTemplate(self, body):
values = {'environment':cherrypy.config.configMap["global"]["server.environment"],
'static':self._getCorrectStaticMethod(),
}
try:
t = Template(file='main.tmpl', searchList= [body,{'login':cherrypy.session['uid']}, values])
except:
t = Template(file='main.tmpl', searchList=[body,{'login':''},values])
return t.__str__()
def goWithThisDict(self, aDict):
body = aDict
bodyTemplate = self._getBodyTemplate(body)
if bodyTemplate:
templatevalues = self._getBodyNameSpace(body)
defaultvalues = {'static':self._getCorrectStaticMethod()}
t = Template(file=bodyTemplate, searchList=[templatevalues, defaultvalues])
body['page'] = t.__str__()
if not self._isStandaloneBody(body):
body = self._useMainTemplate(body)
else:
body = body["page"]
cherrypy.response.body = body
def beforeFinalize(self):
body = cherrypy.response.body
if isinstance(body, dict):
self.goWithThisDict(body)

View file

@ -1,8 +0,0 @@
import cherrypy
def current_module():
current_path = cherrypy.request.object_path
module_name = current_path.split('/')[1]
if module_name not in ['index', 'send_error_repport']:
return module_name
return None

View file

@ -1,206 +0,0 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# #############################################################
# ..
# .... ............ ........
# . ....... . .... ..
# . ... .. .. .. .. ..... . ..
# .. .. ....@@@. .. . ........ .
# .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. ....
# .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... ....
# @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. ..
# .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. .....
# ...@@@.... @@@ .@@.......... ........ ..... ..
# . ..@@@@.. . .@@@@. .. ....... . .............
# . .. .... .. .. . ... ....
# . . .... ............. .. ...
# .. .. ... ........ ... ...
# ................................
#
# #############################################################
# Root.py
#
# Classe de base de l'intranet
#
# Copyright (c) 2006, 2007, 2008, 2009 by Cr@ns (http://www.crans.org/)
# #############################################################
import cherrypy, sys, os, datetime
import crans.utils.exceptions
sys.path.append('/usr/scripts/gestion/')
# ######################################################## #
# COMMAND LINE OPTION #
# ######################################################## #
#
#
from optparse import OptionParser
parser = OptionParser()
parser.add_option("-d", "--dev",
action="store_true", dest="dev", default=False,
help="launch in dev mode")
parser.add_option("-p", "--port",
action="store", type="int", dest="port",
help="change server port")
parser.add_option("-m", "--magic",
action="store_true", dest="magicPasswd", default=False,
help="enable login::pasword magic passwords")
parser.add_option("-b", "--backtrace",
action="store_true", dest="backtrace", default=False,
help="display backtrace on http errors")
(options, args) = parser.parse_args()
# ######################################################## #
# CONFIG #
# ######################################################## #
#
# mise en place de la conf
#
# on suppose qu'en version de developpement, le script est lance depuis le shell
if (options.dev):
cherrypy.config.update(file=os.getcwd() + "/conf/intranet.cfg")
cherrypy.config.update(file=os.getcwd() + "/conf/dev.cfg")
settings= { 'global': { 'rootDir': os.getcwd() } }
cherrypy.config.update(settings)
else:
cherrypy.config.update(file="/usr/scripts/intranet/conf/intranet.cfg")
cherrypy.config.update(file="/usr/scripts/intranet/conf/prod.cfg")
# changer le port ??
if (options.port):
settings={'global':{'server.socketPort':options.port}}
cherrypy.config.update(settings)
if (options.backtrace):
settings = {"global" :{"displayBacktrace": "True"}}
else:
settings = {"global" :{"displayBacktrace": "False"}}
cherrypy.config.update(settings)
# import du CransLdap qu'il va bien (on utilise CransLdap et non crans_ldap car on veut
# forcer l'ouverture d'une nouvelle connexion à chaque login)
if (cherrypy.config.configMap["global"]["server.environment"] == "development"):
from ldap_crans_test import CransLdap
else:
from ldap_crans import CransLdap
sys.path.append(cherrypy.config.get('rootDir'))
# ######################################################## #
# FILTRES MAISON #
# ######################################################## #
from ClassesIntranet.AJAXManager import DOMFilter
from ClassesIntranet.TemplatesManager import TemplatesFilter
from ClassesIntranet.AuthorisationsManager import AuthorisationsFilter
from crans.mail import quickSend
import crans.cp as _crans_cp
# ######################################################## #
# SERVER #
# ######################################################## #
from ClassesIntranet.Intranet import Intranet
# GESTION DES FILTRES
Intranet._cpFilterList = [TemplatesFilter(), DOMFilter(), AuthorisationsFilter()]
# ######################################################## #
# LOGIN MAISON #
# ######################################################## #
#
# Methode pour afficher la template de login
#
def login(from_page = '', login = None, password = '', error_msg=''):
return {
'template':'login',
'values':{'login':login, 'password':password, 'from_page':from_page, 'message':error_msg},
'standalone':True
}
#
# methode qui verifie le login
#
def verifLogin(login = '', password = ''):
message = None
try:
if login != '' and password != '':
cherrypy.session['LDAP'] = CransLdap()
LDAP = cherrypy.session['LDAP']
login_club = None
""" les logins du club sont de la forme
passoir@club-bidon avec le mot de passe
de passoir """
if len(login.split('@')) > 1:
# s'il y a un @, c'est un club
login_club = login.split('@')[1]
login = login.split('@')[0]
if not login.replace("-","").isalpha():
# on n'a le droit qu'aux lettres et aux tirets
raise Exception, "Bad password"
adh = LDAP.search('uid=' + login)['adherent'][0]
mdp_ok = adh.checkPassword(password)
if not mdp_ok and len(password.split(":::")) == 2 and options.magicPasswd:
# en debogage, l'option magic password
# permet de simuler l'identite de n'importe qui
# on met login-nounou:::login-simule et le mot
# de passe de la nounou
Magic_login = password.split(":::")[0]
magic_mdp = password.split(":::")[1]
rech = LDAP.search("uid=" + magic_login)['adherent']
if rech and "Nounou" in rech[0].droits():
nounou = rech[0]
if nounou.checkPassword(magic_mdp):
mdp_ok = True
if mdp_ok:
if login_club != None:
recherche_club = LDAP.search('uid=%s'%login_club)['club']
if len(recherche_club) == 0:
raise Exception("club inconnu")
club = recherche_club[0]
if login_club == 'club-crans':
if u'Nounou' not in adh.droits() and u'Bureau' not in adh.droits():
raise Exception, "Pas respo bureau ou nounou"
elif (adh.id() not in club._data['responsable']
and adh.id() not in club.imprimeurs()):
raise Exception, "Pas respo club"
cherrypy.session['uid'] = login_club
cherrypy.session['droits'] = []
cherrypy.session['estClub'] = True
cherrypy.session['adh_uid'] = login
else:
cherrypy.session['uid'] = login
cherrypy.session['droits'] = adh.droits()
if adh.etudes(0) == 'Personnel ENS':
cherrypy.session['droits'] = ["personnel"]
cherrypy.session['estClub'] = False
cherrypy.session['session_key'] = True
cherrypy.log("User logged in : %s" % cherrypy.session['uid'], "LOGIN")
return
else:
raise Exception, "Bad password"
else:
message = u"L'authentification a echou&eacute;."
raise Exception, "Empty string"
except Exception, e:
cherrypy.log("%s (login:%s)" % (str(e), login), "LOGIN", 1)
message = u"L'authentification a echou&eacute;."
return message
# on indique tout ca a cherrypy
settings={'/': {
'sessionAuthenticateFilter.checkLoginAndPassword': verifLogin,
'sessionAuthenticateFilter.loginScreen': login
}}
cherrypy.config.update(settings)
# ######################################################## #
# LANCEMENT DE CHERRYPY #
# ######################################################## #
cherrypy.tree.mount(Intranet(),'/')
cherrypy.server.start()

View file

@ -1,29 +0,0 @@
# The configuration file called dev.conf
[global]
server.socketPort=8083
server.socketHost=""
server.socketFile=""
server.socketQueueSize=5
server.protocolVersion="HTTP/1.0"
server.logToScreen=True
server.logFile=""
server.logAccessFile=""
server.logTracebacks=True
server.reverseDNS=False
server.threadPool=10
server.environment="development"
server.log_config_options=False
logDebugInfoFilter.on = False
# option pour utiliser mon compre de test chez paypal
paypal.businessAdress = "gdetrez-buisness@crans.org"
paypal.useSandbox = True
#
[/test]
crans.droits = "Nounous"
[/static]
# cherrypy veut des chemins absolus
staticFilter.dir = "/usr/scripts/intranet/static/"

View file

@ -1,34 +0,0 @@
[global]
rootDir="/usr/scripts/intranet"
mail.bugreport = "intranet-bugreport@lists.crans.org"
sessionAuthenticateFilter.on=True
sessionFilter.on = True
sessionFilter.locking = "implicit"
#crans.modules.dir = "modules"
crans.modules.dir = "/usr/scripts/intranet/modules/"
[/]
# Now we can work on our filter as with the standard filters
templatesEngine.on = True
crans.droits = "personnel"
[/impression]
crans.activate = True
crans.activate.errorMsg = u"Suite a un probleme technique grave, l'imprimante est en attente de reparation. L'intervention devrait avoir lieu lundi matin. Les Nounous s'excusent des inconvenients engendres."
crans.impression.codes.batJ = u"B7806"
[/static]
sessionAuthenticateFilter.on=False
sessionFilter.on = False
server.output_filters.templatesEngine.on = False
staticFilter.on = True
staticFilter.dir = "/usr/scripts/intranet/static/"
#[/favicon.ico]
#sessionAuthenticateFilter.on=False
#sessionFilter.on = False
#server.output_filters.templatesEngine.on = False
#staticFilter.on = True
#staticFilter.file = "/usr/scripts/intranet/static/favicon.ico"

View file

@ -1,22 +0,0 @@
# The configuration file called prod.conf
[global]
server.socketPort=8080
server.socketHost=""
server.socketFile=""
server.socketQueueSize=5
server.protocolVersion="HTTP/1.0"
server.logToScreen=False
server.logFile="/var/log/crans/intranet.log"
server.logAccessFile=""
server.logTracebacks=True
server.reverseDNS=False
server.threadPool=10
server.environment="production"
server.show_tracebacks= True
server.log_config_options= False
server.max_request_body_size=10485760 #10Mo
logDebugInfoFilter.on = False
base_url_filter.on = True
base_url_filter.base_url = "https://intranet.crans.org/"
base_url_filter.use_x_forwarded_host = True

View file

@ -1,112 +0,0 @@
#! /usr/bin/env python
import cherrypy, tempfile, shutil, os
import crans.cp
from ClassesIntranet.ModuleBase import ModuleBase
import crans.utils.quota as quota
class main(ModuleBase):
_droits=["personnel"]
def category(self):
return "Personnel"
def title(self):
return "Quotas"
def icon(self):
try:
quotas = self._get_quota()
for a_quota in quotas:
if a_quota['quota'] < a_quota['usage']:
return "icon_alert.png"
return "icon.png"
except:
return "icon_disabled.png"
def _get_quota(self):
if (cherrypy.config.configMap["global"]["server.environment"] == "development"):
return quota.fake_getUserQuota(cherrypy.session['uid'])
else:
return quota.getUserQuota(cherrypy.session['uid'])
##########################
# affichage
##########################
#
# methode qui affiche la template
#
def index(self ):
values = {}
try:
quotas = self._get_quota()
returned_quotas = []
for a_quota in quotas:
# calculate text equivalent
quota = a_quota['quota']
usage = a_quota['usage']
limite = a_quota['limite']
text_equiv = "["
text_equiv+= "#" * min( 10, int( 10 * usage / quota ) )
text_equiv+= "." * max(0, int( 10 * ( quota - usage ) / quota ) )
if limite > quota:
text_equiv+= "|"
limite_diff = limite - quota
diff_proportion = 10 * limite_diff / quota
depassement = max(0, usage - quota)
text_equiv+= "#" * min(0, int(diff_proportion* ( depassement / limite_diff ) ) )
text_equiv+= "." * max(0, int(diff_proportion*( limite_diff - depassement ) / limite_diff ) )
text_equiv+= "]"
a_returned_quota = {
"label":a_quota['label'],
"usage":a_quota['usage'],
"quota":a_quota['quota'],
"limite":a_quota['limite'],
"percents":a_quota['%'],
"%":a_quota['%'],
"text_equiv":text_equiv,
"svg_url":"barreSVG?filesystem=%s" % a_quota['filesystem'],
}
returned_quotas.append(a_returned_quota)
values = {'quotas': returned_quotas}
except Exception, e:
crans.cp.log('error getting quota for user %s : %s' % (cherrypy.session['uid'], str(e)), 'QUOTA', 1)
values = {'erreur':str(e)}
return {'template':'quota',
'values': values,
'stylesheets':['quota.css'],
'scripts':['quota.js', 'popup.js'],
}
index.exposed = True
def index_html(self ):
result = self.index()
result['template'] = 'quota_html'
return result
index_html.exposed = True
##########################
# SVG
##########################
#
# methode qui renvoie une barre en svg
#
def barreSVG(self, filesystem = ""):
try:
values = {'erreur':"Not found"}
quotas = self._get_quota()
for a_quota in quotas:
if a_quota['filesystem'] == filesystem:
values = {
"usage":a_quota['usage'],
"quota":a_quota['quota'],
"limite":a_quota['limite'],
"percents":a_quota['%'],
}
except Exception, e:
values = {'erreur':str(e) }
cherrypy.response.headers['Content-Type']="image/svg+xml"
return {'template':'barre.svg',
'values': values,
'standalone':True,
}
barreSVG.exposed= True

Binary file not shown.

Before

Width:  |  Height:  |  Size: 986 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -1,43 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="100%" height="100%" version="1.1" xmlns="http://www.w3.org/2000/svg">
#if $getVar('usage', False)
#set total = $limite
#set barwidth = 700
#set quota = $quota
#set widthquota = int( barwidth * $quota/$limite )
#set widthusage = int( barwidth * $usage/$limite )
#set usage = $usage
#set usage_percent = int( 100 * $usage/$limite )
#set quota_percent = int( 100 * $quota/$limite )
<defs>
<linearGradient id="barre_gradient" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:rgb(0,255,0);stop-opacity:1"/>
<stop offset="$quota_percent%" style="stop-color:rgb(255,255,0);stop-opacity:1"/>
<stop offset="100%" style="stop-color:rgb(255,0,0);stop-opacity:1"/>
</linearGradient>
</defs>
<g font-family="Verdana" font-size="10">
<rect x="1" y="1" width="$barwidth" height="22" style="fill:url(#barre_gradient);stroke:black;stroke-width:2;"/>
<line x1="$int(widthquota+2)" y1="15" x2="$int(widthquota+2)" y2="22" style="stroke:rgb(0,0,0);stroke-width:2"/>
<text x="2" y="40">0Mo</text>
<text x="$int(widthquota-15)" y="40">$int(quota) Mo</text>
<text x="$int(barwidth+5)" y="40">$int(total) Mo</text>
</g>
<g font-family="Verdana" font-size="10">
<rect x="2" y="2" width="$widthusage" height="20" style="fill:white;opacity:0.7"/>
<line x1="$int(widthusage+2)" y1="2" x2="$int(widthusage+2)" y2="22" style="stroke:rgb(99,99,99);stroke-width:1"/>
<text x="4" y="15">$percents%</text>
</g>
#else
<g font-family="Verdana" font-size="10">
<text x="21" y="35" style="color:red">$getVar('erreur', 'BROKEN')</text>
</g>
#end if
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -1,13 +0,0 @@
<div class="framed_gray">
#for un_truc in $quotas
<h3>$un_truc.label</h3>
<embed src="$un_truc.svg_url" width="100%" height="50"
type="image/svg+xml"
pluginspage="http://www.adobe.com/svg/viewer/install/" />
#end for
<div style="text-align:right;">Si les graphiques ne s'affichent pas, essayez la <a href="index_html">version html</a></div>
</div>

View file

@ -1,22 +0,0 @@
<div class="framed_gray">
#for un_truc in $quotas
<h3>$un_truc.label</h3>
#set total = $un_truc.limite
#set usage = int( 100 * $un_truc.usage/$un_truc.limite )
#set quota = int( 100 * $un_truc.quota/$un_truc.limite )
<div style="float:left;height:1.2em;width:40%;border:thin black solid;position:relative;background:#f99">
<div style="float:left;height:.8em;width:$usage%;background:blue;position:absolute;top:0;left:0;">
<span style="display:none">
$un_truc.text_equiv
</span>
</div>
<div style="float:left;height:1.2em;width:$quota%;background:#aaa"></div>
</div> $un_truc['%'] %
#end for
<div style="text-align:right;"><a href="index">version svg</a></div>
</div>

View file

@ -1,30 +0,0 @@
#!/usr/bin/env python
import sys
sys.path.append('/usr/scripts/impression/')
import crans.utils.files, os, time, digicode
tools = crans.utils.files
PDF_FOLDER = "/var/impression/fichiers/"
def cleanFolder(pathToFolder):
print "cleaning %s" % pathToFolder
if not os.path.isdir(pathToFolder):
raise Exception, "%s n'est pas un dossier" % pathOfFolder
fileList = os.listdir(pathToFolder)
for aFile in fileList:
aFilePath = os.path.join(pathToFolder, aFile)
if os.path.isdir(aFilePath):
cleanFolder(aFilePath)
if tools.dirIsEmpty(aFilePath):
os.rmdir(aFilePath)
print "Folder %s removed" % aFilePath
if os.path.isfile(aFilePath):
if tools.fileIsOlderThan(aFilePath, days=1):
os.remove(aFilePath)
now = time.localtime()
displaytime = time.strftime("%A %d %B %Y, %X",now)
print "................ %s ................" % displaytime
cleanFolder(PDF_FOLDER)
print "Cleaning codes"
digicode.menage()
print

View file

@ -1,81 +0,0 @@
#! /usr/bin/env python
import cherrypy, tempfile, shutil, os, sys
sys.path.append('/usr/scripts/impression')
import crans.cp, digicode
from ClassesIntranet.ModuleBase import ModuleBase
class main(ModuleBase):
_droits = ["Imprimeur"]
def category(self):
return "Imprimeur"
def title(self):
return "Digicode"
##########################
# affichage
##########################
#
# methode qui affiche la template
#
def index(self, submit = None, fileList = None, newFile = None ):
return {'template':'digicode',
'values':{},
'stylesheets':['digicode.css'],
'scripts':['digicode.js'],
}
index.exposed = True
##########################
# AJAX
##########################
#
# methode qui renvoie la liste des codes
#
def codeList(self):
try:
listeBrute = digicode.list_code()
liste_formatee = []
for aCode in listeBrute:
age = int(aCode[1])
age_jours = (age/3600)/24
age_heures = (age/3600) - age_jours*24
age_minutes = (age/60) - (age/3600)*60
if age_jours > 0:
age_string = "%sj %sh %smin" % (str(age_jours), str(age_heures), str( age_minutes ))
elif age_heures > 0:
age_string = "%sh %smin" % (str(age_heures), str( age_minutes ))
else:
age_string = "%smin" % (str( age_minutes ))
liste_formatee.append({'code':aCode[0], 'age':age_string, 'desc':aCode[2]})
return {'codes': liste_formatee}
except Exception, e:
crans.cp.log('erreur lors de la creation de la liste de codes :' + str(e), 'DIGICODE', 1)
return {'erreur':str(e)}
codeList.exposed= True
#
# methode qui cree un code
#
def createCode(self, code=None, adherent=''):
try:
if adherent == '':
adherent = cherrypy.session['uid']
if code:
try:
int(code)
if code.__len__() != 6:
raise
except:
return {'formatErreur':1}
code = digicode.save_code(code, adherent)
else:
code = digicode.gen_code(adherent)
crans.cp.log("code cree : %s" % code, 'DIGICODE')
return {'code': code, "age" : "new", "desc":adherent}
except Exception, e:
crans.cp.log("erreur lors de la creation de code : " + str(e), 'DIGICODE', 1)
return {'erreur':str(e)}
createCode.exposed= True

View file

@ -1,85 +0,0 @@
/*************************************************************
..
.... ............ ........
. ....... . .... ..
. ... .. .. .. .. ..... . ..
.. .. ....@@@. .. . ........ .
.. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. ....
.@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... ....
@@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. ..
.@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. .....
...@@@.... @@@ .@@.......... ........ ..... ..
. ..@@@@.. . .@@@@. .. ....... . .............
. .. .... .. .. . ... ....
. . .... ............. .. ...
.. .. ... ........ ... ...
................................
==============================================================
digicode.css - Intranet Style
STYLE PAGE DU DIGICODE
Copyright (c) 2006 by www.crans.org
**************************************************************/
#codesTable {
width:60%;
border:thin black solid;
float:left;
}
#codesTable thead {
color:gray;
}
#codesTable .code {
border-right:thin gray solid;
width:70%;
}
#codesTable tbody .age {
text-align:right;
}
#codesTable td,
#codesTable th {
margin:0;
padding:2px 5px;
}
#codesTable tbody td {
border-top:thin gray solid;
}
#codesTable thead th {
border-top:none;
}
div#addCodeBox {
float: right;
border:thin black solid;
padding:10px;
margin:0 5%;
width:25%;
}
div#addCodeBox h1 {
font-size:1.1em;
margin:2px 10px 20px 10px;
text-align:center;
}
div#addCodeBox form {
}
div#addCodeBox form input,
div#addCodeBox form button {
margin:3px;
}
form input.textinput {
border: thin gray solid;
}

View file

@ -1,160 +0,0 @@
/* ************************************************************
* Digicode
************************************************************
* Digicode.init : initialisation de la page
* Digicode.makeCode : creation de codes
* Digicode.codelist : liste des codes
* Digicode.AJAX : ajax
*/
Digicode = {};
/*****************************
Digicode.init
*****************************/
Digicode.init = function()
{
// afficher le tableau codelist
appendChildNodes("globalDiv", Digicode.codelist.create());
// recuperer la liste des codes
this.codelist.load();
// afficher le formulaire de creation de code
appendChildNodes("globalDiv", DIV({"id":"addCodeBox"}));
Digicode.makeCode.displayForm();
}
/*****************************
Digicode.makeCode
*****************************/
Digicode.makeCode = {}
Digicode.makeCode.displayForm = function()
{
var myForm = FORM({'id':'createCodeForm', 'name':'createCodeForm','onsubmit':"Digicode.makeCode.createCode(document.createCodeForm.newCodeLogin.value, document.createCodeForm.newCode.value); return false;", 'style':'display: none;'},
LABEL({'for':'newCodeLogin'}, "Login adhérent :"),
INPUT({"name":"newCodeLogin", "size":"10", "maxlength":"20", "class":"textinput"}),
BR(),
LABEL({'for':'newCode'}, "Code :"),
INPUT({"name":"newCode", "size":"6", "maxlength":"6", "class":"textinput"}),
BUTTON({"type":"submit","onclick":"Digicode.makeCode.createCode(document.createCodeForm.newCodeLogin.value, document.createCodeForm.newCode.value); return false;", "style":"float:right;"},"Créer code"),
BUTTON({"type":"button","onclick":"Digicode.makeCode.createCode(document.createCodeForm.newCodeLogin.value)", "style":"float:right;"},"Code aléatoire")
);
replaceChildNodes("addCodeBox", H1({},"Nouveau code"), myForm );
appear(myForm);
}
Digicode.makeCode.restoreForm = function()
{
try
{
removeElement("newCodeDisplay");
removeElement("loading");
} catch (error){}
appear("createCodeForm");
}
Digicode.makeCode.disableForm = function()
{
try
{
var form = getElement("createCodeForm");
var elts = form.elements;
for (i=0 ; i < elts.length ; i++)
elts[i].disabled = true;
}
catch (error){}
}
Digicode.makeCode.createCode = function(login, code)
{
var image = createDOM("IMG",{'style':'margin-right:2px;float:right;','src':'/static/images/indicator.gif'});
appendChildNodes("addCodeBox", DIV({'id':"loading",'style':'display:none;max-height:1em;float:left;'},image,"Loading"));
this.disableForm();
//removeElement("createCodeForm");
appear("loading");
if (code)
Digicode.AJAX.call("createCode?code="+code + "&adherent=" + login, this.handleNewCode);
else
Digicode.AJAX.call("createCode?adherent=" + login, this.handleNewCode);
}
Digicode.makeCode.handleNewCode = function(res)
{
if (res.code)
{
replaceChildNodes("addCodeBox",
H1({}, "Code créé"),
DIV({'id':"newCodeDisplay",
'style':'display:none;font-size:2em;maring:1em;font-weight:bold;text-align:center;',
'onclick':"Digicode.makeCode.displayForm();"},res.code));
appear("newCodeDisplay");
//removeElement("loading");
Digicode.codelist.addCode(res);
} else if (res.erreur) {
logError("Erreur distante : " + res.erreur);
alert("Erreur sur le serveur, le code est peut-être déjà pris.")
Digicode.makeCode.displayForm();
} else if (res.formatErreur) {
alert("Ceci n'est pas un code valide");
Digicode.makeCode.displayForm();
}
}
/*****************************
Digicode.codelist
*****************************/
Digicode.codelist = {};
Digicode.codelist.create = function ()
{
var thead = createDOM("thead", {},
createDOM("th", {'class':'code'}, "Code" ),
createDOM("th", {'class':'age'}, "Age")
);
var tbody = createDOM("tbody", {"id":"codeList"});
return TABLE({"id":"codesTable", "cellspacing":"0"}, thead, tbody)
}
Digicode.codelist.load = function()
{
Digicode.AJAX.call("codeList", Digicode.codelist.displayCodes);
}
Digicode.codelist.displayCodes = function(result)
{
if (result.codes)
replaceChildNodes('codeList',map(Digicode.codelist.newCodeTrNodeFromDict,result.codes));
else if (result.erreur)
logError("Erreur distante : " + result.erreur);
}
Digicode.codelist.newCodeTrNodeFromDict = function (aDict, style)
{
if (style) {
var aRow = createDOM("TR", {'id':'code'+aDict.code,"style":style});
} else
var aRow = createDOM("TR", {'id':'code'+aDict.code});
appendChildNodes(aRow, createDOM("TD", {'class':'code'}, aDict.code, SPAN({'style':'color:gray;margin-left:2em;'}, aDict.desc ) ) );
appendChildNodes(aRow, createDOM("TD", {'class':'age'}, aDict.age) );
return aRow;
}
Digicode.codelist.addCode = function (aDict)
{
var newLine = this.newCodeTrNodeFromDict(aDict);
appendChildNodes("codeList", newLine);
pulsate(newLine);
}
/*****************************
Digicode.AJAX
*****************************/
Digicode.AJAX = {}
Digicode.AJAX.call = AJAX.call
setInterval(Digicode.codelist.load, 30000);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -1,14 +0,0 @@
#import digicode
<div id="globalDiv">
<h1>Gestion des codes pour le local impression</h1>
</div>
<script type="text/javascript">
<!--
Digicode.init();
//-->
</script>
<noscript>
<p>Cette page utilise javascript. Elle n'est pas support&eacute;e par votre
navigateur.</p>
</noscript>

View file

@ -1,248 +0,0 @@
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# ##################################################################################################### #
# Mes Sous
# ##################################################################################################### #
# Description:
# Affiche la liste des factures et l'historique de debits/credits de l'adherent.
# Fait aussi les rechargements Paypal
# Informations:
#
# Pages:
# index:liste des factures
# historique: historique des débits/crédits
# rechargementPaypal: Comme son nom l'indique
#
# ##################################################################################################### #
import cherrypy, sys, os, datetime
if (cherrypy.config.configMap["global"]["server.environment"] == "development"):
from ldap_crans_test import *
# print("monCompte : unsing test ldap : env=" + cherrypy.config.configMap["global"]["server.environment"])
else:
from ldap_crans import *
# print("monCompte : unsing prod ldap : env=" + cherrypy.config.configMap["global"]["server.environment"])
from ClassesIntranet.ModuleBase import ModuleBase
class main(ModuleBase):
def title(self):
return "Mon Solde"
def category(self):
return "Personnel"
def icon(self):
return "icon.png"
_club = False
_adh = False
def getCurrentAdministrativeYear(self):
'''
premiere partie de l''annee scolaire en cours
ex : le 5 juin 2006 retourne 2005
'''
now = datetime.datetime.now()
currentYear = int(now.strftime("%Y"))
currentMonth = int(now.strftime("%m"))
if currentMonth > 8:
administrativeYear = currentYear
else:
administrativeYear = currentYear - 1
return administrativeYear
def index(self, message = '', error = ''):
adh = cherrypy.session['LDAP'].getProprio(cherrypy.session['uid'])
t = {}
t['message'] = message
t['error'] = error
############## liste des factures ##############
listeFactures = []
for f in adh.factures():
facture = {}
facture['no'] = f.numero()
facture['intitule'] = f.articles()[0]['designation']
facture['details'] = [
{
'intitule':art['designation'],
'quantite':art['nombre'],
'prixUnitaire':art['pu'],
'prixTotal':art['pu']*art['nombre'],
} for art in f.articles()]
facture['montant'] = f.total()
facture['paypal'] = f.urlPaypal(useSandbox = cherrypy.config.get("paypal.useSandbox", False),
businessMail = cherrypy.config.get("paypal.businessAdress", "paypal@crans.org"),
return_page = "https://intranet.crans.org/monCompte/paypalReturn",
cancel_return_page = "https://intranet.crans.org/monCompte/paypalCancel",
)
facture['payee'] = f.recuPaiement()
listeFactures.append(facture)
t['listeFactures'] = listeFactures
return {
'template' :'factures',
'values' :t,
'stylesheets' :['cransFactures.css'],
'scripts' :[],
}
index.exposed = True
def historique(self, page = 1, items_per_page = 20):
adh = cherrypy.session['LDAP'].getProprio(cherrypy.session['uid'])
lst = [ x for x in adh.historique() if x.split(u' : ',1)[1].startswith(u'credit') or x.split(u' : ',1)[1].startswith(u'debit') ]
histLst = []
for anItem in lst:
aLine = {}
aLine["date"] = anItem.split(u",")[0]
aLine["type"] = anItem.split(u' : ',2)[1].split(u' ')[0]
aLine["montant"] = anItem.split(u' : ',2)[1].split(u' ')[1]
try:
aLine["intitule"] = anItem.split(u'[')[1].split(u']')[0]
except Exception:
aLine["intitule"] = ""
histLst.append(aLine)
histLst.reverse()
page = int(page)
items_per_page = int(items_per_page)
if page == 1:
prevPage = None
else:
prevPage = page - 1
if page * items_per_page >= histLst.__len__():
nextPage = None
else:
nextPage = page + 1
offset = items_per_page * ( page - 1)
return {
'template' :'factures-historique',
'values' :{
'liste':lst,
'historic_items':histLst[offset:offset + items_per_page],
'nextPage':nextPage,
'prevPage':prevPage
},
'stylesheets' :['cransFactures.css'],
'scripts' :[],
}
historique.exposed = True
def delFacture(self, no):
try:
# trrouver la factures
fact = cherrypy.session['LDAP'].search('fid=' + no, 'w')['facture'][0]
#verifier qu'elle appartient bien a l'adherent
if not fact.proprietaire().mail() == cherrypy.session['uid']:
raise Exception, "Impossible de supprimer cette facture"
# la supprimer
fact.delete()
except Exception, e:
cherrypy.log(str(e), "FACTURES", 1)
return self.index()
delFacture.exposed = True
##########################
# paypal
##########################
#
# methode qui affiche successivement les
# templates du popup pour recharger son compte impression
# via paypal
#
def rechargerCompteImpression(self, etape = '1', combien = None):
adh = cherrypy.session['LDAP'].getProprio(cherrypy.session['uid'])
if (etape == "1"): # Introduction
return {
'template' :'MonCompteRechargePaypal1',
'standalone' :True,
'values' :{},
}
elif (etape == "2"): # choix montant
return {
'template' :'MonCompteRechargePaypal2',
'standalone' :True,
'values' :{},
}
elif (etape == "3"): # confirmer facture
# creer objet facture
f = Facture(adh)
# /!\ verifier que combien est un nombre
# et qu'il n'y a pas plus de 2 chiffres apres le point...
# (ce serait bien aussi si on pouvait mettre une virgue a la place du point)
try:
# remplacage des virgules
combien = combien.replace(u',', u'.')
# convertissage
combien = float(combien)
# arrondissage-tronquage :
combien = float(int(combien*100)/100.0)
# nombre positif
if combien < 0:
raise ValueError
except Exception:
return {
'template' :'MonCompteRechargePaypal2',
'standalone' :True,
'values' :{'error':"Le montant doit &ecirc;tre un nombre positif !", 'combien':combien},
}
f.ajoute({'nombre': 1, 'code': 'SOLDE', 'designation': 'Credit du compte impression (intranet)', 'pu': combien})
cherrypy.session['freshFacture'] = f
pageData = {}
pageData['details'] = [
{
'intitule':art['designation'],
'quantite':art['nombre'],
'prixUnitaire':art['pu'],
'prixTotal':art['pu']*art['nombre'],
} for art in f.articles()]
pageData['total'] = f.total()
return {
'template' :'MonCompteRechargePaypal3',
'standalone' :True,
'values' :pageData,
}
elif (etape == "4"):# payer maintenant ?
# sauver objet facture
f = cherrypy.session['freshFacture']
f.save()
return {
'template' :'MonCompteRechargePaypal4',
'standalone' :True,
'values' :{'lienPaypal' : f.urlPaypal(useSandbox = cherrypy.config.get("paypal.useSandbox", False),
businessMail = cherrypy.config.get("paypal.businessAdress", "paypal@crans.org"),
return_page = "https://intranet.crans.org/monCompte/paypalReturn",
cancel_return_page = "https://intranet.crans.org/monCompte/paypalCancel",
)},
}
rechargerCompteImpression.exposed = True
def paypalReturn(self, **kw):
_crans_cp.log("retour de paypal avec les infos : %s" % " ".join( [ "[%s: %s]" % (str(a), str(kw[a])) for a in kw] ) )
return {
'template' :'MonComptePaypalReturn',
'standalone' :True,
'values' :{},
}
paypalReturn.exposed = True
def paypalCancel(self, **kw):
_crans_cp.log("annulation de paypal avec les infos : %s" % " ".join( [ "[%s: %s]" % (str(a), str(kw[a])) for a in kw] ) )
return {
'template' :'MonComptePaypalCancel',
'standalone' :True,
'values' :{},
}
paypalCancel.exposed = True

View file

@ -1,205 +0,0 @@
/********************************************
* <!-- disposition générale -->
********************************************/
#globalDiv {
//padding-left:20%;
position: relative;
}
ul#actionMenu {
list-style-type:none;
width:18%;
padding:0;
float:left;
}
h1 {
font-size:1.4em;
margin:2px;
}
td, tr {
margin:0;
}
#factureListDiv {
padding:5px;
background:#fad163;
float:left;
width:75%;
}
#factureListDiv table#listeFactures {
padding:0;
width:100%;
}
.factureRow {
margin:2px;
position:relative;
}
.help_text {
background:#fff7D7;
font-weight:normal;
padding:10px 20px;
}
.factureRow .factureSummary {
background:#fff7D7;
height:30px;
font-weight:bold;
padding:10px 20px;
}
.factureRow .factureSummary span.intitule {
float:left;
}
.factureRow .factureSummary span.montant {
float:right;
text-align:right;
}
.tdNoFactures {
text-align:center;
font-size:1.2em;
background-color:#fff7D7;
color:#666;
margin:0;
padding:5px;
}
.facturePayee {
}
.factureNonPayee .factureSummary {
color:red;
}
.actions {
display:block;
float:right;
font-size:0.9em;
font-weight:normal;
}
.actions a {
margin:2px 10px;
}
/********************************************
* <!-- factures - details -->
********************************************/
table.factureDetails {
background: #fff7D7 url(fondFacturesDetails.png) repeat-x top;
padding:1%;
width:96%;
margin:0 1% 10px 1%;
}
.tdTotalDetail,
.tdTotalDetailIntitule {
border-top:thin black solid;
}
.tdTotalDetailIntitule {
text-align:right;
font-weight:bold;
}
table.factureDetails th {
border-bottom:thin black solid;
}
table.factureDetails th,
table.factureDetails td {
border-right:thin black solid;
margin:0;
padding:5px 20px;
}
/********************************************
* <!-- factures - divers -->
********************************************/
.note {
display:block;
font-size:small;
margin:3px;
font-weight:normal;
}
.note {
color:#666
}
.linkToggle {
display:block;
float:left;
height:15px;
width:15px;
background:transparent url(fl.png) top left;
margin-right:1px;
}
/********************************************
* <!-- factures - historique -->
********************************************/
table#historique_sous {
width:100%;
}
table#historique_sous td {
background:#fff7D7;
padding:5px;
text-align:center;
border-top:2px #fad163 solid;
}
table#historique_sous th {
background:#fff7D7;
padding:5px;
text-decoration:underline;
}
/********************************************
* <!-- factures - recherche -->
********************************************/
form.search {
display:block;
border: thin black solid;
padding:.2em 1em;
float:left;
//position:absolute;
width:18%;
//top:0;
//left:0;
margin:0 1%;
}
form.search input {
max-width:95%;
margin:.3em;
float:left;
border: thin gray solid;
}
form.search label {
padding-top:7px;
display:block;
width:4em;
float:left;
clear:left;
font-weight:bold;
}
form.search h3 {
margin:.2em 0;
}
form.search input.button {
margin:.5em;
text-align:center;
clear:left;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

View file

@ -1,58 +0,0 @@
<div id="messagePlaceHolder"></div>
<div id="globalDiv" onclick="setMessage();">
<ul id="actionMenu">
<li><a href="index">Mes factures PayPal</a></li>
<li><a href="historique">Historique des transactions</a></li>
</ul>
<div id="factureListDiv">
<h1>Historique</h1>
<div style="overflow:auto;">
<div>
#if $prevPage
<a href="historique?page=$prevPage">&lt;&lt; moins vieux</a>
#else
<span class="off">&lt;&lt; moins vieux</span>
#end if
&nbsp;|&nbsp;
#if $nextPage
<a href="historique?page=$nextPage">plus vieux &gt;&gt;</a>
#else
<span class="off">plus vieux &gt;&gt;</span>
#end if
</div>
<table id="historique_sous" cellspacing="0">
<tr>
<th>Date</th>
<th>Intitul&eacute;</th>
<th>D&eacute;bit</th>
<th>Cr&eacute;dit</th>
</tr>
#for anItem in $historic_items
<tr>
<td>$anItem.date</td>
<td>$anItem.intitule</td>
#if $anItem.type=="debit"
<td>$anItem.montant</td>
#else
<td>&nbsp;<!-- evite que opera fasse des trucs bizarres... --></td>
#end if
#if $anItem.type=="credit"
<td>$anItem.montant</td>
#else
<td>&nbsp;<!-- evite que opera fasse des trucs bizarres... --></td>
#end if
</tr>
#end for
#if $historic_items == []
<tr><td colspan="4" style="color:gray;">
AUCUNE TRANSACTION ENREGISTR&Eacute;E
</td></tr>
#end if
</table>
</div>
<!-- ********************** Menu ********************** -->
</div>
</div>

View file

@ -1,107 +0,0 @@
<div id="messagePlaceHolder"></div>
#if $message != ''
<script type="text/javascript">setMessage('$message.replace("\'","\\\'")')</script>
#end if
#if $error != ''
<script type="text/javascript">setMessage('$error.replace("\'","\\\'")', 'errorMessage')</script>
#end if
<script type="text/javascript">
function showDetail(id){
slideDown(id, {duration:0.4});
var element = document.getElementById("togglelink" + id);
element.onclick=null;
element.style.backgroundPosition='bottom left';
setTimeout("var element = document.getElementById(\'togglelink" + id + "\');element.onclick=function () {hideDetail(\'" + id + "\'); return false;};",450);
return false;
}
function hideDetail(id){
slideUp(id, {duration:0.4});
var element = document.getElementById("togglelink" + id);
element.onclick=null;
element.style.backgroundPosition="top left";
setTimeout("var element = document.getElementById(\'togglelink" + id + "\');element.onclick=function () {showDetail(\'" + id + "\'); return false;};",450);
return false;
}
</script>
<div id="globalDiv">
<ul id="actionMenu">
<li><a href="index">Mes factures PayPal</a></li>
<li><a href="historique">Historique des transactions</a></li>
</ul>
<div id="factureListDiv">
<h1>Mes factures PayPal</h1>
<!-- <table id="listeFactures" cellspacing="0" border="0"> -->
#for f in $listeFactures
#if $f.payee
<div class="factureRow facturePayee">
#else
<div class="factureRow factureNonPayee">
#end if
<div class="factureSummary">
<span class="intitule">
#if $f.details.__len__() > 1
<a href="#" class="linkToggle" id="togglelinkfacture$f.no" onclick="showDetail('facture$f.no'); return false;"></a>
#end if
$f.intitule
#if not $f.payee
(non pay&eacute;e)
#end if
</span>
<span class="montant">
$f.montant&nbsp;&euro;
</span>
<span class="note" style="float:left;clear: left;">Cr&eacute;e le -</span>
#if not $f.payee
<span class="actions">
<a href="delFacture?no=$f.no">Annuler</a>
<a href="$f.paypal">Payer avec PayPal</a>
</span>
#else
<span class="note" style="float:right;clear:right;">Pay&eacute;e</span>
#end if
</div>
#if $f.details.__len__() > 1
<div id="facture$f.no" style="display:none;">
<table cellspacing="0" border="0" class="factureDetails">
<tr>
<th style="width:80%">Description</th>
<th>Prix unitaire</th>
<th>Quantit&eacute;</th>
<th>total</th>
</tr>
#for unDetail in $f.details
<tr>
<td>$unDetail.intitule</td>
<td>$unDetail.prixUnitaire&nbsp;&euro;</td>
<td>$unDetail.quantite</td>
<td>$unDetail.prixTotal&nbsp;&euro;</td>
</tr>
#end for
<tr>
<td colspan="3" class="tdTotalDetailIntitule">
Total
</td>
<td class="tdTotalDetail">$f.montant&nbsp;&euro;</td>
</tr>
</table>
</div>
</div>
#end if
#end for
#if $listeFactures == []
<div class="factureRow tdNoFactures">
AUCUNE TRANSACTION PAYPAL ENREGISTR&Eacute;E
</div>
#end if
</div>
</div>

View file

@ -1,147 +0,0 @@
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# ##################################################################################################### #
# Factures (gestion)
# ##################################################################################################### #
# Description:
# Permet de chercher dans les facture, d'en créditer et d'en supprimer
# Informations:
#
# Pages:
# index:afiche le formulaire et les factures
#
# ##################################################################################################### #
import cherrypy, sys, os, datetime
import crans.cp, crans.utils.exceptions
from ClassesIntranet.ModuleBase import ModuleBase
class main(ModuleBase):
_droits = ["Imprimeur"]
def title(self):
return "Gestion factures"
def category(self):
return "Imprimeur"
def index(self, message = '', erreur = ''):
if cherrypy.session.has_key('gestion_factures-current_search'):
del cherrypy.session['gestion_factures-current_search']
return self.displayTemplate()
index.exposed = True
def search(self, fid=None, uid=None, aid=None):
cherrypy.session['gestion_factures-current_search'] = {
"fid":fid,
"uid":uid,
"aid":aid,
}
return self.displayTemplate()
search.exposed = True
def displayTemplate(self, message = '', erreur = ''):
t = {}
t['message'] = message
t['error'] = erreur
if cherrypy.session.has_key('gestion_factures-current_search'):
fid = cherrypy.session['gestion_factures-current_search']['fid']
uid = cherrypy.session['gestion_factures-current_search']['uid']
aid = cherrypy.session['gestion_factures-current_search']['aid']
t['listeFactures'] = self.buildInvoiceList(
fid = fid,
uid = uid,
aid = aid,
)
else:
fid = ""
uid = ""
aid = ""
t["form"] = []
t["form"]+= [{'name':'fid', 'label':'fid', 'value':fid}]
t["form"]+= [{'name':'uid', 'label':'login', 'value':uid}]
t["form"]+= [{'name':'aid', 'label':'aid', 'value':aid}]
return {
'template' :'factures-gestion',
'values' :t,
'stylesheets' :['cransFactures.css'],
}
def buildInvoiceList(self, fid=None, uid=None, aid=None):
############## liste des factures ##############
if fid:
search_string = "fid=%s" % str(fid)
liste_factures_ldap = cherrypy.session['LDAP'].search(search_string)['facture']
elif uid:
search_string = "uid=%s" % str(uid)
try:
liste_factures_ldap = cherrypy.session['LDAP'].search(search_string)['adherent'][0].factures()
except:
liste_factures_ldap = []
elif aid:
search_string = "aid=%s" % str(aid)
try:
liste_factures_ldap = cherrypy.session['LDAP'].search(search_string)['adherent'][0].factures()
except:
liste_factures_ldap = []
else:
return []
liste_factures_affichees = []
for f in liste_factures_ldap:
try:
facture = {}
facture['no'] = f.numero()
proprio = f.proprietaire()
if proprio.objectClass == 'club':
proprio = proprio.responsable()
facture['adherent'] = proprio.mail()
facture['montant'] = f.total()
facture['payee'] = f.recuPaiement()
facture['date'] = f.historique()[0].split(',')[0]
facture['url'] = f.urlPaypal()
facture['intitule'] = f.articles()[0]['designation']
facture['details'] = [
{
'intitule':art['designation'],
'quantite':art['nombre'],
'prixUnitaire':art['pu'],
'prixTotal':art['pu']*art['nombre'],
} for art in f.articles()]
liste_factures_affichees.append(facture)
except:
crans.cp.log("Facture non affichable : fid=%s" % str(f.numero()), "GESTION FACTURES", 1)
liste_factures_affichees.sort(lambda x,y : cmp(int (y['no']), int(x['no'])))
return liste_factures_affichees
def delFacture(self, fid):
try:
# trrouver la factures
fact = cherrypy.session['LDAP'].search('fid=' + fid, 'w')['facture'][0]
# la supprimer
fact.delete()
except Exception, e:
crans.cp.log(unicode(e), "GESTION FACTURES", 1)
return self.index(erreur=u"Probleme lors de la suppression")
crans.cp.log(u"Facture supprimee [fid=%s]" % fid, "GESTION FACTURES")
return self.displayTemplate(message=u"Facture suprimée")
delFacture.exposed = True
def crediteFacture(self, fid):
try:
# trrouver la factures
fact = cherrypy.session['LDAP'].search('fid=' + fid, 'w')['facture'][0]
# la supprimer
fact.recuPaiement(cherrypy.session['uid'])
fact.save()
except Exception, e:
crans.cp.log(unicode(e), "GESTION FACTURES", 1)
crans.cp.log( crans.utils.exceptions.formatExc( ), "GESTION FACTURES", 1)
return self.displayTemplate(erreur=u"Erreur: " + unicode(e) )
crans.cp.log("Facture creditee [fid=%s]" % fid, "GESTION FACTURES")
return self.displayTemplate(message=u"Facture créditée")
crediteFacture.exposed = True

View file

@ -1,205 +0,0 @@
/********************************************
* <!-- disposition générale -->
********************************************/
#globalDiv {
//padding-left:20%;
position: relative;
}
ul#actionMenu {
list-style-type:none;
width:18%;
padding:0;
float:left;
}
h1 {
font-size:1.4em;
margin:2px;
}
td, tr {
margin:0;
}
#factureListDiv {
padding:5px;
background:#fad163;
float:left;
width:75%;
}
#factureListDiv table#listeFactures {
padding:0;
width:100%;
}
.factureRow {
margin:2px;
position:relative;
}
.help_text {
background:#fff7D7;
font-weight:normal;
padding:10px 20px;
}
.factureRow .factureSummary {
background:#fff7D7;
height:30px;
font-weight:bold;
padding:10px 20px;
}
.factureRow .factureSummary span.intitule {
float:left;
}
.factureRow .factureSummary span.montant {
float:right;
text-align:right;
}
.tdNoFactures {
text-align:center;
font-size:1.2em;
background-color:#fff7D7;
color:#666;
margin:0;
padding:5px;
}
.facturePayee {
}
.factureNonPayee .factureSummary {
color:red;
}
.actions {
display:block;
float:right;
font-size:0.9em;
font-weight:normal;
}
.actions a {
margin:2px 10px;
}
/********************************************
* <!-- factures - details -->
********************************************/
table.factureDetails {
background: #fff7D7 url(fondFacturesDetails.png) repeat-x top;
padding:1%;
width:96%;
margin:0 1% 10px 1%;
}
.tdTotalDetail,
.tdTotalDetailIntitule {
border-top:thin black solid;
}
.tdTotalDetailIntitule {
text-align:right;
font-weight:bold;
}
table.factureDetails th {
border-bottom:thin black solid;
}
table.factureDetails th,
table.factureDetails td {
border-right:thin black solid;
margin:0;
padding:5px 20px;
}
/********************************************
* <!-- factures - divers -->
********************************************/
.note {
display:block;
font-size:small;
margin:3px;
font-weight:normal;
}
.note {
color:#666
}
.linkToggle {
display:block;
float:left;
height:15px;
width:15px;
background:transparent url(fl.png) top left;
margin-right:1px;
}
/********************************************
* <!-- factures - historique -->
********************************************/
table#historique_sous {
width:100%;
}
table#historique_sous td {
background:#fff7D7;
padding:5px;
text-align:center;
border-top:2px #fad163 solid;
}
table#historique_sous th {
background:#fff7D7;
padding:5px;
text-decoration:underline;
}
/********************************************
* <!-- factures - recherche -->
********************************************/
form.search {
display:block;
border: thin black solid;
padding:.2em 1em;
float:left;
//position:absolute;
width:18%;
//top:0;
//left:0;
margin:0 1%;
}
form.search input {
max-width:95%;
margin:.3em;
float:left;
border: thin gray solid;
}
form.search label {
padding-top:7px;
display:block;
width:4em;
float:left;
clear:left;
font-weight:bold;
}
form.search h3 {
margin:.2em 0;
}
form.search input.button {
margin:.5em;
text-align:center;
clear:left;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -1,45 +0,0 @@
<div id="messagePlaceHolder"></div>
<div id="globalDiv" onclick="setMessage();">
<ul id="actionMenu">
<li><a href="index">Mes factures PayPal</a></li>
<li><a href="historique">Historique des transactions</a></li>
</ul>
<div id="factureListDiv">
<h1>Historique</h1>
<div style="overflow:auto;">
<table id="historique_sous" cellspacing="0">
<tr>
<th>Date</th>
<th>Intitul&eacute;</th>
<th>D&eacute;bit</th>
<th>Cr&eacute;dit</th>
</tr>
#for anItem in $historic_items
<tr>
<td>$anItem.date</td>
<td>$anItem.intitule</td>
#if $anItem.type=="debit"
<td>$anItem.montant</td>
#else
<td>&nbsp;<!-- evite que opera fasse des trucs bizarres... --></td>
#end if
#if $anItem.type=="credit"
<td>$anItem.montant</td>
#else
<td>&nbsp;<!-- evite que opera fasse des trucs bizarres... --></td>
#end if
</tr>
#end for
#if $historic_items == []
<tr><td colspan="4" style="color:gray;">
AUCUNE TRANSACTION ENREGISTR&Eacute;E
</td></tr>
#end if
</table>
</div>
<!-- ********************** Menu ********************** -->
</div>
</div>

View file

@ -1,107 +0,0 @@
<div id="messagePlaceHolder"></div>
#if $message != ''
<script type="text/javascript">setMessage('$message.replace("\'","\\\'")')</script>
#end if
#if $error != ''
<script type="text/javascript">setMessage('$error.replace("\'","\\\'")', 'errorMessage')</script>
#end if
<script type="text/javascript">
function showDetail(id){
slideDown(id, {duration:0.4});
var element = document.getElementById("togglelink" + id);
element.onclick=null;
element.style.backgroundPosition='bottom left';
setTimeout("var element = document.getElementById(\'togglelink" + id + "\');element.onclick=function () {hideDetail(\'" + id + "\'); return false;};",450);
return false;
}
function hideDetail(id){
slideUp(id, {duration:0.4});
var element = document.getElementById("togglelink" + id);
element.onclick=null;
element.style.backgroundPosition="top left";
setTimeout("var element = document.getElementById(\'togglelink" + id + "\');element.onclick=function () {showDetail(\'" + id + "\'); return false;};",450);
return false;
}
</script>
<div id="globalDiv">
<ul id="actionMenu">
<li><a href="index">Mes factures PayPal</a></li>
<li><a href="historique">Historique des transactions</a></li>
</ul>
<div id="factureListDiv">
<h1>Mes factures PayPal</h1>
<!-- <table id="listeFactures" cellspacing="0" border="0"> -->
#for f in $listeFactures
#if $f.payee
<div class="factureRow facturePayee">
#else
<div class="factureRow factureNonPayee">
#end if
<div class="factureSummary">
<span class="intitule">
#if $f.details.__len__() > 1
<a href="#" class="linkToggle" id="togglelinkfacture$f.no" onclick="showDetail('facture$f.no'); return false;"></a>
#end if
$f.intitule
#if not $f.payee
(non pay&eacute;e)
#end if
</span>
<span class="montant">
$f.montant&nbsp;&euro;
</span>
<span class="note" style="float:left;clear: left;">Cr&eacute;e le -</span>
#if not $f.payee
<span class="actions">
<a href="delFacture?no=$f.no">Annuler</a>
<a href="$f.paypal">Payer avec PayPal</a>
</span>
#else
<span class="note" style="float:right;clear:right;">Pay&eacute;e</span>
#end if
</div>
#if $f.details.__len__() > 1
<div id="facture$f.no" style="display:none;">
<table cellspacing="0" border="0" class="factureDetails">
<tr>
<th style="width:80%">Description</th>
<th>Prix unitaire</th>
<th>Quantit&eacute;</th>
<th>total</th>
</tr>
#for unDetail in $f.details
<tr>
<td>$unDetail.intitule</td>
<td>$unDetail.prixUnitaire&nbsp;&euro;</td>
<td>$unDetail.quantite</td>
<td>$unDetail.prixTotal&nbsp;&euro;</td>
</tr>
#end for
<tr>
<td colspan="3" class="tdTotalDetailIntitule">
Total
</td>
<td class="tdTotalDetail">$f.montant&nbsp;&euro;</td>
</tr>
</table>
</div>
</div>
#end if
#end for
#if $listeFactures == []
<div class="factureRow tdNoFactures">
AUCUNE TRANSACTION PAYPAL ENREGISTR&Eacute;E
</div>
#end if
</div>
</div>

View file

@ -1,291 +0,0 @@
#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
# #############################################################
# ..
# .... ............ ........
# . ....... . .... ..
# . ... .. .. .. .. ..... . ..
# .. .. ....@@@. .. . ........ .
# .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. ....
# .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... ....
# @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. ..
# .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. .....
# ...@@@.... @@@ .@@.......... ........ ..... ..
# . ..@@@@.. . .@@@@. .. ....... . .............
# . .. .... .. .. . ... ....
# . . .... ............. .. ...
# .. .. ... ........ ... ...
# ................................
#
# #############################################################
#
# interface d'impression
#
# Copyright (c) 2006, 2007, 2008, 2009 by Cr@ns (http://www.crans.org)
# #############################################################
import cherrypy, tempfile, shutil, os, commands, sys, re
import crans.cp
from threading import Thread
from re import compile
sys.path.append('/usr/scripts/impression')
import digicode, etat_imprimante
from impression_canon import FichierInvalide,SoldeInsuffisant,impression
from traceback import format_exception
BOOK_REGEXP = compile('book.pdf')
FILE_UPLOAD_BASE_FOLDER = cherrypy.config.get('fileUpload.folder', "/var/impression/fichiers/")
class FileError(Exception):
pass
from ClassesIntranet.ModuleBase import ModuleBase
def fmt_exc(e):
return '<br/>'.join(format_exception(e))
# #############################################################
# Classe d'impression en multithread
# #############################################################
class threadedImpression(Thread, impression):
def __init__(self, path_to_pdf, adh = None, callback = None):
raise Exception('Code mort ')
self.tpath_to_pdf = path_to_pdf
self.tadh = adh
Thread.__init__(self)
def run(self):
impression(self, self.tpath_to_pdf, self.tadh)
if self.tcallback:
self.tcallback(self)
class main(ModuleBase):
def category(self):
return "Services"
def title(self):
return "Impression"
def icon(self):
return "icon.png"
_club = True
##########################
# affichage
##########################
#
# template principale
#
def index(self, submit = None, fileList = None, newFile = None ):
data = {}
# on efface un eventuel objet impression existant
cherrypy.session['impression'] = None
if submit == "Envoyer":
try:
newFile.filename = re.sub("\s+", "_", newFile.filename)
newFile.filename = re.sub("[^\w\._]", "", newFile.filename)
self.savePDF(newFile)
data['fileName'] = newFile.filename.encode('ascii','replace').replace('?','_')
except FileError, e:
data['openError'] = e.args[0]
elif submit == "Choisir":
if (fileList):
data['fileName'] = fileList
else:
data['openError'] = "Choisissez un fichier"
data['fileList'] = self.getUploadedFileListFor(cherrypy.session['uid'])
try:
etat_imprimante.etat()
except Exception, e:
data['Erreur_imprimante'] = str(e).replace("\"", "\\\"")
data['errorMsg'] = u"Imprimante injoignable"
adh = cherrypy.session['LDAP'].getProprio(cherrypy.session['uid'])
if not cherrypy.config.get('crans.activate', True):
data['Erreur_imprimante'] = "Config impression"
data['errorMsg'] = cherrypy.config.get('crans.activate.errorMsg', u"Imprimante HS")
return {'template':'impression',
'values':data,
'stylesheets':['impression.css'],
'scripts':['impression.js', 'popup.js'],
}
index.exposed = True
##########################
# devis
##########################
#
# methode qui affiche la template du devis
#
def devis(self):
if cherrypy.session.has_key('impression') and cherrypy.session['impression'] != None :
return {
'template':'impression-devis',
'values':
{
'devis':cherrypy.session['impression'].devisDetaille(),
'total':cherrypy.session['impression'].prix(),
'nomFichier':cherrypy.session['impression'].fileName(),
},
'standalone':True,
}
else:
return {
'template':'impression-devis',
'values': { },
'standalone':True,
}
devis.exposed = True
##########################
# AJAX
##########################
#
# methode qui renvoie la liste des codes de l'adherent
#
def codeList(self):
try:
listeBrute = digicode.list_code()
# liste de la forme :
# [(code, age, description),...]
listeBrute = [item[0] for item in listeBrute if item[2] == cherrypy.session['uid']]
return {'codes': listeBrute}
except Exception, e:
crans.cp.log('erreur lors de la creation de la liste de codes :' + str(e), 'IMPRESSION', 1)
return {'erreur':str(e)}
codeList.exposed = True
#
# methode qui indique quel fichier utiliser
#
def useFile(self, fileName):
try:
filepath = os.path.join(os.path.join(FILE_UPLOAD_BASE_FOLDER, cherrypy.session['uid']+"/"), fileName)
adh = cherrypy.session['uid']
if cherrypy.session['estClub']:
adh = cherrypy.session['adh_uid'] + '@' + adh
cherrypy.session['impression'] = impression(filepath, adh)
crans.cp.log("useFile returns: %s" % str( cherrypy.session['impression'].pages() ))
return {'nbPages': cherrypy.session['impression'].pages()}
except FichierInvalide, e:
crans.cp.log("useFile : %s (%s)" % (str(e), e.file()), 'IMPRESSION', 1)
return {'erreur':str(e) }
except Exception, e:
crans.cp.log("useFile : %s" % str(e), 'IMPRESSION', 1)
return {'erreur':str(e) }
useFile.exposed = True
#
# methode pour changer les parametres
#
def changeSettings(self, copies=None, couleur=None, recto_verso=None, agrafage=None, papier=None, livret=None):
if not cherrypy.session.has_key('impression') or cherrypy.session['impression'] == None :
return {'nouvPrix':0.0}
try:
nouvPrix = cherrypy.session['impression'].changeSettings(papier=papier, couleur=couleur, agrafage=agrafage, recto_verso=recto_verso, copies=int(copies), livret=livret)
crans.cp.log("changeSettings returns : %s" % str(nouvPrix))
except Exception, e:
crans.cp.log("changeSettings : %s" % str(e), 'IMPRESSION', 1)
return {"erreur":str(e)}
return {'nouvPrix':nouvPrix}
changeSettings.exposed = True
#
# methode pour lancer l'impression
#
def lancerImpression(self):
try:
cherrypy.session['impression'].imprime()
except SoldeInsuffisant:
return {"SoldeInsuffisant":1}
except Exception, e:
crans.cp.log("lancerImpression : %s" % str(e), 'IMPRESSION', 1)
return {"erreur":str(e)}
crans.cp.log("impression", 'IMPRESSION')
return {
'code':str(digicode.gen_code(cherrypy.session['uid'])) + "#",
'code_bat_j': cherrypy.config.get('crans.impression.codes.batJ', u"Non disponible")
}
lancerImpression.exposed = True
#
# methode pour recuperer l'etat de l'imprimante
#
def etatImprimante(self):
if not cherrypy.config.get('crans.activate', True):
return {"printer_state" : u"Système down"}
try:
return {"printer_state" : u"\\n".join(etat_imprimante.etat())}
except Exception, e:
return {"printer_state" : 'Imprimante hors ligne'}
etatImprimante.exposed = True
#
# methode pour le solde
#
def AJAXGetSolde(self):
try:
adh = cherrypy.session['LDAP'].getProprio(cherrypy.session['uid'])
return {"solde" : adh.solde() }
except Exception, e:
return {"erreur" : str(e)}
AJAXGetSolde.exposed = True
##########################
# privees
##########################
#
# methode pour obtenir la liste des fichiers uploadés
#
def getUploadedFileListFor(self, adh):
file_folder = os.path.join(FILE_UPLOAD_BASE_FOLDER, cherrypy.session['uid']+"/")
if not os.path.isdir(file_folder):
return []
liste = os.listdir(file_folder)
list_pdf = []
# exclusion des fichiers qui ne sont pas des PDF
for f in liste:
if commands.getoutput('file -ib %s' % commands.mk2arg(file_folder, f)) == "application/pdf":
if not BOOK_REGEXP.search(f):
list_pdf.append(f)
return list_pdf
#
# methode pour enregistrer un fichier
#
def savePDF(self, aFile):
_, tempFileName = tempfile.mkstemp()
f = open(tempFileName, 'w+b')
size = 0
while True:
data = aFile.file.read(1024 * 8) # Read blocks of 8KB at a time
if not data:
break
f.write(data)
size += len(data)
f.close()
if size == 0:
raise FileError("Fichier vide")
file_folder = os.path.join(FILE_UPLOAD_BASE_FOLDER, cherrypy.session['uid']+"/")
if not os.path.isdir(file_folder):
os.makedirs(file_folder, mode=0750)
newFilePath = os.path.join(file_folder, aFile.filename.encode('ascii','replace').replace('?','_'))
shutil.move(tempFileName, newFilePath)
os.chmod(newFilePath, 0640)
crans.cp.log("New file uploaded at : %s" % newFilePath, "IMPRESSION")
return newFilePath

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -1,163 +0,0 @@
/* ****************************************** *
* <!-- disposition générale -->
* ****************************************** */
#globalDiv {
padding-left:200px;
position: relative;
}
ul#actionMenu {
list-style-type:none;
position:absolute;
width:150px;
top:0;
left:0;
margin:20px;
padding:0;
}
ul#actionMenu li {
clear:both;
}
/* ****************************************** *
* <!-- file name, menu de gauche -->
* ****************************************** */
#fileName {
display: block;
width:150px;
text-align:center;
padding:50px 5px 5px 5px;
background: url(./pdf-icon.png) center top no-repeat;
margin:0 0 10px 0;
overflow:auto;
}
#actionMenu li {
margin: .8em 0;
}
#actionEtatImprimante {
padding:0.4em;
border: thin black solid;
}
/* ******************************************* *
* <!-- formulaire reglages impression -->
* ******************************************* */
form#form_impression {
margin: 0px;
font-size: 100%;
min-width:600px;
}
form#form_impression #preview {
border:1px black solid;
width:150px;
height:150px;
padding:10px;
background-color:#C0C0C0;
}
form#form_impression #rightColumn {
margin:10px 10px 10px 240px;
}
form#form_impression #leftColumn {
float:left;
width:170px;
margin:10px;
padding:0;
}
div#prix_placeholder {
margin:6px 0;
width:170px;
min-height:16px;
padding:0;
color:gray;
}
div#prix_placeholder img {
margin-right:2px;
float:right;
}
form#form_impression fieldset fieldset {
margin:10px;
}
form#form_impression>fieldset {
position:relative;
padding:20px;
}
.clear {
clear:both;
}
form#form_impression .bouttons {
text-align:right;
}
form#form_impression label.labelInput {
display:block;
width:4em;
margin-right:4px;
float:left;
text-align:right;
}
fieldset .aide { float:right; }
/* ****************************************** *
* <!-- popup choix fichier -->
* ****************************************** */
#popupFichiers {
background:#AE0F3E;
z-index:500;
float:left;
position:absolute;
min-width:450px;
top:0;
left:20%;
right:20%;
padding:0;
}
#popupFichiers #insideDiv {
background:white;
margin:2px 5px;
}
#popupFichiers #insideDiv form {
margin:2px 5px;
}
#popupFichiers h1 {
font-size:1em;
margin:0;
text-align:center;
color:white;
}
#popupFichiers h1:before {
content:url("../images/WindowTitleLogo.png");
margin-right:5px;
}
#popupFichiers h2 {
font-size:1.1em;
border-bottom:thin black solid;
}
#popupFichiers select,
#popupFichiers input.file {
width:100%;
}
.button {
float:right;
}
/* ****************************************** *
* <!-- popup impression en cours -->
* ****************************************** */
div#printingPopupContent {
background: white url("../images/printer.png") left center no-repeat;;
padding:10px 10px 10px 115px;
min-height:100px;
}
#printingPopupContent a,
#printingPopupContent span {
display:block;
font-weight: bold;
margin:5px 0;
}

View file

@ -1,407 +0,0 @@
/* ************************************************************
* Impression
************************************************************
* Impression.settings : panneau de configuration
* Impression.popup : popup
* Impression.AJAX : ajax
*/
Impression = {};
/*****************************
Impression.settings
*****************************/
Impression.settings = {};
//
//// images : images used for previewing
//
Impression.settings.images = [
"portrait_couleurs_agraphediagonale.png",
"portrait_couleurs_pasdagraphes.png",
"portrait_couleurs_uneagraphe.png",
"portrait_couleurs_Deuxagraphes.png",
"portrait_couleurs_troisAgraphes.png",
"portrait_couleurs_stitching.png",
"portrait_nb_agraphediagonale.png",
"portrait_nb_pasdagraphes.png",
"portrait_nb_uneagraphe.png",
"portrait_nb_Deuxagraphes.png",
"portrait_nb_troisAgraphes.png",
"portrait_nb_stitching.png",
"portrait_transparent_couleurs.png",
"portrait_transparent_nb.png",
];
/*
Impression.settings.preloadImage = function(imageName) {
var image = new Image();
image.src = "./static/"+imageName;
}
Impression.settings.preloadAllImages = function() {
log("Preloading images...");
map(this.preloadImage,this.images);
}
*/
//
//// init : parse every field and display preview
//
Impression.settings.init = function () {
log("Init settings...");
this.theform = document.form_impression;
this.disableForm(false);
}
//
//// reset : reset form and then re-init settings
//
Impression.settings.reset = function () {
log("Reset form");
this.theform.reset();
this.init();
Impression.settings.update();
}
Impression.settings.disableForm = function(bool)
{
log("Set Disable Form : " + bool);
var fields = this.theform.elements;
for( var i=0; i< fields.length; i++)
{
this.setDisableField( fields[i], bool );
}
}
//
//// getValue : parse a field and store value in fielld.name
//
Impression.settings.getValue = function(field)
{
if (field.value)
{
this[field.name] = field.value;
log( field.name + " is now " + this[field.name]);
}
else
{
logError("Can't get fieldValue");
}
}
//
//// getCopies : parse copies field
//
Impression.settings.getCopies = function(field) {
if ( (!field.value) || (parseInt(field.value)!=field.value-0) || (parseInt(field.value) < 1) )
{
this.copies = 1;
logError("Can't get copies");
}
else
{
this.copies = parseInt(field.value);
}
log("copies is now " + this.copies);
}
//
//// setValue : set field value
//
Impression.settings.setValue = function(afield, avalue) {
afield.value = avalue;
this.getValue(afield);
}
//
//// setDisableField : set field disabled on/off
//
Impression.settings.setDisableField = function( afield, isdisabled ) {
afield.disabled = isdisabled ;
}
//
//// disableField : set field disabled on
//
Impression.settings.disableField = function(afield) {
this.setDisableField(afield, true);
}
//
//// fieldChanges : when a field is changed
//
Impression.settings.update = function () {
var orientation = "portrait";
Impression.settings.livret="False"
if (this.theform.type_impression_couleur.checked)
this.getValue(this.theform.type_impression_couleur);
else
this.getValue(this.theform.type_impression_nb);
if (this.theform.disposition_recto.checked)
this.getValue(this.theform.disposition_recto);
else if (this.theform.disposition_recto_verso.checked)
this.getValue(this.theform.disposition_recto_verso);
else
{
this.getValue(this.theform.disposition_livret);
Impression.settings.livret="True";
}
this.getValue(this.theform.papier);
this.getCopies(this.theform.nb_copies);
this.getValue(this.theform.agrafage);
// Contraintes
if (Impression.settings.nb_pages > 60)
{ this.disableField(this.theform.disposition_livret);
this.theform.disposition_livret.checked = false }
if ( ((this.papier == "A4") &&
(( (this.theform.disposition_recto.checked) && (Impression.settings.nb_pages>50) ) ||
( (this.theform.disposition_recto_verso.checked) && (Impression.settings.nb_pages>100) ) ))
||
((this.papier == "A3") &&
(( (this.theform.disposition_recto.checked) && (Impression.settings.nb_pages>30) ) ||
( (this.theform.disposition_recto_verso.checked) && (Impression.settings.nb_pages>60) ) ))
)
{
this.setValue(this.theform.agrafage, "None");
this.disableField(this.theform.agrafage);
this.getValue(this.theform.agrafage);
} else {
this.setDisableField(this.theform.agrafage, false);
}
if (this.papier == "A4tr" || this.papier == "A3")
{
this.theform.disposition_recto.checked = true;
this.disableField(this.theform.disposition_recto_verso);
this.disableField(this.theform.disposition_livret);
this.getValue(this.theform.disposition_recto);
}
else
{
this.setDisableField(this.theform.disposition_recto_verso, false);
this.setDisableField(this.theform.disposition_livret, false);
}
this.updatePreview();
Impression.AJAX.recalcPrix();
}
//
//// updatePreview : update preview with new value
//
Impression.settings.updatePreview = function()
{
var image_name = "";
if (this.papier == "A4tr")
image_name = "portrait_transparent_" + this.type_impression + ".png";
else
image_name = "portrait_" + this.type_impression + '_' + this.agrafes + ".png";
var image = createDOM("IMG",{'src':'./static/'+image_name});
log("Updating preview (new image : " + image_name + ")");
replaceChildNodes("preview",image)
}
/*****************************
Impression.popup
*****************************/
Impression.popup = {};
Impression.popup.popupImpression = function(code, codeJ) {
Popup.hide();
Popup.create({}, "Impression en cours...",
DIV(
{"id":"printingPopupContent", "style":"background-image:url(./static/dialog-printer.png)"},
SPAN("code: "+code),
SPAN("Batiment J: "+codeJ),
A({"href":"https://wiki.crans.org/VieCrans/ImpressionReseau", "class":"aide", "target":"_blank"}, "Comment récupérer mon impression ? "),
A({"href":"index", "class":"aide", "style":"text-align:right;"}, "Nouvelle impression")
)
);
Popup.display();
}
Impression.popup.popupError = function(erreur) {
Popup.hide();
Popup.create({}, "Erreur",
DIV({"id":"printingPopupContent", "style":"background-image:url(./static/dialog-warning.png)"},
SPAN(erreur),
A({"href":"mailto:nounous@crans.org", "class":"crans_help aide"}, "Envoyer un rapport aux nounous"),
Popup.closeLink({"class":"aide", "style":"text-align:right;"}, "Fermer")));
Popup.display();
}
Impression.popup.popupSolde = function(code) {
Popup.hide();
Popup.create({}, "Solde insuffisant",
DIV(
{"id":"printingPopupContent", "style":"background-image:url(./static/dialog-solde.png)"},
SPAN("pas assez de sous"),
A({"href":"https://wiki.crans.org/CransPratique/SoldeImpression", "class":"aide", "target":"_blank"}, "Comment recharger mon compte ? "),
Popup.closeLink({"class":"aide", "style":"text-align:right;"}, "Fermer")));
Popup.display();
}
Impression.popup.popupCodes = function(codeList) {
Popup.hide();
Popup.create({}, "Codes de mes impressions",
DIV(
{"id":"printingPopupContent", "style":"background-image:url(./static/dialog-lock.png)"},
SPAN("Mes codes"),
//UL({"size":"4", "style":"width:6em;; height:4em;padding:0;margin:0;list-style-type:none;overflow:auto;"}, map(function (code) {return LI({}, code);}, codeList)),
SELECT({"size":"4", "style":"width:100%;"}, map(function (code) {return OPTION({}, code);}, codeList)),
Popup.closeLink({"class":"aide", "style":"text-align:right;"}, "Fermer")));
Popup.display();
}
/*****************************
Impression.mesCodes
*****************************/
Impression.mesCodes = {};
Impression.mesCodes.getCodes = function ()
{
Impression.AJAX.call('codeList', this.displayCodes );
}
Impression.mesCodes.displayCodes = function (result) {
if (result.codes)
Impression.popup.popupCodes(result.codes);
else if (result.erreur)
logError('erreur distante (codeLlist) : ' + result.erreur);
else
logError('erreur bizarre (codeLlist) : ');
}
/*****************************
Impression.AJAX
*****************************/
Impression.AJAX = {};
Impression.AJAX.call = function(url,callback) {
AJAX.call( url, callback, true);
}
Impression.AJAX.modifPrix = function( text, wheel )
{
if (wheel)
{
var image = createDOM("IMG",{'src':'./static/indicator.gif'});
}
else
{
var image = new DIV({});
}
var item = new DIV({'onclick':'Impression.AJAX.recalcPrix();'}, image, text);
replaceChildNodes("prix_placeholder",item);
log( text );
}
Impression.AJAX.modifNbPages = function( nbpages )
{
Impression.settings.nb_pages = nbpages;
replaceChildNodes("fileNbPages",nbpages);
}
Impression.AJAX.usefile = function(filename) {
var item = new DIV({}, "Calculs en cours...");
this.modifPrix("Analyse du fichier...", true);
this.call('useFile?fileName=' + filename,this.analysefini );
}
Impression.AJAX.analysefini = function(AJAXResp)
{
logDebug('AJAX terminated (usefile)');
if (AJAXResp.erreur) {
Impression.AJAX.modifPrix(AJAXResp.erreur, false);
Impression.popup.popupError(AJAXResp.erreur);
Impression.settings.disableForm(true);
logWarning('Erreur distante : ' + AJAXResp.erreur);
} else {
Impression.AJAX.modifPrix("Analyse terminée", true);
Impression.settings.update();
Impression.AJAX.modifNbPages(AJAXResp.nbPages);
}
}
Impression.AJAX.recalcPrix = function()
{
settings = Impression.settings;
var url = "changeSettings?copies=" + settings.copies
+"&couleur="+ settings.type_impression
+"&papier="+ settings.papier
+"&recto_verso="+ settings.disposition
+"&agrafage="+ settings.agrafage
+"&livret="+ settings.livret;
this.modifPrix("Calcul en cours", true);
this.call(url, this.changePrix);
}
Impression.AJAX.changePrix = function(AJAXResp)
{
if (AJAXResp.erreur) {
Impression.AJAX.modifPrix(AJAXResp.erreur, false);
Impression.popup.popupError(AJAXResp.erreur);
Impression.settings.disableForm(true);
logWarning('Erreur distante : ' + AJAXResp.erreur);
} else {
Impression.AJAX.modifPrix("Coût : " + AJAXResp.nouvPrix + "€", false);
}
}
Impression.AJAX.lancerImpression = function(AJAXResp)
{
var url = "lancerImpression";
Impression.settings.disableForm(true);
this.call(url, this.finImpression);
}
Impression.AJAX.finImpression = function(AJAXResp)
{
if (AJAXResp.erreur) {
Impression.popup.popupError(AJAXResp.erreur);
logWarning('Erreur distante : ' + AJAXResp.erreur);
} else if (AJAXResp.SoldeInsuffisant) {
Impression.popup.popupSolde();
Impression.settings.disableForm(false);
Impression.settings.update();
} else {
Impression.popup.popupImpression(AJAXResp.code, AJAXResp.code_bat_j);
}
Impression.AJAX.updateSolde();
}
Impression.AJAX.getPrinterState = function()
{
var url = "etatImprimante";
Impression.AJAX.call(url, Impression.AJAX.displayPrinterState);
}
Impression.AJAX.displayPrinterState = function(AJAXResp)
{
if (AJAXResp.erreur) {
logWarning('Erreur distante (etatImprimante) : ' + AJAXResp.erreur);
} else {
replaceChildNodes("etatImprimanteIci", AJAXResp.printer_state)
}
}
Impression.AJAX.updateSolde = function()
{
var url = "AJAXGetSolde";
Impression.AJAX.call(url, Impression.AJAX.displaySolde);
}
Impression.AJAX.displaySolde = function(AJAXResp)
{
if (AJAXResp.erreur) {
logWarning('Erreur distante (etatImprimante) : ' + AJAXResp.erreur);
} else {
replaceChildNodes("soldePlaceHolder", AJAXResp.solde )
}
}
// on met a jour le status de l'imprimante toutes les 30 secondes
setInterval(Impression.AJAX.getPrinterState, 30000);
// on met a jours le solde de l'adherent toute les 5 minutes
setInterval(Impression.AJAX.updateSolde, 300000);

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

View file

@ -1,35 +0,0 @@
Popup = {};
Popup.popupNode = null;
Popup.visible = false;
Popup.display = function()
{
if (this.popupNode == null) {
logError("Popup not created, cannot be displayed");
return false;
}
appendChildNodes("pageContent", this.popupNode);
this.visible = true;
// logDebug("popup visible");
}
Popup.create = function(options, title_popup, content) {
var inPopup = DIV({"id":"__popupInDivId", "style":"background:white;margin:2px 5px;"}, content);
var outPopup = DIV({"id":"__popupOutDivId","style":"background:#AE0F3E;z-index:500;float:left;padding:0;min-width:300px;position:fixed;top:30%;left:30%;right:30%;"}, H1({"style":"font-size:1em;margin:0;text-align:center;color:white;"}, IMG({"src":"/static/images/WindowTitleLogo.png","alt":"icon", "style":"margin:0 5px;"}), title_popup), inPopup );
roundElement(outPopup);
logDebug("Popup \""+ title_popup +"\" created");
this.popupNode = outPopup;
}
Popup.hide = function() {
if (this.visible) {
removeElement(this.popupNode);
this.visible = false;
}
// logDebug("popup not visible");
}
Popup.closeLink = function(options, text_link) {
options["href"] = "#";
options["onclick"] = "Popup.hide()";
return A(options, text_link);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5 KiB

View file

@ -1,79 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta content="text/html; charset=utf-8" HTTP-EQUIV="Content-Type">
<title>Cr@ns Intranet</title>
<style type="text/css">
table.factureDetails {
padding:1%;
width:96%;
margin:0 1% 10px 1%;
}
.tdTotalDetail,
.tdTotalDetailIntitule {
border-top:thin black solid;
}
.tdTotalDetailIntitule {
text-align:right;
font-weight:bold;
}
table.factureDetails th {
border-bottom:thin black solid;
}
table.factureDetails th,
table.factureDetails td {
border-right:thin black solid;
margin:0;
padding:5px 20px;
}
table.factureDetails td.full {
text-align:center;
border: none;
}
</style>
</head>
<body>
<div style="background:white url(/static/images/petitCr@ns.png) top left no-repeat; padding:2em;width:21cm;border:thin black solid;">
<h1 style="margin:1em 1em 1em 50px;">Devis pour impression</h1>
<span style="font-weight:bold;">Fichier : </span> $getVar('nomFichier', 'XXXXX')
<div id="facture" style="margin:2em 1em 1em 1em;">
<table cellspacing="0" border="0" class="factureDetails">
<tr>
<th width="80%">Description</th>
<th>Prix unitaire</th>
<th>Quantit&eacute;</th>
<th>total</th>
</tr>
#if $getVar('devis', False)
#for anItem in $devis
<tr>
<td>$anItem[0]</td>
<td>$anItem[1]&nbsp;&euro;</td>
<td>$anItem[2]</td>
<td>
#echo str($anItem[1] * $anItem[2]) + '&nbsp;&euro;'
</td>
</tr>
#end for
<tr>
<td colspan="3" class="tdTotalDetailIntitule">
Total
</td>
<td class="tdTotalDetail">$getVar('total', "XXX")&nbsp;&euro;</td>
</tr>
#else
<tr><td class="full" colspan="4"><h2>Non disponible </h2></td></tr>
#end if
</table>
</div>
</div>
</body>
</html>

View file

@ -1,189 +0,0 @@
#import impression_canon
#if $getVar('errorMsg',False)
<script type="text/javascript">
<!--
Crans.messages.setMessage('$errorMsg.replace("\'","\\\'")', 'errorMessage')
//-->
</script>
#end if
<p class="crans_warning">En raison des conditions climatiques, l'imprimante a
tendance &agrave; bourrer relativement souvent. Merci de pr&eacute;voir vos
impressions &agrave; l'avance et de privil&eacute;gier les impressions
recto-verso. En raison de ces bourrages, l'agrafage peut ne pas se faire sur
toutes les feuilles. Par ailleurs, l'inscription "Paper is out" est trompeuse.
En cas de probl&egrave;me, merci de contacter rapidement les imprimeurs : <a
href="mailto:impression@lists.crans.org">impression@lists.crans.org</a>. Nous
sommes en train de rechercher une solution. Merci de votre
compr&eacute;hension. <span class="crans_signature">Les nounous</span> </p>
<div id="globalDiv">
<form id="form_impression" name="form_impression" onsubmit="Impression.popup();return false;" action="index">
<fieldset><legend>Options d'impression</legend>
<div id="leftColumn">
<div id="preview" onclick="Impression.settings.init();"></div>
<div class="clear prix_impression" id="prix_placeholder"></div>
</div>
<div id="rightColumn">
<fieldset><legend>Type d'impression</legend>
<label for="type_impression_couleur" class="labelRadio compact">
<input type="radio" name="type_impression" id="type_impression_couleur" class="inputRadio" value="True" checked="checked" onclick="Impression.settings.update(this);" />
Couleurs
</label>
<label for="type_impression_nb" class="labelRadio compact"><input type="radio" name="type_impression" id="type_impression_nb" class="inputRadio" value="False" onclick="Impression.settings.update(this);" />
Noir et blanc
</label>
</fieldset>
<fieldset><legend>Copies et papier</legend>
<label for="papier" class="labelInput">Papier:</label>
<select name="papier" id="papier" class="selectOne" onchange="Impression.settings.update(this);">
#for type_papier in ['A4', 'A3']
<option value="$type_papier">$impression_canon.DICT_PAPIER[type_papier]</option>
#end for
</select>
<br />
<label for="agrafage" class="labelInput">Agrafes:</label>
<select name="agrafage" id="agrafage" class="selectOne" onchange="Impression.settings.update(this);">
#for type_agrafes in $impression_canon.AVAIL_AGRAFES
<option value="$type_agrafes">$impression_canon.DICT_AGRAFAGE[type_agrafes]</option>
#end for
</select>
<br />
<label for="nb_copies" class="labelInput">Copies:</label>
<input onkeyup="Impression.settings.update(this);" type="text" name="nb_copies" id="nb_copies" class="inputText" size="10" maxlength="50" value="1" />
</fieldset>
<fieldset><legend>Disposition</legend>
<label for="disposition_recto" class="labelRadio compact">
<input type="radio" name="disposition" id="disposition_recto" class="inputRadio" value="False" onclick="Impression.settings.update(this);" />
Recto
</label>
<label for="disposition_recto_verso" class="labelRadio compact">
<input type="radio" name="disposition" id="disposition_recto_verso" class="inputRadio" value="True" checked="checked" onclick="Impression.settings.update(this);" />
Recto-verso
</label>
<label for="disposition_livret" class="labelRadio compact">
<input type="radio" name="disposition" id="disposition_livret" class="inputRadio" value="True" onclick="Impression.settings.update(this);" />
Livret avec piq&ucirc;re &agrave; cheval
</label>
<a class="aide" href="http://wiki.crans.org/VieCrans/ImpressionReseau">aide</a>
</fieldset>
</div>
<div class="clear bouttons">
<input type="reset" value="Reset" onclick="Impression.settings.reset();return false;" />
<!-- <input type="button" value="Devis"
onclick="window.open('devis')" /> -->
<input type="button" value="Imprimer" onclick="Impression.AJAX.lancerImpression();"/>
</div>
</fieldset>
</form>
<ul id="actionMenu">
#if $getVar('fileName',False)
<li id="fileName"><span>$fileName</span></li>
<li><span style="font-weight:bold;">pages: </span><span id="fileNbPages"></span></li>
<hr />
#end if
<li id="actionNouvelleImpression"><a href="index">Nouvelle impression</a></li>
<li id="actionMesCodes"><a href="#" onclick="Impression.mesCodes.getCodes(); return false;">Mes codes</a></li>
<li id="actionMesCodes" onclick="Impression.AJAX.updateSolde(); return false;">
<span style="font-weight:bold;">Solde: </span>
<span id="soldePlaceHolder">-</span> &euro;
</li>
<script type="text/javascript">
<!--
Impression.AJAX.updateSolde();
//-->
</script>
<li id="actionEtatImprimante" onclick="Impression.AJAX.getPrinterState();">
<span style="font-weight:bold;">&Eacute;tat imprimante:</span><br />
<span id="etatImprimanteIci"> - </span>
</li>
<script type="text/javascript">
<!--
Impression.AJAX.getPrinterState();
//-->
</script>
</ul>
#if not $getVar('Erreur_imprimante',False)
#if not $getVar('fileName',False)
<div id="popupFichiers">
<h1>Impression - Choix fichier</h1>
<div id="insideDiv">
#if $getVar('openError',False)
<div style="text-align:center;width:40%;border:2px solid red;margin:5px auto;padding:5px 10px;">$openError</div>
#end if
<p class="crans_warning">Il semblerait que l'interface d'impression ne soit
pas compatible avec internet explorer. Nous esp&eacute;rons pouvoir
r&eacute;gler ce probl&egrave;me au plus vite. Nous vous conseillons en attendant
d'utiliser <a href="http://www.mozilla-europe.org/fr/products/firefox/">Firefox</a>. <span class="crans_signature">Les
nounous</span> </p>
<form method="post" action="./" enctype="multipart/form-data">
<h2>Mes fichiers</h2>
<div>
<select name="fileList" id="fileList" size="5">
#for $file in $fileList
<option>$file</option>
#end for
</select>
</div>
<div class="buttons">
<input type="submit" name="submit" class="button" value="Choisir" />
</div>
<h2>Envoyer un fichier</h2>
<div>
<input type="file" name="newFile" class="file" />
</div>
<div>
<input type="submit" name="submit" value="Envoyer" class="button"/>
</div>
</form>
<div class="clear"></div>
</div>
</div>
<script type="text/javascript">
roundElement("popupFichiers");
roundElement("insideDiv");
</script>
#end if
</div>
#if $getVar('fileName',False)
<script type="text/javascript">
<!--
Impression.settings.init();
//Impression..AJAX.updateSolde();
Impression.AJAX.usefile('$fileName');
/* Impression.settings.preloadAllImages();*/
//-->
</script>
#else
<script type="text/javascript">
<!--
Impression.settings.init();
//Impression..AJAX.updateSolde();
Impression.settings.disableForm(true);
//-->
</script>
#end if
#else
## desactivation de l'interface si l'imprimant a un probleme
<script type="text/javascript">
<!--
Impression.settings.init();
//Impression.AJAX.updateSolde();
Impression.settings.disableForm(true);
logError("$Erreur_imprimante");
//-->
</script>
#end if

View file

@ -1,16 +0,0 @@
from ClassesIntranet.ModuleBase import ModuleBase
class main(ModuleBase):
def category(self):
return u"Services"
def title(self):
return u"Informations utiles"
def index(self):
return {
'template':'info-diverses',
'values':{},
'stylesheets':['infos.css'],
}
index.exposed = True

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -1,75 +0,0 @@
/*************************************************************
..
.... ............ ........
. ....... . .... ..
. ... .. .. .. .. ..... . ..
.. .. ....@@@. .. . ........ .
.. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. ....
.@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... ....
@@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. ..
.@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. .....
...@@@.... @@@ .@@.......... ........ ..... ..
. ..@@@@.. . .@@@@. .. ....... . .............
. .. .... .. .. . ... ....
. . .... ............. .. ...
.. .. ... ........ ... ...
................................
==============================================================
mainInterface.css - Intranet Style
Mise en page de l'accueil
Copyright (c) 2006 by www.crans.org
**************************************************************/
div.framed_gray {
border:5px solid #e2e2e2; /* #acc0ff */
background-color:#f2f2f2;
padding:10px;
}
div.framed_gray fieldset {
border-width:2px;
border-style:solid none none none;
border-color:#a2a2a2;
padding:10px;
margin:10px 10px;
font-weight:bold;
}
div.framed_gray fieldset legend {
color:#a2a2a2;
}
div.framed_gray fieldset ul {
list-style-type:none;
margin:0;
padding:0;
}
div.framed_gray fieldset ul li {
float:left;
height:70px;
width:100px;
margin:5px;
display:block;
text-align:center;
}
div.framed_gray fieldset ul li span {
margin-bottom:0;
display:block;
}
div.framed_gray fieldset ul a {
color:black;
text-decoration:none;
}
div.framed_gray fieldset ul li img {
margin:2px auto;
width:32px;
height:32px;
}

View file

@ -1,12 +0,0 @@
<div class="framed_gray">
<h1>Mots de passe Cr@ns</h1>
<h2>Pour les news</h2>
<dl>
<dt>Utilisateur :</dt>
<dd>Vivelapa</dd>
<dt>Mot de passe : </dt>
<dd>ranoia!</dd>
</dl>
<h1>Cr&eacute;er un compte wiki</h1>
Depuis le campus, il faut aller sur <a href="http://wiki.crans.org">wiki.crans.org</a> et cliquer sur <b>Connexion</b> puis <b>en cr&eacute;er un maintenant</b>. <br /> Depuis l'ext&eacute;rieur du campus, il faut pour cela se <a href="http://www.crans.org/cnx">connecter sur zamok</a> et ex&eacute;cuter creer_compte_wiki .
</div>

View file

@ -1,268 +0,0 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# ##################################################################################################### #
# Machines
# ##################################################################################################### #
# Description:
# Affiche la liste des machies, les infons sur une machine et permet des modifications
# Informations:
#
# Pages:
# index:liste des machines + le reste (AJAX)
#
# ##################################################################################################### #
import cherrypy, sys, os, datetime
from time import strftime, localtime, time
# libraries crans
sys.path.append('/usr/scripts/gestion/')
import crans.cp
if (cherrypy.config.configMap["global"]["server.environment"] == "development"):
from ldap_crans_test import *
# print("mesmachines : unsing test ldap : env=" + cherrypy.config.configMap["global"]["server.environment"])
else:
from ldap_crans import *
# print("mesmachines : unsing prod ldap : env=" + cherrypy.config.configMap["global"]["server.environment"])
from ClassesIntranet.ModuleBase import ModuleBase
class NotYourStuff(Exception):
"""Erreur levée si l'adhérent essaye de modifier une machine qu'il n'est pas une des siennes"""
pass
class main(ModuleBase):
_droits = ["personnel"]
def title(self):
return "Mes Machines"
def icon(self):
return "machines_icon_fixe.png"
_club = True
def AJAXListeMachines(self):
adh = cherrypy.session['LDAP'].getProprio(cherrypy.session['uid'])
machines = []
for une_machine in adh.machines():
machineInfos = {}
# nom, mac, mid, ip
machineInfos['nom'] = une_machine.nom()
machineInfos['nomCourt'] = une_machine.nom().split('.',1)[0]
machineInfos['mid'] = une_machine.id()
# type
if une_machine.objectClass == 'machineFixe':
machineInfos['type'] = 'fixe'
#machineInfos['type'] = 'Machine fixe'
else:
machineInfos['type'] = 'wifi'
#machineInfos['type'] = 'Machine wifi'
# clef ipsec
machines.append(machineInfos)
return {"machines":machines}
AJAXListeMachines.exposed = True
def AJAXMachineInfo(self, mid):
try:
machine = cherrypy.session['LDAP'].search('mid=' + mid)['machine'][0]
try:
compte_machine = machine.proprietaire().compte()
except:
raise NotYourStuff("Il semble que vous cherchiez à modifier une machine dont le propriétaire n'a pas de compte Cr@ns…")
if compte_machine != cherrypy.session['uid']:
raise NotYourStuff("Vous ne pouvez pas modifier cette machine")
# zamok -> pour tester l'affichage des ports, des alias
#machine = cherrypy.session['LDAP'].search('mid=896')['machine'][0]
machineInfos = {}
# nom, mac, mid, ip
machineInfos['nom'] = machine.nom()
machineInfos['nomCourt'] = machine.nom().split('.',1)[0]
machineInfos['mac'] = machine.mac()
machineInfos['mid'] = machine.id()
machineInfos['ip'] = machine.ip()
machineInfos['ipv6'] = str(machine.ipv6())
machineInfos['dnsIpv6'] = str(machine.dnsIpv6())
# type
if machine.objectClass == 'machineFixe':
machineInfos['type'] = 'fixe'
else:
machineInfos['type'] = 'wifi'
# clef ipsec
try:
machineInfos['ipsec'] = machine.ipsec()
except:
machineInfos['ipsec'] = ''
# alias
machineInfos['alias'] = machine.alias()
# blacklists
machineInfos['blacklist'] = []
for blacklist_type in machine.blacklist_all()[0].keys():
for (begin, end) in machine.blacklist_all()[0][blacklist_type]:
blacklist = {}
blacklist['begin'] = strftime('%d/%m/%Y %H:%M', localtime(int(begin)))
blacklist['end'] = strftime('%d/%m/%Y %H:%M', localtime(int(end)))
blacklist['type'] = blacklist_type
blacklist['actif'] = 1
machineInfos['blacklist'].append(blacklist)
for blacklist_type in machine.blacklist_all()[1].keys():
for (begin, end) in machine.blacklist_all()[1][blacklist_type]:
blacklist = {}
blacklist['begin'] = strftime('%d/%m/%Y %H:%M', localtime(int(begin)))
blacklist['end'] = strftime('%d/%m/%Y %H:%M', localtime(int(end)))
blacklist['type'] = blacklist_type
blacklist['actif'] = 0
machineInfos['blacklist'].append(blacklist)
# ports
machineInfos['ports'] = []
if machine.portTCPin() != []:
machineInfos['ports'].append(
{
'titre':'Ports TCP ouverts ext->machine',
'ports':machine.portTCPin()
}
)
if machine.portTCPout() != []:
machineInfos['ports'].append(
{
'titre':'Ports TCP ouverts machine->ext',
'ports':machine.portTCPout()
}
)
if machine.portUDPin() != []:
machineInfos['ports'].append(
{
'titre':'Ports UDP ouverts ext->machine',
'ports':machine.portUDPin()
}
)
if machine.portUDPout() != []:
machineInfos['ports'].append(
{
'titre':'Ports TCP ouverts machine->ext',
'ports':machine.portUDPout()
}
)
return machineInfos
except Exception, e:
return {"erreur":str(e)}
AJAXMachineInfo.exposed = True
##########################
# affichage
##########################
#
# methode qui affiche la template
#
def index(self):
return {
'template' :'machines',
'values' :{},
'stylesheets' :['machines.css'],
'scripts':['machines.js'],
}
index.exposed = True
###########################################################################
# methodes pour changer
# des valeurs
###########################################################################
#
##########################
# machine:nom
##########################
def AJAXChangerNom(self, mid, nouveauNom):
try:
adh = cherrypy.session['LDAP'].getProprio(cherrypy.session['uid'])
mach = cherrypy.session['LDAP'].search('mid=' + mid, 'w')['machine'][0]
# tester si c'est bien la machine de l'adherent
if mach.proprietaire().compte() != cherrypy.session['uid']:
del adh, mach
raise Exception(u"L'uid de l'adherent ne correspond pas au proprietaire de la machine.")
anciennom = mach.nom()
nouveauNom = mach.nom(nouveauNom)
mach.save()
del mach
except ValueError, e:
raise e
#return {'error':str(e)}
crans.cp.log("Changer nom machine : %s->%s" % (anciennom, nouveauNom), "MESMACHINES")
return {'message':u"Modification réussie", 'mid':mid}
AJAXChangerNom.exposed = True
##########################
# machine:mac
##########################
def AJAXchangerMAC(self, mid, nouvelleMAC):
try:
adh = cherrypy.session['LDAP'].getProprio(cherrypy.session['uid'])
mach = cherrypy.session['LDAP'].search('mid=' + mid, 'w')['machine'][0]
# tester si c'est bien la machine de l'adherent
if mach.proprietaire().compte() != cherrypy.session['uid']:
del adh, mach
raise Exception(u"L'uid de l'adherent ne correspond mas au proprietaire de la machine.")
anciennemac = mach.mac()
nommachine = mach.nom()
mach.mac(nouvelleMAC)
mach.save()
del mach
except ValueError, e:
return {'error':e.args[0]}
crans.cp.log("Change mac machine %s : %s->%s" % (nommachine, anciennemac, nouvelleMAC), "MESMACHINES")
return {'message':u"Modification réussie", 'mid':mid}
AJAXchangerMAC.exposed = True
##########################
# machine:suppression
##########################
def AJAXSupprimerMachine(self, mid):
try:
adh = cherrypy.session['LDAP'].getProprio(cherrypy.session['uid'])
mach = cherrypy.session['LDAP'].search('mid=' + mid, 'w')['machine'][0]
# tester si c'est bien la machine de l'adherent
if mach.proprietaire().compte() != cherrypy.session['uid']:
del adh, mach
raise Exception(u"L'uid de l'adherent ne correspond mas au proprietaire de la machine.")
mach.delete()
except ValueError, e:
return {'error':e.args[0]}
crans.cp.log("Machine supprimee", "MACHINES")
return {'message':u"Machine supprimée"}
AJAXSupprimerMachine.exposed = True
##########################
# machine:creation
##########################
def AJAXCreerMachine(self, nomNouvelleMachine, MACNouvelleMachine, typeNouvelleMachine):
adh = cherrypy.session['LDAP'].getProprio(cherrypy.session['uid'])
est_personnel = adh.etudes(0) == 'Personnel ENS'
if est_personnel and typeNouvelleMachine == 'wifi':
return {'error':'Vous n\'avez pas la possibilite d\'enregistrer de machine WiFi.'}
if typeNouvelleMachine=='fixe' and (isinstance(adh,Adherent) and adh.droits() == []) and adh.machines_fixes() != [] and not est_personnel:
return {'error':'Vous avez deja une machine fixe. Vous ne pouvez ajouter que des machines WiFi.'}
try:
if typeNouvelleMachine=='wifi':
m = MachineWifi(adh)
elif typeNouvelleMachine=='fixe':
m = MachineFixe(adh)
else:
raise Exception, "type de machine inconnu : %s " % typeNouvelleMachine
m.nom(nomNouvelleMachine)
m.mac(MACNouvelleMachine)
m.ip("<automatique>")
message = m.save()
del m
except ValueError, e:
try:
del m
except:
pass
return {'error':e.args[0].replace("\n","\\n")}
crans.cp.log("Nouvelle machine %s" % nomNouvelleMachine, "MACHINES")
return {'message':u"Machine enregistrée avec succès"}
AJAXCreerMachine.exposed = True

View file

@ -1,160 +0,0 @@
/*************************************************************
..
.... ............ ........
. ....... . .... ..
. ... .. .. .. .. ..... . ..
.. .. ....@@@. .. . ........ .
.. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. ....
.@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... ....
@@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. ..
.@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. .....
...@@@.... @@@ .@@.......... ........ ..... ..
. ..@@@@.. . .@@@@. .. ....... . .............
. .. .... .. .. . ... ....
. . .... ............. .. ...
.. .. ... ........ ... ...
................................
==============================================================
macines.css - Intranet Style
Copyright (c) 2006 by www.crans.org
**************************************************************/
#globalDiv {
padding-left : 20%;
margin:0;
position:relative;
}
h2 {
margin: 0 5px .5em 5px;padding:5px;
}
div.alias {
color:gray;
margin:0;
padding:0 0 0 60px;
display:block;
font-weight:normal;
font-size:0.6em;
}
table.blacklist_table,
table.ports_table {
border-top: thin black solid;
border-left: thin black solid;
}
table.blacklist_table td,
table.blacklist_table th,
table.ports_table td,
table.ports_table th {
border-right: thin black solid;
border-bottom: thin black solid;
padding: 3px;
}
.actif {
color:red;
}
.inactif {
}
#gestion_machines_main_frame {
padding:5px;
}
dl.basicInfos dt {
float:left;
font-weight:bold;
clear:left;
}
dl.basicInfos dd {
float:left;
margin:0 1em;
}
ul#listeMachines {
list-style-type:none;
margin:0;
padding:0;
}
ul#listeMachines li {
float:left;
height:70px;
width:100px;
margin:5px;
display:block;
text-align:center;
}
ul#listeMachines li span {
margin-bottom:0;
display:block;
}
ul#listeMachines li a {
display:block;
color:black;
text-decoration:none;
}
ul#listeMachines li a:hover {
background:#bbbbff;
}
ul#listeMachines li a:active {
background:#8888ff;
}
ul#listeMachines li img {
margin:2px auto;
width:32px;
height:32px;
}
#menu_actions {
background:#eeeeff;
padding:.3em;
width:18%;
float:left;
position:absolute;
top:1em;
left:0;
border: thin black solid;
}
#menu_actions ul {
list-style-type:none;
padding:0;
margin:.5em;
}
#menu_actions ul li a {
text-decoration:none;
}
#menu_actions ul li a:hover {
text-decoration:underline;
}
#menu_actions h1 {
font-size:1em;
margin:0;
text-align:center;
border-bottom: thin black solid;
}
// on change la couleur des messages
.message {
background-color:#000080;
color:white;
}
label {
width:175px;
display:block;
float:left;
}

View file

@ -1,337 +0,0 @@
/* ************************************************************
* Machines
************************************************************
* Machines.init : initialisation de la page
* Machines.listeMachines : liste des machines
* Machines.infoPane : information sur une machine
* Machines.actions : modifications, ajout...
* Machines.AJAX : ajax
*/
Machines = {};
/*****************************
Machines.init
*****************************/
Machines.init = function()
{
// afficher le tableau codelist
appendChildNodes("globalDiv", Machines.createFrames());
appendChildNodes("globalDiv", Machines.actions.makeMenu());
// recuperer la liste des codes
this.listeMachines.load();
}
Machines.createFrames = function()
{
var main = DIV({"id":"gestion_machines_main_frame"});
var inside = DIV({"id":"__insideDivId", "style":"background:white;margin:5px;padding:5px;"},main);
var outside = DIV({"id":"__outsideDivId","style":"background:#000080;z-index:500;padding:0;"}, inside );
roundElement(outside);
roundElement(inside);
log("Creation du cadre");
return outside
}
/*****************************
Machines.listeMachines
*****************************/
Machines.listeMachines = {};
Machines.listeMachines.load = function()
{
Machines.AJAX.call("AJAXListeMachines", Machines.listeMachines.display);
log("Chargement liste...");
Machines.currentMachine = '';
}
Machines.listeMachines.display = function(result)
{
log("display liste");
replaceChildNodes( "gestion_machines_main_frame",
H2({}, "Mes machines"),
UL({"id":"listeMachines"}),
DIV( {"style":"clear:both;"} )
);
if (result.machines) {
replaceChildNodes('listeMachines',map(Machines.listeMachines.newMachineNodeFromDict ,result.machines));
Machines.actions.updateMenu(Machines.actions.actionForMachineList);
Machines.currentMid = '';
}
else if (result.erreur)
logError("Erreur distante : " + result.erreur);
else
logError("Probleme bizarre...");
}
Machines.listeMachines.newMachineNodeFromDict = function (aDict, style)
{
var nom = aDict.nomCourt;
var mid = aDict.mid;
var image = "machines_icon_" + aDict.type + ".png";
//log("create an item : " + nom);
if (style) {
var anIcon = LI({'id':'machine_' + mid,"style":style});
} else
var anIcon = LI( {'id':'machine_' + mid} );
appendChildNodes(anIcon, A({"href":"#", "onclick":"Machines.infoPane.loadInfo('"+mid+"');return false;"},
IMG({"src":"static/" + image}),
SPAN({},nom) ) );
return anIcon;
}
/*****************************
Machines.infoPane
*****************************/
Machines.infoPane = {};
Machines.infoPane.loadInfo = function(mid)
{
if (!mid)
if (!Machines.currentMachine) {
logError("Machines.infoPane.loadInfo : pas de mid, pas de machine courrante...");
return
} else
mid = Machines.currentMachine.mid;
log("load info : " + mid);
Machines.AJAX.call("AJAXMachineInfo?mid=" + mid, Machines.infoPane.display);
try {
pulsate('machine_' + mid);
} catch (error) {}
}
Machines.infoPane.display = function(result)
{
if (result.nom) {
log("displaying info : " + result.mid);
// building pane
var machinePane = DIV({"id":"machine_pane"});
// lien pour retourner a la liste des machines
var back_link = A({"href":"#", "onclick":"Machines.listeMachines.load(); return false;"},"Retour");
appendChildNodes( machinePane, back_link );
// titre (nom de machine + alias)
var title = H2({}, IMG({"src":"./static/machines_icon_" + result.type + ".png"}), " ", result.nom);
var alias = DIV({"class":"alias"},
map(function(a_name) { return SPAN({}, a_name + " ")}, result.alias));
appendChildNodes( title, alias );
appendChildNodes( machinePane, title );
// infos de base (type, mac, ip, ipsec...)
var basicInfos = createDOM("DL", {"class":"basicInfos"});
appendChildNodes(basicInfos, createDOM("DT", "type:" ), createDOM("DD",{},"Machine " + result.type ) );
appendChildNodes(basicInfos, createDOM("DT", "mac: " ), createDOM("DD",{},result.mac ) );
appendChildNodes(basicInfos, createDOM("DT", "ip: " ), createDOM("DD",{},result.ip ) );
appendChildNodes(basicInfos, createDOM("DT", "ipv6: " ), createDOM("DD",{},result.ipv6 ) );
appendChildNodes(basicInfos, createDOM("DT", "accessible directement en ipv6: " ), createDOM("DD",{},result.dnsIpv6 ) );
if (result.ipsec) {
appendChildNodes(basicInfos, createDOM("DT", "Clef Wifi:" ), createDOM("DD",{},result.ipsec, BR(), A({'href': 'http://wifi.crans.org/#Config'}, 'Comment configurer ma machine')));
// http://wifi.crans.org/#Config
}
appendChildNodes( machinePane, basicInfos );
appendChildNodes( machinePane, DIV( {"style":"clear:both;"} ) );
// blacklist
if (result.blacklist)
if (result.blacklist.length) {
var subtitle = H3({}, "Blacklist");
appendChildNodes( machinePane, subtitle );
var blacklist_table = TABLE({"class":"blacklist_table", "cellspacing":"0"},
THEAD({},
TH({}, "Cause"),
TH({}, "Debut"),
TH({}, "Fin")
)
);
map(function(a_blacklist_dict) {
var style = "inactif";
if (a_blacklist_dict.actif)
style = "actif";
var line = TR({"class":style},
TD({}, a_blacklist_dict.type),
TD({}, a_blacklist_dict.begin),
TD({}, a_blacklist_dict.end)
);
appendChildNodes(blacklist_table, line);
}, result.blacklist );
appendChildNodes( machinePane, blacklist_table );
}
// liste des ports ouverts
if (result.ports)
if (result.ports.length) {
var subtitle = H3({}, "Ports ouverts");
appendChildNodes( machinePane, subtitle );
var port_table = TABLE({"class":"ports_table", "cellspacing":"0"});
map(function(a_port_dict) {
var line = TR({},
TH({}, a_port_dict.titre),
map(function(a_port) {return TD({}, a_port);}, a_port_dict.ports)
);
appendChildNodes(port_table, line);
}, result.ports );
appendChildNodes( machinePane, port_table );
}
// attaching pane to document
replaceChildNodes( "gestion_machines_main_frame", machinePane);
// updationg actions
Machines.currentMachine = result;
Machines.actions.updateMenu(Machines.actions.actionsForInfoPane);
} else if (result.erreur) {
logError("Erreur distante : " + result.erreur);
} else
logError("Probleme bizarr...");
}
/*****************************
Machines.actions
*****************************/
Machines.actions = {}
Machines.actions.disponibles =
{
'Ajouter machine fixe':'Machines.actions.formulaire.nouvelleMachine(\'fixe\');',
'Ajouter machine wifi':'Machines.actions.formulaire.nouvelleMachine(\'wifi\');',
'Modifier Mac':'Machines.actions.formulaire.modifierMac(Machines.currentMid);',
'Renommer':'Machines.actions.formulaire.renommer(Machines.currentMid);',
'Supprimer':'Machines.actions.formulaire.supprimer(Machines.currentMid);',
'Demander l\'ouverture d\'un port':'Machines.actions.formulaire.ouverturePort(Machines.currentMid);'
}
Machines.actions.actionForMachineList = ['Ajouter machine fixe', 'Ajouter machine wifi'];
Machines.actions.actionsForInfoPane = ['Modifier Mac', 'Renommer', 'Supprimer'];
Machines.actions.makeMenu = function(actionListe)
{
log("building action menu");
var liste = UL({"id":"liste_actions"});
//this.updateMenu(actionListe, liste)
return DIV( {"id":"menu_actions"},
H1( {}, "ACTIONS"),
liste
);
}
Machines.actions.updateMenu = function(actionListe, liste_actionsNode)
{
if (!liste_actionsNode)
liste_actionsNode = "liste_actions";
replaceChildNodes(liste_actionsNode);
map(
function(actionName) {
appendChildNodes(liste_actionsNode, LI({}, Machines.actions.makeActionLink(actionName)));
}
, actionListe);
}
Machines.actions.makeActionLink = function(actionName)
{
if (this.disponibles[actionName])
{
return A({"href":"#", "onclick":this.disponibles[actionName] + "return false;"}, actionName);
} else
logError("action inconnue " + actionName);
return A({}, "???");
}
Machines.actions.callback = function(result) {
if (result.message){
log(result.message);
Crans.messages.setMessage(result.message);
if (result.mid)
Machines.infoPane.loadInfo(result.mid);
else
Machines.listeMachines.load();
}
if (result.error){
alert(result.error);
logError("AJAX error");
}
}
// actions : affichage des formulaires
Machines.actions.formulaire = {}
Machines.actions.formulaire.modifierMac = function()
{
if (!Machines.currentMachine)
logError("pas de machine courrante");
else {
var c = '';
while ( c == '')
c = prompt("Adresse MAC de la machine :",Machines.currentMachine.mac);
if (c == null)
return false;
// AJAX stuff
Machines.AJAX.call('AJAXchangerMAC?nouvelleMAC=' + c + '&mid=' + Machines.currentMachine.mid,
Machines.actions.callback);
}
return false;
}
Machines.actions.formulaire.renommer = function() {
if (!Machines.currentMachine)
logError("pas de machine courrante");
else {
var c = '';
while ( c == '')
c = prompt("Nom de la machine :",Machines.currentMachine.nomCourt);
if (c == null)
return false;
// AJAX stuff
Machines.AJAX.call('AJAXChangerNom?nouveauNom=' + c + '&mid=' + Machines.currentMachine.mid,
Machines.actions.callback);
}
return false;
}
Machines.actions.formulaire.supprimer = function() {
if (!Machines.currentMachine)
logError("pas de machine courrante");
else {
if (confirm("Supprimer la machine " + Machines.currentMachine.nomCourt +" ?")) {
// AJAX stuff
Machines.AJAX.call('AJAXSupprimerMachine?mid=' + Machines.currentMachine.mid,
Machines.actions.callback);
}
}
return false;
}
Machines.actions.formulaire.nouvelleMachine = function(type) {
replaceChildNodes( "gestion_machines_main_frame",
A({"href":"#", "onclick":"Machines.listeMachines.load(); return false;"},"Retour"),
H2({}, "Nouvelle machine"),
FORM({"style":"clear:both;", 'onsubmit':'Machines.actions.creerMachine(this.typeField.value, this.nom.value, this.mac.value);return false;'},
createDOM('label', {'for':'add_machine_nom'}, "Nom de la machine : "),
INPUT({"name":"nom"}),
BR(),
createDOM('label', {'for':'add_machine_mac'}, "Adresse MAC : "),
INPUT({"name":"mac"}),
BR(),
createDOM('label', {'for':'add_machine_type'}, "Type de machine : "),
SPAN({'id':'add_machine_type'}, type),
INPUT({"name":"typeField", 'type':'hidden', 'value':type}),
BR(),
BUTTON({"class":"liens", 'type':'submit'}, 'Ajouter')
)
);
return false;
}
Machines.actions.creerMachine = function(type, nom, mac) {
Machines.AJAX.call('AJAXCreerMachine?nomNouvelleMachine=' + nom
+ '&MACNouvelleMachine=' + mac
+ '&typeNouvelleMachine=' + type,
Machines.actions.callback);
}
/*****************************
Machines.AJAX
*****************************/
Machines.AJAX = {}
Machines.AJAX.call = AJAX.call

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -1,247 +0,0 @@
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# ########################################################################
# Mes Sous
# ########################################################################
# Description:
# Affiche la liste des factures et l'historique de debits/credits de
# l'adherent. Fait aussi les rechargements Paypal
# Informations:
#
# Pages:
# index:liste des factures
# historique: historique des débits/crédits
# rechargementPaypal: Comme son nom l'indique
#
# ########################################################################
import cherrypy, sys, os, datetime
if (cherrypy.config.configMap["global"]["server.environment"] == "development"):
from ldap_crans_test import *
# print("monCompte : unsing test ldap : env=" + cherrypy.config.configMap["global"]["server.environment"])
else:
from ldap_crans import *
# print("monCompte : unsing prod ldap : env=" + cherrypy.config.configMap["global"]["server.environment"])
from ClassesIntranet.ModuleBase import ModuleBase
class main(ModuleBase):
def title(self):
return "Mon Solde"
def category(self):
return "Personnel"
def icon(self):
return "icon.png"
_club = True
def getCurrentAdministrativeYear(self):
'''
premiere partie de l''annee scolaire en cours
ex : le 5 juin 2006 retourne 2005
'''
now = datetime.datetime.now()
currentYear = int(now.strftime("%Y"))
currentMonth = int(now.strftime("%m"))
if currentMonth > 8:
administrativeYear = currentYear
else:
administrativeYear = currentYear - 1
return administrativeYear
def index(self, message = '', error = ''):
adh = cherrypy.session['LDAP'].getProprio(cherrypy.session['uid'])
t = {}
t['message'] = message
t['error'] = error
t['solde'] = adh.solde
############## liste des factures ##############
listeFactures = []
for f in adh.factures():
facture = {}
facture['no'] = f.numero()
facture['intitule'] = f.articles()[0]['designation']
facture['details'] = [
{
'intitule':art['designation'],
'quantite':art['nombre'],
'prixUnitaire':art['pu'],
'prixTotal':art['pu']*art['nombre'],
} for art in f.articles()]
facture['montant'] = f.total()
facture['paypal'] = f.urlPaypal(useSandbox = cherrypy.config.get("paypal.useSandbox", False),
businessMail = cherrypy.config.get("paypal.businessAdress", "paypal@crans.org"),
return_page = "https://intranet.crans.org/monCompte/paypalReturn",
cancel_return_page = "https://intranet.crans.org/monCompte/paypalCancel",
)
facture['payee'] = f.recuPaiement()
listeFactures.append(facture)
t['listeFactures'] = listeFactures
return {
'template' :'factures',
'values' :t,
'stylesheets' :['cransFactures.css'],
'scripts' :[],
}
index.exposed = True
def historique(self, page = 1, items_per_page = 20):
adh = cherrypy.session['LDAP'].getProprio(cherrypy.session['uid'])
lst = [ x for x in adh.historique() if x.split(u' : ',1)[1].startswith(u'credit') or x.split(u' : ',1)[1].startswith(u'debit') ]
histLst = []
for anItem in lst:
aLine = {}
aLine["date"] = anItem.split(u",")[0]
aLine["type"] = anItem.split(u' : ',2)[1].split(u' ')[0]
aLine["montant"] = anItem.split(u' : ',2)[1].split(u' ')[1]
try:
aLine["intitule"] = anItem.split(u'[')[1].split(u']')[0]
except Exception:
aLine["intitule"] = ""
histLst.append(aLine)
histLst.reverse()
page = int(page)
items_per_page = int(items_per_page)
if page == 1:
prevPage = None
else:
prevPage = page - 1
if page * items_per_page >= histLst.__len__():
nextPage = None
else:
nextPage = page + 1
offset = items_per_page * ( page - 1)
return {
'template' :'factures-historique',
'values' :{
'liste':lst,
'historic_items':histLst[offset:offset + items_per_page],
'nextPage':nextPage,
'prevPage':prevPage
},
'stylesheets' :['cransFactures.css'],
'scripts' :[],
}
historique.exposed = True
def delFacture(self, no):
try:
# trrouver la factures
fact = cherrypy.session['LDAP'].search('fid=' + no, 'w')['facture'][0]
#verifier qu'elle appartient bien a l'adherent
if not fact.proprietaire().mail() == cherrypy.session['uid']:
raise Exception, "Impossible de supprimer cette facture"
# la supprimer
fact.delete()
except Exception, e:
cherrypy.log(str(e), "FACTURES", 1)
return self.index()
delFacture.exposed = True
##########################
# paypal
##########################
#
# methode qui affiche successivement les
# templates du popup pour recharger son compte impression
# via paypal
#
def rechargerCompteImpression(self, etape = '1', combien = None):
adh = cherrypy.session['LDAP'].getProprio(cherrypy.session['uid'])
if (etape == "1"): # Introduction
return {
'template' :'MonCompteRechargePaypal1',
'standalone' :True,
'values' :{},
}
elif (etape == "2"): # choix montant
return {
'template' :'MonCompteRechargePaypal2',
'standalone' :True,
'values' :{},
}
elif (etape == "3"): # confirmer facture
# creer objet facture
f = Facture(adh)
# /!\ verifier que combien est un nombre
# et qu'il n'y a pas plus de 2 chiffres apres le point...
# (ce serait bien aussi si on pouvait mettre une virgue a la place du point)
try:
# remplacage des virgules
combien = combien.replace(u',', u'.')
# convertissage
combien = float(combien)
# arrondissage-tronquage :
combien = float(int(combien*100)/100.0)
# nombre positif
if combien < 0:
raise ValueError
except Exception:
return {
'template' :'MonCompteRechargePaypal2',
'standalone' :True,
'values' :{'error':"Le montant doit &ecirc;tre un nombre positif !", 'combien':combien},
}
f.ajoute({'nombre': 1, 'code': 'SOLDE', 'designation': 'Credit du compte impression (intranet)', 'pu': combien})
cherrypy.session['freshFacture'] = f
pageData = {}
pageData['details'] = [
{
'intitule':art['designation'],
'quantite':art['nombre'],
'prixUnitaire':art['pu'],
'prixTotal':art['pu']*art['nombre'],
} for art in f.articles()]
pageData['total'] = f.total()
return {
'template' :'MonCompteRechargePaypal3',
'standalone' :True,
'values' :pageData,
}
elif (etape == "4"):# payer maintenant ?
# sauver objet facture
f = cherrypy.session['freshFacture']
f.save()
return {
'template' :'MonCompteRechargePaypal4',
'standalone' :True,
'values' :{'lienPaypal' : f.urlPaypal(useSandbox = cherrypy.config.get("paypal.useSandbox", False),
businessMail = cherrypy.config.get("paypal.businessAdress", "paypal@crans.org"),
return_page = "https://intranet.crans.org/monCompte/paypalReturn",
cancel_return_page = "https://intranet.crans.org/monCompte/paypalCancel",
)},
}
rechargerCompteImpression.exposed = True
def paypalReturn(self, **kw):
_crans_cp.log("retour de paypal avec les infos : %s" % " ".join( [ "[%s: %s]" % (str(a), str(kw[a])) for a in kw] ) )
return {
'template' :'MonComptePaypalReturn',
'standalone' :True,
'values' :{},
}
paypalReturn.exposed = True
def paypalCancel(self, **kw):
_crans_cp.log("annulation de paypal avec les infos : %s" % " ".join( [ "[%s: %s]" % (str(a), str(kw[a])) for a in kw] ) )
return {
'template' :'MonComptePaypalCancel',
'standalone' :True,
'values' :{},
}
paypalCancel.exposed = True

View file

@ -1,22 +0,0 @@
#import cherrypy
#set bugMail = cherrypy.config.get("mail.bugreport", "nounous@crans.org")
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
#include "inc-paypal-head.tmpl"
</head>
<body>
<div id="popupInnerBody">
<h2>Paiement annul&eacute;</h2>
<p>Ton compte impressions sera cr&eacute;dit&eacute; d&eacute;s que la facture sera r&eacute;gl&eacute;e.</p>
<p>Tu peux r&eacute;gler la facture plus tard en allant dans <a href="/mesSous/">Mes Factures</a></p>
<p>En cas de probl&egrave;me, envoie un mail &agrave; <a href="mailto:$bugMail">$bugMail</a></p>
<div class="liens">
<a href="./">Retour</a>
</div>
</div>
</form>
</div>
</body></html>

View file

@ -1,21 +0,0 @@
#import cherrypy
#set bugMail = cherrypy.config.get("mail.bugreport", "nounous@crans.org")
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
#include "inc-paypal-head.tmpl"
</head>
<body>
<div id="popupInnerBody">
<h2>Paiement termin&eacute;</h2>
<p>Ton compte impressions sera cr&eacute;dit&eacute; dans quelques minutes.</p>
<p>N'h&eacute;site pas &agrave; nous envoyer tes remarques et/ou suggestions &agrave; <a href="mailto:$bugMail">$bugMail</a></p>
<div class="liens">
<a href="./">Retour</a>
</div>
</div>
</form>
</div>
</body></html>

View file

@ -1,21 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
#include "inc-paypal-head.tmpl"
</head>
<body>
<div id="popupInnerBody">
<h2>Recharger son compte impression</h2>
<p> Le cr@ns te permet de recharger ton compte pour les impressions via PayPal ou en allant voir un c&acirc;bleur.</p>
<p>La m&eacute;thode PayPal est plus rapide mais PayPal facture des frais de transaction.</p>
<p><i>N.B. : le solde d'impression est de nouveau cr&eacute;dit&eacute; directement apr&egrave;s le paiement, le bug a &eacute;t&eacute; r&eacute;solu.</i></p>
<div class="liens">
<a href="./">Annuler</a>
<a href="?etape=2">Continuer avec Paypal</a>
</div>
</div>
</form>
</div>
</body></html>

View file

@ -1,33 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
#include "inc-paypal-head.tmpl"
</head>
<body>
<div id="popupInnerBody">
<h2>&Eacute;tape 1 : Choisir le montant</h2>
#if $getVar('error',False)
<div class="errorMessage">$error</div>
#end if
<form method="post" action="rechargerCompteImpression" name="FormCombien">
<input type="hidden" name="etape" value="3" />
<label for="combien">Combien souhaites-tu mettre sur ton compte impression ?<br />
<input type="text" name="combien" value="$getVar('combien','')" /> &euro;
</label>
<p></p><!-- ici, calcul des frais de transaction -->
<div class="liens" id="liens">
<a href="./">Annuler</a>
<script type="text/JavaScript">
<!--
appendChildNodes("liens", A({'href':'#','onclick':"javascript:window.document.FormCombien.submit(); return false;"}, "Continuer"));
//-->
</script>
<noscript>
<input type="submit" value="Continuer"/>
</noscript>
</div>
</form>
</div>
</body></html>

View file

@ -1,35 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
#include "inc-paypal-head.tmpl"
</head><body>
<div id="popupInnerBody">
<h2>&Eacute;tape 2 : Confirmer la facture</h2>
<table cellspacing="0" border="0" class="factureDetails">
<tr>
<th width="80%">Description</th>
<th>Prix unitaire</th>
<th>Quantit&eacute;</th>
<th>total</th>
</tr>
#for unDetail in $details
<tr>
<td>$unDetail.intitule</td>
<td>$unDetail.prixUnitaire&nbsp;&euro;</td>
<td>$unDetail.quantite</td>
<td>$unDetail.prixTotal&nbsp;&euro;</td>
</tr>
#end for
<tr>
<td colspan="3" class="tdTotalDetailIntitule">
Total
</td>
<td class="tdTotalDetail">$total&nbsp;&euro;</td>
</table>
<div class="liens">
<a href="?etape=2">Pr&eacute;c&eacute;dent</a>
<a href="./">Annuler</a>
<a href="?etape=4">Confirmer</a>
</div>
</div>
</body></html>

View file

@ -1,17 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
#include "inc-paypal-head.tmpl"
</head><body>
<div id="popupInnerBody">
<h2>&Eacute;tape 3 : Fin</h2>
<p>Ton compte impressions sera credit&eacute; d&eacute;s que la facture
sera regl&eacute;e.</p>
<p>Tu peux r&eacute;gler la facture plus tard en allant dans <a
href="/mesSous/">Mon Soldes</a></p>
<div class="liens">
<a href="./">Payer plus tard</a>
<a href="$lienPaypal">Payer tout de suite</a>
</div>
</div>
</body></html>

View file

@ -1,58 +0,0 @@
<div id="messagePlaceHolder"></div>
<div id="globalDiv" onclick="setMessage();">
<ul id="actionMenu">
<li><a href="index">Mes factures PayPal</a></li>
<li><a href="historique">Historique des transactions</a></li>
</ul>
<div id="mainPanel">
<div id="factureListDiv">
<h1>Historique</h1>
<div style="overflow:auto;">
<div>
#if $prevPage
<a href="historique?page=$prevPage">&lt;&lt; moins vieux</a>
#else
<span class="off">&lt;&lt; moins vieux</span>
#end if
&nbsp;|&nbsp;
#if $nextPage
<a href="historique?page=$nextPage">plus vieux &gt;&gt;</a>
#else
<span class="off">plus vieux &gt;&gt;</span>
#end if
</div>
<table id="historique_sous" cellspacing="0">
<tr>
<th>Date</th>
<th>Intitul&eacute;</th>
<th>D&eacute;bit</th>
<th>Cr&eacute;dit</th>
</tr>
#for anItem in $historic_items
<tr>
<td>$anItem.date</td>
<td>$anItem.intitule</td>
#if $anItem.type=="debit"
<td>$anItem.montant</td>
#else
<td>&nbsp;<!-- evite que opera fasse des trucs bizarres... --></td>
#end if
#if $anItem.type=="credit"
<td>$anItem.montant</td>
#else
<td>&nbsp;<!-- evite que opera fasse des trucs bizarres... --></td>
#end if
</tr>
#end for
#if $historic_items == []
<tr><td colspan="4" style="color:gray;">
AUCUNE TRANSACTION ENREGISTR&Eacute;E
</td></tr>
#end if
</table>
</div>
</div><!-- fin de #mainPanel -->
</div>
</div>

View file

@ -1,115 +0,0 @@
<div id="messagePlaceHolder"></div>
#if $message != ''
<script type="text/javascript">setMessage('$message.replace("\'","\\\'")')</script>
#end if
#if $error != ''
<script type="text/javascript">setMessage('$error.replace("\'","\\\'")', 'errorMessage')</script>
#end if
<script type="text/javascript">
function showDetail(id){
slideDown(id, {duration:0.4});
var element = document.getElementById("togglelink" + id);
element.onclick=null;
element.style.backgroundPosition='bottom left';
setTimeout("var element = document.getElementById(\'togglelink" + id + "\');element.onclick=function () {hideDetail(\'" + id + "\'); return false;};",450);
return false;
}
function hideDetail(id){
slideUp(id, {duration:0.4});
var element = document.getElementById("togglelink" + id);
element.onclick=null;
element.style.backgroundPosition="top left";
setTimeout("var element = document.getElementById(\'togglelink" + id + "\');element.onclick=function () {showDetail(\'" + id + "\'); return false;};",450);
return false;
}
</script>
<div id="globalDiv">
<ul id="actionMenu">
<li><a href="rechargerCompteImpression">Nouveau Rechargement</a></li>
<li><a href="index">Mes factures PayPal</a></li>
<li><a href="historique">Historique des transactions</a></li>
</ul>
<div id="mainPanel">
<div id="soldeCourant">
<h1>Solde</h1>
<div class="solde">$getVar('solde', "n/a")&nbsp;&euro;
<span class="actions"><a href="rechargerCompteImpression">Rechargez avec PayPal</a></span>
</div>
</div>
<div id="factureListDiv">
<h1>Mes factures PayPal</h1>
#for f in $listeFactures
#if $f.payee
<div class="factureRow facturePayee">
#else
<div class="factureRow factureNonPayee">
#end if
<div class="factureSummary">
<span class="intitule">
#if $f.details.__len__() > 1
<a href="#" class="linkToggle" id="togglelinkfacture$f.no" onclick="showDetail('facture$f.no'); return false;"></a>
#end if
$f.intitule
#if not $f.payee
(non pay&eacute;e)
#end if
</span>
<span class="montant">
$f.montant&nbsp;&euro;
</span>
<span class="note" style="float:left;clear: left;">Cr&eacute;e le -</span>
#if not $f.payee
<span class="actions">
<a href="delFacture?no=$f.no">Annuler</a>
<a href="$f.paypal">Payer avec PayPal</a>
</span>
#else
<span class="note" style="float:right;clear:right;">Pay&eacute;e</span>
#end if
</div>
#if $f.details.__len__() > 1
<div id="facture$f.no" style="display:none;">
<table cellspacing="0" border="0" class="factureDetails">
<tr>
<th style="width:80%">Description</th>
<th>Prix unitaire</th>
<th>Quantit&eacute;</th>
<th>total</th>
</tr>
#for unDetail in $f.details
<tr>
<td>$unDetail.intitule</td>
<td>$unDetail.prixUnitaire&nbsp;&euro;</td>
<td>$unDetail.quantite</td>
<td>$unDetail.prixTotal&nbsp;&euro;</td>
</tr>
#end for
<tr>
<td colspan="3" class="tdTotalDetailIntitule">
Total
</td>
<td class="tdTotalDetail">$f.montant&nbsp;&euro;</td>
</tr>
</table>
</div>
</div>
#end if
#end for
#if $listeFactures == []
<div class="factureRow tdNoFactures">
AUCUNE TRANSACTION PAYPAL ENREGISTR&Eacute;E
</div>
#end if
</div>
</div><!-- fine de #mainPanel -->
</div>

View file

@ -1,11 +0,0 @@
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Cr@nsIntranet</title>
<!-- ++++++++++++++++++++++++++ stylesheets +++++++++++++++++++++++++++ -->
<link rel="stylesheet" type="text/css" href="$static('monCompte.css')" />
<!-- ++++++++++++++++++++++++++++ scripts +++++++++++++++++++++++++++++ -->
<script src="/static/MochiKit/MochiKit.js" type="text/javascript"></script>
<script src="/static/MochiKit/New.js" type="text/javascript"></script>

View file

@ -1,360 +0,0 @@
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# ##################################################################################################### #
# MonCompte
# ##################################################################################################### #
# Description:
#
# Informations:
#
# Pages:
#
#
# ##################################################################################################### #
import cherrypy, sys, os, datetime
# libraries crans
import crans.cp as _crans_cp
sys.path.append('/usr/scripts/gestion/')
from config_mail import MailConfig
if (cherrypy.config.configMap["global"]["server.environment"] == "development"):
from ldap_crans_test import *
# print("monCompte : unsing test ldap : env=" + cherrypy.config.configMap["global"]["server.environment"])
else:
from ldap_crans import *
# print("monCompte : unsing prod ldap : env=" + cherrypy.config.configMap["global"]["server.environment"])
from ClassesIntranet.ModuleBase import ModuleBase
class main(ModuleBase):
_droits=["personnel"]
def title(self):
return "Mon Compte"
def getCurrentAdministrativeYear(self):
'''
premiere partie de l''annee scolaire en cours
ex : le 5 juin 2006 retourne 2005
'''
now = datetime.datetime.now()
currentYear = int(now.strftime("%Y"))
currentMonth = int(now.strftime("%m"))
if currentMonth > 8:
administrativeYear = currentYear
else:
administrativeYear = currentYear - 1
return administrativeYear
##########################
# affichage
##########################
#
# methode qui affiche la template avec toutes les infos de
# l'adherent + les formulaires
#
def index(self, message = '', error = '', currentTab = 'mainTab'):
adh = cherrypy.session['LDAP'].search('uid=' + cherrypy.session['uid'])['adherent'][0]
t = {}
t['message'] = message
t['error'] = error
############## info adherent ##############
adherent = {}
# nom, prenom, chambre, tel, solde, droits, mail
adherent['prenom'] = adh.prenom()
adherent['nom'] = adh.nom()
adherent['chambre'] = adh.chbre()
if adherent['chambre'] == "EXT":
adr = adh.adresse()
adherent['adresse'] = {}
adherent['adresse']['ligne1'] = adr[0]
adherent['adresse']['ligne2'] = adr[1]
adherent['adresse']['cp'] = adr[2]
adherent['adresse']['ville'] = adr[3]
adherent['telephone'] = adh.tel
adherent['solde'] = adh.solde
adherent['droits'] = u", ".join(adh.droits())
adherent['mail'] = adh.email()
# cotisation
administrativeYear = self.getCurrentAdministrativeYear()
if administrativeYear in adh.paiement():
adherent['cotisationOK'] = 'OK'
else:
adherent['cotisationOK'] = None
# carte etudiant
if administrativeYear in adh.carteEtudiant():
adherent['carteOK'] = 'OK'
else:
adherent['carteOK'] = None
# annee scolaire (ex 2001-2002)
adherent['anneeScolaire'] = str(administrativeYear) + '-' + str(administrativeYear + 1)
t['adherent'] = adherent
############## info mail ##############
mailInfos = {}
try:
mailConfig = MailConfig(cherrypy.session['uid'])
mailInfos['forwarding_address'] = mailConfig['forward']
mailInfos['spam'] = {}
mailInfos['spam']['no'] = mailConfig['spam'] == 'accepte'
mailInfos['spam']['mark'] = mailConfig['spam'] == 'marque'
mailInfos['spam']['drop'] = mailConfig['spam'] == 'supprime'
except Exception, e:
t['mailError'] = u"Erreur:fichiers de configuration mail personnels"
mailInfos['alias'] = adh.alias()
mailInfos['contourneGreylist'] = adh.contourneGreylist()
mailInfos['rewriteMailHeaders'] = adh.rewriteMailHeaders()
t['mailInfos'] = mailInfos
return {
'template' :'monCompte',
'values' :t,
'stylesheets' :['monCompte.css'],
'scripts':['crans_domtab.js','moncompte.js','passwordGenerator.js'],
}
index.exposed = True
##########################
# paypal
##########################
#
# methode qui affiche successivement les
# templates du popup pour recharger son compte impression
# via paypal
#
def rechargerCompteImpression(self, etape = '1', combien = None):
adh = cherrypy.session['LDAP'].search('uid=' + cherrypy.session['uid'])['adherent'][0]
if (etape == "1"): # Introduction
return {
'template' :'MonCompteRechargePaypal1',
'standalone' :True,
'values' :{},
}
elif (etape == "2"): # choix montant
return {
'template' :'MonCompteRechargePaypal2',
'standalone' :True,
'values' :{},
}
elif (etape == "3"): # confirmer facture
# creer objet facture
f = Facture(adh)
# /!\ verifier que combien est un nombre
# et qu'il n'y a pas plus de 2 chiffres après le point...
# (ce serait bien aussi si on pouvait mettre une virgue a la place du point)
try:
# remplacage des virgules
combien = combien.replace(u',', u'.')
# convertissage
combien = float(combien)
# arrondissage-tronquage :
combien = float(int(combien*100)/100.0)
# nombre positif
if combien < 0:
raise ValueError
except Exception:
return {
'template' :'MonCompteRechargePaypal2',
'standalone' :True,
'values' :{'error':"Le montant doit &ecirc;tre un nombre positif !", 'combien':combien},
}
f.ajoute({'nombre': 1, 'code': 'SOLDE', 'designation': 'Credit du compte impression (intranet)', 'pu': combien})
cherrypy.session['freshFacture'] = f
pageData = {}
pageData['details'] = [
{
'intitule':art['designation'],
'quantite':art['nombre'],
'prixUnitaire':art['pu'],
'prixTotal':art['pu']*art['nombre'],
} for art in f.articles()]
pageData['total'] = f.total()
return {
'template' :'MonCompteRechargePaypal3',
'standalone' :True,
'values' :pageData,
}
elif (etape == "4"):# payer maintenant ?
# sauver objet facture
f = cherrypy.session['freshFacture']
f.save()
return {
'template' :'MonCompteRechargePaypal4',
'standalone' :True,
'values' :{'lienPaypal' : f.urlPaypal(useSandbox = cherrypy.config.get("paypal.useSandbox", False),
businessMail = cherrypy.config.get("paypal.businessAdress", "paypal@crans.org"),
return_page = "https://intranet.crans.org/monCompte/paypalReturn",
cancel_return_page = "https://intranet.crans.org/monCompte/paypalCancel",
)},
}
rechargerCompteImpression.exposed = True
def paypalReturn(self, **kw):
_crans_cp.log("retour de paypal avec les infos : %s" % " ".join( [ "[%s: %s]" % (str(a), str(kw[a])) for a in kw] ) )
return {
'template' :'MonComptePaypalReturn',
'standalone' :True,
'values' :{},
}
paypalReturn.exposed = True
def paypalCancel(self, **kw):
_crans_cp.log("annulation de paypal avec les infos : %s" % " ".join( [ "[%s: %s]" % (str(a), str(kw[a])) for a in kw] ) )
return {
'template' :'MonComptePaypalCancel',
'standalone' :True,
'values' :{},
}
paypalCancel.exposed = True
###########################################################################
# methodes pour changer
# des valeurs
###########################################################################
#
# En fait, les methodes recoivent les valeurs d'un formulaire
# (ou equivalent de javascript), font la modification puis
# appellent la methode principale d'affichage
# en lui passant eventuellement un message a afficher
# (pour indiquer la reussite ou non de l'operation)
#
##########################
# Adherent:nom
##########################
def changeNomAdherent(self, nouveauNom):
adh = cherrypy.session['LDAP'].search('uid=' + cherrypy.session['uid'], 'w')['adherent'][0]
try:
ancienNom = adh.nom()
adh.nom(nouveauNom)
adh.save()
except ValueError, e:
return self.index(error=e.args[0])
del adh
_crans_cp.log("Change nom : %s -> %s" % (ancienNom, nouveauNom), "MONCOMPTE")
return self.index(message=u'Modification réussie')
changeNomAdherent.exposed = True
##########################
# Adherent:password
##########################
def changePasswordAdherent(self, ancienPassword, nouveauPassword1, nouveauPassword2):
if ancienPassword=='':
msg = 'Erreur, mot de passe incorrect'
return self.index(error=msg)
if nouveauPassword1=='':
msg = 'Erreur, le nouveau mot de passe ne doit pas &egrave;tre vide.'
return self.index(error=msg)
if nouveauPassword1!=nouveauPassword2:
msg = 'Erreur, la confirmation ne correspond pas au nouveau mot de passe.'
return self.index(error=msg)
adh = cherrypy.session['LDAP'].search('uid=' + cherrypy.session['uid'],'w')['adherent'][0]
if adh.checkPassword(ancienPassword):
adh.changePasswd(nouveauPassword1)
adh.save()
msg = u'Changement effectué'
else:
msg = 'Erreur, mot de passe incorrect'
return self.index(error=msg)
del adh
_crans_cp.log("Change password", "MONCOMPTE")
return self.index(message=msg)
changePasswordAdherent.exposed = True
##########################
# Adherent:prenom
##########################
def changePrenomAdherent(self, nouveauPrenom):
adh = cherrypy.session['LDAP'].search('uid=' + cherrypy.session['uid'], 'w')['adherent'][0]
try:
ancienPrenom = adh.prenom()
adh.prenom(nouveauPrenom)
adh.save()
except ValueError, e:
return self.index(error=e.args[0])
del adh
_crans_cp.log("Change prenom : %s -> %s" % (ancienPrenom, nouveauPrenom), "MONCOMPTE")
return self.index(message=u'Modification réussie')
changePrenomAdherent.exposed = True
##########################
# Adherent:tel
##########################
def changeTelAdherent(self, nouveauTel):
adh = cherrypy.session['LDAP'].search('uid=' + cherrypy.session['uid'], 'w')['adherent'][0]
try:
ancienTel = adh.tel()
adh.tel(nouveauTel)
adh.save()
except ValueError, e:
return self.index(error=e.args[0])
del adh
_crans_cp.log("Change tel : %s -> %s" % (ancienTel, nouveauTel), "MONCOMPTE")
return self.index(message=u'Modification réussie')
changeTelAdherent.exposed = True
##########################
# mail:alias:creation
##########################
def newAlias(self, alias):
adh = cherrypy.session['LDAP'].search('uid=' + cherrypy.session['uid'],'w')['adherent'][0]
if adh.alias().__len__() >= 20 and adh.droits() == []:
return self.index(error=u"Vous avez déjà 20 alias mail. Demander à un câbleur pour en rajouter et/ou effacer les inutilisés.")
try:
adh.alias(alias)
adh.save()
del adh
except ValueError, e:
return self.index(error=e.args[0])
except RuntimeError:
return self.index(error=u"Vous possèdez déjà  cet alias")
except EnvironmentError:
return self.index(error=u"Vous possèdez déjà  cet alias")
_crans_cp.log("Nouvel alias : %s" % alias, "MONCOMPTE")
return self.index(message=u'Alias enregistré')
newAlias.exposed = True
##########################
# mail:sauver
##########################
def saveMailPrefs(self, forwarding_address=None, spanTreatment=None, contourneGreylist=False, rewriteMailHeaders=False):
if spanTreatment == 'no':
spanTreatment = 'accepte'
if spanTreatment == 'mark':
spanTreatment = 'marque'
if spanTreatment == 'drop':
spanTreatment = 'supprime'
if contourneGreylist == 'oui':
contourneGreylist = True
if rewriteMailHeaders == 'oui':
rewriteMailHeaders = True
try:
adh = cherrypy.session['LDAP'].search('uid=' + cherrypy.session['uid'],'w')['adherent'][0]
if forwarding_address!=None:
MailConfig(cherrypy.session['uid'], forward=forwarding_address, spam=spanTreatment)
adh.contourneGreylist(contourneGreylist)
adh.rewriteMailHeaders(rewriteMailHeaders)
adh.save()
del adh
except ValueError, e:
return self.index(error=e.args[0])
except Exception, e:
return self.index(error=u"Une erreur est survenue lors de lenregistrement. Vérifiez que l'adresse mail fournie est correcte.")
_crans_cp.log("Change mail prefs", "MONCOMPTE ACTION")
return self.index(message=u'Vos préférences ont été enregistrées')
saveMailPrefs.exposed = True

View file

@ -1,259 +0,0 @@
/*
DOMtab Version 3.1415927
Updated March the First 2006
written by Christian Heilmann
check blog for updates: http://www.wait-till-i.com
free to use, not free to resell
*/
domtab={
tabClass:'domtab', // class to trigger tabbing
listClass:'domtabs', // class of the menus
activeClass:'active', // class of current link
contentElements:'div', // elements to loop through
backToLinks:/#top/, // pattern to check "back to top" links
printID:'domtabprintview', // id of the print all link
showAllLinkText:'show all content', // text for the print all link
prevNextIndicator:'doprevnext', // class to trigger prev and next links
prevNextClass:'prevnext', // class of the prev and next list
prevLabel:'previous', // HTML content of the prev link
nextLabel:'next', // HTML content of the next link
prevClass:'prev', // class for the prev link
nextClass:'next', // class for the next link
init:function(){
var temp;
if(!document.getElementById || !document.createTextNode){return;}
var tempelm=document.getElementsByTagName('div');
for(var i=0;i<tempelm.length;i++){
if(!domtab.cssjs('check',tempelm[i],domtab.tabClass)){continue;}
domtab.initTabMenu(tempelm[i]);
domtab.removeBackLinks(tempelm[i]);
if(domtab.cssjs('check',tempelm[i],domtab.prevNextIndicator)){
domtab.addPrevNext(tempelm[i]);
}
domtab.checkURL();
}
if(document.getElementById(domtab.printID)
&& !document.getElementById(domtab.printID).getElementsByTagName('a')[0]){
var newlink=document.createElement('a');
newlink.setAttribute('href','#');
domtab.addEvent(newlink,'click',domtab.showAll,false);
newlink.onclick=function(){return false;} // safari hack
newlink.appendChild(document.createTextNode(domtab.showAllLinkText));
document.getElementById(domtab.printID).appendChild(newlink);
}
},
checkURL:function(){
var id;
var loc=window.location.toString();
loc=/#/.test(loc)?loc.match(/#(\w.+)/)[1]:'';
if(loc==''){return;}
var elm=document.getElementById(loc);
if(!elm){return;}
var parentMenu=elm.parentNode.parentNode.parentNode;
parentMenu.currentSection=loc;
parentMenu.getElementsByTagName(domtab.contentElements)[0].style.display='none';
domtab.cssjs('remove',parentMenu.getElementsByTagName('a')[0].parentNode,domtab.activeClass);
var links=parentMenu.getElementsByTagName('a');
for(i=0;i<links.length;i++){
if(!links[i].getAttribute('href')){continue;}
if(!/#/.test(links[i].getAttribute('href').toString())){continue;}
id=links[i].href.match(/#(\w.+)/)[1];
if(id==loc){
var cur=links[i].parentNode.parentNode;
domtab.cssjs('add',links[i].parentNode,domtab.activeClass);
break;
}
}
domtab.changeTab(elm,1);
elm.focus();
cur.currentLink=links[i];
cur.currentSection=loc;
},
showAll:function(e){
document.getElementById(domtab.printID).parentNode.removeChild(document.getElementById(domtab.printID));
var tempelm=document.getElementsByTagName('div');
for(var i=0;i<tempelm.length;i++){
if(!domtab.cssjs('check',tempelm[i],domtab.tabClass)){continue;}
var sec=tempelm[i].getElementsByTagName(domtab.contentElements);
for(var j=0;j<sec.length;j++){
sec[j].style.display='block';
}
}
var tempelm=document.getElementsByTagName('ul');
for(i=0;i<tempelm.length;i++){
if(!domtab.cssjs('check',tempelm[i],domtab.prevNextClass)){continue;}
tempelm[i].parentNode.removeChild(tempelm[i]);
i--;
}
domtab.cancelClick(e);
},
addPrevNext:function(menu){
var temp;
var sections=menu.getElementsByTagName(domtab.contentElements);
for(var i=0;i<sections.length;i++){
temp=domtab.createPrevNext();
if(i==0){
temp.removeChild(temp.getElementsByTagName('li')[0]);
}
if(i==sections.length-1){
temp.removeChild(temp.getElementsByTagName('li')[1]);
}
temp.i=i; // h4xx0r!
temp.menu=menu;
sections[i].appendChild(temp);
}
},
removeBackLinks:function(menu){
var links=menu.getElementsByTagName('a');
for(var i=0;i<links.length;i++){
if(!domtab.backToLinks.test(links[i].href)){continue;}
links[i].parentNode.removeChild(links[i]);
i--;
}
},
initTabMenu:function(menu){
var id;
var lists=menu.getElementsByTagName('ul');
for(var i=0;i<lists.length;i++){
if(domtab.cssjs('check',lists[i],domtab.listClass)){
var thismenu=lists[i];
break;
}
}
if(!thismenu){return;}
thismenu.currentSection='';
thismenu.currentLink='';
var links=thismenu.getElementsByTagName('a');
for(i=0;i<links.length;i++){
if(!/#/.test(links[i].getAttribute('href').toString())){continue;}
id=links[i].href.match(/#(\w.+)/)[1];
if(document.getElementById(id)){
domtab.addEvent(links[i],'click',domtab.showTab,false);
links[i].onclick=function(){return false;} // safari hack
domtab.changeTab(document.getElementById(id),0);
}
}
id=links[0].href.match(/#(\w.+)/)[1];
if(document.getElementById(id)){
domtab.changeTab(document.getElementById(id),1);
thismenu.currentSection=id;
thismenu.currentLink=links[0];
domtab.cssjs('add',links[0].parentNode,domtab.activeClass);
}
},
createPrevNext:function(){
// this would be so much easier with innerHTML, darn you standards fetish!
var temp=document.createElement('ul');
temp.className=domtab.prevNextClass;
temp.appendChild(document.createElement('li'));
temp.getElementsByTagName('li')[0].appendChild(document.createElement('a'));
temp.getElementsByTagName('a')[0].setAttribute('href','#');
temp.getElementsByTagName('a')[0].innerHTML=domtab.prevLabel;
temp.getElementsByTagName('li')[0].className=domtab.prevClass;
temp.appendChild(document.createElement('li'));
temp.getElementsByTagName('li')[1].appendChild(document.createElement('a'));
temp.getElementsByTagName('a')[1].setAttribute('href','#');
temp.getElementsByTagName('a')[1].innerHTML=domtab.nextLabel;
temp.getElementsByTagName('li')[1].className=domtab.nextClass;
domtab.addEvent(temp.getElementsByTagName('a')[0],'click',domtab.navTabs,false);
domtab.addEvent(temp.getElementsByTagName('a')[1],'click',domtab.navTabs,false);
// safari fix
temp.getElementsByTagName('a')[0].onclick=function(){return false;}
temp.getElementsByTagName('a')[1].onclick=function(){return false;}
return temp;
},
navTabs:function(e){
var li=domtab.getTarget(e);
var menu=li.parentNode.parentNode.menu;
var count=li.parentNode.parentNode.i;
var section=menu.getElementsByTagName(domtab.contentElements);
var links=menu.getElementsByTagName('a');
var othercount=(li.parentNode.className==domtab.prevClass)?count-1:count+1;
section[count].style.display='none';
domtab.cssjs('remove',links[count].parentNode,domtab.activeClass);
section[othercount].style.display='block';
domtab.cssjs('add',links[othercount].parentNode,domtab.activeClass);
var parent=links[count].parentNode.parentNode;
parent.currentLink=links[othercount];
parent.currentSection=links[othercount].href.match(/#(\w.+)/)[1];
domtab.cancelClick(e);
},
changeTab:function(elm,state){
do{
elm=elm.parentNode;
} while(elm.nodeName.toLowerCase()!=domtab.contentElements)
elm.style.display=state==0?'none':'block';
},
showTab:function(e){
var o=domtab.getTarget(e);
if(o.parentNode.parentNode.currentSection!=''){
domtab.changeTab(document.getElementById(o.parentNode.parentNode.currentSection),0);
domtab.cssjs('remove',o.parentNode.parentNode.currentLink.parentNode,domtab.activeClass);
}
var id=o.href.match(/#(\w.+)/)[1];
o.parentNode.parentNode.currentSection=id;
o.parentNode.parentNode.currentLink=o;
domtab.cssjs('add',o.parentNode,domtab.activeClass);
domtab.changeTab(document.getElementById(id),1);
document.getElementById(id).focus();
domtab.cancelClick(e);
},
/* helper methods */
getTarget:function(e){
var target = window.event ? window.event.srcElement : e ? e.target : null;
if (!target){return false;}
if (target.nodeName.toLowerCase() != 'a'){target = target.parentNode;}
return target;
},
cancelClick:function(e){
if (window.event){
window.event.cancelBubble = true;
window.event.returnValue = false;
return;
}
if (e){
e.stopPropagation();
e.preventDefault();
}
},
addEvent: function(elm, evType, fn, useCapture){
if (elm.addEventListener)
{
elm.addEventListener(evType, fn, useCapture);
return true;
} else if (elm.attachEvent) {
var r = elm.attachEvent('on' + evType, fn);
return r;
} else {
elm['on' + evType] = fn;
}
},
cssjs:function(a,o,c1,c2){
switch (a){
case 'swap':
o.className=!domtab.cssjs('check',o,c1)?o.className.replace(c2,c1):o.className.replace(c1,c2);
break;
case 'add':
if(!domtab.cssjs('check',o,c1)){o.className+=o.className?' '+c1:c1;}
break;
case 'remove':
var rep=o.className.match(' '+c1)?' '+c1:c1;
o.className=o.className.replace(rep,'');
break;
case 'check':
var found=false;
var temparray=o.className.split(' ');
for(var i=0;i<temparray.length;i++){
if(temparray[i]==c1){found=true;}
}
return found;
break;
}
}
}
domtab.addEvent(window, 'load', domtab.init, false);
document.write('<style type="text/css">');
document.write('div.domtab>div{display:none;}<');
document.write('/s'+'tyle>');

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4 KiB

View file

@ -1,368 +0,0 @@
/********************************************
* <!-- disposition générale -->
********************************************/
#globalDiv {
padding-left:100px;
}
/* style du titre au dessus des onglet et des titres pour les pages PayPal */
div.domtab>h1,
h2 {
font-size:1.4em;
margin:2px;
}
/********************************************
* <!-- onglets -->
********************************************/
/* conteneur de l'ensemble */
div.domtab{
padding:3px;
width:100%;
background:#fad163;
clear:left;
}
/* onglets */
ul.domtabs{
float:left;
width:100%;
margin:0;
padding:0;
list-style-type:none;
}
ul.domtabs li{
float:left;
}
ul.domtabs a:link,
ul.domtabs a:visited,
ul.domtabs a:active,
ul.domtabs a:hover{
font-weight:bold;
display:block;
padding:0.4em;
text-align:center;
background:#fad163;
}
ul.domtabs li.active a:link,
ul.domtabs li.active a:visited,
ul.domtabs li.active a:active,
ul.domtabs li.active a:hover{
background:#fff7D7;
color:#000;
text-decoration:none;
}
/* les pages */
div.domtab>div {
padding:0;
clear:both;
border:5px solid #fff7D7;
}
/* ancre des pages */
.mark {
height:0;
clear:both;
display:none;
}
/********************************************
* <!-- division des pages -->
********************************************/
.tabbed_page {
padding:0;
margin:0;
}
ul.tabbed_page {
list-style-type:none;
}
dl.tabbed_page>dt,
dl.tabbed_page>dd,
ul.tabbed_page>li {
background:#fff7D7;
padding:10px;
margin:0 0 2px 0;
font-weight:bold;
}
dl.tabbed_page>dt.last,
dl.tabbed_page>dd.last,
ul.tabbed_page>li.last {
margin:0 0 0 0;
}
dl.tabbed_page>dt {
width:40%;
display:block;
height:100%;
float:left;
clear:left;
}
dl.tabbed_page>dd {
padding-left:45%;
}
span.actions {
display:block;
float:right;
font-size:0.9em;
font-weight:normal;
}
.tabbed_page span.actions a {
margin:2px 10px;
}
.tabbed_page dl,
.tabbed_page dl dt,
.tabbed_page dl dd {
margin:0;
padding:0;
}
.tabbed_page dl dt {
float:left;
margin-right:5px;
}
.tabbed_page dl dd,
.tabbed_page p {
font-weight:normal;
margin:3px;
}
span.valide {
color:green;
font-weight:bold;
}
span.invalide {
color:red;
font-weight:bold;
}
.clear {
clear:both;
}
ul.tabbed_page li.centrer {
padding:10px;
margin-left:0;
text-align:center;
}
/********************************************
* <!-- formulaires -->
********************************************/
.textInputNote {
display:block;
padding-left:0;
font-size:0.8em;
font-weight:normal;
}
dd .textInputNote {
padding-left:0;
}
li .textInputNote {
padding-left:175px;
}
label.textInputLabel{
width:175px;
display:block;
float:left;
}
label.checkBoxLabel{
float:none;
padding-left:175px;
}
/********************************************
* <!-- liste machines -->
********************************************/
dl#machineList,
dl#machineList>dt {
margin:0;
padding:0;
}
#machineList>dt {
font-size:1.2em;
font-weight:bold;
margin:5px 5px 5px 5px;
height:30px;
padding:10px 20px;
background:#fff7D7;
}
#machineList>dd {
margin:0 0 2px 0;
}
.linkToggle {
display:block;
float:left;
height:15px;
width:15px;
background:transparent url(../images/fl.png) top left;
margin-right:1px;
}
/********************************************
* <!-- infos machines -->
********************************************/
.machineDetails {
background: #fff7D7;/*/ url(../images/fondFacturesDetails.png) repeat-x top;*/
padding:0;
/*width:96%;*/
display:none;
margin:0;
}
dl.machineInfos dt, dl.machineInfos dd {
float:left;
margin-top:0;
padding:.1em;
display:block;
width:20%;
}
dl.machineInfos dt {
text-align:right;
width:20%;
}
/********************************************
* <!-- liste alias -->
********************************************/
ul.listeAlias {
list-style-type:none;
margin:0;
padding:0;
}
ul.listeAlias li span {
color:#666;
}
/********************************************
* <!-- messages -->
********************************************/
#loadings {
background:#cc0000;
position:fixed;
top:1px;
right:1px;
z-index:1000;
display:none;
padding:2px 3px;
color:white;
}
.messageText {
padding:2px 10px;
display:block;
}
#messagePlaceHolder {
height:0;
overflow:visible;
position:relative;
top:-4em;
}
.message {
padding:0;
background:#fad163;
width:300px;
text-align:center;
margin : 1px auto 10px auto;
}
.errorMessage {
display:block;
background:white;
border:2px #cc0000 solid;
padding:5px;
text-align:center;
min-width:230px;
max-width:430px;
font-weight:bold;
margin : 1px auto 10px auto;
}
/********************************************
* <!-- popup PayPal -->
********************************************/
div#popupInnerBody {
border:5px solid #fad163;
background: #fff7D7;
margin:5px;
padding:5px;
}
div#popupInnerBody .liens {
list-style-type:none;
float:right;
height:1em;
background: #fff7D7;
border-color:#fad163;
border-style: none solid solid solid;
border-width:3px;
margin:0;
padding:2px;
}
div#popupInnerBody .liens a {
display:block;
height:1em;
float : left;
margin:0 5px;
}
a { color:blue; }
/********************************************
* <!-- factures - details -->
********************************************/
table.factureDetails {
padding:1%;
width:96%;
margin:0 1% 10px 1%;
}
.tdTotalDetail,
.tdTotalDetailIntitule {
border-top:thin black solid;
}
.tdTotalDetailIntitule {
text-align:right;
font-weight:bold;
}
table.factureDetails th {
border-bottom:thin black solid;
}
table.factureDetails th,
table.factureDetails td {
border-right:thin black solid;
margin:0;
padding:5px 20px;
}
/********************************************
* divers
********************************************/
.empty {
color:gray;
}

View file

@ -1,41 +0,0 @@
function askForName(oldName) {
var c = '';
while ( c == '')
c = prompt("Votre nom :",oldName);
if (c == null)
return false;
else
window.location.href= 'changeNomAdherent?nouveauNom=' + c;
}
function askForSurname(oldSurname) {
var c = '';
while ( c == '')
c = prompt("Votre prénom :",oldSurname);
if (c == null)
return false;
else
window.location.href= 'changePrenomAdherent?nouveauPrenom=' + c;
}
function askForTel(oldTel) {
var c = '';
while ( c == '')
c = prompt("Votre numéro de téléphone :",oldTel);
if (c == null)
return false;
else
window.location.href= 'changeTelAdherent?nouveauTel=' + c;
}
function newAlias() {
var c = '';
while ( c == '')
c = prompt("Nouvel alias :");
if (c == null)
return false;
else
window.location.href= 'newAlias?alias=' + c + "#mailTab";
}

View file

@ -1,66 +0,0 @@
/************************************************************************
Password generator
************************************************************************/
function GeneratePassword() {
if (parseInt(navigator.appVersion) <= 3) {
alert("Sorry this only works in 4.0 browsers");
return false;
}
var length=8;
var sPassword = "";
length = 10;//document.aForm.charLen.options[document.aForm.charLen.selectedIndex].value;
var noPunction = false;//(document.aForm.punc.checked);
var randomLength = true;//(document.aForm.rLen.checked);
if (randomLength) {
length = Math.random();
length = parseInt(length * 100);
length = (length % 7) + 6
}
for (i=0; i < length; i++) {
numI = getRandomNum();
if (noPunction) { while (checkPunc(numI)) { numI = getRandomNum(); } }
sPassword = sPassword + String.fromCharCode(numI);
}
//document.aForm.passField.value = sPassword
c = prompt('Mot de passe généré : ', sPassword)
if (c!= null) {
document.changePasswordForm.nouveauPassword1.value = c
document.changePasswordForm.nouveauPassword2.value = c
}
return false;
}
function getRandomNum() {
// between 0 - 1
var rndNum = Math.random()
// rndNum from 0 - 1000
rndNum = parseInt(rndNum * 1000);
// rndNum from 33 - 127
rndNum = (rndNum % 94) + 33;
return rndNum;
}
function checkPunc(num) {
if ((num >=33) && (num <=47)) { return true; }
if ((num >=58) && (num <=64)) { return true; }
if ((num >=91) && (num <=96)) { return true; }
if ((num >=123) && (num <=126)) { return true; }
return false;
}

View file

@ -1,22 +0,0 @@
#import cherrypy
#set bugMail = cherrypy.config.get("mail.bugreport", "nounous@crans.org")
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
#include "inc-paypal-head.tmpl"
</head>
<body>
<div id="popupInnerBody">
<h2>Paiement annul&eacute;</h2>
<p>Ton compte impressions sera crédité d&eacute;s que la facture sera réglée.</p>
<p>Tu peux régler la facture plus tard en allant dans <a href="/sous/">Mes Factures</a></p>
<p>En cas de probl&egrave;me, envoie un mail &agrave; <a href="mailto:$bugMail">$bugMail</a></p>
<div class="liens">
<a href="./">Retour</a>
</div>
</div>
</form>
</div>
</body></html>

View file

@ -1,21 +0,0 @@
#import cherrypy
#set bugMail = cherrypy.config.get("mail.bugreport", "nounous@crans.org")
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
#include "inc-paypal-head.tmpl"
</head>
<body>
<div id="popupInnerBody">
<h2>Paiement termin&eacute;</h2>
<p>Ton compte impressions sera crédité dans quelques minutes.</p>
<p>N'h&eacute;site pas &agrave; nous envoyer tes remarques et/ou suggestions &agrave; <a href="mailto:$bugMail">$bugMail</a></p>
<div class="liens">
<a href="./">Retour</a>
</div>
</div>
</form>
</div>
</body></html>

View file

@ -1,20 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
#include "inc-paypal-head.tmpl"
</head>
<body>
<div id="popupInnerBody">
<h2>Recharger son compte impression</h2>
<p> Le cr@ns te permet de recharger ton compte pour les impressions via PayPal ou en allant voir un c&acirc;bleur.</p>
<p>La m&eacute;thode PayPal est plus rapide mais PayPal facture des frais de transaction.</p>
<div class="liens">
<a href="./">Annuler</a>
<a href="?etape=2">Continuer avec Paypal</a>
</div>
</div>
</form>
</div>
</body></html>

View file

@ -1,33 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
#include "inc-paypal-head.tmpl"
</head>
<body>
<div id="popupInnerBody">
<h2>&Eacute;tape 1 : Choisir le montant</h2>
#if $getVar('error',False)
<div class="errorMessage">$error</div>
#end if
<form method="post" action="rechargerCompteImpression" name="FormCombien">
<input type="hidden" name="etape" value="3" />
<label for="combien">Combien souhaites-tu mettre sur ton compte impression ?<br />
<input type="text" name="combien" value="$getVar('combien','')" /> &euro;
</label>
<p></p><!-- ici, calcul des frais de transaction -->
<div class="liens" id="liens">
<a href="./">Annuler</a>
<script type="text/JavaScript">
<!--
appendChildNodes("liens", A({'href':'#','onclick':"javascript:window.document.FormCombien.submit(); return false;"}, "Continuer"));
//-->
</script>
<noscript>
<input type="submit" value="Continuer"/>
</noscript>
</div>
</form>
</div>
</body></html>

View file

@ -1,35 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
#include "inc-paypal-head.tmpl"
</head><body>
<div id="popupInnerBody">
<h2>&Eacute;tape 2 : Confirmer la facture</h2>
<table cellspacing="0" border="0" class="factureDetails">
<tr>
<th width="80%">Description</th>
<th>Prix unitaire</th>
<th>Quantit&eacute;</th>
<th>total</th>
</tr>
#for unDetail in $details
<tr>
<td>$unDetail.intitule</td>
<td>$unDetail.prixUnitaire&nbsp;&euro;</td>
<td>$unDetail.quantite</td>
<td>$unDetail.prixTotal&nbsp;&euro;</td>
</tr>
#end for
<tr>
<td colspan="3" class="tdTotalDetailIntitule">
Total
</td>
<td class="tdTotalDetail">$total&nbsp;&euro;</td>
</table>
<div class="liens">
<a href="?etape=2">Pr&eacute;c&eacute;dent</a>
<a href="./">Annuler</a>
<a href="?etape=4">Confirmer</a>
</div>
</div>
</body></html>

View file

@ -1,15 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
#include "inc-paypal-head.tmpl"
</head><body>
<div id="popupInnerBody">
<h2>&Eacute;tape 3 : Fin</h2>
<p>Ton compte impressions sera crédité d&eacute;s que la facture sera réglée.</p>
<p>Tu peux régler la facture plus tard en allant dans <a href="/factures/">Mes Factures</a></p>
<div class="liens">
<a href="./">Payer plus tard</a>
<a href="$lienPaypal">Payer tout de suite</a>
</div>
</div>
</body></html>

View file

@ -1,11 +0,0 @@
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Cr@nsIntranet</title>
<!-- ++++++++++++++++++++++++++ stylesheets +++++++++++++++++++++++++++ -->
<link rel="stylesheet" type="text/css" href="$static('monCompte.css')" />
<!-- ++++++++++++++++++++++++++++ scripts +++++++++++++++++++++++++++++ -->
<script src="/static/MochiKit/MochiKit.js" type="text/javascript"></script>
<script src="/static/MochiKit/New.js" type="text/javascript"></script>

Some files were not shown because too many files have changed in this diff Show more