Close #14. Bug fix.
This commit is contained in:
parent
4955fe232b
commit
0665a1f92a
|
@ -7,7 +7,7 @@ from .models import Message
|
||||||
|
|
||||||
@admin.register(Message)
|
@admin.register(Message)
|
||||||
class MessageAdmin(admin.ModelAdmin):
|
class MessageAdmin(admin.ModelAdmin):
|
||||||
list_display = ("writer", "reader", "date_of_writing", "is_read", "date_of_reading")
|
list_display = ("sender", "recipient", "date_of_writing", "is_read", "date_of_reading")
|
||||||
ordering = ("date_of_writing", "writer")
|
ordering = ("date_of_writing", "sender")
|
||||||
search_fields = ("writer", "reader", "message_title")
|
search_fields = ("sender", "recipient", "message_title")
|
||||||
list_filter = ("writer", "reader", "is_read")
|
list_filter = ("sender", "recipient")
|
||||||
|
|
|
@ -12,28 +12,28 @@ class MessageForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Message
|
model = Message
|
||||||
fields = (
|
fields = (
|
||||||
"writer",
|
"sender",
|
||||||
"reader",
|
"recipient",
|
||||||
"message_title",
|
"title",
|
||||||
"message_body",
|
"body",
|
||||||
)
|
)
|
||||||
widgets = {
|
widgets = {
|
||||||
"writer": forms.HiddenInput(),
|
"sender": forms.HiddenInput(),
|
||||||
"reader": forms.HiddenInput(),
|
"recipient": forms.HiddenInput(),
|
||||||
"message_title": forms.TextInput(
|
"title": forms.TextInput(
|
||||||
attrs={"class": "form-control", "placeholder": "Message title"}
|
attrs={"class": "form-control", "placeholder": "Message title"}
|
||||||
),
|
),
|
||||||
"message_body": forms.Textarea(
|
"body": forms.Textarea(
|
||||||
attrs={"class": "form-control", "placeholder": "Message body",}
|
attrs={"class": "form-control", "placeholder": "Message body",}
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
reader_related = forms.CharField(
|
recipient_related = forms.CharField(
|
||||||
widget=forms.TextInput(
|
widget=forms.TextInput(
|
||||||
attrs={
|
attrs={
|
||||||
"class": "form-control",
|
"class": "form-control",
|
||||||
"placeholder": "Trainer search…",
|
"placeholder": "Trainer search…",
|
||||||
"data-ref": "#id_reader",
|
"data-ref": "#id_recipient",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
class Message(models.Model):
|
class Message(models.Model):
|
||||||
"""Représente un message échangé entre deux utilisateurs.
|
"""Représente un message échangé entre deux utilisateurs.
|
||||||
|
@ -10,7 +11,6 @@ class Message(models.Model):
|
||||||
reader (User): Association au destinataire du message.
|
reader (User): Association au destinataire du message.
|
||||||
date_of_writing (datetime): Date à laquelle le message a été enregistré.
|
date_of_writing (datetime): Date à laquelle le message a été enregistré.
|
||||||
date_of_reading (datetime): Date à laquelle le message a été lu par son destinataire.
|
date_of_reading (datetime): Date à laquelle le message a été lu par son destinataire.
|
||||||
is_read (bool): Indique si le message a été lu ou non - par défaut: False
|
|
||||||
message_title (str): Titre ou sujet du message.
|
message_title (str): Titre ou sujet du message.
|
||||||
message_body (text): Contenu du message.
|
message_body (text): Contenu du message.
|
||||||
"""
|
"""
|
||||||
|
@ -25,9 +25,12 @@ class Message(models.Model):
|
||||||
date_of_reading = models.DateTimeField(
|
date_of_reading = models.DateTimeField(
|
||||||
auto_now=True, verbose_name="Date of reading"
|
auto_now=True, verbose_name="Date of reading"
|
||||||
)
|
)
|
||||||
is_read = models.BooleanField(default=False)
|
|
||||||
title = models.CharField(max_length=255, verbose_name="Title")
|
title = models.CharField(max_length=255, verbose_name="Title")
|
||||||
body = models.TextField(null=True, blank=True, verbose_name="Message",)
|
body = models.TextField(null=True, blank=True, verbose_name="Message",)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def is_read():
|
||||||
|
return date_of_reading is not null or date_of_reading <= datetime.today()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "%s - %s : %s" % (self.sender, self.date_of_writing, self.title)
|
return "%s - %s : %s" % (self.sender, self.date_of_writing, self.title)
|
||||||
|
|
|
@ -6,8 +6,8 @@ from . import views
|
||||||
|
|
||||||
|
|
||||||
message_urlpatterns = [
|
message_urlpatterns = [
|
||||||
path(r"sent/", views.get_message_sent, name="message_sent"),
|
path(r"sent/", views.get_sent_messages, name="sent_messages"),
|
||||||
path(r"received/", views.get_message_received, name="message_received"),
|
path(r"received/", views.get_received_messages, name="received_messages"),
|
||||||
path(r"<int:messageid>/", views.get_message_details, name="message_details"),
|
path(r"<int:messageid>/", views.get_message_details, name="message_details"),
|
||||||
path(r"delete/<int:messageid>/", views.delete_message, name="delete_message"),
|
path(r"delete/<int:messageid>/", views.delete_message, name="delete_message"),
|
||||||
path(r"compose/", views.compose_message, name="compose_message"),
|
path(r"compose/", views.compose_message, name="compose_message"),
|
||||||
|
|
|
@ -15,7 +15,6 @@ from .models import Message
|
||||||
def get_number_of_unread_message(request):
|
def get_number_of_unread_message(request):
|
||||||
"""Récupère le nombre de messages non lus associés à l'utilisateur en session.
|
"""Récupère le nombre de messages non lus associés à l'utilisateur en session.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return Message.objects.filter(reader=request.user).filter(date_of_reading__isnull=True).count()
|
return Message.objects.filter(reader=request.user).filter(date_of_reading__isnull=True).count()
|
||||||
|
|
||||||
|
|
||||||
|
@ -31,18 +30,6 @@ def get_messages(request, message_type="received"):
|
||||||
Returns:
|
Returns:
|
||||||
Retourne les messages reçus ou envoyés par l'utilisateur connecté.
|
Retourne les messages reçus ou envoyés par l'utilisateur connecté.
|
||||||
Si le paramètre `message_type` est vide, la liste renvoyée est vide également.
|
Si le paramètre `message_type` est vide, la liste renvoyée est vide également.
|
||||||
|
|
||||||
Remarks:
|
|
||||||
Je vois bien l'idée, mais par simplification, j'aurais plutôt fait une fonction
|
|
||||||
qui récupère une liste de messages, et qui retourne cette liste à la fonction appelante.
|
|
||||||
|
|
||||||
Note aussi qu'avec la modification sur les related_name, tu peux changer la ligne
|
|
||||||
Message.objects.filter(reader=request.user)
|
|
||||||
|
|
||||||
-> request.user.received_messages.all()
|
|
||||||
|
|
||||||
En mixant le tout, tu ne dois plus passer la requête, ni les décorateurs.
|
|
||||||
Tu peux juste passer l'utilisateur et ton paramètre `received` ou `sent`.
|
|
||||||
"""
|
"""
|
||||||
if message_type == "received":
|
if message_type == "received":
|
||||||
message_list = Message.objects.filter(reader=request.user)
|
message_list = Message.objects.filter(reader=request.user)
|
||||||
|
@ -57,20 +44,16 @@ def get_messages(request, message_type="received"):
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
def get_message_received(request):
|
def get_received_messages(request):
|
||||||
"""Idem que dans la fonction `get_messages`
|
"""Idem que dans la fonction `get_messages`
|
||||||
|
|
||||||
Remarks:
|
|
||||||
La fonction s'appelle `get_message_received`, mais devrait s'appeller `get_received_messages`
|
|
||||||
(au pluriel et accordé).
|
|
||||||
"""
|
"""
|
||||||
return get_messages(request, "received")
|
return get_messages(request, "received")
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["GET"])
|
||||||
def get_message_sent(request):
|
def get_sent_messages(request):
|
||||||
"""Idem que `get_message_received`. Nomme la plutôt `get_sent_messages`.
|
"""Idem.
|
||||||
"""
|
"""
|
||||||
return get_messages(request, "sent")
|
return get_messages(request, "sent")
|
||||||
|
|
||||||
|
@ -90,29 +73,14 @@ def get_message_details(request, messageid):
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
@require_http_methods(["GET"])
|
@require_http_methods(["DELETE"])
|
||||||
def delete_message(request, messageid):
|
def delete_message(request, messageid):
|
||||||
"""Supprime le message dont la clé est passée en paramètre.
|
"""Supprime le message dont la clé est passée en paramètre.
|
||||||
|
|
||||||
Remarks:
|
|
||||||
. Il existe un verbe Http spécifique pour ce type d'action: DELETE
|
|
||||||
|
|
||||||
. Tu ne vérifies pas non plus si le message appartient à l'utilisateur qui l'a écrit ;-)
|
|
||||||
|
|
||||||
> Alice écrit un message et le sauve
|
|
||||||
> Le message porte l'identifiant 301
|
|
||||||
> Bob se connecte et appelle l'URL /delete/301
|
|
||||||
> Le message 301 est supprimé et Alice n'en sait rien.
|
|
||||||
|
|
||||||
. Est-ce qu'il ne vaudrait pas mieux aussi *invalider* un message
|
|
||||||
plutôt que de le supprimer ? Et enregister qui a effectué cette modification ?
|
|
||||||
|
|
||||||
. C'est quoi le code http 409 ?
|
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
Message.objects.get(pk=messageid).delete()
|
Message.objects.get(pk=messageid).delete()
|
||||||
except:
|
except:
|
||||||
return HttpResponse(409)
|
return HttpResponse(400)
|
||||||
|
|
||||||
return HttpResponse(200)
|
return HttpResponse(200)
|
||||||
|
|
||||||
|
@ -121,10 +89,6 @@ def delete_message(request, messageid):
|
||||||
@require_http_methods(["GET", "POST"])
|
@require_http_methods(["GET", "POST"])
|
||||||
def compose_message(request):
|
def compose_message(request):
|
||||||
"""Permet à l'utilisateur connecté de rédiger un nouveau message.
|
"""Permet à l'utilisateur connecté de rédiger un nouveau message.
|
||||||
|
|
||||||
Remarks:
|
|
||||||
Tes messages d'erreur sont en anglais ou en français ?
|
|
||||||
"Form invalide" ou "Invalid form" ?
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
|
@ -134,7 +98,7 @@ def compose_message(request):
|
||||||
form.save()
|
form.save()
|
||||||
return HttpResponseRedirect(reverse("message_sent"))
|
return HttpResponseRedirect(reverse("message_sent"))
|
||||||
else:
|
else:
|
||||||
print("Form invalide")
|
print("Invalid form")
|
||||||
else:
|
else:
|
||||||
form = MessageForm()
|
form = MessageForm()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue