Commit 15ef8e9d authored by Vincent Le gallic's avatar Vincent Le gallic

Implémentation des crédits

parent e315f025
......@@ -352,3 +352,19 @@ class PhotoForm(forms.Form):
if photo != None and photo.size > settings.MAX_PHOTO_SIZE:
raise forms.ValidationError(u"Photo trop volumineuse (%s octets), maximum %s" % (photo.size, settings.MAX_PHOTO_SIZE))
return out
class CreditForm(forms.Form):
destinataire = forms.IntegerField(widget=forms.HiddenInput)
montant = FrenchFloatField(label="Montant")
type = forms.ChoiceField(label="Type de paiement", choices=[("especes", "Espèces"), ("cheque", "Chèque"), ("virement", "Virement bancaire")])
nom = forms.CharField(label="Nom", required=False)
prenom = forms.CharField(label="Prénom", required=False)
banque = forms.CharField(label="Banque", 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
\ No newline at end of file
......@@ -43,6 +43,7 @@ urlpatterns = patterns('note.views',
url(ur'^/get_boutons/*$', 'get_boutons'),
url(ur'^/get_photo/(?P<idbde>[^/]*)/*$', 'get_photo'),
url(ur'^/do_conso/*$', 'do_conso'),
url(ur'^/do_credit/*$', 'do_credit'),
# easter egg
url(ur'^/(?:teapot|th(?:é|e)|coffee|caf(?:é|e))/*$', 'teapot'),
)
......@@ -607,6 +607,8 @@ def consos(request):
variables["historique"] = out["msg"]
else:
_add_error(request, out["errmsg"])
# Le formulaire de Crédit
variables["credit_form"] = CreditForm(prefix="credit_form", label_suffix=" :")
variables.update(variables_standard)
return render_to_response('note/consos.html', variables, context_instance=RequestContext(request))
else:
......@@ -614,6 +616,32 @@ def consos(request):
response = sock_ou_response
return response
@csrf_exempt
def do_credit(request):
# On appelle la fonction standard
success, sock_ou_response, variables_standard = standard_page(request, socket=True)
if success:
sock = sock_ou_response
# on n'a pas besoin du prefix parce que le JS a filé les paramètre sans.
credit_form = CreditForm(request.POST, label_suffix=" :")
if credit_form.is_valid():
data = credit_form.cleaned_data
if data["type"] != "especes" and "" in [data["nom"], data["prenom"], data["banque"]]:
types = {"especes": "Espèces", "cheque": "Chèque", "virement": "Virement bancaire"}
return HttpResponse("""Pour un crédit par %s, les champs Nom, Prénom et Banque doivent être spécifiés.""" % types[data["type"]])
to_send = [data["destinataire"], data["montant"], data["type"],
{"nom": data["nom"], "prenom": data["prenom"], "banque": data["banque"]}]
sock.write("crediter %s" % json.dumps(to_send))
out = full_read(sock)
return HttpResponse(json.dumps(out))
else:
errmsg = "Ce crédit est invalide :\n"
for (k,v) in credit_form.errors.items():
errmsg += "%s : %s\n" % (k,"".join([str(i) for i in v]))
return HttpResponse(errmsg)
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
......
......@@ -47,7 +47,7 @@ function getInfo(secondstack) {
/*** Gestion des stacks ***/
/* fonction appelée quand on clique sur une note */
function put_note(itself, affiche, idbde, secondstack) {
function put_note(itself, affiche, idbde, nom, prenom, secondstack) {
//par défaut secondstack est undefined, donc on utilisera le premier
if (secondstack) {
var stack_used = stack_2;
......@@ -86,7 +86,16 @@ function put_note(itself, affiche, idbde, secondstack) {
{
display_stack_used[affiche]["nb"] += 1;
}
refreshStack(secondstack)
refreshStack(secondstack);
/* On remplit aussi les champs du formulaire de crédit */
var pseudo_destinataire = document.getElementById("credit_pseudo_destinataire");
pseudo_destinataire.replaceChild(itself.cloneNode(true), pseudo_destinataire.firstChild);
var nom_field = document.getElementById("id_credit_form-nom");
nom_field.value = nom;
var prenom_field = document.getElementById("id_credit_form-prenom");
prenom_field.value = prenom;
var destinataire_field = document.getElementById("id_credit_form-destinataire");
destinataire_field.value = idbde;
}
/* fonction appelée quand on clique sur une note déjà dans le stack */
......@@ -141,6 +150,13 @@ function refreshStack(secondstack) {
old_stack.parentNode.replaceChild(new_stack, old_stack);
}
/* fonction pour vider le stack */
function emptyStack() {
stack = [];
display_stack = [];
refreshStack();
}
/* fonction appelée quand on clique sur un bouton */
function put_conso(label, idbut) {
if ((!double_stack_mode) && (!isEmpty(stack)))
......@@ -197,6 +213,29 @@ function refreshStackButton() {
old_stack.parentNode.replaceChild(new_stack, old_stack);
}
/* Fonction de nettoyage des fomulaires */
function cleanForms() {
/* On vide les forms */
var ids = ["id_credit_form-destinataire", "id_credit_form-montant", "id_credit_form-type", "id_credit_form-nom",
"id_credit_form-prenom", "id_credit_form-banque"];
var id, field;
for (var i_id = 0, c = ids.length; i_id < ids.length; i_id++) {
id = ids[i_id];
field = document.getElementById(id);
field.value = null;
}
/* On vide aussi les zones de texte */
var span_ids = ["credit_pseudo_destinataire"];
var emptyspan = document.createElement("span");
var span;
for (var i_id = 0, c = span_ids.length; i_id < span_ids.length; i_id++) {
id = span_ids[i_id];
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();
}
/*** Faisage des consos ***/
/* fonction qui fait une conso avec plusieurs boutons et une seule note */
......@@ -241,7 +280,7 @@ function do_conso_many_boutons(idbde) {
}
var post_data = "consodata=" + encodeURIComponent(consodata);
xhr.send(post_data);
$("#historique").load("/note/consos/ #historique");
refreshHistorique();
}
/* fonction qui fait une conso avec plusieurs notes et un seule bouton */
......@@ -303,9 +342,13 @@ function do_conso_many_notes(idbut) {
}
var post_data = "consodata=" + encodeURIComponent(consodata);
xhr.send(post_data);
$("#historique").load("/note/consos/ #historique");
refreshHistorique();
}
/* fonction de mise à jour de l'historique */
function refreshHistorique() {
$("#historique").load("/note/consos/ #historique");
}
/*** Les affichages mouseover ***/
/* Affichage d'un bouton */
......@@ -353,3 +396,48 @@ function displayAccount(objetnote, note, idbde, solde) {
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(null);
}
/*** Crédits ***/
/* Fonction qui va chercher le contenu des champs du formulaire de Crédit et envoie le crédit */
function crediter() {
var destinataire_field = document.getElementById("id_credit_form-destinataire");
var montant_field = document.getElementById("id_credit_form-montant");
var type_field = document.getElementById("id_credit_form-type");
var nom_field = document.getElementById("id_credit_form-nom");
var prenom_field = document.getElementById("id_credit_form-prenom");
var banque_field = document.getElementById("id_credit_form-banque");
/* On envoie la requête grâce à jQuery */
jQuery.ajax({
url: "/note/do_credit/",
type: "POST",
data: ({destinataire: destinataire_field.value,
montant: montant_field.value,
type: type_field.value,
nom: nom_field.value,
prenom: prenom_field.value,
banque: banque_field.value}),
dataType: "text",
success:
function(msg) {
/* On traite les éventuelles erreurs */
try {
var answer = JSON.parse(msg);
var cod = answer["retcode"];
}
catch(err) {
alert(msg);
return;
}
if (isSuccessCode(cod)) {
cleanForms();
refreshHistorique();
}
else {
alert(answer["errmsg"]);
}
}
}
);
}
\ No newline at end of file
......@@ -11,10 +11,13 @@
- true si on veut que les notes appellent la fonction displayAccount sur un onMouseOver
- false sinon
Quand on clique sur une note, la fontion put_note est appelé avec 3 paramètres :
Quand on clique sur une note, la fontion put_note est appelé avec 6 paramètres :
- l'objet sur lequel on a cliqué
- le texte qu'il contient
- l'idbde du compte correspondant
- le nom du compte correspondant
- le prénom du comtpe correspondant
- tosecondstack
**/
......@@ -82,7 +85,7 @@ function readData(oData, targetid, display, tosecondstack) {
// on donne les deux classe à l'élément span
elemt_span.setAttribute("class", "liste " + class1 + " " + class2);
elemt_span.terme = gotlist[i]["terme"]
elemt_span.addEventListener("click", put_note.bind("trapped", elemt_span, gotlist[i]["terme"], gotlist[i]["idbde"], tosecondstack));
elemt_span.addEventListener("click", put_note.bind("trapped", elemt_span, gotlist[i]["terme"], gotlist[i]["idbde"], gotlist[i]["nom"], gotlist[i]["prenom"], tosecondstack));
if (display) { //il faut préparer le listener pour afficher la photo du compte
elemt_span.addEventListener("mouseover", displayAccount.bind("trapped", elemt_span, gotlist[i]["terme"], gotlist[i]["idbde"], "" + gotlist[i]["solde"]/100 + ""));
}
......
......@@ -56,7 +56,11 @@
<p>Transfert...</p>
</div>
<div class="tab-pane" id="credit">
<p>Crédit...</p>
Créditer <span id="credit_pseudo_destinataire"><span></span></span> :
<form onsubmit="crediter(); return false;"> <!-- pas d'action, on fait du JS -->
{{ credit_form.as_p }}
<input type="submit" class="btn btn-primary" value="Créditer"/>
</form>
</div>
<div class="tab-pane" id="retrait">
<p>Donne-moi du cash...</p>
......
......@@ -25,7 +25,7 @@ function readDataInvitation(oData) {
}
/* fonction appelée quand on clique sur une note */
function put_note(itself, affiche, idbde, _) {
function put_note(itself, affiche, idbde, _, __, ___) {
var field = document.getElementById("id_search_field");
var hiddenfield = document.getElementById("id_output_idbde");
field.value=affiche;
......
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