Commit 77b61795 authored by Vincent Le gallic's avatar Vincent Le gallic

Splitting encore : on met la gestion de l'AJAJ dnas son propre module.

parent 18ba6da9
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""Les "pages" qui sont destinées à répondre aux requêtes AJAJ."""
import json
# L'objet de réponse HTTP
from django.http import HttpResponse
# Les formulaires
import forms
# Les utilitaires
import utilities
# La communication avec le backend
import nk
# Pour bypasser le test de Cross-Site Request Forgery
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
def quick_search(request):
"""Renvoie l'objet JSON résultat d'un quick_search,
destiné à être chargé par javascript"""
if (request.method == "GET") or (request.session.get("logged", None) != "ok"):
return HttpResponse("Get the fuck out of here", status=444)
else:
try:
asked = request.POST["asked"]
except:
return HttpResponse("")
success, sock_ou_response = nk.socket_still_alive(request)
if success:
sock = sock_ou_response
data = [asked]
sock.write(json.dumps(["quick_search", data]))
out = nk.full_read(sock)["msg"]
return HttpResponse(json.dumps(out))
else:
response = sock_ou_response
return response
@csrf_exempt
def search(request):
"""Renvoie l'objet JSON résultat d'un search,
destiné à être chargé par javascript"""
if (request.method == "GET") or (request.session.get("logged", None) != "ok"):
return HttpResponse("Get the fuck out of here", status=444)
else:
try:
asked = request.POST["asked"]
except:
return HttpResponse("")
success, sock_ou_response = nk.socket_still_alive(request)
if success:
sock = sock_ou_response
flags = "ioaAhH" # dans la recherche de base on ne cherhe pas sur les alias et les historiques, mais on prend les comptes non à jour
data = [flags, ["idbde", "nom", "prenom", "pseudo", "mail"], asked]
sock.write(json.dumps(["search", data]))
out = nk.full_read(sock)["msg"]
return HttpResponse(json.dumps(out))
else:
response = sock_ou_response
return response
@csrf_exempt
def get_boutons(request):
"""Renvoie l'objet JSON résultat d'un get_boutons,
destiné à être chargé par javascript"""
if (request.method == "GET") or (request.session.get("logged", None) != "ok"):
return HttpResponse("Get the fuck out of here", status=444)
else:
try:
categorie = request.POST["categorie"]
except:
return HttpResponse("")
success, sock_ou_response = nk.socket_still_alive(request)
if success:
sock = sock_ou_response
data = ["", categorie]
sock.write(json.dumps(["get_boutons", data]))
out = nk.full_read(sock)["msg"]
return HttpResponse(json.dumps(out))
else:
response = sock_ou_response
return response
@csrf_exempt
def do_conso(request):
"""Effectue les consos envoyées en POST par javascript"""
if (request.method == "GET") or (request.session.get("logged", None) != "ok"):
return HttpResponse("Get the fuck out of here", status=444)
else:
try:
consodata = request.POST["consodata"]
consodata = [[int(i) for i in triplet.split(",")] for triplet in consodata[1:-1].split("),(")]
except:
return HttpResponse(u'"Bad request"')
success, sock_ou_response = nk.socket_still_alive(request)
if success:
sock = sock_ou_response
sock.write(json.dumps(["consos", consodata]))
out = nk.full_read(sock)
return HttpResponse(json.dumps(out))
else:
return HttpResponse(u'"Erreur"')
@csrf_exempt
def get_photo(request, idbde=None):
"""Affiche dans une page HTML la photo demandée.
Si elle n'existe pas encore (ou n'est pas à jour), la demande au serveur
et la stocke dans un ficher."""
try:
idbde = int(idbde)
except Exception as e:
return HttpResponse("Bad Request")
# On appelle alors la fonction standard
success, sock_ou_response, variables_standard = utilities.standard_page(request, socket=True)
if success:
sock = sock_ou_response
utilities._provide_photo(sock, idbde)
urlphoto = utilities._get_url_photo(idbde)
return HttpResponse('<img src = "%s"></img>' % (urlphoto))
else:
return HttpResponse("Erreur")
@csrf_exempt
def do_credit_retrait(request, action):
types = {"especes": "Espèces", "cheque": "Chèque", "virement": "Virement bancaire"}
actions_write = {"credit": "crédit", "retrait": "retrait"}
actions_socket = {"credit": "crediter", "retrait": "retirer"}
# On appelle la fonction standard
success, sock_ou_response, variables_standard = utilities.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.
form = forms.CreditRetraitForm(request.POST, label_suffix=" :")
if form.is_valid():
data = form.cleaned_data
if data["type"] != "especes" and "" in [data["nom"], data["prenom"], data["banque"]]:
return HttpResponse("""Pour un %s par %s, les champs Nom, Prénom et Banque doivent être spécifiés.""" % (actions_write[action], types[data["type"]]))
to_send = [data["idbde"], data["montant"], data["type"],
{"nom": data["nom"], "prenom": data["prenom"], "banque": data["banque"], "commentaire" : data["commentaire"]}]
paquet = [actions_socket[action], to_send]
sock.write(json.dumps(paquet))
out = nk.full_read(sock)
return HttpResponse(json.dumps(out))
else:
errmsg = "Ce %s est invalide :\n" % (actions_write[action])
for (k,v) in 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")
@csrf_exempt
def do_transfert(request):
# On appelle la fonction standard
success, sock_ou_response, variables_standard = utilities.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, commentaire = 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, commentaire]]
sock.write(json.dumps(paquet))
out = nk.full_read(sock)
return HttpResponse(json.dumps(out))
else:
return HttpResponse("Erreur à l'établissement de la connexion")
......@@ -28,6 +28,7 @@ urlpatterns = patterns('note.views',
url(ur'^/mes_activites(?:/(?P<idact>[^/]*))?(?P<delete>/delete)?/*$', 'mes_activites'),
# la recherche et gestion des comptes
url(ur'^/comptes_advanced/*$', 'comptes_advanced'),
url(ur'^/search_historique_pseudo/*$', 'search_historique_pseudo'),
url(ur'^/comptes/(?P<idbde>[^/]*)/*$', 'comptes'),
url(ur'^/comptes/(?P<idbde>[^/]*)/historique/*$', 'historique_transactions'),
url(ur'^/comptes/(?P<idbde>[^/]*)/modifier/*$', 'modifier_compte'),
......@@ -44,15 +45,17 @@ urlpatterns = patterns('note.views',
url(ur'^/preinscriptions?/*$', 'preinscriptions'),
# les inscriptions
url(ur'^/inscriptions?(?:/(?P<preid>[^/]*))?(?P<delete>/delete)?/*$', 'inscriptions'),
# les pages de requêtes AJAX
# easter egg
url(ur'^/(?:teapot|th(?:é|e)|coffee|caf(?:é|e))/*$', 'teapot'),
)
urlpatterns += patterns('note.ajaj',
# les pages de requêtes AJAJ
url(ur'^/quick_search/*$', 'quick_search'),
url(ur'^/search/*$', 'search'),
url(ur'^/search_historique_pseudo/*$', 'search_historique_pseudo'),
url(ur'^/get_boutons/*$', 'get_boutons'),
url(ur'^/get_photo/(?P<idbde>[^/]*)/*$', 'get_photo'),
url(ur'^/do_conso/*$', 'do_conso'),
url(ur'^/do_(?P<action>credit|retrait)/*$', 'do_credit_retrait'),
url(ur'^/do_transfert/*$', 'do_transfert'),
# easter egg
url(ur'^/(?:teapot|th(?:é|e)|coffee|caf(?:é|e))/*$', 'teapot'),
)
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
"""Les méthodes pour faire des requêtes au serveur NK2015
"""Fonctions secondaires pour contruire les pages.
Attention, ce module est en trois parties dont voici les descriptions :
Les méthodes _get
%%%%%%%%%%%%%%%%%
Les méthodes pour faire des requêtes au serveur NK2015
La convention est la suivante :
- en cas de réussite, on renvoie ``(True, <l'objet>)``
- en cas d'échec, ``(<un HttpReponseRedirect>, None)``
En fait le ``HttpResponseRedirect`` est un :py:class:`note.basic.MyHttpResponseRedirect` qui est exactement
la même chose sauf qu'il est interprêté comme un False dans les tests."""
la même chose sauf qu'il est interprêté comme un False dans les tests.
La gestion des photos
%%%%%%%%%%%%%%%%%%%%%
Quelques fonctions pour stocker et fournir les photos
La gestion commune à toutes les pages
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Dans un soucis de factorisation de code, tout ce qui a besoin d'être fait sur toutes les pages
(à part login et logout) est dans ces fonctions.
Documentation successive des trois parties
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
"""
import json
import os
......@@ -323,3 +346,37 @@ def _provide_photo(sock, idbde):
def _display_versions():
"""Renvoie un string html-formaté des version de nginx et django."""
return "<address> %s <br/> Django/%s </address>\n" % basic._get_versions()
#################################################################
## Gestion commmune à presque toutes les pages ##
#################################################################
def standard_page(request, socket=False):
"""Fonction appelée pour générer quasiment toutes les pages (pas login).
Elle récupère la socket dans :py:mod:`keep_alive` et vérifie que la session NK2015 n'a pas timeout.
Renvoie ``(bool, sock_ou_response, variables_standard)`` avec les cas suivants :
* ``(True, <une socket ouverte vers le serveur NK2015>, <un dico de variables de bases>)``
* ``(False, <un Http object utilisable>, {})``
* ``(True, None, <un dico de variables de base>)`` (dans le cas ``socket=False``)
"""
if request.session.get("logged", "no") == "ok":
# Le login a réussi
whoami = request.session["whoami"]
variables_standard = basic._fundamental_variables()
variables_standard["pages"] = request.session["pages"]
variables_standard["whoami"] = whoami
if socket:
success, sock_ou_response = nk.socket_still_alive(request)
if success:
return (True, sock_ou_response, variables_standard)
else:
return (False, sock_ou_response, {})
else:
return (True, None, variables_standard)
else:
# Le cookie Django a expiré ou est invalide
messages.add_error(request, settings.ERRMSG_DJANGO_SESSION_EXPIRED)
return (False, HttpResponseRedirect(_gen_redirect_postlogin(request)), {})
\ No newline at end of file
This diff is collapsed.
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