Commit 40ca1491 authored by Vincent Le gallic's avatar Vincent Le gallic

Une gestion plus correcte des photos

parent 5a30f246
# Custom #
###################
*~
media/tmp/*
media/photos/*
# Compiled source #
###################
......
......@@ -62,7 +62,7 @@ MEDIA_ROOT = '/home/note/Django_Client/media/'
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = '/media/'
MEDIA_URL = NOTE_ROOT_URL + 'media/'
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
......@@ -182,7 +182,9 @@ SESSION_COOKIE_AGE=60*100 # 100 minutes
# Taille max autorisée pour les photos
MAX_PHOTO_SIZE = 870000 # en bytes (850KB)
# Dossier où sont stockées les photos temporairement
PHOTOS_PATH = MEDIA_ROOT + "tmp/photos/"
PHOTOS_PATH = MEDIA_ROOT + "photos/"
# URL par laquelle on y accède
PHOTOS_URL = MEDIA_URL + "photos/"
# Temps avant de supprimer un fichier de photo temporaire
# Pendant cet intervalle de temps,
# la photo pourra être affichée sans être redemandée au serveur NK2015
......
......@@ -22,7 +22,7 @@ if settings.DEBUG:
# On n'utilise pas ça en prod
urlpatterns += staticfiles_urlpatterns()
urlpatterns += patterns('',
(r'^%s(?P<path>.*)$' % (settings.NOTE_ROOT_URL.strip("/") + settings.MEDIA_URL),
(r'^%s/(?P<path>.*)$' % (settings.MEDIA_URL.strip('/')),
'django.views.static.serve',
{'document_root': settings.MEDIA_ROOT}),
)
......@@ -313,7 +313,7 @@ class InscriptionForm(forms.Form):
commentaire = forms.CharField(label="Commentaire", required=False)
report_period = forms.IntegerField(label="Fréquence des rapports", required=False)
wei = forms.BooleanField(label="Inscription au WEI", required=False)
annee = forms.IntegerField(label="Année d'inscription", required=False)
annee = forms.IntegerField(label="Année d'inscription (année courante si non précisée)", required=False)
# partie paiement
on_note = forms.IntegerField(label="Montant à mettre sur la note", required=False, initial=0)
type_de_paiement = forms.ChoiceField(label="Type de paiement", choices=[("cheque", "Chèque"), ("especes", "Espèces"), ("virement", "Virement bancaire"), ("soge", "Société Générale")])
......
......@@ -1635,43 +1635,45 @@ def do_conso(request):
else:
return HttpResponse(u'"Erreur"')
def _get_tempphotoname(idbde):
def _get_photoname(idbde):
"""Donne le nom de fichier de la photo n°<idbde>"""
return "%s.png" % (idbde)
def _get_tempphotopath(idbde):
def _get_photopath(idbde):
"""Donne le chemin de la photo n°<idbde>"""
return settings.PHOTOS_PATH + _get_tempphotoname(idbde)
return settings.PHOTOS_PATH + _get_photoname(idbde)
def _get_url_photo(idbde):
"""Donne l'url d'accès à une photo"""
return "/note/media/tmp/photos/%s" % (_get_tempphotoname(idbde))
return settings.PHOTOS_URL + _get_photoname(idbde)
def _delete_photo_later(tempphotopath):
# On ne tient ps à garder éternellement les photos,
# on lance donc un thread qui les supprimera plus tard
def delete_tempphoto():
time.sleep(settings.TIME_BEFORE_PHOTO_DELETE)
try:
os.remove(tempphotopath)
except:
pass
threading.Thread(target=delete_tempphoto).start()
def _temporary_store_photo(photodata, idbde):
"""Stocke dans un fichier la photo et lance un thread qui la supprimera plus tard"""
tempphotopath = _get_tempphotopath(idbde)
f = open(tempphotopath, "w")
def _store_photo(photodata, idbde):
"""Stocke dans un fichier la photo"""
photopath = _get_photopath(idbde)
f = open(photopath, "w")
f.write(photodata)
f.close()
_delete_photo_later(tempphotopath)
def _provide_photo(sock, idbde):
# Il est possible que quelqu'un ait déjà demandé à voir la photo (voire, moi-même),
# auquel cas, le fichier est déjà présent et donc on s'en sert,
# sinon, il faut le demander au serveur NK2015
tempphotopath = _get_tempphotopath(idbde)
if not os.path.isfile(tempphotopath):
photopath = _get_photopath(idbde)
ask = True
load_unknown = False # A priori on ne charge pas la photo inconnue
# On a besoin de demander la photo au serveur, sauf si on la possède…
if os.path.isfile(photopath):
sock.write("get_last_modified_photo %s" % idbde)
out = full_read(sock)
if _is_success_code(out["retcode"]):
remote_timestamp = out["msg"]
owned_timestamp = os.path.getmtime(photopath)
if owned_timestamp >= remote_timestamp:
# …et qu'elle est à jour
ask = False
else:
load_unknown = True
if ask and not load_unknown:
sock.write("get_photo %s" % (idbde))
sizemsg = full_read(sock)
if _is_success_code(sizemsg["retcode"]):
......@@ -1683,16 +1685,18 @@ def _provide_photo(sock, idbde):
time.sleep(0.01)
photo = base64.b64decode(photob64)
# pour pouvoir servir la photo au client HTTP il faut l'enregistrer quelque part
_temporary_store_photo(photo, idbde) # cette fonction s'occupe de la supprimer plus tard
_store_photo(photo, idbde)
else:
# On n'a pas réussi à charger la photo, on met donc celle par défaut
shutil.copy(settings.MEDIA_ROOT + "photo_unknown.png", tempphotopath)
_delete_photo_later(tempphotopath)
load_unknown = True
if load_unknown:
# On n'a pas réussi à charger la photo, on met donc celle par défaut
shutil.copy(settings.MEDIA_ROOT + "photo_unknown.png", photopath)
@csrf_exempt
def get_photo(request, idbde=None):
"""Affiche dans une page HTML la photo demandée.
La demande au serveur et la stocke dans un ficher temporaire, supprimé plus tard."""
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:
......
......@@ -330,7 +330,7 @@ function displayAccount(objetnote, note, idbde, solde) {
new_displayer.setAttribute("id", "current_selection");
new_displayer.setAttribute("class", "current_selection");
var photo = document.createElement("img");
photo.setAttribute("src", "/note/media/tmp/photos/" + idbde + ".png");
photo.setAttribute("src", "/note/media/photos/" + idbde + ".png");
var photo_linked = document.createElement("a");
photo_linked.setAttribute("href", "/note/comptes/" + idbde + "/");
photo_linked.appendChild(photo);
......
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