From ed3ab40ccdedef7420394e83d6f48d86c048cbb4 Mon Sep 17 00:00:00 2001 From: gdetrez Date: Wed, 24 Jan 2007 12:48:12 +0100 Subject: [PATCH] Ajout des modules initiaux darcs-hash:20070124114812-f46e9-171ef12f1e1b89ae005adf4aab6f6535fb9289e6.gz --- intranet/conf/intranet.cfg | 5 - intranet/modules/digicode/main.py | 81 ++++ intranet/modules/digicode/static/digicode.css | 85 ++++ intranet/modules/digicode/static/digicode.js | 170 ++++++++ intranet/modules/digicode/static/icon.png | Bin 0 -> 1388 bytes .../modules/digicode/templates/digicode.tmpl | 14 + intranet/modules/factures/main.py | 100 +++++ .../modules/factures/static/cransFactures.css | 205 +++++++++ intranet/modules/factures/static/fl.png | Bin 0 -> 3111 bytes .../factures/static/fondFacturesDetails.png | Bin 0 -> 3071 bytes intranet/modules/factures/static/icon.png | Bin 0 -> 4163 bytes .../templates/factures-historique.tmpl | 45 ++ .../modules/factures/templates/factures.tmpl | 107 +++++ intranet/modules/gestionFactures/main.py | 140 ++++++ .../gestionFactures/static/cransFactures.css | 205 +++++++++ .../modules/gestionFactures/static/fl.png | Bin 0 -> 3111 bytes .../static/fondFacturesDetails.png | Bin 0 -> 3071 bytes .../modules/gestionFactures/static/icon.png | Bin 0 -> 1690 bytes .../templates/factures-historique.tmpl | 45 ++ .../gestionFactures/templates/factures.tmpl | 107 +++++ intranet/modules/impression/main.py | 237 ++++++++++ .../impression/static/WindowTitleLogo.png | Bin 0 -> 3799 bytes .../impression/static/dialog-printer.png | Bin 0 -> 3219 bytes .../impression/static/dialog-solde.png | Bin 0 -> 5311 bytes .../impression/static/dialog-warning.png | Bin 0 -> 3464 bytes intranet/modules/impression/static/icon.png | Bin 0 -> 2154 bytes .../modules/impression/static/impression.css | 162 +++++++ .../modules/impression/static/impression.js | 404 ++++++++++++++++++ .../modules/impression/static/indicator.gif | Bin 0 -> 1553 bytes .../impression/static/paysage_b&w_non.png | Bin 0 -> 4219 bytes .../impression/static/paysage_couleur_non.png | Bin 0 -> 5199 bytes .../modules/impression/static/pdf-icon.png | Bin 0 -> 3362 bytes .../static/portrait_couleur_diagonale.psd | Bin 0 -> 357871 bytes .../static/portrait_couleurs_Deuxagraphes.png | Bin 0 -> 5249 bytes .../portrait_couleurs_agraphediagonale.png | Bin 0 -> 5291 bytes .../static/portrait_couleurs_pasdagraphes.png | Bin 0 -> 5218 bytes .../static/portrait_couleurs_stitching.png | Bin 0 -> 5253 bytes .../portrait_couleurs_troisAgraphes.png | Bin 0 -> 5230 bytes .../static/portrait_couleurs_uneagraphe.png | Bin 0 -> 5241 bytes .../static/portrait_nb_Deuxagraphes.png | Bin 0 -> 4324 bytes .../static/portrait_nb_agraphediagonale.png | Bin 0 -> 4408 bytes .../static/portrait_nb_pasdagraphes.png | Bin 0 -> 4308 bytes .../static/portrait_nb_stitching.png | Bin 0 -> 4292 bytes .../static/portrait_nb_troisAgraphes.png | Bin 0 -> 4336 bytes .../static/portrait_nb_uneagraphe.png | Bin 0 -> 4246 bytes .../static/portrait_transparent.png | Bin 0 -> 4162 bytes .../static/portrait_transparent_couleurs.png | Bin 0 -> 6334 bytes .../static/portrait_transparent_nb.png | Bin 0 -> 5141 bytes .../templates/impression-devis.tmpl | 67 +++ .../impression/templates/impression.tmpl | 170 ++++++++ intranet/modules/infos/main.py | 16 + intranet/modules/infos/static/icon.png | Bin 0 -> 1830 bytes intranet/modules/infos/static/infos.css | 75 ++++ .../infos/templates/info-diverses.tmpl | 17 + intranet/modules/mesMachines/main.py | 249 +++++++++++ .../modules/mesMachines/static/machines.css | 160 +++++++ .../modules/mesMachines/static/machines.js | 348 +++++++++++++++ .../mesMachines/static/machines_icon_fixe.png | Bin 0 -> 1683 bytes .../mesMachines/static/machines_icon_wifi.png | Bin 0 -> 1412 bytes intranet/modules/monCompte/main.py | 359 ++++++++++++++++ .../modules/monCompte/static/crans_domtab.js | 259 +++++++++++ intranet/modules/monCompte/static/icon.png | Bin 0 -> 4072 bytes .../modules/monCompte/static/monCompte.css | 368 ++++++++++++++++ .../modules/monCompte/static/moncompte.js | 41 ++ .../monCompte/static/passwordGenerator.js | 66 +++ .../templates/MonComptePaypalCancel.tmpl | 22 + .../templates/MonComptePaypalReturn.tmpl | 21 + .../templates/MonCompteRechargePaypal1.tmpl | 20 + .../templates/MonCompteRechargePaypal2.tmpl | 33 ++ .../templates/MonCompteRechargePaypal3.tmpl | 35 ++ .../templates/MonCompteRechargePaypal4.tmpl | 15 + .../monCompte/templates/inc-paypal-head.tmpl | 11 + .../monCompte/templates/monCompte.tmpl | 211 +++++++++ intranet/modules/quota/main.py | 107 +++++ intranet/modules/quota/static/icon.png | Bin 0 -> 986 bytes intranet/modules/quota/static/icon_alert.png | Bin 0 -> 1310 bytes .../modules/quota/static/icon_digicode.png | Bin 0 -> 1388 bytes .../modules/quota/templates/barre.svg.tmpl | 40 ++ intranet/modules/quota/templates/quota.tmpl | 13 + .../modules/quota/templates/quota_html.tmpl | 22 + 80 files changed, 4852 insertions(+), 5 deletions(-) create mode 100755 intranet/modules/digicode/main.py create mode 100644 intranet/modules/digicode/static/digicode.css create mode 100644 intranet/modules/digicode/static/digicode.js create mode 100644 intranet/modules/digicode/static/icon.png create mode 100644 intranet/modules/digicode/templates/digicode.tmpl create mode 100755 intranet/modules/factures/main.py create mode 100644 intranet/modules/factures/static/cransFactures.css create mode 100644 intranet/modules/factures/static/fl.png create mode 100644 intranet/modules/factures/static/fondFacturesDetails.png create mode 100644 intranet/modules/factures/static/icon.png create mode 100644 intranet/modules/factures/templates/factures-historique.tmpl create mode 100644 intranet/modules/factures/templates/factures.tmpl create mode 100755 intranet/modules/gestionFactures/main.py create mode 100644 intranet/modules/gestionFactures/static/cransFactures.css create mode 100644 intranet/modules/gestionFactures/static/fl.png create mode 100644 intranet/modules/gestionFactures/static/fondFacturesDetails.png create mode 100644 intranet/modules/gestionFactures/static/icon.png create mode 100644 intranet/modules/gestionFactures/templates/factures-historique.tmpl create mode 100644 intranet/modules/gestionFactures/templates/factures.tmpl create mode 100755 intranet/modules/impression/main.py create mode 100644 intranet/modules/impression/static/WindowTitleLogo.png create mode 100644 intranet/modules/impression/static/dialog-printer.png create mode 100644 intranet/modules/impression/static/dialog-solde.png create mode 100644 intranet/modules/impression/static/dialog-warning.png create mode 100644 intranet/modules/impression/static/icon.png create mode 100644 intranet/modules/impression/static/impression.css create mode 100644 intranet/modules/impression/static/impression.js create mode 100644 intranet/modules/impression/static/indicator.gif create mode 100644 intranet/modules/impression/static/paysage_b&w_non.png create mode 100644 intranet/modules/impression/static/paysage_couleur_non.png create mode 100644 intranet/modules/impression/static/pdf-icon.png create mode 100644 intranet/modules/impression/static/portrait_couleur_diagonale.psd create mode 100644 intranet/modules/impression/static/portrait_couleurs_Deuxagraphes.png create mode 100644 intranet/modules/impression/static/portrait_couleurs_agraphediagonale.png create mode 100644 intranet/modules/impression/static/portrait_couleurs_pasdagraphes.png create mode 100644 intranet/modules/impression/static/portrait_couleurs_stitching.png create mode 100644 intranet/modules/impression/static/portrait_couleurs_troisAgraphes.png create mode 100644 intranet/modules/impression/static/portrait_couleurs_uneagraphe.png create mode 100644 intranet/modules/impression/static/portrait_nb_Deuxagraphes.png create mode 100644 intranet/modules/impression/static/portrait_nb_agraphediagonale.png create mode 100644 intranet/modules/impression/static/portrait_nb_pasdagraphes.png create mode 100644 intranet/modules/impression/static/portrait_nb_stitching.png create mode 100644 intranet/modules/impression/static/portrait_nb_troisAgraphes.png create mode 100644 intranet/modules/impression/static/portrait_nb_uneagraphe.png create mode 100644 intranet/modules/impression/static/portrait_transparent.png create mode 100644 intranet/modules/impression/static/portrait_transparent_couleurs.png create mode 100644 intranet/modules/impression/static/portrait_transparent_nb.png create mode 100644 intranet/modules/impression/templates/impression-devis.tmpl create mode 100644 intranet/modules/impression/templates/impression.tmpl create mode 100644 intranet/modules/infos/main.py create mode 100644 intranet/modules/infos/static/icon.png create mode 100644 intranet/modules/infos/static/infos.css create mode 100644 intranet/modules/infos/templates/info-diverses.tmpl create mode 100755 intranet/modules/mesMachines/main.py create mode 100644 intranet/modules/mesMachines/static/machines.css create mode 100644 intranet/modules/mesMachines/static/machines.js create mode 100644 intranet/modules/mesMachines/static/machines_icon_fixe.png create mode 100644 intranet/modules/mesMachines/static/machines_icon_wifi.png create mode 100755 intranet/modules/monCompte/main.py create mode 100644 intranet/modules/monCompte/static/crans_domtab.js create mode 100644 intranet/modules/monCompte/static/icon.png create mode 100644 intranet/modules/monCompte/static/monCompte.css create mode 100644 intranet/modules/monCompte/static/moncompte.js create mode 100644 intranet/modules/monCompte/static/passwordGenerator.js create mode 100644 intranet/modules/monCompte/templates/MonComptePaypalCancel.tmpl create mode 100644 intranet/modules/monCompte/templates/MonComptePaypalReturn.tmpl create mode 100644 intranet/modules/monCompte/templates/MonCompteRechargePaypal1.tmpl create mode 100644 intranet/modules/monCompte/templates/MonCompteRechargePaypal2.tmpl create mode 100644 intranet/modules/monCompte/templates/MonCompteRechargePaypal3.tmpl create mode 100644 intranet/modules/monCompte/templates/MonCompteRechargePaypal4.tmpl create mode 100644 intranet/modules/monCompte/templates/inc-paypal-head.tmpl create mode 100644 intranet/modules/monCompte/templates/monCompte.tmpl create mode 100755 intranet/modules/quota/main.py create mode 100644 intranet/modules/quota/static/icon.png create mode 100644 intranet/modules/quota/static/icon_alert.png create mode 100644 intranet/modules/quota/static/icon_digicode.png create mode 100644 intranet/modules/quota/templates/barre.svg.tmpl create mode 100644 intranet/modules/quota/templates/quota.tmpl create mode 100644 intranet/modules/quota/templates/quota_html.tmpl diff --git a/intranet/conf/intranet.cfg b/intranet/conf/intranet.cfg index cb6b6df3..90ce464a 100644 --- a/intranet/conf/intranet.cfg +++ b/intranet/conf/intranet.cfg @@ -11,11 +11,6 @@ crans.modules.dir = "/usr/scripts/intranet/modules/" # Now we can work on our filter as with the standard filters templatesEngine.on = True -[/digicode] -crans.droits="Imprimeur" -[/gestionFactures] -crans.droits="Imprimeur" - [/impression] crans.activate = True crans.activate.errorMsg = u"Plus d'encre ! Le fournisseur s'est trompé dans la commande." diff --git a/intranet/modules/digicode/main.py b/intranet/modules/digicode/main.py new file mode 100755 index 00000000..52f03dee --- /dev/null +++ b/intranet/modules/digicode/main.py @@ -0,0 +1,81 @@ +#! /usr/bin/env python +import cherrypy, tempfile, shutil, os +import crans.impression +import crans.impression.digicode +import crans.cp +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', 'popup.js'], + } + index.exposed = True + + + ########################## + # AJAX + ########################## + # + # methode qui renvoie la liste des codes + # + def codeList(self): + try: + listeBrute = crans.impression.digicode.list_code() + liste_formatee = [] + for aCode in listeBrute: + age = 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 = crans.impression.digicode.save_code(code, adherent) + else: + code = crans.impression.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 diff --git a/intranet/modules/digicode/static/digicode.css b/intranet/modules/digicode/static/digicode.css new file mode 100644 index 00000000..921f9165 --- /dev/null +++ b/intranet/modules/digicode/static/digicode.css @@ -0,0 +1,85 @@ +/************************************************************* + .. + .... ............ ........ + . ....... . .... .. + . ... .. .. .. .. ..... . .. + .. .. ....@@@. .. . ........ . + .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. .... + .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... .... + @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. .. + .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. ..... + ...@@@.... @@@ .@@.......... ........ ..... .. + . ..@@@@.. . .@@@@. .. ....... . ............. + . .. .... .. .. . ... .... +. . .... ............. .. ... +.. .. ... ........ ... ... + ................................ + +============================================================== +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; +} diff --git a/intranet/modules/digicode/static/digicode.js b/intranet/modules/digicode/static/digicode.js new file mode 100644 index 00000000..5fca191e --- /dev/null +++ b/intranet/modules/digicode/static/digicode.js @@ -0,0 +1,170 @@ +/* ************************************************************ + * 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)", "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 = function(page, callBack) { + logDebug("calling AJAX : " + page); + var e = loadJSONDoc(page); + e.addCallback(callBack); + e.addErrback(this.errorHandler); +} + +Digicode.AJAX.errorHandler = function(d) { + //Digicode.AJAX..modifPrix("Erreur", false); + logError("AJAX Error: " + d); +} + +setInterval(Digicode.codelist.load, 30000); diff --git a/intranet/modules/digicode/static/icon.png b/intranet/modules/digicode/static/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..fe3729c6852d97d7da651e288ecad003da799a73 GIT binary patch literal 1388 zcmV-y1(W)TP)WFU8GbZ8({Xk{QrNlj4iWF>9@00huUL_t(o!>yNHY?Db#|VTv<_3K{Og=dU~4M zw{K&bCWc|)a=GyNeC*n_i`A=FNy1Hzwt*wMYA$odx{+^tiYytkHz}C~$)Fd4p9pd$R z1^5ss&awV6yWKw3-Q6wy{rz(6*fCK`oyc{7kwaGEbUI(Hsi`3x4l^+^@dI!Oh~?OG z(KOBd0|Ntc{rYw4>gsU2-FpfJ;4LpN_b8%$^KFc{1UAQLqnpbBWvTBpv} z1N#!Uivv3Gjb-SLg-y|D6u=3DmIPoJT0#^bVQsdUMT zWJE7pnHk`!iY&kZRAYj|d;zGmRV$LiwKeec?!|jvIglgX8NQ4b&yNAu;$Yg}2aUeu zxcw=3=k09D8WX|LRsaJED9!vvCQ~ZCkx|PXGb?M&`sSBrz>#^?sWT9sPmceZhOf?M zse6qbSrh8gUf|3u@BMV~+=;$SH`xrTDywVd2B3hF#j;Dk!tgJP=g*yoiEHVxCA3x$A*& zn3&es|9yZN09^S4_Oyc*>&BV-vkQ#?0000 +

Gestion des codes pour le local impression

+ + + diff --git a/intranet/modules/factures/main.py b/intranet/modules/factures/main.py new file mode 100755 index 00000000..2a8e0048 --- /dev/null +++ b/intranet/modules/factures/main.py @@ -0,0 +1,100 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-15 -*- +# ##################################################################################################### # +# Factures +# ##################################################################################################### # +# Description: +# Affiche la liste des factures et l'historique de débits/crédits de l'adhérent. +# Informations: +# +# Pages: +# index:liste des factures +# historique: historique des débits/crédits +# +# ##################################################################################################### # +import cherrypy, sys, os, datetime +from ClassesIntranet.ModuleBase import ModuleBase + + +class main(ModuleBase): + def title(self): + return "Factures" + def icon(self): + return "icon.png" + + + def index(self, message = '', error = ''): + adh = cherrypy.session['LDAP'].search('uid=' + cherrypy.session['uid'])['adherent'][0] + 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): + adh = cherrypy.session['LDAP'].search('uid=' + cherrypy.session['uid'])['adherent'][0] + + 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) + + return { + 'template' :'factures-historique', + 'values' :{'liste':lst, 'historic_items':histLst}, + '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 diff --git a/intranet/modules/factures/static/cransFactures.css b/intranet/modules/factures/static/cransFactures.css new file mode 100644 index 00000000..cc230642 --- /dev/null +++ b/intranet/modules/factures/static/cransFactures.css @@ -0,0 +1,205 @@ +/******************************************** + * +********************************************/ +#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; +} + +/******************************************** + * +********************************************/ + +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; +} + +/******************************************** + * +********************************************/ +.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; +} + +/******************************************** + * +********************************************/ + +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; +} + +/******************************************** + * +********************************************/ + +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; +} + diff --git a/intranet/modules/factures/static/fl.png b/intranet/modules/factures/static/fl.png new file mode 100644 index 0000000000000000000000000000000000000000..2c72f9ea7dee9e97c1be297eb655c827d4a95306 GIT binary patch literal 3111 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 + +
+ + + +
+

Historique

+
+ + + + + + + + #for anItem in $historic_items + + + + #if $anItem.type=="debit" + + #else + + #end if + #if $anItem.type=="credit" + + #else + + #end if + + #end for + #if $historic_items == [] + + #end if +
DateIntituléDébitCrédit
$anItem.date$anItem.intitule$anItem.montant $anItem.montant 
+ AUCUNE TRANSACTION ENREGISTRÉE +
+
+ +
+
diff --git a/intranet/modules/factures/templates/factures.tmpl b/intranet/modules/factures/templates/factures.tmpl new file mode 100644 index 00000000..7551fcc8 --- /dev/null +++ b/intranet/modules/factures/templates/factures.tmpl @@ -0,0 +1,107 @@ +
+ +#if $message != '' + +#end if + +#if $error != '' + +#end if + + + + +
+ + +
+

Mes factures PayPal

+ + #for f in $listeFactures + #if $f.payee +
+ #else +
+ #end if +
+ + #if $f.details.__len__() > 1 + + #end if + $f.intitule + #if not $f.payee + (non payée) + #end if + + + + $f.montant € + + Crée le - + #if not $f.payee + + Annuler + Payer avec PayPal + + #else + Payée + #end if + +
+ #if $f.details.__len__() > 1 + +
+ #end if + #end for + + #if $listeFactures == [] +
+ AUCUNE TRANSACTION PAYPAL ENREGISTRÉE +
+ #end if +
+ +
diff --git a/intranet/modules/gestionFactures/main.py b/intranet/modules/gestionFactures/main.py new file mode 100755 index 00000000..b558dce4 --- /dev/null +++ b/intranet/modules/gestionFactures/main.py @@ -0,0 +1,140 @@ +#! /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 +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() + facture['adherent'] = f.proprietaire().mail() + facture['montant'] = f.total() + facture['payee'] = f.recuPaiement() + 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) + + 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("pb crédit", "GESTION FACTURES", 1) + return self.index(erreur=u"Problème lors du crédit") + crans.cp.log("Facture creditee [fid=%s]" % fid, "GESTION FACTURES") + return self.displayTemplate(message=u"Facture créditée") + crediteFacture.exposed = True diff --git a/intranet/modules/gestionFactures/static/cransFactures.css b/intranet/modules/gestionFactures/static/cransFactures.css new file mode 100644 index 00000000..cc230642 --- /dev/null +++ b/intranet/modules/gestionFactures/static/cransFactures.css @@ -0,0 +1,205 @@ +/******************************************** + * +********************************************/ +#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; +} + +/******************************************** + * +********************************************/ + +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; +} + +/******************************************** + * +********************************************/ +.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; +} + +/******************************************** + * +********************************************/ + +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; +} + +/******************************************** + * +********************************************/ + +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; +} + diff --git a/intranet/modules/gestionFactures/static/fl.png b/intranet/modules/gestionFactures/static/fl.png new file mode 100644 index 0000000000000000000000000000000000000000..2c72f9ea7dee9e97c1be297eb655c827d4a95306 GIT binary patch literal 3111 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 literal 0 HcmV?d00001 diff --git a/intranet/modules/gestionFactures/templates/factures-historique.tmpl b/intranet/modules/gestionFactures/templates/factures-historique.tmpl new file mode 100644 index 00000000..065725d9 --- /dev/null +++ b/intranet/modules/gestionFactures/templates/factures-historique.tmpl @@ -0,0 +1,45 @@ +
+ +
+ + + +
+

Historique

+
+ + + + + + + + #for anItem in $historic_items + + + + #if $anItem.type=="debit" + + #else + + #end if + #if $anItem.type=="credit" + + #else + + #end if + + #end for + #if $historic_items == [] + + #end if +
DateIntituléDébitCrédit
$anItem.date$anItem.intitule$anItem.montant $anItem.montant 
+ AUCUNE TRANSACTION ENREGISTRÉE +
+
+ +
+
diff --git a/intranet/modules/gestionFactures/templates/factures.tmpl b/intranet/modules/gestionFactures/templates/factures.tmpl new file mode 100644 index 00000000..7551fcc8 --- /dev/null +++ b/intranet/modules/gestionFactures/templates/factures.tmpl @@ -0,0 +1,107 @@ +
+ +#if $message != '' + +#end if + +#if $error != '' + +#end if + + + + +
+ + +
+

Mes factures PayPal

+ + #for f in $listeFactures + #if $f.payee +
+ #else +
+ #end if +
+ + #if $f.details.__len__() > 1 + + #end if + $f.intitule + #if not $f.payee + (non payée) + #end if + + + + $f.montant € + + Crée le - + #if not $f.payee + + Annuler + Payer avec PayPal + + #else + Payée + #end if + +
+ #if $f.details.__len__() > 1 + +
+ #end if + #end for + + #if $listeFactures == [] +
+ AUCUNE TRANSACTION PAYPAL ENREGISTRÉE +
+ #end if +
+ +
diff --git a/intranet/modules/impression/main.py b/intranet/modules/impression/main.py new file mode 100755 index 00000000..deb384b0 --- /dev/null +++ b/intranet/modules/impression/main.py @@ -0,0 +1,237 @@ +#!/usr/bin/env python +# -*- coding: iso-8859-15 -*- +# ############################################################# +# .. +# .... ............ ........ +# . ....... . .... .. +# . ... .. .. .. .. ..... . .. +# .. .. ....@@@. .. . ........ . +# .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. .... +# .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... .... +# @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. .. +# .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. ..... +# ...@@@.... @@@ .@@.......... ........ ..... .. +# . ..@@@@.. . .@@@@. .. ....... . ............. +# . .. .... .. .. . ... .... +# . . .... ............. .. ... +# .. .. ... ........ ... ... +# ................................ +# +# ############################################################# +# +# interface d'impression +# +# Copyright (c) 2006 by www.crans.org +# ############################################################# + +import cherrypy, tempfile, shutil, os +import crans.impression +import crans.impression.digicode +import crans.impression.etat_imprimante +import crans.cp +FILE_UPLOAD_BASE_FOLDER = cherrypy.config.get('fileUpload.folder', "/var/impression/fichiers/") + +class FileError(Exception): + pass +from ClassesIntranet.ModuleBase import ModuleBase + +class main(ModuleBase): + def category(self): + return "Services" + def title(self): + return "Impression" + def icon(self): + return "icon.png" + + + ########################## + # 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: + self.savePDF(newFile) + data['fileName'] = newFile.filename + 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: + crans.impression.etat_imprimante.etat() + except Exception, e: + data['Erreur_imprimante'] = str(e).replace("\"", "\\\"") + data['errorMsg'] = u"Imprimante injoignable" + 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): + return { + 'template':'impression-devis', + 'values': + { + 'devis':cherrypy.session['impression'].devisDetaille(), + 'total':cherrypy.session['impression'].prix(), + 'nomFichier':cherrypy.session['impression'].fileName(), + }, + 'standalone':True, + } + devis.exposed=True + + + ########################## + # AJAX + ########################## + # + # methode qui renvoie la liste des codes de l'adherent + # + def codeList(self): + try: + listeBrute = crans.impression.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) + cherrypy.session['impression'] = crans.impression.impression(filepath, cherrypy.session['uid']) + return {'nbPages': cherrypy.session['impression'].pages()} + except crans.impression.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, couleurs=None, recto_verso=None, agrafes=None, papier=None): + try: + nouvPrix = cherrypy.session['impression'].changeSettings(papier=papier, couleurs=couleurs, agraphes=agrafes, recto_verso=recto_verso, copies=int(copies)) + 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 crans.impression.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(crans.impression.digicode.gen_code(cherrypy.session['uid'])) + "#"} + 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(crans.impression.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'].search('uid=' + cherrypy.session['uid'])['adherent'][0] + 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 [] + return os.listdir(file_folder) + + + # + # 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) + newFilePath = os.path.join(file_folder, aFile.filename) + shutil.move(tempFileName, newFilePath) + crans.cp.log("New file uploaded at : %s" % newFilePath, "IMPRESSION") + return newFilePath + + + + + diff --git a/intranet/modules/impression/static/WindowTitleLogo.png b/intranet/modules/impression/static/WindowTitleLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..d704d48e99dba6d399655f964c7a9a4e498d5d76 GIT binary patch literal 3799 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 N002ovPDHLkV1nW8F|Ggr literal 0 HcmV?d00001 diff --git a/intranet/modules/impression/static/dialog-printer.png b/intranet/modules/impression/static/dialog-printer.png new file mode 100644 index 0000000000000000000000000000000000000000..e812c88091e3bed741c758d991c5bc9170cd1400 GIT binary patch literal 3219 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 FV1fp#;W7XK literal 0 HcmV?d00001 diff --git a/intranet/modules/impression/static/dialog-solde.png b/intranet/modules/impression/static/dialog-solde.png new file mode 100644 index 0000000000000000000000000000000000000000..a6cd9dd8c2506c087e39b60cf00aea60e9f1ddb5 GIT binary patch literal 5311 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 RYU%(0002ovPDHLkV1l?e4Zr{Z literal 0 HcmV?d00001 diff --git a/intranet/modules/impression/static/dialog-warning.png b/intranet/modules/impression/static/dialog-warning.png new file mode 100644 index 0000000000000000000000000000000000000000..632f99a31b882b98661687c1207ba741b839e602 GIT binary patch literal 3464 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 literal 0 HcmV?d00001 diff --git a/intranet/modules/impression/static/impression.css b/intranet/modules/impression/static/impression.css new file mode 100644 index 00000000..09f330ea --- /dev/null +++ b/intranet/modules/impression/static/impression.css @@ -0,0 +1,162 @@ +/* ****************************************** * + * + * ****************************************** */ +#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; +} +/* ****************************************** * + * + * ****************************************** */ +#fileName { + display: block; + width:150px; + text-align:center; + padding:50px 5px 5px 5px; + background: url(../images/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; +} + +/* ******************************************* * + * + * ******************************************* */ +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; +} + +/* ****************************************** * + * + * ****************************************** */ +#popupFichiers { + background:#AE0F3E; + z-index:500; + float:left; + position:fixed; + min-width:450px; + top:110px; + 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; +} + +/* ****************************************** * + * + * ****************************************** */ +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; +} diff --git a/intranet/modules/impression/static/impression.js b/intranet/modules/impression/static/impression.js new file mode 100644 index 00000000..298ab375 --- /dev/null +++ b/intranet/modules/impression/static/impression.js @@ -0,0 +1,404 @@ +/* ************************************************************ + * 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/images/"+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"; + 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 + this.getValue(this.theform.disposition_recto_verso); + this.getValue(this.theform.papier); + this.getCopies(this.theform.nb_copies); + this.getValue(this.theform.agrafes); + // Contraintes + if ( + ( this.papier != "A4" ) || + ( (this.disposition == "recto") && (this.nb_pages>50) ) || + ( (this.disposition == "rectoverso") && (this.nb_pages>100) ) ) + { + this.setValue(this.theform.agrafes, "pasdagraphes"); + this.disableField(this.theform.agrafes); + this.getValue(this.theform.agrafes); + } else { + this.setDisableField(this.theform.agrafes, false); + } + if (this.papier == "A4tr") + { + this.theform.disposition_recto.checked = true; + this.disableField(this.theform.disposition_recto); + this.disableField(this.theform.disposition_recto_verso); + this.getValue(this.theform.disposition_recto); + } + else + { + this.setDisableField(this.theform.disposition_recto, false); + this.setDisableField(this.theform.disposition_recto_verso, 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/images/'+image_name}); + log("Updating preview (new image : " + image_name + ")"); + replaceChildNodes("preview",image) +} + + +/***************************** + Impression.popup + *****************************/ +Impression.popup = {}; + +Impression.popup.popupImpression = function(code) { + Popup.hide(); + Popup.create({}, "Impression en cours...", + DIV( + {"id":"printingPopupContent", "style":"background-image:url(/static/images/dialog-printer.png)"}, + SPAN("code: "+code), + 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/images/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/images/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/images/dialog-printer.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 LI({}, 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.modifPrix = function( text, wheel ) +{ + if (wheel) + { + var image = createDOM("IMG",{'src':'/static/images/indicator.gif'}); + } + else + { + var image = new DIV({}); + } + var item = new DIV({'onclick':'Impression.AJAX.recalcPrix();'}, image, text); + replaceChildNodes("prix_placeholder",item); +} + +Impression.AJAX.modifNbPages = function( nbpages ) +{ + Impression.settings.nb_pages = nbpages; + replaceChildNodes("fileNbPages",nbpages); +} + +Impression.AJAX.call = function(page, callBack) { + logDebug("calling AJAX : " + page); + var e = loadJSONDoc(page); + e.addCallback(callBack); + e.addErrback(this.errorHandler); +} + +Impression.AJAX.errorHandler = function(d) { + logError("AJAX Error: " + d); + //Impression.AJAX.modifPrix("Erreur...", false); +} + + +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 + +"&couleurs="+ settings.type_impression + +"&papier="+ settings.papier + +"&recto_verso="+ settings.disposition + +"&agrafes="+ settings.agrafes; + this.modifPrix("Calcul en cours", true); + this.call(url, this.changePrix); +} + +Impression.AJAX.changePrix = function(AJAXResp) +{ + logDebug('AJAX terminated (recalcPrix)'); + 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) +{ + logDebug('AJAX terminated (lancerImpression)'); + 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); + } + Impression.AJAX.updateSolde(); + +} + +Impression.AJAX.getPrinterState = function() +{ + var url = "etatImprimante"; + Impression.AJAX.call(url, Impression.AJAX.displayPrinterState); +} + +Impression.AJAX.displayPrinterState = function(AJAXResp) +{ + logDebug('AJAX terminated (getPrinterState)'); + 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) +{ + logDebug('AJAX terminated (updateSolde)'); + if (AJAXResp.erreur) { + logWarning('Erreur distante (etatImprimante) : ' + AJAXResp.erreur); + } else { + replaceChildNodes("soldePlaceHolder", AJAXResp.solde ) + } +} + +setInterval(Impression.AJAX.getPrinterState, 30000); +setInterval(Impression.AJAX.updateSolde, 60000); diff --git a/intranet/modules/impression/static/indicator.gif b/intranet/modules/impression/static/indicator.gif new file mode 100644 index 0000000000000000000000000000000000000000..085ccaecaf5fa5c34bc14cd2c2ed5cbbd8e25dcb GIT binary patch literal 1553 zcma)+TTl~c6vwlh>nb99Af5rT)t{mCEg5urg=A(g z{C|6SPb~9Xage|wB`SrZk2FOMYM!buln2sX?5Y+T78iB(Zu9cS7|LZyZ++}u$^oi1 z_j@S}bW9OzU2R+RMy&~OT>X-oZ98$jq#ogNfJ!BM-42wHGZk*6s2KD}U*IA%epmxb zm}|6BK9YoIF;*xSL!+z@<64lB7->LTW2Vi4ostCA(z&2XniwNIv}fFo-`MbG;)u4G z^p@F!)|9HhZprHd_vXjDoxs6WkK-6P0@lfxnGT>*p(QHoUV=u1FAqb@b%*W=a3{`LsH5k^AvQNL>6fPpy#oU(&MuH(*aEX4b35*} zn4n7)`I2U%=+Z=?BVZQ?vjQFW4gD@~XSOO6b{qu81`4&LFuU2(ilxW+1|ZkNMnWe79C$gs zWT?Ele|HR{JGPe)5BTW>0Ey?-Ls6S#GoV0tbt6ku7B&*0 z;i9QM$W1Rj*rRIdceL)rAOSl+sDe3LkB87<%){;ZdHp6|SNlopDXRx< zxBDF9-lTo&v`8$humFygUij@qgT=Qzhj8{ym2-{Xciwqq_Xwk%=O3B-MNAL_6e`3U zyxwmXex4`g0^1RYw~Dth3av3Dl^AAlpO3mG!nLr#&ZZ7c_wUboI+deC+&%TFjK2Lm z!Y&f1h|T_On%RCV&=4bx`!>(YezqGVhl&QpED?N6GV)HmzJ9&rh$x*i?*@o9#6QI< z5ZI_MRX;0+pY8$`j)eF#TlUyG(eE%E7S!rj;mj^M5vhUicPm zVWQ2z+imFyg}SRABmOBY_@osR!>7Ov!ioK`NB6_Rv}7Ud?35ed5Sb@?yND?kv~RCa wqs^a3Sh>&&L4)!LKI?D2&k@))k(LESaga|C278ChSzn3NWVkcuNoY&{0f?~U_5c6? literal 0 HcmV?d00001 diff --git a/intranet/modules/impression/static/paysage_b&w_non.png b/intranet/modules/impression/static/paysage_b&w_non.png new file mode 100644 index 0000000000000000000000000000000000000000..441ac6d227fcd911fa0ac93ce578f6dfbb1c0b34 GIT binary patch literal 4219 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 literal 0 HcmV?d00001 diff --git a/intranet/modules/impression/static/paysage_couleur_non.png b/intranet/modules/impression/static/paysage_couleur_non.png new file mode 100644 index 0000000000000000000000000000000000000000..d3b440d76d7a82c9de8ab8f294e248b7843004f3 GIT binary patch literal 5199 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 PM+4MUw3I6qtzQ2R>;&B> literal 0 HcmV?d00001 diff --git a/intranet/modules/impression/static/pdf-icon.png b/intranet/modules/impression/static/pdf-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..552079fd9b77bdc0c996b0f22151fefa6cde9fa0 GIT binary patch literal 3362 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 literal 0 HcmV?d00001 diff --git a/intranet/modules/impression/static/portrait_couleur_diagonale.psd b/intranet/modules/impression/static/portrait_couleur_diagonale.psd new file mode 100644 index 0000000000000000000000000000000000000000..55c6280c0d5af604cb5f929f083e5de629b5f5d1 GIT binary patch literal 357871 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 literal 0 HcmV?d00001 diff --git a/intranet/modules/impression/static/portrait_couleurs_Deuxagraphes.png b/intranet/modules/impression/static/portrait_couleurs_Deuxagraphes.png new file mode 100644 index 0000000000000000000000000000000000000000..f431ce3913b8a5664ce33ac05fed57ebd222ae49 GIT binary patch literal 5249 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 literal 0 HcmV?d00001 diff --git a/intranet/modules/impression/static/portrait_couleurs_agraphediagonale.png b/intranet/modules/impression/static/portrait_couleurs_agraphediagonale.png new file mode 100644 index 0000000000000000000000000000000000000000..25d82c811fe8334e0c6a67660568607901b20765 GIT binary patch literal 5291 zcma)=Ran&Tw#R>@G&nRUozjgUAxKJhN`o+TcZjrfrw9lP3@F_p3^|0<&|T6)OS;|v zb8{}vdG@|o@ArAvS~u%+^Igx1(NI&s$DzUj003V}@r~AB&G>gL{U zLk|GJCH{Ay06BRS0Dz-vFDt8|@!rML#pAt;E1i<8ES;;ni>dDL@Ycd_f00u@V)*z8#5m5?Y@sS85-4_v!qenveG*3|%_F)D`F+X~vkgeJ7 zb!@azoUV!JG3`=WLy-T;(b3)PUHfj{?){kGIAQ2h5KHn-kpu8jE8>;d9BrbyB5bH5 z6qQtQ4V{i?2i{|c(FXuXG(X>9&+k(ADBoNFRKRtHn+Y_q{wKUugGC>pO9s{$K)bjo zNm{@lx6U95Fh~J>*RHe10nz}#(JxSj0jR(S4lk4>F@QNp>Jm9HSM&^m1;nEO*=!0- zsM2kKxo(&iCu(;OPzaS~;70GRMhP`+s;0NwEP(ag7#0wm4pKdF4qkZT+C8$FISG8W|QM7G#l40)Nk zjKqq&XewiP06=v!@#9fcDrt9TYkkLd*YV_{ujmnsbYYOBKV5xn|AdMT5UGuyESPO? zBhXw2P`-P0fg#4gf*$aG^~O|S5xdX`=coTooS*2uG)=)5jloyXpW)!*9x+>f>EPXr zll&vF?y?paeD$~bxaf}r+;XI|tGbKBAKWaQy{okncH!tUe9qUqjE@5mArA@c6B~jx zCY+?Prv@?28Vsrfel1$bZ|H~8H$ZzK{HL@T57?_6_E_)R_HUFFBBQCDRsKV=Fl6yqfr$;%~>a^|G_7U zzqpc8pK_KlVPhU4btxtX30k8r4g>rJR;3w!hG0!c&mY zG&G|KJV8}YBN5tIR5tPUmzO6H6q{fbI>AR^`)S_7h1!I6D%gwxKQFltal%YdK^C_B`FxF7|510A2Qa1TCw!8!$0!%urj2UtJgF8 zgKl8HmSQzY2J%prV|p6;0_JzD1jJ^kicADUDO+kd^vp^8O1Mg3#YIJ~673SnNh13^ z6_$e}r=gWCtlCg0U1oAq5@C{h%H2@!RuhR>U-X6wb`g_SNg7C5$VO@#{p)9bne4&} z%~43fG*(5l*k>apr$TQH9_=Uyv7lED^Jp%aEWCuPc;;u0y`BB_d!9YdR_x_)8oA7$ znUmmOPxf~A!Y_RA@FVfV2NW&YD8ZBglw}l6lswrgr5ID0*@HT~v;5TAc3Fg3F1iLU zu3iL^CJ%$s#nScCgVT2_baXv*rDpspaCItm2`k^}1(nL{)@f`)u&2o?XCTjY+aSW# zV_H61i5laYX2qRm4A;`YGe-$@=+iP7P!b?s{kkoZu`~OXJ#` zLltj~J8Ey902OUnj|y9;ZL)3tj@u{-L4VB}^5uM<@)-RX{#XDP8kZDT4Z@+ywko(v zWWj%-bHVb+{fO-7VBy5eHD5ZPGyhV|N$lDSyH&VVvo)f1(QABPa?0w!Zx8!&_>y36 zc|zgR>7w|OeE$S-GC?cCD~KhWMCr&UYK0t0vib$ivTvS1eq1kq3V+|440~TZp;XM; z%yJxMw<+XHE@=yOd1eU}T(MaKzp}8j=U*&=mGo_OvX7>Lb8K5D>Zd$MMg}>TpmWfn z!-SVJdEf$z&iVGm`}l~ja(R8qal&x}84DSKaEuJqjB99?o}`|i-lg6wR0&~nz zpZ($K+f>J`lMPds#kp;{OI7nu)5{|geL{5E8vNzI* z6}_h57~M>3Pnk`A6GX!Pg1>@$U$b7@)6Mgm69L^aytC^_I8B6nY7t*_Xmt0sgE}~B zIa(d&HitG>G>7>{{gyk;1bGrOVIRe8!RBBRF`FK!yN)>md0RO;8Jh?J{T8=fr0pb0gH{I*a0qG;5lgm0zXohuyUlaGOv_8lE7rod ^zi_i!|R!!kx2Y1>eKjbYBMM070)mJ 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 GAN~bMsxJKi literal 0 HcmV?d00001 diff --git a/intranet/modules/impression/static/portrait_couleurs_pasdagraphes.png b/intranet/modules/impression/static/portrait_couleurs_pasdagraphes.png new file mode 100644 index 0000000000000000000000000000000000000000..68f469cc8ecf0d339f37537c90522f283923eb5c GIT binary patch literal 5218 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 Ig8BRZ0s3VFivR!s literal 0 HcmV?d00001 diff --git a/intranet/modules/impression/static/portrait_couleurs_troisAgraphes.png b/intranet/modules/impression/static/portrait_couleurs_troisAgraphes.png new file mode 100644 index 0000000000000000000000000000000000000000..bd7d91f0857e28dc27beeadc79421498ca7499ac GIT binary patch literal 5230 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 L^`ctw&HH}=cA58P literal 0 HcmV?d00001 diff --git a/intranet/modules/impression/static/portrait_nb_Deuxagraphes.png b/intranet/modules/impression/static/portrait_nb_Deuxagraphes.png new file mode 100644 index 0000000000000000000000000000000000000000..77308966c988f26d4590fa9641948dcd543c5a77 GIT binary patch literal 4324 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 N9WBHAH5v}j{sq+~aYz6F literal 0 HcmV?d00001 diff --git a/intranet/modules/impression/static/portrait_nb_pasdagraphes.png b/intranet/modules/impression/static/portrait_nb_pasdagraphes.png new file mode 100644 index 0000000000000000000000000000000000000000..d58be940aec04925250ea5ab16c099657e4dce16 GIT binary patch literal 4308 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 literal 0 HcmV?d00001 diff --git a/intranet/modules/impression/static/portrait_nb_troisAgraphes.png b/intranet/modules/impression/static/portrait_nb_troisAgraphes.png new file mode 100644 index 0000000000000000000000000000000000000000..cb3b5b3534715370726406ce8d54cb92cca1a59c GIT binary patch literal 4336 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ஒzJWA~p9rY@G%mN5=}3x)j+AiStto4;H-e>7xvF}X{1`gW+T zI-vZ(d#AFzM!tuyhr4AkKxwb^qH1s^WT$DTdA=lK zh4}I7gL8qA0_khFN#d-grv?BY6N1l;Qm^;79H7Q}01zku0AUdTaQgQ;uLFRu1ORNn z0YE+r03co|wq07+Mpa7Zf!Y)Q=}nYD+*3`?9u+Sqq@NQqlT?GkP6pq`T6~L~UYB3e z{2q}hBW)Nt9alV}oy6-kD9c}pg8V*Okaj~&JYSY84acSEFY!DaPAyD{FZwd7Agy%i zReB!q!FI(&C2-ATsNm;BP3!#f$`*3M$G1ZHveNdlV&k}0aVWV2JD!)L%3zj)OCibN z2aD*yb%-DR3o-oR0@v`r&NUpfpz=MFGS9%0U6}opGO7U?7z7q4SQgaEhm?!py%(4k z+Mb-|*A4=YaCe%#drU5KoZm&!WRaUrh6#Z(rY>1AVCqffI$?;}b9g+uy{g5>_w%Sp-Uo-H(lkp!-|DQ1o|G$j6 zMg0-kHLxO1U_p?caO~>MX14~!b`)jjJc4)qHpSs_*0^{iCukdVMXg9K@++ZI%Zd1~G#ITxfc%){Imb@$>t}rwJ*~&aZX6=!1)>;v}^)p~4 z98Yb5#!17^arknHn$jPJtQ&Tqr|dteW?Aa&vU*E00@NHoR%2~`zDqwZH?PWdho+6C zbg_e$^Et1!F3HA$%xAK?^qFGx^K+sbho!=>2;^WR{ zS`PPmy~R72YSd_`n`X9t*LfrB6Y11$BluREO@;qUiWZJNIRheX8WHYvgXx!gY-s8e zEzNAIruwf{vEH^)+yt`Q;>Q#sa$62(03`RUq-d6BLD;FDHZw}Y9Nmc?V`O$b!$n0h z3~C0iIyik)w5lKM5W^g43nIQi8b-BO9el(85?9{Pzc7j*AU5=aE8y6hMynxKm``qo zSjN4748FZFfLtHy`5=a;(GC+o^ZPicf^Xec7L!oA-C0I4{^ zKOa8Q1G#m;U1!>6aO*M6>VnFBhaG9SvsT|-WV1WsFv1Swkx}VTgQ}mX$UBL?V{g$X zwS_$fx}FQroi3TJ#O*nLh&Ox6#U`;!#MSU_pk2=araP1Pp7nx~nj#cdefJYWZE z3^_;dD(t-#lG`f}I}Co{9Li1|fdbIGc5AuF5Fq%b(M}_=;9N9UikXV8-De(9D812k zlXXye5OoC~6Cv6uEev)zbb-USQbaUN-4#Twm z=rTe>S2@aep@s>p6oovVK=Oo3I1W49@HmxOh%>LsFt6egQJ~MV|#3053rkWUPcqK z^b%<+?2C+Z2&F#}6^ndoG8O%5@w>uaMCqxy9tj~lM(RqUqOB3(Os>-9p*ELAjHZTU zo^kFL$7Ii8aWn0RNvL3}3*51(PThnuMEGS3A*Fq+cA}vaAQVR47<@q8fp@C)&i_{91 z`->_2nS}7?8)2Ky5tK>eRvqx}MmzfYe);3gOPRNp)|6kVB7|-pRkm+NYp9I=`8@w| zVhvqQ|9g%$$~N2=g-$Qnt720;AR84h)+q@ehBN6{QTY`VQx5ZB*cfk?%PIWB&{0ZeR24S=C>jw!m=caeMzzZf z%!!AafST09YK?nV-w*a5zYC>9*Qk8a@})w%J;Ux3Bxdii=iOajxBZ_g@voTv?;=xC zxq-}Dy02?>k2`>r^8yKxqQWq+K8u zLmkg=T}fh6)&fjf+=5P1@yZ2bj#i!q2<>qQBWYzc{s1vN-MJP$uZPSl!BH{>)}eVm zMk%T%Gu)A(dBr`g>BdnY70i!W!m%%;JUiKG(AvXnM?Pq$WPDSH5Xu^#nt6I##|-WH zz0i$G2mTnrXtH*1rEnOIE1%2X(leO_@Gg$jp%c zdlpr-M7dVQ{+kEN2a{jey-mb1C9BY6zyHj}|B00UG`U3S`(JY4A5xk#bBA!>Yo`V1 MXzD+xR)@d(e}Fc=bN~PV literal 0 HcmV?d00001 diff --git a/intranet/modules/impression/templates/impression-devis.tmpl b/intranet/modules/impression/templates/impression-devis.tmpl new file mode 100644 index 00000000..06c2eb10 --- /dev/null +++ b/intranet/modules/impression/templates/impression-devis.tmpl @@ -0,0 +1,67 @@ + + + + + Cr@ns Intranet + + + +
+

Devis pour impression

+ Fichier : $nomFichier +
+ + + + + + + + + #for anItem in $devis + + + + + + + + #end for + + + +
DescriptionPrix unitaireQuantitétotal
$anItem[0]$anItem[1] €$anItem[2] + #echo str($anItem[1] * $anItem[2]) + ' €' +
+ Total + $total €
+
+
+ + diff --git a/intranet/modules/impression/templates/impression.tmpl b/intranet/modules/impression/templates/impression.tmpl new file mode 100644 index 00000000..1f5b7e00 --- /dev/null +++ b/intranet/modules/impression/templates/impression.tmpl @@ -0,0 +1,170 @@ +#import crans.impression + +#if $getVar('errorMsg',False) + +#end if + +
+ + #if $getVar('fileName',False) + + #else + + #end if +#else + ## desactivation de l'interface si l'imprimant a un probleme + +#end if diff --git a/intranet/modules/infos/main.py b/intranet/modules/infos/main.py new file mode 100644 index 00000000..797773c1 --- /dev/null +++ b/intranet/modules/infos/main.py @@ -0,0 +1,16 @@ +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 diff --git a/intranet/modules/infos/static/icon.png b/intranet/modules/infos/static/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..df73c4d5691ac21e85e0fece50e5381a47e03260 GIT binary patch literal 1830 zcmV+>2if?EP)- zK~z}7<(FHGRc9H7pMR~j*FMaFanF%~JyWJFR4C96hh9ipxFDqx0!E{;iP6NQy-;JL z-kR7Z#%kh~+Sn$f7aBusYSIf5ERCdg+9EXE^ zST!;6Pu{F#WqtqmuJ3#Q_gf48-~Q|F00pC8ml*%RIIHpjTX6E|YH)n@mKkSVS z{q8?PAkj9kvunpwFRtIZ`=MMeM>dw|&RAUc2jC4<3B}PhZ&m#Wnr?{n(a;=XrRZhm2#2WuLUGNjZv%d5 zoypMKyN2HW4LzcL@SCOS@$slQdiGx?(6VmtcXxjE`4_kE*l9bCL#13M3`4ZmSeC#G z6_0Fa=Gm`zuz#=_%dvTXq>6Hf!ON8foj zs?JP$9%#DUB@z z-#gIFBM-P_Z20pB9=|<0NoYW8vn(!(A`*!V-M#D5a`nLeo7evFhZQy8c5L03ZEq)v zVzf3G!vX+etr3>s$4~b1*yml+^&Ph499+ww)Y6#6h@>Q&?Z9pu*w;{miERJoOj8q) ziqXO>fuUCRXAX35{LD0m-^e5CO)UEwKh_w`vbcG~aZGb-Ga}uyxgh~3(bDNU36xY| zSb#9#g_>N4#jRP7KfX21qZ?Zm;x3K(grUX~VoBU$Xr)Oc65wPy7xLXsKnpjGWg)e} zvOdwMQVJ;}CJKUIz2>ngm*&3SB*xT^hmr83M9>`$V2~N$#TpkZdIs&Qmr+BL&j3aFA`3+kT`^9_^1b~H-8s7_u zBZ*c9tqe+Q1h8#=6UG>fG5md`LZKoN77Nd<1Y-3^VHuYt=aNWaoKrM2@d0-?#7?Y};@rQ>m9c@fNMn!ey zm6wLEjA2Zz=h_&wF-WCJyMlFHF2)$7)I7SWi60#5;pea1K3g9D44K(@<;WC&SC{kCpqL>>F5T&0De%wQ)Og(?=@9i4RKr;?+s6Pe(Mn z7V%+-@}V~J89$3O^^{qgg-_$ z6`b~}#aBm0MqaBYQ}x6?Pyylv-VG{X0nI?F-X?p#EdZ|TwzsuqcL__hx{1_%cEV1? zVQ^6hO8I<#C=A0wJ;7ollt2Jf7a42A9}}?xKI@tv$lNxd@Azl*?C#Ji2wiq literal 0 HcmV?d00001 diff --git a/intranet/modules/infos/static/infos.css b/intranet/modules/infos/static/infos.css new file mode 100644 index 00000000..c2f0b785 --- /dev/null +++ b/intranet/modules/infos/static/infos.css @@ -0,0 +1,75 @@ +/************************************************************* + .. + .... ............ ........ + . ....... . .... .. + . ... .. .. .. .. ..... . .. + .. .. ....@@@. .. . ........ . + .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. .... + .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... .... + @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. .. + .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. ..... + ...@@@.... @@@ .@@.......... ........ ..... .. + . ..@@@@.. . .@@@@. .. ....... . ............. + . .. .... .. .. . ... .... +. . .... ............. .. ... +.. .. ... ........ ... ... + ................................ + +============================================================== +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; +} diff --git a/intranet/modules/infos/templates/info-diverses.tmpl b/intranet/modules/infos/templates/info-diverses.tmpl new file mode 100644 index 00000000..82e8ee53 --- /dev/null +++ b/intranet/modules/infos/templates/info-diverses.tmpl @@ -0,0 +1,17 @@ +
+

Mots de passe Cr@ns

+

Pour les news

+
+
Utilisateur :
+
Vivelapa
+
Mot de passe :
+
ranoia!
+
+

Pour le wiki

+
+
Utilisateur :
+
ViveLe
+
Mot de passe :
+
Wiki!
+
+
diff --git a/intranet/modules/mesMachines/main.py b/intranet/modules/mesMachines/main.py new file mode 100755 index 00000000..a98f8b9b --- /dev/null +++ b/intranet/modules/mesMachines/main.py @@ -0,0 +1,249 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-15 -*- +# ##################################################################################################### # +# 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 main(ModuleBase): + def title(self): + return "Mes Machines" + def icon(self): + return "machines_icon_fixe.png" + + def AJAXListeMachines(self): + adh = cherrypy.session['LDAP'].search('uid=' + cherrypy.session['uid'])['adherent'][0] + 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] + if machine.proprietaire().mail() != cherrypy.session['uid']: + raise Exception + # 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() + # 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 ouvert ext->machine', + 'ports':machine.portTCPin() + } + ) + if machine.portTCPout() != []: + machineInfos['ports'].append( + { + 'titre':'Ports TCP ouvert machine->ext', + 'ports':machine.portTCPout() + } + ) + if machine.portUDPin() != []: + machineInfos['ports'].append( + { + 'titre':'Ports UDP ouvert ext->machine', + 'ports':machine.portUDPin() + } + ) + if machine.portUDPout() != []: + machineInfos['ports'].append( + { + 'titre':'Ports TCP ouvert 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'].search('uid=' + cherrypy.session['uid'])['adherent'][0] + 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.") + 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'].search('uid=' + cherrypy.session['uid'])['adherent'][0] + 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'].search('uid=' + cherrypy.session['uid'])['adherent'][0] + 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'].search('uid=' + cherrypy.session['uid'])['adherent'][0] + if typeNouvelleMachine=='fixe' and adh.droits() == [] and adh.machines_fixes() != []: + 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("") + message = m.save() + del m + except ValueError, e: + del m + 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 + + + diff --git a/intranet/modules/mesMachines/static/machines.css b/intranet/modules/mesMachines/static/machines.css new file mode 100644 index 00000000..b25aba27 --- /dev/null +++ b/intranet/modules/mesMachines/static/machines.css @@ -0,0 +1,160 @@ +/************************************************************* + .. + .... ............ ........ + . ....... . .... .. + . ... .. .. .. .. ..... . .. + .. .. ....@@@. .. . ........ . + .. . .. ..@.@@..@@. .@@@@@@@ @@@@@@. .... + .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... .... + @@@@... .@@@.. @@ @@ .@..@@..@@...@@@. .@@@@@. .. + .@@@.. . @@@. @@.@@..@@.@@..@@@ @@ .@@@@@@.. ..... + ...@@@.... @@@ .@@.......... ........ ..... .. + . ..@@@@.. . .@@@@. .. ....... . ............. + . .. .... .. .. . ... .... +. . .... ............. .. ... +.. .. ... ........ ... ... + ................................ + +============================================================== +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; +} diff --git a/intranet/modules/mesMachines/static/machines.js b/intranet/modules/mesMachines/static/machines.js new file mode 100644 index 00000000..023002bb --- /dev/null +++ b/intranet/modules/mesMachines/static/machines.js @@ -0,0 +1,348 @@ +/* ************************************************************ + * 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) +{ + Crans.loading.display(false); + 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/images/" + 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) +{ + Crans.loading.display(false); + 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/images/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 ) ); + if (result.ipsec) + appendChildNodes(basicInfos, createDOM("DT", "Clef ipSec:" ), createDOM("DD",{},result.ipsec ) ); + 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) { + Crans.loading.display(false); + 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 = function(page, callBack) { + logDebug("calling AJAX : " + page); + var e = loadJSONDoc(page); + e.addCallback(callBack); + e.addErrback(this.errorHandler); + Crans.loading.display(true); + +} + +Machines.AJAX.errorHandler = function(d) { + //Machines.AJAX..modifPrix("Erreur", false); + logError("AJAX Error: " + d); + Crans.loading.display(false); +} + diff --git a/intranet/modules/mesMachines/static/machines_icon_fixe.png b/intranet/modules/mesMachines/static/machines_icon_fixe.png new file mode 100644 index 0000000000000000000000000000000000000000..11ffbb715841e715c95d4b842c4d91ce15a182d7 GIT binary patch literal 1683 zcmV;E25k9>P)P~G_ZgYpe5;xA}@_$Q->}L64pP~ zI7*f*A*&dhWy)Y#tU`>g!RW$9v?WoSS_O3!6@)dkg+g28C{?bt*WTOj{kuO3XS%b- zIG61Yp1;1oJTLitpYQW~o(FErZTTOI?b{k2IdUYUt1I-@>ea#aXmtARhK7bq|8;;v zhyI$^-hScJ>FHRJWf{^v_qd2gB|st^)(M4T?B8GST(_=D``!RLJ3HlPpZ&)Lo6RiN zbzNS)IuE};Go_a#2_XbR2zq)ZaXQ_9Y-?-U^&bOl*zn}V>FH#t5SD%A$^r@t9VsKH z(}^t0Xqtwu>zp|8C6)!BeKv{H>5NuYl`Uv#*&h8)0KL7v(xZ+3_;b&|~<3ZEf%RcJ2Dx7!Z^JJRV1XIBd^bwW`e7*Vo6;&=6j) zmx+l9bX`vaP!yfv;W#5Bc0wU9vTR3|C7ezh9#0&fZ=C%6J_-vhN=mZudfgNi6|sEz zkFneB)YmVUdV0>d0c3!O9{SPx*IpZ#%E?ivtXzv>n2e8ynV6WsFpTtfvk77`lSCqp z!{J1dq?B%QQs%}DKO-Y@%GT?R69^2@+?>mzMGKjln&P96Mx6i>Kz)6^YMQ1N3ATx?YLM4$7%;A;US$%fr7&DmU3RY6gb zH_tkWghob&hAd|wgkX9)!KO`REwcb-en)*gH#Z-T$HT#c2l4s*U;7M_B&ev!AtNJW zP6%DsQV@!wkxW{tEM;a&qPn_zC=H;ZBDn3t4=1RpsmASgqw5+Dha)Zcl`9b*es~$R zwXk480bZ{Mhr@x*W=n%mRRw_T>|3>wz~z!tl|2h!-@bYoYd7lEm~UYICg9)J9j#$s}*GB zddmMEd}>OKMj{b^QBe_!q7n=S7#|-`>4%3CT)sSQ`ThATH*EOByP25|xwtrAdhWSj z$dSmT?VWf2Nl%Z#@UWXNzHktaC($&WMT@ck2!%qJrY$@tKw+Wp$>!$nKRxzX36>?u z&(CLgco=|BK8Y|gl8B!wyQJdU-Cpy1Hg#aBxuc_V$VsCr*mZo1Yfv&Ycr`_PikOxZ~%dtZb** z)zzc*_xEc{mNe?$X(#+9sjqM88W^~?_NAA8C6|`^NhTFc)1a~Ou;p?&UViYwqF)|9 zJk;rMh##(5v#?_K?w>}#R{((LpMN2H-@Z?8tX;b>X161~|Nc-`dHMYM*I)l_=k4A9 dw)|hqzW|YL*cM{#EkytT002ovPDHLkV1gGrGK>HK literal 0 HcmV?d00001 diff --git a/intranet/modules/mesMachines/static/machines_icon_wifi.png b/intranet/modules/mesMachines/static/machines_icon_wifi.png new file mode 100644 index 0000000000000000000000000000000000000000..caca9a1d963c0fd7e6d76a1943c5fbfbdb7f77ac GIT binary patch literal 1412 zcmV-~1$+95P)WFU8GbZ8({Xk{QrNlj4iWF>9@00ihsL_t(o!|j*LZxdG( z#?PI5=RIRP@7PYU6G-9^N=&POSil0J1_`PnwW1B8>Y`H1h7Aka3L#ZpbjOB&qL9X- zp(_Zbhz6o4KnRaS_>n*!ZGxTHjy*H>IKH=w5~NU6VA8J2k*;QS?){zb%$)fyz?=BL z2U<_^@bK_=JkK9j6va{$#S#R;WQz&kpp+KM<+4F3Etbn=!?x{g zB9XX5oF1+y3O71B`q|O1j;bJoiZB8K1aw^oMN~j7sGzEUEltxvQIs`LRaM!MBS#h- zSKr&)yQ`M+IEI$CSfq{X1S67$n2;lVT(-+or zcvV$ZX=-Zf^6GxC)q-Qkj#Z6}jC8MOdUkbnfngW}jsOlFI`rY#*qFd^+`9TdG&Jt(n}tLo0num_VzC&+VljwDqY#hBVQFaz7-KK~@gPLQ;c#-# zo;_o)1+cwyySr!_`_G;2-H=QslQlIp#Ow8GrfJ%WqAZ^{al#c0233yZz%UGm$K%hS zRsrMjI0S=1T2WE)YdW2#F9q1%+3DV~W5@fZVeZmY{XK$-!ebua93J60j7h0vr%lTu z12m1QXZLF=W>EU_)uqX&^nM}5rPN&i0;?hbc zlg%uqmQonwq-9zzm+q2RR#qxFjw=Iz$QUybLNY?AL@DJcrDm~Mv>C86;rW~-iDg1a zqhT7$4`Z>upU$8Ec8vlzZVdh`@OVGRanH<&$Kw_~9ybJo0ijs56;V=rf*?boVA1L6 z$Ems5nMd(hVp*1Ci7`+VS+;H4)(B5Z48Wr(N`W!PVT>yUQK-ZObMZ%y-7~ZE^7F06 z;}g;9$J4X5=}cC^81uTW!72=;403rB=H~tYf(eMCgk(uj8yh$Hw{G1MsHv^4a=G>D zQrR{Q)11#_GP8t`8H{n30h2VBR?mx~Ff?+z9E-+Ij@`NWJ$r71BTd(90H6r~8bwhG zd%eDvZQH_)p-@XxTc}0y`@AHV%X0`J&~*(k#(>a^ot$A9b~2eNFDyLCbC^i8bMxwN z*N5g8Q>l;djoli2sVCHQodAFz00IEeq^jDx_4VFhINZ^+xh)h3g<5#O&&zWh`bRH0 zJu}CCj9kcH9~?ZxVSHvX{_u$-Q>y8@1ORV61!{J=J@5E^{$M!Vv9T@G+R)nCjO*)a z5kj!qGJ5;YJ$AM?k{BDkb*fk_oX_WSrGL#8Yr3ujzy<&aAcR65PvzTzV6Z9N(b3et zWwUo?de-cVM1J{wZst@zm%IO;+j33UE1#+pc={ft0iZvh%PqaR@w|ywjXweK#!G8h SwL2jI0000 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 ê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 è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 + diff --git a/intranet/modules/monCompte/static/crans_domtab.js b/intranet/modules/monCompte/static/crans_domtab.js new file mode 100644 index 00000000..ce6a1fce --- /dev/null +++ b/intranet/modules/monCompte/static/crans_domtab.js @@ -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'); +document.write('div.domtab>div{display:none;}<'); +document.write('/s'+'tyle>'); diff --git a/intranet/modules/monCompte/static/icon.png b/intranet/modules/monCompte/static/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f2551b9fc670dc30741ed28b43effc55f4bb1b6d GIT binary patch literal 4072 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 a{xtxre-6(*ye}C50000 +********************************************/ +#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; +} + + +/******************************************** + * +********************************************/ +/* 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; +} + +/******************************************** + * +********************************************/ +.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; +} + + +/******************************************** + * +********************************************/ + +.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; +} + +/******************************************** + * +********************************************/ +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; +} +/******************************************** + * +********************************************/ +.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%; + +} +/******************************************** + * +********************************************/ +ul.listeAlias { + list-style-type:none; + margin:0; + padding:0; +} +ul.listeAlias li span { + color:#666; +} + + +/******************************************** + * +********************************************/ +#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; +} + +/******************************************** + * +********************************************/ +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; } + +/******************************************** + * +********************************************/ + +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; +} diff --git a/intranet/modules/monCompte/static/moncompte.js b/intranet/modules/monCompte/static/moncompte.js new file mode 100644 index 00000000..3abaac7e --- /dev/null +++ b/intranet/modules/monCompte/static/moncompte.js @@ -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"; +} diff --git a/intranet/modules/monCompte/static/passwordGenerator.js b/intranet/modules/monCompte/static/passwordGenerator.js new file mode 100644 index 00000000..18b6cf90 --- /dev/null +++ b/intranet/modules/monCompte/static/passwordGenerator.js @@ -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; +} diff --git a/intranet/modules/monCompte/templates/MonComptePaypalCancel.tmpl b/intranet/modules/monCompte/templates/MonComptePaypalCancel.tmpl new file mode 100644 index 00000000..7bef45d6 --- /dev/null +++ b/intranet/modules/monCompte/templates/MonComptePaypalCancel.tmpl @@ -0,0 +1,22 @@ +#import cherrypy +#set bugMail = cherrypy.config.get("mail.bugreport", "nounous@crans.org") + + +#include "inc-paypal-head.tmpl" + + + + + + +
+
+
Options d'impression +
+
+
+
+ +
+
Type d'impression + + +
+ +
Copies et papier + + + +
+ + +
+ + + +
+ +
Disposition + + +
+
+ +
+ + + +
+
+
+ + +
+ +#if not $getVar('Erreur_imprimante',False) + #if not $getVar('fileName',False) +
+

Impression - Choix fichier

+
+ #if $getVar('openError',False) +
$openError
+ #end if +

Il semblerait que l'interface d'impression ne soit +pas compatible avec internet explorer. Nous espérons pouvoir +régler ce problème au plus vite. Nous vous conseillons en attendant +d'utiliser Firefox. Les +nounous

+
+

Mes fichiers

+
+ +
+
+ +
+

Envoyer un fichier

+
+ + +
+
+
+
+
+ + #end if +
+ + diff --git a/intranet/modules/monCompte/templates/MonComptePaypalReturn.tmpl b/intranet/modules/monCompte/templates/MonComptePaypalReturn.tmpl new file mode 100644 index 00000000..e96cd6c3 --- /dev/null +++ b/intranet/modules/monCompte/templates/MonComptePaypalReturn.tmpl @@ -0,0 +1,21 @@ +#import cherrypy +#set bugMail = cherrypy.config.get("mail.bugreport", "nounous@crans.org") + + +#include "inc-paypal-head.tmpl" + + +
+

Paiement terminé

+

Ton compte impressions sera crédité dans quelques minutes.

+

N'hésite pas à nous envoyer tes remarques et/ou suggestions à $bugMail

+
+ Retour +
+
+ + + +
+ + diff --git a/intranet/modules/monCompte/templates/MonCompteRechargePaypal1.tmpl b/intranet/modules/monCompte/templates/MonCompteRechargePaypal1.tmpl new file mode 100644 index 00000000..f8e76575 --- /dev/null +++ b/intranet/modules/monCompte/templates/MonCompteRechargePaypal1.tmpl @@ -0,0 +1,20 @@ + + +#include "inc-paypal-head.tmpl" + + +
+

Recharger son compte impression

+

Le cr@ns te permet de recharger ton compte pour les impressions via PayPal ou en allant voir un câbleur.

+

La méthode PayPal est plus rapide mais PayPal facture des frais de transaction.

+ +
+ + + + + + \ No newline at end of file diff --git a/intranet/modules/monCompte/templates/MonCompteRechargePaypal2.tmpl b/intranet/modules/monCompte/templates/MonCompteRechargePaypal2.tmpl new file mode 100644 index 00000000..e8a4e9ff --- /dev/null +++ b/intranet/modules/monCompte/templates/MonCompteRechargePaypal2.tmpl @@ -0,0 +1,33 @@ + + +#include "inc-paypal-head.tmpl" + + +
+

Étape 1 : Choisir le montant

+#if $getVar('error',False) +
$error
+#end if +
+ + +

+
+ Annuler + + +
+ + +
+
+ + diff --git a/intranet/modules/monCompte/templates/MonCompteRechargePaypal3.tmpl b/intranet/modules/monCompte/templates/MonCompteRechargePaypal3.tmpl new file mode 100644 index 00000000..3ce6045b --- /dev/null +++ b/intranet/modules/monCompte/templates/MonCompteRechargePaypal3.tmpl @@ -0,0 +1,35 @@ + + +#include "inc-paypal-head.tmpl" + +
+

Étape 2 : Confirmer la facture

+ + + + + + + + #for unDetail in $details + + + + + + + #end for + + + +
DescriptionPrix unitaireQuantitétotal
$unDetail.intitule$unDetail.prixUnitaire €$unDetail.quantite$unDetail.prixTotal €
+ Total + $total €
+ +
+ + \ No newline at end of file diff --git a/intranet/modules/monCompte/templates/MonCompteRechargePaypal4.tmpl b/intranet/modules/monCompte/templates/MonCompteRechargePaypal4.tmpl new file mode 100644 index 00000000..c9c52d59 --- /dev/null +++ b/intranet/modules/monCompte/templates/MonCompteRechargePaypal4.tmpl @@ -0,0 +1,15 @@ + + +#include "inc-paypal-head.tmpl" + +
+

Étape 3 : Fin

+

Ton compte impressions sera crédité dés que la facture sera réglée.

+

Tu peux régler la facture plus tard en allant dans Mes Factures

+ +
+ + \ No newline at end of file diff --git a/intranet/modules/monCompte/templates/inc-paypal-head.tmpl b/intranet/modules/monCompte/templates/inc-paypal-head.tmpl new file mode 100644 index 00000000..907ec0c7 --- /dev/null +++ b/intranet/modules/monCompte/templates/inc-paypal-head.tmpl @@ -0,0 +1,11 @@ + + + Cr@nsIntranet + + + + + + + + diff --git a/intranet/modules/monCompte/templates/monCompte.tmpl b/intranet/modules/monCompte/templates/monCompte.tmpl new file mode 100644 index 00000000..2ce3fbe9 --- /dev/null +++ b/intranet/modules/monCompte/templates/monCompte.tmpl @@ -0,0 +1,211 @@ +#if $message != '' + +#end if + +#if $error != '' + +#end if + +
+
+

Paramètres de mon compte

+ + +
+

+
+
Nom :
+
$adherent.nom + modifier +
+
+
Prénom :
+
$adherent.prenom + modifier +
+
+ #if $getVar('adherent.adresse', False) +
Adresse :
+
+ $adherent.adresse.ligne1
+ #if $adherent.adresse.ligne2 != u' ' + $adherent.adresse.ligne2
+ #end if + $adherent.adresse.cp $adherent.adresse.ville +
+ #else +
Chambre :
+
$adherent.chambre
+ #end if +
Solde :
+
+ $adherent.solde € + modifier +
+
+
Téléphone :
+
$adherent.telephone + modifier +
+
+ #if $adherent.droits +
Droits :
+
+ $adherent.droits +
+ #end if +
État administratif pour l'année $adherent.anneeScolaire :
+
+
+
Cotisation :
+
+ #if $adherent.cotisationOK + OK + #else + Non payée + #end if +
+
Carte d'étudiant :
+
+ #if $adherent.carteOK + OK + #else + pas de carte d'étudiant + #end if +
+
+
+
Changer mon mot de passe
+
+
+
+ +
+ +
+ Générer un nouveau mot de passe
+ +
+ +
+
+
+
+
+ +
+

+
+
+
Alias:
+
+ #if $mailInfos.alias==[] + Vous n'avez pas d'alias + #else +
    + #for $an_alias in $mailInfos.alias +
  • $an_alias@crans.org
  • + #end for +
+ #end if +
+ + Nouvel alias + +
+
+
Greylisting:
+
+ #if $mailInfos.contourneGreylist==True + + #else + + #end if + Plus d'infos
+
+
+ Entêtes: +
+
+ #if $mailInfos.rewriteMailHeaders==True + + #else + + #end if +
+
+#if $getVar('mailError', False) +
    +
  • + $mailError +
  • +
+#else +
+
Transfert:
+
+ +

Laisser vide pour désactiver le transfert


+ +
+
Tri des spams:
+
+
+
+
+
+
+#end if +
    +
  • + + +
  • +
+
+
+
+
diff --git a/intranet/modules/quota/main.py b/intranet/modules/quota/main.py new file mode 100755 index 00000000..958308c3 --- /dev/null +++ b/intranet/modules/quota/main.py @@ -0,0 +1,107 @@ +#! /usr/bin/env python +import cherrypy, tempfile, shutil, os +import crans.utils.quota +import crans.cp +from ClassesIntranet.ModuleBase import ModuleBase + + +class main(ModuleBase): + def category(self): + return "Personnel" + def title(self): + return "Quotas" + def icon(self): + quotas = self._get_quota() + for a_quota in quotas: + if a_quota['quota'] < a_quota['usage']: + return "icon_alert.png" + return "icon.png" + + + def _get_quota(self): + #return quotas = crans.utils.quota.getUserQuota(cherrypy.session['uid']) + return [{'%': 33.9, 'quota': 390.62, 'label': u'Dossier personnel', 'limite': 585.94, 'filesystem': '/home', 'usage': 420.32}, {'%': 0.1, 'quota': 100.00, 'label': u'Boite de r\xe9ception', 'limite': 150.00, 'filesystem': '/var/mail', 'usage': 0.06}] + + + ########################## + # 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, 'e': "eeede"} + except Exception, e: + crans.cp.log('error getting quota for user %s : %s' % (cherrypy.session['uid'], str(e)), 'QUOTA', 1) + values = {'erreur':str(e), 'e': "eee"} + 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 diff --git a/intranet/modules/quota/static/icon.png b/intranet/modules/quota/static/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..7621d2fa8ccf8e25d152dc9f483db7ff111e8762 GIT binary patch literal 986 zcmV<0110>4P)~z*?ul2sm|^| zFYQmFup1MobLdcD5zI`Dn}9K7Uz4to}LSBWGK`T5BgbmJzLba<`wKJTo4 zM5TCrIRKg`KhgKTr~2w(`GAM~()x`LH}6gtQ6HdSiYDp53{_dV5G? zyUp3|F43)9xNB>30Vv3_!86QiOXKj!vMCMYqoak)1fv9EbCahJ9-N;eD!(u!=8Ff+{1L!lWxiYXiQgWAWmgwtd}W5Vc7YM$zmc-U6FyY zwI+ASN|78NYfo7Q)YjFD&`Te}?;oR%0>B-6yL9(cs0=IJ4`Ka1&8MHh;b(AC8l;b+ z=}i7N5dVO%YQSAH05|^wqF+J20<4YIgya1M;m{xAm5Bn3Ao&x*(UwR+VWLiw=MX*v zt7>LI2th6et+jfi$D!Rsq!z--DOEGd>zX;0&Jch92+2@HD}$QmQ-Ix7Byxb>k>Cmq zte7FeY42?cXE(@KQ|h0T$z+`z3x&;LED>>vBt?=TofPS02!{P1XyX{T2{6K(L7tp) z974YGE~$0l8Mc&Cjm)Rj-=tOeaxvTA(JYIhT$W=1aw#RQ>$1JQ&9Y+TD|QeBk?Xok z|28ZZi$qb>w_B~&w?N`JPD2PG7xX!<9}6LbbX_;z+uOVU51THNHG}PkyRMP)pXrv@Hk}8M~7HJESy!av(wNSPXmI#7q#5W1W zDybA>wIV7-sXo|3kv>=u|GcOviVY&Au@X#Mg>5v(CE0BDPj+W_ZXb5LnN21((I!2x z46|ou&Ntt8&Uf#K2M-=>4uwLWMx)UHAe2&A!+QQ7=1jnd$Kz+klP6EQLZQ&RV`F2? zc36S9-EJb0NWYd&rvuq+mV7?XTt+IDLQ3h@q?GC(Wbt@>PKrw@@%elxrO>SO#9}dO zYiltKqja$lV#){E<)-Qdr4&jjOw%M9jpFn90LlS)JRX9<;H>vSG#V{|m;BG6O-0@7 zgkh$+^Y}9o*$58lWPy7vZ!O$}&s8-y03yRbG3NOW{~LwJr?|!af!}zq?!@GVoDEtt z`Pife9Z5f(I|-!Fh$R!G4ad0g$f}nEutwtEJ)U2@$XI_rn%|G7p@G`AHh9TMTEi*l zF&s~zRgC}F;I5fI1J8~fV{xoVV=Tt#!-r(HY(ZbNXj%X&q}RqX?A4aGi$^{`NyF@m z7qhY^*h(Pk>UetfYUwH_r84G*YuBh8a`E>0DOs3eIRA|SyCyS>lJxiE{puXa?b~U; zex1nX&8+;!#QALG96EG}@0Ts3!e2$*;cL^E zK-lbj%4D%4PUYe5UAS-o4jjNN?s!yXC3JMK;KyI#&YfxYz{DN0QW!%+mb)DG@3LnP ztXKi9t>u8XZ9}YD1#N9GVZzF|^yF?q?+2(CDL^lKyWGQ%z*p?_Xc`u;vH0|3IJXIY z9)!!6LDMGr2uF{?`t^vzjj-XOJp;P=2+}=4RNq5x)E#nMh1#KnQ^;3d6dvImw_FLF60=r-|F2$Gg}Ag<_Lc1B`<@RI8bN|W+ft< zLy|+1M>=yzXCBAX5qv+~L~Q#6R<0~Ha7#-IJv}`%Ha3nIsIP~eJDGpt1j*gIAs9sT z_4WNyU0uB@nM~5x*EeG?U*6u%{QLLe(IZrKb&2}k-do7=Z$M0j)q;~68Rxe);r%xj+ISd0_ zE`l8$E^T07;A_BeI-MaQgq+DIcbyP5F3{P#w`A4IV%_fpT)Kp5XX#3*tYJL+8)`ZS U5rIayPXGV_07*qoM6N<$g0ih+%K!iX literal 0 HcmV?d00001 diff --git a/intranet/modules/quota/static/icon_digicode.png b/intranet/modules/quota/static/icon_digicode.png new file mode 100644 index 0000000000000000000000000000000000000000..fe3729c6852d97d7da651e288ecad003da799a73 GIT binary patch literal 1388 zcmV-y1(W)TP)WFU8GbZ8({Xk{QrNlj4iWF>9@00huUL_t(o!>yNHY?Db#|VTv<_3K{Og=dU~4M zw{K&bCWc|)a=GyNeC*n_i`A=FNy1Hzwt*wMYA$odx{+^tiYytkHz}C~$)Fd4p9pd$R z1^5ss&awV6yWKw3-Q6wy{rz(6*fCK`oyc{7kwaGEbUI(Hsi`3x4l^+^@dI!Oh~?OG z(KOBd0|Ntc{rYw4>gsU2-FpfJ;4LpN_b8%$^KFc{1UAQLqnpbBWvTBpv} z1N#!Uivv3Gjb-SLg-y|D6u=3DmIPoJT0#^bVQsdUMT zWJE7pnHk`!iY&kZRAYj|d;zGmRV$LiwKeec?!|jvIglgX8NQ4b&yNAu;$Yg}2aUeu zxcw=3=k09D8WX|LRsaJED9!vvCQ~ZCkx|PXGb?M&`sSBrz>#^?sWT9sPmceZhOf?M zse6qbSrh8gUf|3u@BMV~+=;$SH`xrTDywVd2B3hF#j;Dk!tgJP=g*yoiEHVxCA3x$A*& zn3&es|9yZN09^S4_Oyc*>&BV-vkQ#?0000 + + + +#if $getVar('usage', False) + +#set total = $limite +#set quota = $quota +#set usage = $usage +#set usage_percent = int( 100 * $usage/$limite ) +#set quota_percent = int( 100 * $quota/$limite ) + + + + + + + + + + + + +0Mo +$int(quota) Mo +$int(total) Mo + + + + + +$percents% + + +#else + +$getVar('erreur', 'BROKEN') + +#end if + diff --git a/intranet/modules/quota/templates/quota.tmpl b/intranet/modules/quota/templates/quota.tmpl new file mode 100644 index 00000000..07d8c2c6 --- /dev/null +++ b/intranet/modules/quota/templates/quota.tmpl @@ -0,0 +1,13 @@ +
+ +#for un_truc in $quotas +

$un_truc.label

+ + +#end for + +
Si les graphiques ne s'affichent pas, essayez la version html
+ +
\ No newline at end of file diff --git a/intranet/modules/quota/templates/quota_html.tmpl b/intranet/modules/quota/templates/quota_html.tmpl new file mode 100644 index 00000000..9cf178a7 --- /dev/null +++ b/intranet/modules/quota/templates/quota_html.tmpl @@ -0,0 +1,22 @@ +
+ + +#for un_truc in $quotas +

$un_truc.label

+ #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 ) +
+
+ + $un_truc.text_equiv + +
+
+
$un_truc['%'] % + +#end for + + + +
\ No newline at end of file