From 915ad96cf252a81c6f284516020119eaee149dad Mon Sep 17 00:00:00 2001 From: Gregory Trullemans Date: Thu, 27 Apr 2023 15:05:53 +0200 Subject: [PATCH] [WIP] Notification --- jarvis/profiles/admin.py | 22 ++--- .../profiles/migrations/0002_notification.py | 58 +++++++++++++ jarvis/profiles/models.py | 32 ++++---- .../templates/notification_update.html | 8 +- jarvis/profiles/urls.py | 14 ++-- jarvis/profiles/views.py | 81 ++++++++++--------- 6 files changed, 138 insertions(+), 77 deletions(-) create mode 100644 jarvis/profiles/migrations/0002_notification.py diff --git a/jarvis/profiles/admin.py b/jarvis/profiles/admin.py index 9d8881c..1859ed0 100644 --- a/jarvis/profiles/admin.py +++ b/jarvis/profiles/admin.py @@ -1,5 +1,5 @@ from django.contrib import admin -from .models import Profile # , Notification +from .models import Profile, Notification from django_admin_listfilter_dropdown.filters import RelatedDropdownFilter @@ -12,15 +12,15 @@ class ProfileAdmin(admin.ModelAdmin): admin.site.register(Profile, ProfileAdmin) -# class NotificationAdmin(admin.ModelAdmin): -# model = Notification -# list_display = ("user", "gymnast", "functionality") -# autocomplete_fields = ("user", "gymnast") -# list_filter = ( -# ("user", RelatedDropdownFilter), -# ("gymnast", RelatedDropdownFilter), -# ("functionality", RelatedDropdownFilter), -# ) +class NotificationAdmin(admin.ModelAdmin): + model = Notification + list_display = ("user", "gymnast", "functionality") + autocomplete_fields = ("user", "gymnast") + list_filter = ( + ("user", RelatedDropdownFilter), + ("gymnast", RelatedDropdownFilter), + ("functionality", RelatedDropdownFilter), + ) -# admin.site.register(Notification, NotificationAdmin) +admin.site.register(Notification, NotificationAdmin) diff --git a/jarvis/profiles/migrations/0002_notification.py b/jarvis/profiles/migrations/0002_notification.py new file mode 100644 index 0000000..298cb60 --- /dev/null +++ b/jarvis/profiles/migrations/0002_notification.py @@ -0,0 +1,58 @@ +# Generated by Django 4.2 on 2023-04-27 11:54 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("people", "0008_alter_gymnast_orientation"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("contenttypes", "0002_remove_content_type_name"), + ("profiles", "0001_initial"), + ] + + operations = [ + migrations.CreateModel( + name="Notification", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "functionality", + models.ForeignKey( + limit_choices_to={"app_label": "followup"}, + on_delete=django.db.models.deletion.CASCADE, + to="contenttypes.contenttype", + ), + ), + ( + "gymnast", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="notifications", + to="people.gymnast", + ), + ), + ( + "user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "unique_together": {("user", "gymnast", "functionality")}, + }, + ), + ] diff --git a/jarvis/profiles/models.py b/jarvis/profiles/models.py index 4675d70..3c23a74 100644 --- a/jarvis/profiles/models.py +++ b/jarvis/profiles/models.py @@ -7,7 +7,7 @@ Les profils peuvent enregistrer les informations suivantes: * si la barre de navigation doit être cachée ou non """ -# from django.contrib.contenttypes.models import ContentType +from django.contrib.contenttypes.models import ContentType from django.contrib.auth import get_user_model from django.db import models from jarvis.people.models import Gymnast @@ -44,21 +44,21 @@ class Profile(models.Model): return "%s %s" % (self.user.first_name, self.user.last_name) -# class Notification(models.Model): -# """Classe permettant de définir quelles notification un utilisateur veut recevoir.""" +class Notification(models.Model): + """Classe permettant de définir quelles notification un utilisateur veut recevoir.""" -# class Meta: -# unique_together = ("user", "gymnast", "functionality") + class Meta: + unique_together = ("user", "gymnast", "functionality") -# user = models.ForeignKey(User, on_delete=models.CASCADE) -# gymnast = models.ForeignKey( -# Gymnast, on_delete=models.CASCADE, related_name="notifications" -# ) -# functionality = models.ForeignKey( -# ContentType, -# on_delete=models.CASCADE, -# limit_choices_to={"app_label": "followup"}, -# ) + user = models.ForeignKey(User, on_delete=models.CASCADE) + gymnast = models.ForeignKey( + Gymnast, on_delete=models.CASCADE, related_name="notifications" + ) + functionality = models.ForeignKey( + ContentType, + on_delete=models.CASCADE, + limit_choices_to={"app_label": "followup"}, + ) -# def __str__(self): -# return f"{self.user} will be notified for add/update {self.functionality} to {self.gymnast}" + def __str__(self): + return f"{self.user} will be notified for add/update {self.functionality} to {self.gymnast}" diff --git a/jarvis/profiles/templates/notification_update.html b/jarvis/profiles/templates/notification_update.html index d20c0f2..b214fe2 100644 --- a/jarvis/profiles/templates/notification_update.html +++ b/jarvis/profiles/templates/notification_update.html @@ -22,10 +22,10 @@
{% for functionality in functionality_list %}
- {{ functionality.1 }} + {{ functionality }}
- +
{% endfor %}
@@ -49,7 +49,7 @@ method: "POST", data: { gymnast_id: $(this).data("gymnast"), - notification_id: $(this).data("functionality"), + functionality_id: $(this).data("functionality"), csrfmiddlewaretoken: '{{ csrf_token }}' }, success: function(data) { @@ -63,7 +63,7 @@ method: "POST", data: { gymnast_id: $(this).data("gymnast"), - notification_id: $(this).data("functionality"), + functionality_id: $(this).data("functionality"), csrfmiddlewaretoken: '{{ csrf_token }}' }, success: function(data) { diff --git a/jarvis/profiles/urls.py b/jarvis/profiles/urls.py index 890d211..0c7591b 100644 --- a/jarvis/profiles/urls.py +++ b/jarvis/profiles/urls.py @@ -7,11 +7,11 @@ from . import views profile_urlpatterns = [ path(r"edit/", views.profile_update, name="profile_update"), - # path( - # r"notification_update/", views.notification_update, name="notification_update" - # ), - # path(r"notification_add/", views.notification_add, name="notification_add"), - # path( - # r"notification_remove/", views.notification_remove, name="notification_remove" - # ), + path( + r"notification_update/", views.notification_update, name="notification_update" + ), + path(r"notification_add/", views.notification_add, name="notification_add"), + path( + r"notification_remove/", views.notification_remove, name="notification_remove" + ), ] diff --git a/jarvis/profiles/views.py b/jarvis/profiles/views.py index 3469fc7..cfd055d 100644 --- a/jarvis/profiles/views.py +++ b/jarvis/profiles/views.py @@ -2,13 +2,14 @@ from django.contrib.auth.decorators import login_required from django.contrib.auth import get_user_model +from django.contrib.contenttypes.models import ContentType from django.http import HttpResponseRedirect, HttpResponse from django.shortcuts import render, get_object_or_404 from django.views.decorators.http import require_http_methods from django.urls import reverse from .forms import ProfileForm -from .models import Profile # , Notification, FUNCTIONALITY_CHOICES +from .models import Profile, Notification from jarvis.people.models import Gymnast @@ -44,50 +45,52 @@ def profile_update(request): return render(request, "update.html", context) -# @login_required -# @require_http_methods(["GET", "POST"]) -# def notification_update(request): -# gymnast_list = Gymnast.objects.filter(is_active=True) +@login_required +@require_http_methods(["GET", "POST"]) +def notification_update(request): + gymnast_list = Gymnast.objects.filter(is_active=True) + functionality_list = ContentType.objects.filter(app_label="followup") -# context = { -# "gymnast_list": gymnast_list, -# "functionality_list": FUNCTIONALITY_CHOICES, -# } -# return render(request, "notification_update.html", context) + context = { + "gymnast_list": gymnast_list, + "functionality_list": functionality_list, + } + return render(request, "notification_update.html", context) -# @require_http_methods(["POST"]) -# def notification_add(request): -# """ -# Ajoute une demande de notification -# """ -# gymnast_id = request.POST.get("gymnast_id", None) -# notification_id = request.POST.get("notification_id", None) +@require_http_methods(["POST"]) +def notification_add(request): + """ + Ajoute une demande de notification + """ + gymnast_id = request.POST.get("gymnast_id", None) + functionality_id = request.POST.get("functionality_id", None) -# gymnast = get_object_or_404(Gymnast, pk=gymnast_id) -# row, created = Notification.objects.get_or_create( -# user=request.user, gymnast=gymnast, functionality=notification_id -# ) + gymnast = get_object_or_404(Gymnast, pk=gymnast_id) + functionality = get_object_or_404(ContentType, pk=functionality_id) + row, created = Notification.objects.get_or_create( + user=request.user, gymnast=gymnast, functionality=functionality + ) -# if created: -# return HttpResponse(200, (row, created)) # devrait être un 201 -# else: -# return HttpResponse(400, (row, created)) + if created: + return HttpResponse(200, (row, created)) # devrait être un 201 + else: + return HttpResponse(400, (row, created)) -# @require_http_methods(["POST"]) -# def notification_remove(request): -# """ -# Supprime une demande de notification -# """ -# gymnast_id = request.POST.get("gymnast_id", None) -# notification_id = request.POST.get("notification_id", None) +@require_http_methods(["POST"]) +def notification_remove(request): + """ + Supprime une demande de notification + """ + gymnast_id = request.POST.get("gymnast_id", None) + functionnality_id = request.POST.get("functionnality_id", None) -# try: -# Notification.objects.get( -# user=request.user, gymnast=gymnast_id, functionality=notification_id -# ).delete() -# except Exception: -# return HttpResponse(409) + try: + Notification.objects.get( + user=request.user, gymnast=gymnast_id, functionality=functionnality_id + ).delete() + except Exception: + return HttpResponse(409) -# return HttpResponse(200) + return HttpResponse(200)