Commit 6170e927 authored by Vincent Le gallic's avatar Vincent Le gallic

Transferts en mode double-stack

parent 4b22b3b1
......@@ -370,3 +370,16 @@ class CreditRetraitForm(forms.Form):
else:
out["montant"] = 0
return out
class TransfertForm(forms.Form):
"""Formulaire pour effectuer un transfert d'argent."""
montant = FrenchFloatField(label="Montant")
motif = forms.CharField(label="Motif", required=False)
def clean(self):
"""Les centimes"""
out = forms.Form.clean(self)
if out.has_key("montant") and type(out["montant"]) == float:
out["montant"] = int(100 * out["montant"])
else:
out["montant"] = 0
return out
......@@ -44,6 +44,7 @@ urlpatterns = patterns('note.views',
url(ur'^/get_photo/(?P<idbde>[^/]*)/*$', 'get_photo'),
url(ur'^/do_conso/*$', 'do_conso'),
url(ur'^/do_(?P<action>credit|retrait)/*$', 'do_credit'),
url(ur'^/do_transfert/*$', 'do_transfert'),
# easter egg
url(ur'^/(?:teapot|th(?:é|e)|coffee|caf(?:é|e))/*$', 'teapot'),
)
......@@ -615,6 +615,8 @@ def consos(request, double=None):
variables["credit_form"] = CreditRetraitForm(prefix="credit_form", label_suffix=" :")
# Le formulaire de Retrait
variables["retrait_form"] = CreditRetraitForm(prefix="retrait_form", label_suffix=" :")
# Le formulaire de Transfert
variables["transfert_form"] = TransfertForm(prefix="transfert_form", label_suffix=" :")
variables.update(variables_standard)
template = 'note/consos-double.html' if double else 'note/consos.html'
return render_to_response(template, variables, context_instance=RequestContext(request))
......@@ -652,6 +654,40 @@ def do_credit(request, action):
else:
return HttpResponse("Erreur à l'établissement de la connexion")
@csrf_exempt
def do_transfert(request):
# On appelle la fonction standard
success, sock_ou_response, variables_standard = standard_page(request, socket=True)
if success:
sock = sock_ou_response
if request.method != "POST" or not request.POST.has_key("transfertdata"):
return HttpResponse("Bad request", status=400)
transfertdata = request.POST["transfertdata"]
try:
transfertdata = json.loads(transfertdata)
except ValueError:
return HttpResponse("Failed to decode JSON object.", status=500)
if not( isinstance(transfertdata, list) and len(transfertdata) == 4 and
[type(i) for i in transfertdata] == [list, list, unicode, unicode]):
return HttpResponse("Bad parameter", status=500)
emetteurs, destinataires, montant, motif = transfertdata
try:
montant = float(montant)
except ValueError:
return HttpResponse(json.dumps({"retcode" : 1111, "msg" : None, "errmsg" : """Transfert impossible : "%s" n'est pas un montant valide.""" % (montant,)}))
if emetteurs == []:
return HttpResponse(json.dumps({"retcode" : 1112, "msg" : None, "errmsg" : "Transfert impossible : pas d'émetteurs."}))
if destinataires == []:
return HttpResponse(json.dumps({"retcode" : 1113, "msg" : None, "errmsg" : "Transfert impossible : pas de destinataires."}))
montant = int(montant * 100)
paquet = ["transferts", [emetteurs, destinataires, montant, motif]]
print "%r" % json.dumps(paquet)
sock.write(json.dumps(paquet))
out = full_read(sock)
return HttpResponse(json.dumps(out))
else:
return HttpResponse("Erreur à l'établissement de la connexion")
def activites(request, admin=None):
"""Affichage des activités"""
# On commence par appeller la fonction standard
......
......@@ -221,9 +221,9 @@ ERRMSG_IDBUTTON_FAIL = u"Le bouton n°%s n'existe pas."
ERRMSG_PREID_INVALID = u'''"%s" n'est pas un identifiant de préinscription valide.'''
ERRMSG_PREID_FAIL = u"La préinscription n°%s n'existe pas."
ERRMSG_DJANGO_SESSION_EXPIRED = u"Ta session Django a expiré, reconnectes-toi."
ERRMSG_DJANGO_SESSION_EXPIRED = u"Ta session Django a expiré, reconnecte-toi."
ERRMSG_NOCOOKIE = u"Ton cookie est inexistant ou invalide."
ERRMSG_NK2015_SESSION_EXPIRED = u"Ton cookie NK2015 est invalide ou a expiré, reconnectes-toi."
ERRMSG_NK2015_SESSION_EXPIRED = u"Ton cookie NK2015 est invalide ou a expiré, reconnecte-toi."
ERRMSG_PASSWORD_NEGATIVE_IDBDE = u"Mais oui bien sûr…"
ERRMSG_NO_ACL_CHGPASS = u"Tu n'as pas le droit de changer le mot de passe d'un autre compte que le tien."
......@@ -240,7 +240,7 @@ SUCCMSG_ALIAS_ADDED = u"Alias ajouté avec succès."
SUCCMSG_ALIAS_DELETED = u"Alias supprimé avec succès."
SUCCMSG_ALIAS_ALLDELETED = u"Tous les alias supprimés avec succès."
SUCCMSG_PASSWORD_CHANGED = u"Mot de passe modifié avec succès."
SUCCMSG_LOGOUT = u"Tu t'es êtes déconnecté."
SUCCMSG_LOGOUT = u"Tu t'es déconnecté."
SUCCMSG_ADDBUTTON = u"Bouton ajouté avec succès."
SUCCMSG_CHGBUTTON = u"Bouton modifié avec succès."
SUCCMSG_DELBUTTON = u"Bouton supprimé avec succès."
......
......@@ -257,8 +257,13 @@ function cleanForms() {
span = document.getElementById(id);
span.replaceChild(emptyspan.cloneNode(true), span.firstChild);
}
/* On vide le stack qui a probablement été rempli quand on a cliqué sur celui qu'on voulait créditer */
emptyStack();
/* On vide également le formulaire de transfert */
ids = ["montant", "motif"];
for (var i_id = 0, c = ids.length; i_id < ids.length; i_id++) {
id = "id_transfert_form-" + ids[i_id];
field = document.getElementById(id);
field.value = null;
}
}
/*** Faisage des consos ***/
......@@ -381,7 +386,7 @@ function do_conso_multiples() {
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
var answer = JSON.parse(xhr.responseText);
//On enlève du stack les consos qui ont marché et si il y a eu des échecs on alerte
//Si il y a eu des échecs on alerte
var errorhappened = false;
var errlist = [];
for (var i_ans in answer) {
......@@ -389,7 +394,7 @@ function do_conso_multiples() {
if (!isSuccessCode(ans[0])) {
errorhappened = true;
//Il faut trouver les noms de note correspondants
var nom = ""
var nom = "";
for (var i_note in display_stack) {
note = display_stack[i_note];
if (note["idbde"] == ans[1][1]) {
......@@ -404,7 +409,7 @@ function do_conso_multiples() {
errlist.push(nom + ", " + bouton["nb"] + "x" + bouton["label"] + " : " + ans[2]);
}
}
// On vide tous les stacks, parce que garder des transaction échouées n'aurait pas de sens ici
// On vide tous les stacks, parce que garder des transactions échouées n'aurait pas de sens ici
//stack & stack_button
emptyStack(false, true);
if (errorhappened) {
......@@ -486,7 +491,7 @@ function displayAccount(objetnote, note, idbde, solde) {
xhr.send(null);
}
/*** Crédits et Retraits ***/
/*** Crédits et Retraits et Transferts ***/
/* Fonction qui va chercher le contenu des champs du formulaire et envoie le crédit/retrait */
function crediter_ou_retirer(credit) {
if (credit) {
......@@ -526,6 +531,7 @@ function crediter_ou_retirer(credit) {
}
if (isSuccessCode(cod)) {
cleanForms();
emptyStack();
refreshHistorique();
}
else {
......@@ -534,7 +540,88 @@ function crediter_ou_retirer(credit) {
}
}
);
}
/* Fonction qui va chercher le contenu des champs du formulaire et les emetteurs/destinataires et envoie le transfert
La fonction appelée pour récupérer les listes des émetteurs et des destinataires est différente en mode double stack */
function transferer() {
var montant_field = document.getElementById("id_transfert_form-montant");
var motif_field = document.getElementById("id_transfert_form-motif");
var emetteurs, destinataires, temp;
//On fait appel à la fonction qui récupère émetteurs et destinataires différemment selon le stack_mode
temp = transfert_get_people();
emetteurs = temp[0];
destinataires = temp[1];
//On se prépare à poster une requête
var xhr = getXMLHttpRequest();
//On définit ce qu'on fera quand on recevra la réponse = gestion de l'éventuelle erreur
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
var answer = JSON.parse(xhr.responseText);
if (!isSuccessCode(answer["retcode"])) {
display_error(answer["errmsg"]);
return;
}
answer = answer["msg"];
//Si il y a eu des échecs on alerte
var errorhappened = false;
var errlist = [];
for (var i_ans in answer) {
ans = answer[i_ans];
if (!isSuccessCode(ans[0])) {
errorhappened = true;
//Il faut trouver les noms de note correspondants
var nom = "";
for (var i_note in display_stack) {
note = display_stack[i_note];
if (note["idbde"] == ans[1][0]) {
if (nom != "") {
nom += " aka ";
}
nom += note["affiche"];
}
}
//Il faut aussi trouver les noms de note correspondant au destinataire
var nomdest = "";
for (var i_note in display_stack_2) {
note = display_stack_2[i_note];
if (note["idbde"] == ans[1][1]) {
if (nomdest != "") {
nomdest += " aka ";
}
nomdest += note["affiche"];
}
}
// et le bouton concerné
errlist.push("De " + nom + " à " + nomdest + " : " + ans[2]);
}
}
// On vide tous les stacks, parce que garder des transactions échouées n'aurait pas de sens ici
//stack
emptyStack(false);
//stack_2
emptyStack(true);
if (errorhappened) {
display_error("Transaction(s) échouée(s) :", errlist);
}
else {
// si rien n'a échoué, on vide les formulaires
cleanForms();
}
//et on rafraîchit les stacks
refreshStack();
refreshStack(true);
//et l'historique
refreshHistorique();
}
};
xhr.open("POST", "/note/do_transfert/", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
var transfertdata = [emetteurs, destinataires, montant_field.value, motif_field.value];
transfertdata = JSON.stringify(transfertdata);
var post_data = "transfertdata=" + encodeURIComponent(transfertdata);
xhr.send(post_data);
}
/* Fonction pour afficher une erreur de transaction dans le div prévu à cet effet */
......
/*******************************************************************************
Script consos en mode single stack
Script consos en mode double stack
*******************************************************************************/
var double_stack_mode = true;
var stack = Array();
var stack_2 = Array();
var stack = [];
var stack_2 = [];
var display_stack = Array();
var display_stack_2 = Array();
var display_stack = [];
var display_stack_2 = [];
var stack_button = Array();
var stack_button = [];
function transfert_get_people() {
var emetteurs = [];
var destinataires = [];
//On remplit la liste des emetteurs avec le stack
for (var i_emet in stack) {
for (var i = 0; i < stack[i_emet]; i++) {
//On le place autant de fois que son coefficient
emetteurs.push(parseInt(i_emet));
}
}
//On remplit la liste des destinataires avec le stack_2
for (var i_dest in stack_2) {
for (var i = 0; i < stack_2[i_dest]; i++) {
//On le place autant de fois que son coefficient
destinataires.push(parseInt(i_dest));
}
}
return [emetteurs, destinataires];
}
......@@ -28,7 +28,11 @@
<div class="tab-content">
<div class="tab-pane active" id="transfert">
<p>Transfert...</p>
<form onsubmit="transferer(); return false;">
<legend>Transfert d'argent :</legend>
{{ transfert_form.as_p }}
<input type="submit" class="btn btn-primary" value="Transférer"/>
</form>
</div>
<div class="tab-pane" id="credit">
<form onsubmit="crediter_ou_retirer(true); return false;"> {# true = crédit #}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment