migration errors

This commit is contained in:
Petitminion 2025-03-17 19:13:04 +01:00
parent 4a5cc99085
commit a3adccf233
3 changed files with 66 additions and 11 deletions

View File

@ -28,6 +28,8 @@ def insert_tracks_to_playlist(apps, playlist, uploads):
upload.library = None upload.library = None
upload.save() upload.save()
playlist.library.playlist_uploads.set(uploads)
@transaction.atomic @transaction.atomic
def migrate_libraries_to_playlist(apps, schema_editor): def migrate_libraries_to_playlist(apps, schema_editor):
@ -37,9 +39,24 @@ def migrate_libraries_to_playlist(apps, schema_editor):
Channel = apps.get_model("audio", "Channel") Channel = apps.get_model("audio", "Channel")
for library in Library.objects.all(): for library in Library.objects.all():
if (
not federation_utils.is_local(library.actor.fid)
or library.actor.name == "service"
):
continue
if (
hasattr(library, "playlist")
and library.playlist
and library.uploads.all().exists()
):
uploads = library.uploads.all()
with transaction.atomic():
insert_tracks_to_playlist(apps, library.playlist, uploads)
continue
if ( if (
Channel.objects.filter(library=library).exists() Channel.objects.filter(library=library).exists()
or library.name.startswith("playlist_")
or Playlist.objects.filter(library=library).exists() or Playlist.objects.filter(library=library).exists()
or not federation_utils.is_local(library.fid) or not federation_utils.is_local(library.fid)
or library.name in ["me", "instance", "everyone"] or library.name in ["me", "instance", "everyone"]
@ -68,7 +85,7 @@ def migrate_libraries_to_playlist(apps, schema_editor):
uploads = library.uploads.all() uploads = library.uploads.all()
with transaction.atomic(): with transaction.atomic():
insert_tracks_to_playlist(apps, playlist, uploads) insert_tracks_to_playlist(apps, playlist, uploads)
playlist.library.playlist_uploads.set(uploads)
except Exception as e: except Exception as e:
print(f"An error occurred during library.playlist creation : {e}") print(f"An error occurred during library.playlist creation : {e}")
continue continue
@ -94,6 +111,7 @@ def migrate_libraries_to_playlist(apps, schema_editor):
) )
for library in actor.libraries.filter(privacy_level=privacy_level): for library in actor.libraries.filter(privacy_level=privacy_level):
library.uploads.all().update(library=build_in_lib) library.uploads.all().update(library=build_in_lib)
library.delete
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@ -9,7 +9,7 @@ import uuid
def add_uploads_to_pl_library(playlist, library): def add_uploads_to_pl_library(playlist, library):
for plt in playlist.playlist_tracks.all(): for plt in playlist.playlist_tracks.all():
for upload in plt.track.uploads.filter(library__actor=playlist.actor): for upload in plt.track.uploads.filter(library__actor=playlist.actor):
library.playlist_uploads.add(upload) library.uploads.add(upload)
@transaction.atomic @transaction.atomic
@ -31,7 +31,7 @@ def create_playlist_libraries(apps, schema_editor):
uuid=(new_uuid := uuid.uuid4()), uuid=(new_uuid := uuid.uuid4()),
fid=federation_utils.full_url( fid=federation_utils.full_url(
reverse( reverse(
"federation:music:playlist-tracks-detail", "federation:music:libraries-detail",
kwargs={"uuid": new_uuid}, kwargs={"uuid": new_uuid},
) )
), ),

View File

@ -1,6 +1,7 @@
from uuid import uuid4 from uuid import uuid4
import pytest import pytest
from django.conf import settings
from django.utils.timezone import now from django.utils.timezone import now
# this test is commented since it's very slow, but it can be useful for future development # this test is commented since it's very slow, but it can be useful for future development
@ -102,11 +103,14 @@ def test_migrate_libraries_to_playlist(migrator):
Track = music_apps.get_model("music", "Track") Track = music_apps.get_model("music", "Track")
Library = music_apps.get_model("music", "Library") Library = music_apps.get_model("music", "Library")
Upload = music_apps.get_model("music", "Upload") Upload = music_apps.get_model("music", "Upload")
Playlist = music_apps.get_model("playlists", "Playlist")
Plt = music_apps.get_model("playlists", "PlaylistTrack")
# Create data # Create data
d = settings.FEDERATION_HOSTNAME
domain = Domain.objects.create() domain = Domain.objects.create()
domain2 = Domain.objects.create(pk=2) domain2 = Domain.objects.create(pk=2)
actor = Actor.objects.create(name="Test Actor", domain=domain) actor = Actor.objects.create(name="Test Actor", domain=domain, fid=f"http://{d}/")
target_actor = Actor.objects.create( target_actor = Actor.objects.create(
name="Test Actor 2", name="Test Actor 2",
domain=domain2, domain=domain2,
@ -115,7 +119,7 @@ def test_migrate_libraries_to_playlist(migrator):
library = Library.objects.create( library = Library.objects.create(
name="This should becane playlist name", name="This should becane playlist name",
actor=target_actor, actor=actor,
creation_date=now(), creation_date=now(),
privacy_level="everyone", privacy_level="everyone",
uuid=uuid4(), uuid=uuid4(),
@ -123,7 +127,7 @@ def test_migrate_libraries_to_playlist(migrator):
) )
library_not_local = Library.objects.create( library_not_local = Library.objects.create(
name="This should becane playlist name", name="This should not becane playlist name",
fid="https://asupernotlocal.acab/federation/music/libraries/8505207e-45da-449a-9ec8-ed12a848fcea", fid="https://asupernotlocal.acab/federation/music/libraries/8505207e-45da-449a-9ec8-ed12a848fcea",
actor=target_actor, actor=target_actor,
creation_date=now(), creation_date=now(),
@ -132,6 +136,22 @@ def test_migrate_libraries_to_playlist(migrator):
description="This is a description recalling to eat the rich", description="This is a description recalling to eat the rich",
) )
playlist = Playlist.objects.create(
name="This should becane a library name",
fid="https://asupernotlocal.acab/federation/music/playlist/8505207e-45da-449a-9ec8-ed12a848fcea",
actor=actor,
creation_date=now(),
privacy_level="everyone",
uuid=uuid4(),
)
playlist_not_local = Playlist.objects.create(
name="This should not becane a library name",
actor=target_actor,
creation_date=now(),
privacy_level="everyone",
uuid=uuid4(),
)
Track.objects.create() Track.objects.create()
Track.objects.create() Track.objects.create()
track = Track.objects.create() track = Track.objects.create()
@ -148,6 +168,13 @@ def test_migrate_libraries_to_playlist(migrator):
Upload.objects.create(library=library_not_local, track=track2), Upload.objects.create(library=library_not_local, track=track2),
Upload.objects.create(library=library_not_local, track=track3), Upload.objects.create(library=library_not_local, track=track3),
Plt.objects.create(playlist=playlist, track=track)
Plt.objects.create(
playlist=playlist_not_local,
track=track,
fid="https://asupernotlocal.acab/federation/music/playlistttrack/8505207e-",
)
library_follow = LibraryFollow.objects.create( library_follow = LibraryFollow.objects.create(
uuid=uuid4(), uuid=uuid4(),
target=library, target=library,
@ -195,11 +222,21 @@ def test_migrate_libraries_to_playlist(migrator):
assert upload.pk not in [u.pk for u in playlist.library.uploads.all()] assert upload.pk not in [u.pk for u in playlist.library.uploads.all()]
assert not playlist.library.uploads.all() assert not playlist.library.uploads.all()
# Not local
library_not_local = Library.objects.get(fid=library_not_local.fid)
assert not library_not_local.playlist_uploads.all()
# Test fail but works on real db I don't get why # Test fail but works on real db I don't get why
# no library are found in the new app # no library are found in the new app
# NewAppLibrary = new_apps.get_model("music", "Library") # NewAppLibrary = new_apps.get_model("music", "Library")
# assert NewAppLibrary.objects.count() == 3 # assert NewAppLibrary.objects.count() == 3
# Playlist
# library = Playlist.objects.get(name="This should becane a library name").library
# assert library.name == "This should becane a library name"
# assert library.privacy_level == "me"
# # Not local
# library_not_local = Library.objects.get(fid=library_not_local.fid)
# assert not library_not_local.playlist_uploads.all()
# playlist_not_local = Playlist.objects.get(
# name="This should not becane a library name"
# )
# assert not playlist_not_local.library