diff --git a/requirements.txt b/requirements.txt index 4bcb5fe..0593b0a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,6 +3,7 @@ asgiref>=3.2.3 cffi>=1.13.2 dj-database-url>=0.5.0 Django>=3.0.2 +django-inline-actions>=2.3.0 djangorestframework>=3.11.0 psycopg2-binary>=2.8.4 pycparser>=2.19 diff --git a/savepointradio/radio/admin.py b/savepointradio/radio/admin.py index d05e06d..508aada 100644 --- a/savepointradio/radio/admin.py +++ b/savepointradio/radio/admin.py @@ -1,9 +1,13 @@ -from django.contrib import admin +from django.contrib import admin, messages from django.db import models from django.forms import TextInput +from inline_actions.admin import InlineActionsModelAdminMixin + from .actions import change_items, publish_items, remove_items from .models import Album, Artist, Game, Song, Store +from profiles.exceptions import MakeRequestError +from profiles.models import RadioProfile class ArtistInline(admin.TabularInline): @@ -137,7 +141,7 @@ class StoreAdmin(admin.ModelAdmin): @admin.register(Song) -class SongAdmin(admin.ModelAdmin): +class SongAdmin(InlineActionsModelAdminMixin, admin.ModelAdmin): formfield_overrides = { models.TextField: {'widget': TextInput(attrs={'size': 160, })}, } @@ -190,6 +194,7 @@ class SongAdmin(admin.ModelAdmin): }) ) inlines = [ArtistInline, StoreInline] + inline_actions = ['request_song'] def formfield_for_foreignkey(self, db_field, request, **kwargs): if db_field.name == 'active_store': @@ -198,6 +203,8 @@ class SongAdmin(admin.ModelAdmin): ) return super().formfield_for_foreignkey(db_field, request, **kwargs) + # Admin Actions + def artist_list(self, obj): return ', '.join([a.full_name for a in obj.artists.all()]) @@ -230,3 +237,17 @@ class SongAdmin(admin.ModelAdmin): def publish_songs(self, request, queryset): publish_items(request, queryset) publish_songs.short_description = "Publish selected songs" + + # Inline Admin Actions + + def request_song(self, request, obj, parent_obj=None): + profile = RadioProfile.objects.get(user=request.user) + try: + profile.make_request(obj) + except MakeRequestError as e: + return messages.error( + request, + 'Unable to request the song: {}'.format(str(e)) + ) + return messages.success(request, 'Successfully queued song.') + request_song.short_description = 'Request Song'