Ajout des modules initiaux

darcs-hash:20070124114812-f46e9-171ef12f1e1b89ae005adf4aab6f6535fb9289e6.gz
This commit is contained in:
gdetrez 2007-01-24 12:48:12 +01:00
parent 8713311bc1
commit ed3ab40ccd
80 changed files with 4852 additions and 5 deletions

View file

@ -0,0 +1,359 @@
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# ##################################################################################################### #
# 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):
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__() >= 3 and adh.droits() == []:
return self.index(error=u"Vous avez plus de 2 alias. Demander a un cableur pour en rajouter.")
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

@ -0,0 +1,259 @@
/*
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.

After

Width:  |  Height:  |  Size: 4 KiB

View file

@ -0,0 +1,368 @@
/********************************************
* <!-- 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

@ -0,0 +1,41 @@
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

@ -0,0 +1,66 @@
/************************************************************************
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

@ -0,0 +1,22 @@
#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

@ -0,0 +1,21 @@
#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

@ -0,0 +1,20 @@
<!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

@ -0,0 +1,33 @@
<!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

@ -0,0 +1,35 @@
<!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

@ -0,0 +1,15 @@
<!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

@ -0,0 +1,11 @@
<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

@ -0,0 +1,211 @@
#if $message != ''
<script type="text/javascript">
<!--
Crans.messages.setMessage('$message.replace("\'","\\\'")')
//-->
</script>
#end if
#if $error != ''
<script type="text/javascript">
<!--
Crans.messages.setMessage('$error.replace("\'","\\\'")', 'errorMessage')
//-->
</script>
#end if
<div id="globalDiv">
<div id="paramCompte" class="domtab">
<h1>Param&egrave;tres de mon compte</h1>
<ul class="domtabs">
<li><a href="#mainTab">G&eacute;n&eacute;ral</a></li>
<li><a href="#mailTab">Mails</a></li>
</ul>
<!-- +++++++++++++++++++ Infos Utilisateur +++++++++++++++++++ -->
<div>
<h2 class="mark"><a name="mainTab" id="mainTab"></a></h2>
<dl class="tabbed_page">
<dt>Nom :</dt>
<dd>$adherent.nom
<span class="actions"><a href="#" onclick="return askForName('$adherent.nom')">modifier</a></span>
<div class="clear"></div>
</dd>
<dt>Pr&eacute;nom :</dt>
<dd>$adherent.prenom
<span class="actions"><a href="#" onclick="return askForSurname('$adherent.prenom')">modifier</a></span>
<div class="clear"></div>
</dd>
#if $getVar('adherent.adresse', False)
<dt>Adresse :</dt>
<dd>
$adherent.adresse.ligne1 <br />
#if $adherent.adresse.ligne2 != u' '
$adherent.adresse.ligne2 <br />
#end if
$adherent.adresse.cp $adherent.adresse.ville
</dd>
#else
<dt>Chambre :</dt>
<dd>$adherent.chambre</dd>
#end if
<dt>Solde :</dt>
<dd>
$adherent.solde &euro;
<span class="actions"><a href="rechargerCompteImpression" onclick="return paypalWindow('$adherent.telephone')">modifier</a></span>
<div class="clear"></div>
</dd>
<dt>T&eacute;l&eacute;phone :</dt>
<dd>$adherent.telephone
<span class="actions"><a href="#" onclick="return askForTel('$adherent.telephone')">modifier</a></span>
<div class="clear"></div>
</dd>
#if $adherent.droits
<dt>Droits :</dt>
<dd>
$adherent.droits
</dd>
#end if
<dt>&Eacute;tat administratif pour l'ann&eacute;e $adherent.anneeScolaire :</dt>
<dd>
<dl>
<dt>Cotisation : </dt>
<dd>
#if $adherent.cotisationOK
<span class="valide"> OK</span>
#else
<span class="invalide"> Non pay&eacute;e</span>
#end if
</dd>
<dt>Carte d'&eacute;tudiant : </dt>
<dd>
#if $adherent.carteOK
<span class="valide"> OK</span>
#else
<span class="invalide"> pas de carte d'&eacute;tudiant</span>
#end if
</dd>
</dl>
</dd>
<dt class="last">Changer mon mot de passe</dt>
<dd class="last">
<form action="changePasswordAdherent" name="changePasswordForm" method="post">
<div>
<label class="textInputLabel" for="ancienPassword">Ancien mot de passe : </label>
<input type="password" id="ancienPassword" name="ancienPassword"/><br />
<label class="textInputLabel" for="nouveauPassword1">Nouveau mot de passe : </label>
<input type="password" id="nouveauPassword1" name="nouveauPassword1"/><br />
<a class="textInputNote" href="#" onclick="return GeneratePassword()">Générer un nouveau mot de passe</a><br />
<label class="textInputLabel" for="nouveauPassword2">Confirmation : </label>
<input type="password" id="nouveauPassword2" name="nouveauPassword2"/><br />
<input type="submit" value="Modifier" />
</div>
</form>
</dd>
</dl>
</div>
<!-- +++++++++++++++++++ Infos Mails +++++++++++++++++++ -->
<div>
<h2 class="mark"><a name="mailTab" id="mailTab"></a></h2>
<form action="saveMailPrefs#mailTab" method="post">
<dl class="tabbed_page">
<dt>Alias:</dt>
<dd>
#if $mailInfos.alias==[]
<span class="empty">Vous n'avez pas d'alias</span>
#else
<ul class="listeAlias">
#for $an_alias in $mailInfos.alias
<li>$an_alias<span>@crans.org</span></li>
#end for
</ul>
#end if
<div class="clear"></div>
<span class="actions">
<a href="#" onclick="return newAlias()">Nouvel alias</a>
</span>
<div class="clear"></div>
</dd>
<dt> Greylisting: </dt>
<dd>
#if $mailInfos.contourneGreylist==True
<label for="contourneGreylist" class="labelCheckbox">
<input type="checkbox" name="contourneGreylist" id="contourneGreylist" class="inputCheckbox" value="oui" checked="checked" />
Contourner
</label>
#else
<label for="contourneGreylist" class="labelCheckbox">
<input type="checkbox" name="contourneGreylist" id="contourneGreylist" class="inputCheckbox" value="oui" />
Contourner
</label>
#end if
<a class="textInputNote" href="http://wiki/CransTechnique/GreyListing?highlight=%28Greylist%29" target="_blanc">Plus d'infos</a><br />
</dd>
<dt>
Ent&ecirc;tes:
</dt>
<dd>
#if $mailInfos.rewriteMailHeaders==True
<label for="rewriteMailHeaders" class="labelCheckbox">
<input type="checkbox" name="rewriteMailHeaders" id="rewriteMailHeaders" class="contourneGreylist" value="oui" checked="checked" />
R&eacute;&eacute;criture des en-t&ecirc;te mails
</label>
#else
<label for="rewriteMailHeaders" class="labelCheckbox">
<input type="checkbox" name="rewriteMailHeaders" id="rewriteMailHeaders" class="contourneGreylist" value="oui" />
R&eacute;&eacute;criture des en-t&ecirc;te mails
</label>
#end if
</dd>
</dl>
#if $getVar('mailError', False)
<ul class="tabbed_page">
<li class="centrer last">
<span class="errorMessage">$mailError</span>
</li>
</ul>
#else
<dl class="tabbed_page">
<dt>Transfert:</dt>
<dd>
<label for="forwarding_address" class="labelInput">
<input type="text" name="forwarding_address" id="forwarding_address" class="inputText" value="$mailInfos.forwarding_address" />
</label>
<p class="textInputNote">Laisser vide pour d&eacute;sactiver le transfert</p><br />
</dd>
<dt>Tri des spams:</dt>
<dd>
<label for="spanTreatment_no" class="labelRadio">
#if $mailInfos.spam.no
<input type="radio" name="spanTreatment" id="spanTreatment_no" class="inputRadio" value="no" checked="checked" /> Aucun
#else
<input type="radio" name="spanTreatment" id="spanTreatment_no" class="inputRadio" value="no" /> Aucun
#end if
</label><br />
<label for="spanTreatment_mark" class="labelRadio">
#if $mailInfos.spam.mark
<input type="radio" name="spanTreatment" id="spanTreatment_mark" class="inputRadio" value="mark" checked="checked" /> Marquer
#else
<input type="radio" name="spanTreatment" id="spanTreatment_mark" class="inputRadio" value="mark" /> Marquer
#end if
</label><br />
<label for="spanTreatment_drop" class="labelRadio">
#if $mailInfos.spam.drop
<input type="radio" name="spanTreatment" id="spanTreatment_drop" class="inputRadio" value="drop" checked="checked" /> Supprimer
#else
<input type="radio" name="spanTreatment" id="spanTreatment_drop" class="inputRadio" value="drop" /> Supprimer
#end if
</label><br />
</dd>
</dl>
#end if
<ul class="tabbed_page">
<li class="centrer last">
<input type="reset" value="Reset" />
<input type="submit" value="Soumettre" />
</li>
</ul>
</form>
</div>
</div>
</div>