diff --git a/sas/api.py b/sas/api.py index fa37e974..6f68bd94 100644 --- a/sas/api.py +++ b/sas/api.py @@ -2,7 +2,6 @@ from typing import Any, Literal from django.conf import settings from django.core.exceptions import ValidationError -from django.db.models import F from django.urls import reverse from ninja import Body, File, Query from ninja.security import SessionAuth @@ -105,8 +104,7 @@ class PicturesController(ControllerBase): filters.filter(Picture.objects.viewable_by(user)) .distinct() .order_by("-parent__date", "date") - .select_related("owner") - .annotate(album=F("parent__name")) + .select_related("owner", "parent") ) @route.post( @@ -153,7 +151,9 @@ class PicturesController(ControllerBase): @route.put("/{picture_id}/identified", permissions=[IsAuthenticated, CanView]) def identify_users(self, picture_id: NonNegativeInt, users: set[NonNegativeInt]): - picture = self.get_object_or_exception(Picture, pk=picture_id) + picture = self.get_object_or_exception( + Picture.objects.select_related("parent"), pk=picture_id + ) db_users = list(User.objects.filter(id__in=users)) if len(users) != len(db_users): raise NotFound @@ -166,13 +166,15 @@ class PicturesController(ControllerBase): ] PeoplePictureRelation.objects.bulk_create(relations) for u in identified: + html_id = f"album-{picture.parent_id}" + url = reverse( + "sas:user_pictures", kwargs={"user_id": u.id}, fragment=html_id + ) Notification.objects.get_or_create( user=u, viewed=False, type="NEW_PICTURES", - defaults={ - "url": reverse("sas:user_pictures", kwargs={"user_id": u.id}) - }, + defaults={"url": url, "param": picture.parent.name}, ) @route.delete("/{picture_id}", permissions=[IsSasAdmin]) diff --git a/sas/schemas.py b/sas/schemas.py index 76eb908a..6f490dca 100644 --- a/sas/schemas.py +++ b/sas/schemas.py @@ -18,6 +18,12 @@ class AlbumFilterSchema(FilterSchema): parent_id: int | None = Field(None, q="parent_id") +class SimpleAlbumSchema(ModelSchema): + class Meta: + model = Album + fields = ["id", "name"] + + class AlbumSchema(ModelSchema): class Meta: model = Album @@ -70,7 +76,7 @@ class PictureSchema(ModelSchema): full_size_url: str compressed_url: str thumb_url: str - album: str + album: SimpleAlbumSchema = Field(alias="parent") report_url: str edit_url: str diff --git a/sas/static/bundled/sas/user/pictures-index.ts b/sas/static/bundled/sas/user/pictures-index.ts index a18dede5..f5f2fcbc 100644 --- a/sas/static/bundled/sas/user/pictures-index.ts +++ b/sas/static/bundled/sas/user/pictures-index.ts @@ -22,11 +22,11 @@ document.addEventListener("alpine:init", () => { } as PicturesFetchPicturesData); this.albums = this.pictures.reduce( - (acc: Record, picture: PictureSchema) => { - if (!acc[picture.album]) { - acc[picture.album] = []; + (acc: Record, picture: PictureSchema) => { + if (!acc[picture.album.id]) { + acc[picture.album.id] = []; } - acc[picture.album].push(picture); + acc[picture.album.id].push(picture); return acc; }, {}, diff --git a/sas/templates/sas/user_pictures.jinja b/sas/templates/sas/user_pictures.jinja index cb1f98c5..76c74bc7 100644 --- a/sas/templates/sas/user_pictures.jinja +++ b/sas/templates/sas/user_pictures.jinja @@ -20,11 +20,11 @@ {{ download_button(_("Download all my pictures")) }} {% endif %} -