Close #14. Bug fix.

This commit is contained in:
Trullemans Gregory 2020-10-31 18:39:09 +01:00
parent 4955fe232b
commit 0665a1f92a
5 changed files with 27 additions and 60 deletions

View File

@ -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")

View File

@ -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",
} }
) )
) )

View File

@ -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)

View File

@ -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"),

View File

@ -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()