diff --git a/src/communication/admin.py b/src/communication/admin.py index bbffdb3..6b02a27 100644 --- a/src/communication/admin.py +++ b/src/communication/admin.py @@ -7,7 +7,7 @@ from .models import Message @admin.register(Message) class MessageAdmin(admin.ModelAdmin): - list_display = ("writer", "reader", "date_of_writing", "is_read", "date_of_reading") - ordering = ("date_of_writing", "writer") - search_fields = ("writer", "reader", "message_title") - list_filter = ("writer", "reader", "is_read") + list_display = ("sender", "recipient", "date_of_writing", "is_read", "date_of_reading") + ordering = ("date_of_writing", "sender") + search_fields = ("sender", "recipient", "message_title") + list_filter = ("sender", "recipient") diff --git a/src/communication/forms.py b/src/communication/forms.py index e00d7c0..2870f30 100644 --- a/src/communication/forms.py +++ b/src/communication/forms.py @@ -12,28 +12,28 @@ class MessageForm(forms.ModelForm): class Meta: model = Message fields = ( - "writer", - "reader", - "message_title", - "message_body", + "sender", + "recipient", + "title", + "body", ) widgets = { - "writer": forms.HiddenInput(), - "reader": forms.HiddenInput(), - "message_title": forms.TextInput( + "sender": forms.HiddenInput(), + "recipient": forms.HiddenInput(), + "title": forms.TextInput( attrs={"class": "form-control", "placeholder": "Message title"} ), - "message_body": forms.Textarea( + "body": forms.Textarea( attrs={"class": "form-control", "placeholder": "Message body",} ), } - reader_related = forms.CharField( + recipient_related = forms.CharField( widget=forms.TextInput( attrs={ "class": "form-control", "placeholder": "Trainer search…", - "data-ref": "#id_reader", + "data-ref": "#id_recipient", } ) ) diff --git a/src/communication/models.py b/src/communication/models.py index bd46506..2f4eae0 100644 --- a/src/communication/models.py +++ b/src/communication/models.py @@ -1,6 +1,7 @@ from django.db import models from django.contrib.auth.models import User +from datetime import datetime class Message(models.Model): """Représente un message échangé entre deux utilisateurs. @@ -10,7 +11,6 @@ class Message(models.Model): reader (User): Association au destinataire du message. 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. - 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_body (text): Contenu du message. """ @@ -25,9 +25,12 @@ class Message(models.Model): date_of_reading = models.DateTimeField( auto_now=True, verbose_name="Date of reading" ) - is_read = models.BooleanField(default=False) title = models.CharField(max_length=255, verbose_name="Title") 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): return "%s - %s : %s" % (self.sender, self.date_of_writing, self.title) diff --git a/src/communication/urls.py b/src/communication/urls.py index f6e00b3..9c958c4 100644 --- a/src/communication/urls.py +++ b/src/communication/urls.py @@ -6,8 +6,8 @@ from . import views message_urlpatterns = [ - path(r"sent/", views.get_message_sent, name="message_sent"), - path(r"received/", views.get_message_received, name="message_received"), + path(r"sent/", views.get_sent_messages, name="sent_messages"), + path(r"received/", views.get_received_messages, name="received_messages"), path(r"/", views.get_message_details, name="message_details"), path(r"delete//", views.delete_message, name="delete_message"), path(r"compose/", views.compose_message, name="compose_message"), diff --git a/src/communication/views.py b/src/communication/views.py index d3caf82..315a8b9 100644 --- a/src/communication/views.py +++ b/src/communication/views.py @@ -15,7 +15,6 @@ from .models import Message def get_number_of_unread_message(request): """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() @@ -31,18 +30,6 @@ def get_messages(request, message_type="received"): Returns: 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. - - 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": message_list = Message.objects.filter(reader=request.user) @@ -57,20 +44,16 @@ def get_messages(request, message_type="received"): @login_required @require_http_methods(["GET"]) -def get_message_received(request): +def get_received_messages(request): """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") @login_required @require_http_methods(["GET"]) -def get_message_sent(request): - """Idem que `get_message_received`. Nomme la plutôt `get_sent_messages`. +def get_sent_messages(request): + """Idem. """ return get_messages(request, "sent") @@ -90,29 +73,14 @@ def get_message_details(request, messageid): @login_required -@require_http_methods(["GET"]) +@require_http_methods(["DELETE"]) def delete_message(request, messageid): """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: Message.objects.get(pk=messageid).delete() except: - return HttpResponse(409) + return HttpResponse(400) return HttpResponse(200) @@ -121,10 +89,6 @@ def delete_message(request, messageid): @require_http_methods(["GET", "POST"]) def compose_message(request): """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": @@ -134,7 +98,7 @@ def compose_message(request): form.save() return HttpResponseRedirect(reverse("message_sent")) else: - print("Form invalide") + print("Invalid form") else: form = MessageForm()