Add ScrobbledPage model to start book transition
This commit is contained in:
@ -7,6 +7,7 @@ from scrobbles.models import (
|
|||||||
LastFmImport,
|
LastFmImport,
|
||||||
RetroarchImport,
|
RetroarchImport,
|
||||||
Scrobble,
|
Scrobble,
|
||||||
|
ScrobbledPage,
|
||||||
)
|
)
|
||||||
from scrobbles.mixins import Genre
|
from scrobbles.mixins import Genre
|
||||||
|
|
||||||
@ -119,3 +120,13 @@ class ScrobbleAdmin(admin.ModelAdmin):
|
|||||||
|
|
||||||
def playback_percent(self, obj):
|
def playback_percent(self, obj):
|
||||||
return obj.percent_played
|
return obj.percent_played
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(ScrobbledPage)
|
||||||
|
class ScrobbledPageAdmin(admin.ModelAdmin):
|
||||||
|
list_display = (
|
||||||
|
"number",
|
||||||
|
"scrobble",
|
||||||
|
"notes",
|
||||||
|
)
|
||||||
|
raw_id_fields = ("scrobble",)
|
||||||
|
|||||||
@ -0,0 +1,63 @@
|
|||||||
|
from books.models import Book
|
||||||
|
from django.core.management.base import BaseCommand, no_translations
|
||||||
|
from scrobbles.models import ScrobbledPage
|
||||||
|
|
||||||
|
|
||||||
|
class Command(BaseCommand):
|
||||||
|
def add_arguments(self, parser):
|
||||||
|
parser.add_argument(
|
||||||
|
"--commit",
|
||||||
|
action="store_true",
|
||||||
|
help="Actually populate data",
|
||||||
|
)
|
||||||
|
|
||||||
|
def handle(self, *args, **options):
|
||||||
|
dry_run = True
|
||||||
|
if options["commit"]:
|
||||||
|
dry_run = False
|
||||||
|
|
||||||
|
pages_to_create = []
|
||||||
|
associated_scrobble = None
|
||||||
|
last_scrobble = None
|
||||||
|
for book in Book.objects.all():
|
||||||
|
for page in book.page_set.all().order_by("number"):
|
||||||
|
notes = ""
|
||||||
|
last_scrobble = associated_scrobble
|
||||||
|
if (
|
||||||
|
not associated_scrobble
|
||||||
|
or page.number > associated_scrobble.book_pages_read
|
||||||
|
):
|
||||||
|
associated_scrobble = page.user.scrobble_set.filter(
|
||||||
|
book=page.book,
|
||||||
|
timestamp__gte=page.start_time,
|
||||||
|
timestamp__lte=page.end_time,
|
||||||
|
).first()
|
||||||
|
|
||||||
|
if (
|
||||||
|
last_scrobble
|
||||||
|
and not associated_scrobble
|
||||||
|
and page.number > last_scrobble.book_pages_read
|
||||||
|
):
|
||||||
|
associated_scrobble = last_scrobble
|
||||||
|
notes = f"Extrapolated reading from scrobble {associated_scrobble.id}"
|
||||||
|
|
||||||
|
pages_to_create.append(
|
||||||
|
ScrobbledPage(
|
||||||
|
scrobble=associated_scrobble,
|
||||||
|
number=page.number,
|
||||||
|
start_time=page.start_time,
|
||||||
|
end_time=page.end_time,
|
||||||
|
duration_seconds=page.duration_seconds,
|
||||||
|
notes=notes,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
pages_to_move_len = len(pages_to_create)
|
||||||
|
if dry_run:
|
||||||
|
print(
|
||||||
|
f"Found {pages_to_move_len} to migrate. Use --commit to move them"
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
ScrobbledPage.objects.bulk_create(pages_to_create)
|
||||||
|
print(f"Migrated {pages_to_move_len} generic pages to scrobbled pages")
|
||||||
63
vrobbler/apps/scrobbles/migrations/0043_scrobbledpage.py
Normal file
63
vrobbler/apps/scrobbles/migrations/0043_scrobbledpage.py
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
# Generated by Django 4.1.7 on 2023-07-16 05:23
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
import django_extensions.db.fields
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("scrobbles", "0042_scrobble_videogame_screenshot"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name="ScrobbledPage",
|
||||||
|
fields=[
|
||||||
|
(
|
||||||
|
"id",
|
||||||
|
models.BigAutoField(
|
||||||
|
auto_created=True,
|
||||||
|
primary_key=True,
|
||||||
|
serialize=False,
|
||||||
|
verbose_name="ID",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"created",
|
||||||
|
django_extensions.db.fields.CreationDateTimeField(
|
||||||
|
auto_now_add=True, verbose_name="created"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"modified",
|
||||||
|
django_extensions.db.fields.ModificationDateTimeField(
|
||||||
|
auto_now=True, verbose_name="modified"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
("number", models.IntegerField()),
|
||||||
|
("start_time", models.DateTimeField(blank=True, null=True)),
|
||||||
|
("end_time", models.DateTimeField(blank=True, null=True)),
|
||||||
|
(
|
||||||
|
"duration_seconds",
|
||||||
|
models.IntegerField(blank=True, null=True),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"notes",
|
||||||
|
models.CharField(blank=True, max_length=255, null=True),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
"scrobble",
|
||||||
|
models.ForeignKey(
|
||||||
|
on_delete=django.db.models.deletion.DO_NOTHING,
|
||||||
|
to="scrobbles.scrobble",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
"get_latest_by": "modified",
|
||||||
|
"abstract": False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
Reference in New Issue
Block a user