Clean up music detail views
This commit is contained in:
@ -8,6 +8,7 @@ from scrobbles.stats import get_scrobble_count_qs
|
|||||||
|
|
||||||
class TrackListView(generic.ListView):
|
class TrackListView(generic.ListView):
|
||||||
model = Track
|
model = Track
|
||||||
|
paginate_by = 200
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return get_scrobble_count_qs(user=self.request.user).order_by(
|
return get_scrobble_count_qs(user=self.request.user).order_by(
|
||||||
@ -30,10 +31,18 @@ class TrackDetailView(generic.DetailView):
|
|||||||
|
|
||||||
class ArtistListView(generic.ListView):
|
class ArtistListView(generic.ListView):
|
||||||
model = Artist
|
model = Artist
|
||||||
|
paginate_by = 100
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
return super().get_queryset().order_by("name")
|
return super().get_queryset().order_by("name")
|
||||||
|
|
||||||
|
def get_context_data(self, *, object_list=None, **kwargs):
|
||||||
|
context_data = super().get_context_data(
|
||||||
|
object_list=object_list, **kwargs
|
||||||
|
)
|
||||||
|
context_data['view'] = self.request.GET.get('view')
|
||||||
|
return context_data
|
||||||
|
|
||||||
|
|
||||||
class ArtistDetailView(generic.DetailView):
|
class ArtistDetailView(generic.DetailView):
|
||||||
model = Artist
|
model = Artist
|
||||||
@ -49,6 +58,17 @@ class ArtistDetailView(generic.DetailView):
|
|||||||
|
|
||||||
class AlbumListView(generic.ListView):
|
class AlbumListView(generic.ListView):
|
||||||
model = Album
|
model = Album
|
||||||
|
paginate_by = 50
|
||||||
|
|
||||||
|
def get_queryset(self):
|
||||||
|
return super().get_queryset().order_by("name")
|
||||||
|
|
||||||
|
def get_context_data(self, *, object_list=None, **kwargs):
|
||||||
|
context_data = super().get_context_data(
|
||||||
|
object_list=object_list, **kwargs
|
||||||
|
)
|
||||||
|
context_data['view'] = self.request.GET.get('view')
|
||||||
|
return context_data
|
||||||
|
|
||||||
|
|
||||||
class AlbumDetailView(generic.DetailView):
|
class AlbumDetailView(generic.DetailView):
|
||||||
|
|||||||
0
vrobbler/apps/scrobbles/templatetags/__init__.py
Normal file
0
vrobbler/apps/scrobbles/templatetags/__init__.py
Normal file
10
vrobbler/apps/scrobbles/templatetags/urlreplace.py
Normal file
10
vrobbler/apps/scrobbles/templatetags/urlreplace.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
from django import template
|
||||||
|
|
||||||
|
register = template.Library()
|
||||||
|
|
||||||
|
|
||||||
|
@register.simple_tag(takes_context=True)
|
||||||
|
def urlreplace(context, **kwargs):
|
||||||
|
query = context['request'].GET.copy()
|
||||||
|
query.update(kwargs)
|
||||||
|
return query.urlencode()
|
||||||
@ -212,6 +212,7 @@
|
|||||||
Dashboard
|
Dashboard
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
{% if user.is_authenticated %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" aria-current="page" href="/charts/">
|
<a class="nav-link" aria-current="page" href="/charts/">
|
||||||
<span data-feather="bar-chart"></span>
|
<span data-feather="bar-chart"></span>
|
||||||
@ -230,6 +231,12 @@
|
|||||||
Artists
|
Artists
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" href="/albums/">
|
||||||
|
<span data-feather="music"></span>
|
||||||
|
Albums
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="/movies/">
|
<a class="nav-link" href="/movies/">
|
||||||
<span data-feather="film"></span>
|
<span data-feather="film"></span>
|
||||||
@ -242,7 +249,6 @@
|
|||||||
TV Shows
|
TV Shows
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
{% if user.is_authenticated %}
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="/admin/">
|
<a class="nav-link" href="/admin/">
|
||||||
<span data-feather="key"></span>
|
<span data-feather="key"></span>
|
||||||
@ -261,13 +267,13 @@
|
|||||||
{% for scrobble in now_playing_list %}
|
{% for scrobble in now_playing_list %}
|
||||||
<div>
|
<div>
|
||||||
{% if scrobble.media_obj.album.cover_image %}
|
{% if scrobble.media_obj.album.cover_image %}
|
||||||
<td><img src="{{scrobble.track.album.cover_image.url}}" width=120 height=120
|
<td><img src="{{scrobble.track.album.cover_image.url}}" width=120 height=120 style="border:1px solid black; " /></td><br/>
|
||||||
style="border:1px solid black; " /></td><br/>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{{scrobble.media_obj.title}}<br/>
|
<a href="{{scrobble.media_obj.get_absolute_url}}">{{scrobble.media_obj.title}}</a><br/>
|
||||||
{% if scrobble.media_obj.subtitle %}<em>{{scrobble.media_obj.subtitle}}</em><br/>{% endif %}
|
{% if scrobble.media_obj.subtitle %}
|
||||||
<small>{{scrobble.timestamp|naturaltime}}<br/>
|
<em><a href="{{scrobble.media_obj.subtitle.get_absolute_url}}">{{scrobble.media_obj.subtitle}}</a></em><br/>
|
||||||
from {{scrobble.source}}</small>
|
{% endif %}
|
||||||
|
<small>{{scrobble.timestamp|naturaltime}}<br/> from {{scrobble.source}}</small>
|
||||||
<div class="progress-bar" style="margin-right:5px;">
|
<div class="progress-bar" style="margin-right:5px;">
|
||||||
<span class="progress-bar-fill" style="width: {{scrobble.percent_played}}%;"></span>
|
<span class="progress-bar-fill" style="width: {{scrobble.percent_played}}%;"></span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -1,11 +1,82 @@
|
|||||||
{% extends "base_list.html" %}
|
{% extends "base_list.html" %}
|
||||||
|
{% load urlreplace %}
|
||||||
|
|
||||||
{% block title %}Albums{% endblock %}
|
{% block title %}Albums{% endblock %}
|
||||||
|
|
||||||
{% block lists %}
|
{% block lists %}
|
||||||
{% for album in object_list %}
|
|
||||||
<dl style="width: 130px; float: left; margin-right:10px;">
|
<div class="row">
|
||||||
<dd><img src="{{album.cover_image.url}}" width=120 height=120 /></dd>
|
<p class="view">
|
||||||
</dl>
|
<span class="view-links">
|
||||||
{% endfor %}
|
{% if view == 'grid' %}
|
||||||
|
View as <a href="?{% urlreplace view='list' %}">List</a>
|
||||||
|
{% else %}
|
||||||
|
View as <a href="?{% urlreplace view='grid' %}">Grid</a>
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
<p class="pagination">
|
||||||
|
<span class="page-links">
|
||||||
|
{% if page_obj.has_previous %}
|
||||||
|
<a href="?{% urlreplace page=page_obj.previous_page_number %}">prev</a>
|
||||||
|
{% endif %}
|
||||||
|
<span class="page-current">
|
||||||
|
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
|
||||||
|
</span>
|
||||||
|
{% if page_obj.has_next %}
|
||||||
|
<a href="?{% urlreplace page=page_obj.next_page_number %}">next</a>
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
|
||||||
|
{% if view == 'grid' %}
|
||||||
|
<div>
|
||||||
|
{% for album in object_list %}
|
||||||
|
{% if album.cover_image %}
|
||||||
|
<dl style="width: 130px; float: left; margin-right:10px;">
|
||||||
|
<dd><img src="{{album.cover_image.url}}" width=120 height=120 /></dd>
|
||||||
|
</dl>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
|
<div class="col-md">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-striped table-sm">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">Album</th>
|
||||||
|
<th scope="col">Artist</th>
|
||||||
|
<th scope="col">Scrobbles</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for album in object_list %}
|
||||||
|
<tr>
|
||||||
|
<td><a href="{{album.get_absolute_url}}">{{album}}</a></td>
|
||||||
|
<td><a href="{{album.artist.get_absolute_url}}">{{album.artist}}</a></td>
|
||||||
|
<td>{{album.scrobbles.count}}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="pagination" style="margin-bottom:50px;">
|
||||||
|
<span class="page-links">
|
||||||
|
{% if page_obj.has_previous %}
|
||||||
|
<a href="?{% urlreplace page=page_obj.previous_page_number %}">prev</a>
|
||||||
|
{% endif %}
|
||||||
|
<span class="page-current">
|
||||||
|
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
|
||||||
|
</span>
|
||||||
|
{% if page_obj.has_next %}
|
||||||
|
<a href="?{% urlreplace page=page_obj.next_page_number %}">next</a>
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@ -4,12 +4,11 @@
|
|||||||
{% block title %}{{object.name}}{% endblock %}
|
{% block title %}{{object.name}}{% endblock %}
|
||||||
|
|
||||||
{% block lists %}
|
{% block lists %}
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
||||||
{% if object.thumbnail %}
|
{% if object.thumbnail %}
|
||||||
<p style="float:left; width:302px; padding:0; border: 1px solid #ccc">
|
<p style="float:left; width:300px; margin-right:10px;">
|
||||||
<img src="{{artist.thumbnail.url}}" width=300 height=300 />
|
<img style="border:1px solid #ccc;" src="{{artist.thumbnail.url}}" width=300 height=300 />
|
||||||
</p>
|
</p>
|
||||||
{% else %}
|
{% else %}
|
||||||
{% if object.album_set.first.cover_image %}
|
{% if object.album_set.first.cover_image %}
|
||||||
@ -18,6 +17,11 @@
|
|||||||
</p>
|
</p>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<div style="float:left; width:600px; margin-left:10px; ">
|
||||||
|
<p>{{artist.biography|safe|linebreaks|truncatewords:160}}</p>
|
||||||
|
<hr/>
|
||||||
|
<p><a href="{{artist.mb_link}}">Musicbrainz</a></p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<p>{{artist.scrobbles.count}} scrobbles</p>
|
<p>{{artist.scrobbles.count}} scrobbles</p>
|
||||||
|
|||||||
@ -1,9 +1,45 @@
|
|||||||
{% extends "base_list.html" %}
|
{% extends "base_list.html" %}
|
||||||
|
{% load urlreplace %}
|
||||||
|
|
||||||
{% block title %}Artists{% endblock %}
|
{% block title %}Artists{% endblock %}
|
||||||
|
|
||||||
{% block lists %}
|
{% block lists %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
|
<p class="view">
|
||||||
|
<span class="view-links">
|
||||||
|
{% if view == 'grid' %}
|
||||||
|
View as <a href="?{% urlreplace view='list' %}">List</a>
|
||||||
|
{% else %}
|
||||||
|
View as <a href="?{% urlreplace view='grid' %}">Grid</a>
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
<p class="pagination">
|
||||||
|
<span class="page-links">
|
||||||
|
{% if page_obj.has_previous %}
|
||||||
|
<a href="?{% urlreplace page=page_obj.previous_page_number %}">prev</a>
|
||||||
|
{% endif %}
|
||||||
|
<span class="page-current">
|
||||||
|
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
|
||||||
|
</span>
|
||||||
|
{% if page_obj.has_next %}
|
||||||
|
<a href="?{% urlreplace page=page_obj.next_page_number %}">next</a>
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
|
||||||
|
{% if view == 'grid' %}
|
||||||
|
<div>
|
||||||
|
{% for artist in object_list %}
|
||||||
|
{% if artist.thumbnail %}
|
||||||
|
<dl style="width: 130px; float: left; margin-right:10px;">
|
||||||
|
<dd><img src="{{artist.thumbnail.url}}" width=120 height=120 /></dd>
|
||||||
|
</dl>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% else %}
|
||||||
<div class="col-md">
|
<div class="col-md">
|
||||||
<div class="table-responsive">
|
<div class="table-responsive">
|
||||||
<table class="table table-striped table-sm">
|
<table class="table table-striped table-sm">
|
||||||
@ -26,5 +62,20 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<div class="pagination" style="margin-bottom:50px;">
|
||||||
|
<span class="page-links">
|
||||||
|
{% if page_obj.has_previous %}
|
||||||
|
<a href="?{% urlreplace page=page_obj.previous_page_number %}">prev</a>
|
||||||
|
{% endif %}
|
||||||
|
<span class="page-current">
|
||||||
|
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
|
||||||
|
</span>
|
||||||
|
{% if page_obj.has_next %}
|
||||||
|
<a href="?{% urlreplace page=page_obj.next_page_number %}">next</a>
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@ -3,10 +3,57 @@
|
|||||||
{% block title %}Tracks{% endblock %}
|
{% block title %}Tracks{% endblock %}
|
||||||
|
|
||||||
{% block lists %}
|
{% block lists %}
|
||||||
<h2>All time</h2>
|
<div class="row">
|
||||||
{% for track in object_list %}
|
<p class="pagination">
|
||||||
<ul>
|
<span class="page-links">
|
||||||
<li><a href="{{track.get_absolute_url}}">{{track}}</a></li>
|
{% if page_obj.has_previous %}
|
||||||
</ul>
|
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
|
||||||
{% endfor %}
|
{% endif %}
|
||||||
|
<span class="page-current">
|
||||||
|
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
|
||||||
|
</span>
|
||||||
|
{% if page_obj.has_next %}
|
||||||
|
<a href="?page={{ page_obj.next_page_number }}">next</a>
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
</p>
|
||||||
|
<hr />
|
||||||
|
|
||||||
|
<div class="col-md">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-striped table-sm">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th scope="col">Track</th>
|
||||||
|
<th scope="col">Artist</th>
|
||||||
|
<th scope="col">Scrobbles</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for track in object_list %}
|
||||||
|
<tr>
|
||||||
|
<td><a href="{{track.get_absolute_url}}">{{track}}</a></td>
|
||||||
|
<td><a href="{{track.artist.get_absolute_url}}">{{track.artist}}</a></td>
|
||||||
|
<td>{{track.scrobble_set.count}}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="pagination" style="margin-bottom:50px;">
|
||||||
|
<span class="page-links">
|
||||||
|
{% if page_obj.has_previous %}
|
||||||
|
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
|
||||||
|
{% endif %}
|
||||||
|
<span class="page-current">
|
||||||
|
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}
|
||||||
|
</span>
|
||||||
|
{% if page_obj.has_next %}
|
||||||
|
<a href="?page={{ page_obj.next_page_number }}">next</a>
|
||||||
|
{% endif %}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
Reference in New Issue
Block a user