[favorites] Add ability to favorite and add to Mopidy
Some checks failed
build / test (push) Has been cancelled
Some checks failed
build / test (push) Has been cancelled
This commit is contained in:
@ -75,6 +75,7 @@ from scrobbles.models import (
|
||||
AudioScrobblerTSVImport,
|
||||
BGStatsImport,
|
||||
EBirdCSVImport,
|
||||
FavoriteMedia,
|
||||
KoReaderImport,
|
||||
LastFmImport,
|
||||
RetroarchImport,
|
||||
@ -1033,6 +1034,58 @@ def add_to_mopidy_queue(request, uuid):
|
||||
return redirect("scrobbles:detail", uuid=uuid)
|
||||
|
||||
|
||||
@require_POST
|
||||
def toggle_favorite(request, media_type, object_id):
|
||||
if not request.user.is_authenticated:
|
||||
return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
|
||||
|
||||
app_model_map = {
|
||||
"Video": ("videos", "Video"),
|
||||
"Channel": ("videos", "Channel"),
|
||||
"Track": ("music", "Track"),
|
||||
"PodcastEpisode": ("podcasts", "PodcastEpisode"),
|
||||
"SportEvent": ("sports", "SportEvent"),
|
||||
"Book": ("books", "Book"),
|
||||
"Paper": ("books", "Paper"),
|
||||
"VideoGame": ("videogames", "VideoGame"),
|
||||
"BoardGame": ("boardgames", "BoardGame"),
|
||||
"GeoLocation": ("locations", "GeoLocation"),
|
||||
"Beer": ("beers", "Beer"),
|
||||
"Puzzle": ("puzzles", "Puzzle"),
|
||||
"Food": ("foods", "Food"),
|
||||
"Trail": ("trails", "Trail"),
|
||||
"Task": ("tasks", "Task"),
|
||||
"WebPage": ("webpages", "WebPage"),
|
||||
"LifeEvent": ("lifeevents", "LifeEvent"),
|
||||
"Mood": ("moods", "Mood"),
|
||||
"BrickSet": ("bricksets", "BrickSet"),
|
||||
"BirdingLocation": ("birds", "BirdingLocation"),
|
||||
}
|
||||
|
||||
app_label, model_name = app_model_map.get(media_type, (None, None))
|
||||
if not app_label:
|
||||
messages.add_message(
|
||||
request, messages.ERROR, f"Unknown media type: {media_type}"
|
||||
)
|
||||
return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
|
||||
|
||||
model = apps.get_model(app_label, model_name)
|
||||
media_obj = get_object_or_404(model, id=object_id)
|
||||
result = FavoriteMedia.toggle(media_obj, request.user)
|
||||
|
||||
is_favorited = result is not None
|
||||
if not is_favorited:
|
||||
msg = f'Removed "{media_obj}" from favorites.'
|
||||
else:
|
||||
msg = f'Added "{media_obj}" to favorites.'
|
||||
|
||||
if request.headers.get("x-requested-with") == "XMLHttpRequest":
|
||||
return JsonResponse({"is_favorited": is_favorited, "message": msg})
|
||||
|
||||
messages.add_message(request, messages.SUCCESS, msg)
|
||||
return HttpResponseRedirect(request.META.get("HTTP_REFERER", "/"))
|
||||
|
||||
|
||||
@api_view(["GET"])
|
||||
@permission_classes([IsAuthenticated])
|
||||
def export(request):
|
||||
@ -1183,6 +1236,13 @@ class ScrobbleDetailView(DetailView):
|
||||
except EmptyPage:
|
||||
context["related_scrobbles"] = paginator.page(paginator.num_pages)
|
||||
|
||||
if self.request.user.is_authenticated:
|
||||
fk_field = self.MEDIA_FK_MAP.get(media_type)
|
||||
if fk_field and media_obj:
|
||||
context["is_favorited"] = FavoriteMedia.objects.filter(
|
||||
user=self.request.user, **{fk_field: media_obj}
|
||||
).exists()
|
||||
|
||||
return context
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user