[scrobbles] Add admin list to index
This commit is contained in:
10
PROJECT.org
10
PROJECT.org
@ -92,7 +92,7 @@ fetching and simple saving.
|
|||||||
:LOGBOOK:
|
:LOGBOOK:
|
||||||
CLOCK: [2025-07-09 Wed 09:55]--[2025-07-09 Wed 10:15] => 0:20
|
CLOCK: [2025-07-09 Wed 09:55]--[2025-07-09 Wed 10:15] => 0:20
|
||||||
:END:
|
:END:
|
||||||
* Backlog [6/30]
|
* Backlog [8/32]
|
||||||
** TODO [#C] Create small utility to clean up tracks scrobbled with wonky playback times :vrobbler:personal:bug:music:scrobbles:
|
** TODO [#C] Create small utility to clean up tracks scrobbled with wonky playback times :vrobbler:personal:bug:music:scrobbles:
|
||||||
** TODO [#C] Move to using more robust mopidy-webhooks pacakge form pypi :utility:improvement:
|
** TODO [#C] Move to using more robust mopidy-webhooks pacakge form pypi :utility:improvement:
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
@ -460,6 +460,14 @@ Turns out we're not looking up music tracks properly, again.
|
|||||||
:END:
|
:END:
|
||||||
** TODO Add sentiment parsing for Scrobbles with notes :vrobbler:project:scrobbles:sentiment:
|
** TODO Add sentiment parsing for Scrobbles with notes :vrobbler:project:scrobbles:sentiment:
|
||||||
** TODO Check opencode about a way to present stats like movies per month :vrobbler:scrobbles:stats:personal:project:
|
** TODO Check opencode about a way to present stats like movies per month :vrobbler:scrobbles:stats:personal:project:
|
||||||
|
** DONE Update admin page to be easier to use :vrobbler:djadmin:project:personal:
|
||||||
|
:PROPERTIES:
|
||||||
|
:ID: 0779be1f-1ad7-ddc7-8861-d3c7c833cbe9
|
||||||
|
:END:
|
||||||
|
** DONE Fix migrations and update repo :vrobbler:scrobbles:admin:personal:project:
|
||||||
|
:PROPERTIES:
|
||||||
|
:ID: ccbc2ef0-68bf-9ef7-dcaf-febab5ebefe2
|
||||||
|
:END:
|
||||||
** DONE Add recipe parsing for food lookups :vrobbler:foods:project:feature:personal:
|
** DONE Add recipe parsing for food lookups :vrobbler:foods:project:feature:personal:
|
||||||
:PROPERTIES:
|
:PROPERTIES:
|
||||||
:ID: 86456c78-247b-fb63-7ae8-d6d17e7666b1
|
:ID: 86456c78-247b-fb63-7ae8-d6d17e7666b1
|
||||||
|
|||||||
@ -54,23 +54,19 @@ class ImportBaseAdmin(admin.ModelAdmin):
|
|||||||
|
|
||||||
|
|
||||||
@admin.register(AudioScrobblerTSVImport)
|
@admin.register(AudioScrobblerTSVImport)
|
||||||
class AudioScrobblerTSVImportAdmin(ImportBaseAdmin):
|
class AudioScrobblerTSVImportAdmin(ImportBaseAdmin): ...
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
@admin.register(LastFmImport)
|
@admin.register(LastFmImport)
|
||||||
class LastFmImportAdmin(ImportBaseAdmin):
|
class LastFmImportAdmin(ImportBaseAdmin): ...
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
@admin.register(KoReaderImport)
|
@admin.register(KoReaderImport)
|
||||||
class KoReaderImportAdmin(ImportBaseAdmin):
|
class KoReaderImportAdmin(ImportBaseAdmin): ...
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
@admin.register(RetroarchImport)
|
@admin.register(RetroarchImport)
|
||||||
class RetroarchImportAdmin(ImportBaseAdmin):
|
class RetroarchImportAdmin(ImportBaseAdmin): ...
|
||||||
...
|
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Genre)
|
@admin.register(Genre)
|
||||||
|
|||||||
@ -1,5 +1,20 @@
|
|||||||
from django.apps import AppConfig
|
from django.apps import AppConfig
|
||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
|
||||||
class ScrobblesConfig(AppConfig):
|
class ScrobblesConfig(AppConfig):
|
||||||
name = "scrobbles"
|
name = "scrobbles"
|
||||||
|
|
||||||
|
def ready(self):
|
||||||
|
from scrobbles.models import Scrobble
|
||||||
|
|
||||||
|
original_index = admin.site.index
|
||||||
|
|
||||||
|
def custom_index(request, extra_context=None):
|
||||||
|
extra_context = extra_context or {}
|
||||||
|
extra_context["recent_scrobbles"] = Scrobble.objects.filter(
|
||||||
|
timestamp__isnull=False
|
||||||
|
).order_by("-timestamp")[:20]
|
||||||
|
return original_index(request, extra_context)
|
||||||
|
|
||||||
|
admin.site.index = custom_index
|
||||||
|
|||||||
78
vrobbler/templates/admin/index.html
Normal file
78
vrobbler/templates/admin/index.html
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
{% extends "admin/base_site.html" %}
|
||||||
|
{% load i18n static %}
|
||||||
|
|
||||||
|
{% block extrastyle %}{{ block.super }}<link rel="stylesheet" href="{% static "admin/css/dashboard.css" %}">{% endblock %}
|
||||||
|
|
||||||
|
{% block coltype %}colMS{% endblock %}
|
||||||
|
|
||||||
|
{% block bodyclass %}{{ block.super }} dashboard{% endblock %}
|
||||||
|
|
||||||
|
{% block nav-breadcrumbs %}{% endblock %}
|
||||||
|
|
||||||
|
{% block nav-sidebar %}{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div id="content-main">
|
||||||
|
{% if recent_scrobbles %}
|
||||||
|
<div class="app-scrobbles module">
|
||||||
|
<table>
|
||||||
|
<caption>
|
||||||
|
<a href="{% url 'admin:scrobbles_scrobble_changelist' %}" class="section">Recent Scrobbles</a>
|
||||||
|
</caption>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Timestamp</th>
|
||||||
|
<th>Media</th>
|
||||||
|
<th>Type</th>
|
||||||
|
<th>User</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for scrobble in recent_scrobbles %}
|
||||||
|
<tr>
|
||||||
|
<td><a href="{% url 'admin:scrobbles_scrobble_change' scrobble.pk %}">{{ scrobble.timestamp|date:"Y-m-d H:i" }}</a></td>
|
||||||
|
<td>{{ scrobble.media_obj|truncatechars:50 }}</td>
|
||||||
|
<td>{{ scrobble.get_media_type_display }}</td>
|
||||||
|
<td>{{ scrobble.user|default:"-" }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% include "admin/app_list.html" with app_list=app_list show_changelinks=True %}
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block sidebar %}
|
||||||
|
<div id="content-related">
|
||||||
|
<div class="module" id="recent-actions-module">
|
||||||
|
<h2>{% translate 'Recent actions' %}</h2>
|
||||||
|
<h3>{% translate 'My actions' %}</h3>
|
||||||
|
{% load log %}
|
||||||
|
{% get_admin_log 10 as admin_log for_user user %}
|
||||||
|
{% if not admin_log %}
|
||||||
|
<p>{% translate 'None available' %}</p>
|
||||||
|
{% else %}
|
||||||
|
<ul class="actionlist">
|
||||||
|
{% for entry in admin_log %}
|
||||||
|
<li class="{% if entry.is_addition %}addlink{% endif %}{% if entry.is_change %}changelink{% endif %}{% if entry.is_deletion %}deletelink{% endif %}">
|
||||||
|
{% if entry.is_deletion or not entry.get_admin_url %}
|
||||||
|
{{ entry.object_repr }}
|
||||||
|
{% else %}
|
||||||
|
<a href="{{ entry.get_admin_url }}">{{ entry.object_repr }}</a>
|
||||||
|
{% endif %}
|
||||||
|
<br>
|
||||||
|
{% if entry.content_type %}
|
||||||
|
<span class="mini quiet">{% filter capfirst %}{{ entry.content_type.name }}{% endfilter %}</span>
|
||||||
|
{% else %}
|
||||||
|
<span class="mini quiet">{% translate 'Unknown content' %}</span>
|
||||||
|
{% endif %}
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
Reference in New Issue
Block a user