spradio-server-django/savepointradio/radio/admin.py

241 lines
8.2 KiB
Python
Raw Normal View History

from django.contrib import admin, messages
from django.db import models
from django.forms import TextInput
from django.http import HttpResponseRedirect
from django.shortcuts import render
from django.utils import timezone
from .forms import ArtistFormSet
from .models import Album, Artist, Game, Song
class ArtistInline(admin.TabularInline):
model = Song.artists.through
verbose_name = 'artist'
verbose_name_plural = 'artists'
extra = 0
@admin.register(Album)
class AlbumAdmin(admin.ModelAdmin):
# Detail List display
list_display = ('title', '_is_enabled', '_is_published')
search_fields = ['title']
actions = ['publish_items']
# Edit Form display
readonly_fields = ('created_date', 'modified_date')
fieldsets = (
('Album Disabling', {
'classes': ('collapse',),
'fields': ('disabled', 'disabled_date', 'disabled_reason')
}),
('Main', {
'fields': ('title', 'published_date')
}),
('Stats', {
'classes': ('collapse',),
'fields': ('created_date', 'modified_date')
})
)
def publish_items(self, request, queryset):
rows_updated = queryset.update(published_date=timezone.now())
if rows_updated == 1:
msg = '1 album was'
else:
msg = '{} albums were'.format(str(rows_updated))
self.message_user(request, '{} successfully published.'.format(msg))
publish_items.short_description = "Publish selected items"
@admin.register(Artist)
class ArtistAdmin(admin.ModelAdmin):
# Detail List display
list_display = ('first_name',
'alias',
'last_name',
'_is_enabled',
'_is_published')
search_fields = ['first_name', 'alias', 'last_name']
actions = ['publish_items']
# Edit Form display
readonly_fields = ('created_date', 'modified_date')
fieldsets = (
('Artist Disabling', {
'classes': ('collapse',),
'fields': ('disabled', 'disabled_date', 'disabled_reason')
}),
('Main', {
'fields': ('first_name', 'alias', 'last_name', 'published_date')
}),
('Stats', {
'classes': ('collapse',),
'fields': ('created_date', 'modified_date')
})
)
def publish_items(self, request, queryset):
rows_updated = queryset.update(published_date=timezone.now())
if rows_updated == 1:
msg = '1 artist was'
else:
msg = '{} artists were'.format(str(rows_updated))
self.message_user(request, '{} successfully published.'.format(msg))
publish_items.short_description = "Publish selected items"
@admin.register(Game)
class GameAdmin(admin.ModelAdmin):
# Detail List display
list_display = ('title', '_is_enabled', '_is_published')
search_fields = ['title']
actions = ['publish_items']
# Edit Form display
readonly_fields = ('created_date', 'modified_date')
fieldsets = (
('Game Disabling', {
'classes': ('collapse',),
'fields': ('disabled', 'disabled_date', 'disabled_reason')
}),
('Main', {
'fields': ('title', 'published_date')
}),
('Stats', {
'classes': ('collapse',),
'fields': ('created_date', 'modified_date')
})
)
def publish_items(self, request, queryset):
rows_updated = queryset.update(published_date=timezone.now())
if rows_updated == 1:
msg = '1 game was'
else:
msg = '{} games were'.format(str(rows_updated))
self.message_user(request, '{} successfully published.'.format(msg))
publish_items.short_description = "Publish selected items"
@admin.register(Song)
class SongAdmin(admin.ModelAdmin):
formfield_overrides = {
models.TextField: {'widget': TextInput(attrs={'size': 160, })},
}
# Detail List display
list_display = ('title',
'game',
'album',
'artist_list',
'_is_enabled',
'_is_published')
search_fields = ['title']
actions = ['publish_items', 'add_artists', 'remove_artists']
# Edit Form display
exclude = ('artists',)
readonly_fields = ('length',
'last_played',
'num_played',
'created_date',
'modified_date')
fieldsets = (
('Song Disabling', {
'classes': ('collapse',),
'fields': ('disabled', 'disabled_date', 'disabled_reason')
}),
('Main', {
'fields': ('song_type',
'title',
'path',
'published_date')
}),
('Stats', {
'classes': ('collapse',),
'fields': ('created_date',
'modified_date',
'last_played',
'num_played',
'length')
}),
('Album', {
'fields': ('album',)
}),
('Game', {
'fields': ('game',)
})
)
inlines = [ArtistInline]
def artist_list(self, obj):
return ', '.join([a.full_name for a in obj.artists.all()])
2018-01-13 05:39:13 +00:00
def change_artists(self, request, queryset, remove=False):
artist_formset = None
2018-01-13 05:39:13 +00:00
# If we clicked Submit, then continue. . .
if 'apply' in request.POST:
# Fill the formset with values from the POST request
artist_formset = ArtistFormSet(request.POST)
2018-01-13 05:39:13 +00:00
# Will only returned "cleaned_data" if form is valid, so check
if artist_formset.is_valid():
2018-01-13 05:39:13 +00:00
# Remove the empty form data from the list
data = list(filter(None, artist_formset.cleaned_data))
for artist in data:
for song in queryset:
2018-01-13 05:39:13 +00:00
if request.POST['removal'] == 'True':
song.artists.remove(artist['artist'])
else:
song.artists.add(artist['artist'])
# Return with informative success message and counts
a_count = len(data)
s_count = queryset.count()
a_msg = ('1 artist was',
'{} artists were'.format(a_count))[a_count > 1]
s_msg = ('1 song', '{} songs'.format(s_count))[s_count > 1]
2018-01-13 05:39:13 +00:00
if request.POST['removal'] == 'True':
act_msg = 'removed from'
else:
act_msg = 'added to'
self.message_user(request,
2018-01-13 05:39:13 +00:00
'{} successfully {} {}.'.format(a_msg,
act_msg,
s_msg))
return HttpResponseRedirect(request.get_full_path())
else:
self.message_user(request,
"See below for errors in the form.",
level=messages.ERROR)
# . . .otherwise, create empty formset.
if not artist_formset:
artist_formset = ArtistFormSet()
return render(request,
2018-01-13 05:39:13 +00:00
'admin/change_artists_intermediate.html',
{'songs': queryset,
'artist_formset': artist_formset,
'is_removal': remove, })
def add_artists(self, request, queryset):
return self.change_artists(request, queryset)
add_artists.short_description = "Add artists to selected items"
def remove_artists(self, request, queryset):
2018-01-13 05:39:13 +00:00
return self.change_artists(request, queryset, remove=True)
remove_artists.short_description = "Remove artists from selected items"
def publish_items(self, request, queryset):
rows_updated = queryset.update(published_date=timezone.now())
if rows_updated == 1:
msg = '1 song was'
else:
msg = '{} songs were'.format(str(rows_updated))
self.message_user(request, '{} successfully published.'.format(msg))
publish_items.short_description = "Publish selected items"