Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 107-actor-api
  • 170-channels-ui
  • 735-table-truncate
  • 839-donation-link
  • 865-sql-optimization
  • 890-notification
  • 925-flac-transcoding
  • Shleeble-develop-patch-44699
  • add-new-shortcuts
  • develop
  • fix-broken-playlist-cards
  • landing-page
  • limit-album-tracks
  • live-streaming
  • master
  • ollie/funkwhale-documentation-fixes
  • plugins
  • plugins-v2
  • rely-on-musicbrainz
  • vuln-testing
  • webdav
  • 0.1
  • 0.10
  • 0.11
  • 0.12
  • 0.13
  • 0.14
  • 0.14.1
  • 0.14.2
  • 0.15
  • 0.16
  • 0.16.1
  • 0.16.2
  • 0.16.3
  • 0.17
  • 0.18
  • 0.18.1
  • 0.18.2
  • 0.18.3
  • 0.19.0
  • 0.19.0-rc1
  • 0.19.0-rc2
  • 0.19.1
  • 0.2
  • 0.2.1
  • 0.2.2
  • 0.2.3
  • 0.2.4
  • 0.2.5
  • 0.2.6
  • 0.20.0
  • 0.20.0-rc1
  • 0.20.1
  • 0.3
  • 0.3.1
  • 0.3.2
  • 0.3.3
  • 0.3.4
  • 0.3.5
  • 0.4
  • 0.5
  • 0.5.1
  • 0.5.2
  • 0.5.3
  • 0.5.4
  • 0.6
  • 0.6.1
  • 0.7
  • 0.8
  • 0.9
  • 0.9.1
71 results

Target

Select target project
  • funkwhale/funkwhale
  • Luclu7/funkwhale
  • mbothorel/funkwhale
  • EorlBruder/funkwhale
  • tcit/funkwhale
  • JocelynDelalande/funkwhale
  • eneiluj/funkwhale
  • reg/funkwhale
  • ButterflyOfFire/funkwhale
  • m4sk1n/funkwhale
  • wxcafe/funkwhale
  • andybalaam/funkwhale
  • jcgruenhage/funkwhale
  • pblayo/funkwhale
  • joshuaboniface/funkwhale
  • n3ddy/funkwhale
  • gegeweb/funkwhale
  • tohojo/funkwhale
  • emillumine/funkwhale
  • Te-k/funkwhale
  • asaintgenis/funkwhale
  • anoadragon453/funkwhale
  • Sakada/funkwhale
  • ilianaw/funkwhale
  • l4p1n/funkwhale
  • pnizet/funkwhale
  • dante383/funkwhale
  • interfect/funkwhale
  • akhardya/funkwhale
  • svfusion/funkwhale
  • noplanman/funkwhale
  • nykopol/funkwhale
  • roipoussiere/funkwhale
  • Von/funkwhale
  • aurieh/funkwhale
  • icaria36/funkwhale
  • floreal/funkwhale
  • paulwalko/funkwhale
  • comradekingu/funkwhale
  • FurryJulie/funkwhale
  • Legolars99/funkwhale
  • Vierkantor/funkwhale
  • zachhats/funkwhale
  • heyjake/funkwhale
  • sn0w/funkwhale
  • jvoisin/funkwhale
  • gordon/funkwhale
  • Alexander/funkwhale
  • bignose/funkwhale
  • qasim.ali/funkwhale
  • fakegit/funkwhale
  • Kxze/funkwhale
  • stenstad/funkwhale
  • creak/funkwhale
  • Kaze/funkwhale
  • Tixie/funkwhale
  • IISergII/funkwhale
  • lfuelling/funkwhale
  • nhaddag/funkwhale
  • yoasif/funkwhale
  • ifischer/funkwhale
  • keslerm/funkwhale
  • flupe/funkwhale
  • petitminion/funkwhale
  • ariasuni/funkwhale
  • ollie/funkwhale
  • ngaumont/funkwhale
  • techknowlogick/funkwhale
  • Shleeble/funkwhale
  • theflyingfrog/funkwhale
  • jonatron/funkwhale
  • neobrain/funkwhale
  • eorn/funkwhale
  • KokaKiwi/funkwhale
  • u1-liquid/funkwhale
  • marzzzello/funkwhale
  • sirenwatcher/funkwhale
  • newer027/funkwhale
  • codl/funkwhale
  • Zwordi/funkwhale
  • gisforgabriel/funkwhale
  • iuriatan/funkwhale
  • simon/funkwhale
  • bheesham/funkwhale
  • zeoses/funkwhale
  • accraze/funkwhale
  • meliurwen/funkwhale
  • divadsn/funkwhale
  • Etua/funkwhale
  • sdrik/funkwhale
  • Soran/funkwhale
  • kuba-orlik/funkwhale
  • cristianvogel/funkwhale
  • Forceu/funkwhale
  • jeff/funkwhale
  • der_scheibenhacker/funkwhale
  • owlnical/funkwhale
  • jovuit/funkwhale
  • SilverFox15/funkwhale
  • phw/funkwhale
  • mayhem/funkwhale
  • sridhar/funkwhale
  • stromlin/funkwhale
  • rrrnld/funkwhale
  • nitaibezerra/funkwhale
  • jaller94/funkwhale
  • pcouy/funkwhale
  • eduxstad/funkwhale
  • codingHahn/funkwhale
  • captain/funkwhale
  • polyedre/funkwhale
  • leishenailong/funkwhale
  • ccritter/funkwhale
  • lnceballosz/funkwhale
  • fpiesche/funkwhale
  • Fanyx/funkwhale
  • markusblogde/funkwhale
  • Firobe/funkwhale
  • devilcius/funkwhale
  • freaktechnik/funkwhale
  • blopware/funkwhale
  • cone/funkwhale
  • thanksd/funkwhale
  • vachan-maker/funkwhale
  • bbenti/funkwhale
  • tarator/funkwhale
  • prplecake/funkwhale
  • DMarzal/funkwhale
  • lullis/funkwhale
  • hanacgr/funkwhale
  • albjeremias/funkwhale
  • xeruf/funkwhale
  • llelite/funkwhale
  • RoiArthurB/funkwhale
  • cloo/funkwhale
  • nztvar/funkwhale
  • Keunes/funkwhale
  • petitminion/funkwhale-petitminion
  • m-idler/funkwhale
  • SkyLeite/funkwhale
140 results
Select Git revision
  • 1.4.1-upgrade-release
  • 1121-download
  • 1218-smartplaylist_backend
  • 1373-login-form-move-reset-your-password-link
  • 1381-progress-bars
  • 1481
  • 1518-update-django-allauth
  • 1645
  • 1675-widget-improperly-configured-missing-resource-id
  • 1675-widget-improperly-configured-missing-resource-id-2
  • 1704-required-props-are-not-always-passed
  • 1716-add-frontend-tests-again
  • 1749-smtp-uri-configuration
  • 1930-first-upload-in-a-batch-always-fails
  • 1976-update-documentation-links-in-readme-files
  • 2054-player-layout
  • 2063-funkwhale-connection-interrupted-every-so-often-requires-network-reset-page-refresh
  • 2091-iii-6-improve-visuals-layout
  • 2151-refused-to-load-spa-manifest-json-2
  • 2154-add-to-playlist-pop-up-hidden-by-now-playing-screen
  • 2155-can-t-see-the-episode-list-of-a-podcast-as-an-anonymous-user-with-anonymous-access-enabled
  • 2156-add-management-command-to-change-file-ref-for-in-place-imported-files-to-s3
  • 2192-clear-queue-bug-when-random-shuffle-is-enabled
  • 2205-channel-page-pagination-link-dont-working
  • 2215-custom-logger-does-not-work-at-all-with-webkit-and-blink-based-browsers
  • 2228-troi-real-world-review
  • 2274-implement-new-upload-api
  • 2303-allow-users-to-own-tagged-items
  • 2395-far-right-filter
  • 2405-front-buttont-trigger-third-party-hook
  • 2408-troi-create-missing-tracks
  • 2416-revert-library-drop
  • 2448-complete-tags
  • 2452-fetch-third-party-metadata
  • 623-test
  • 653-enable-starting-embedded-player-at-a-specific-position-in-track
  • activitypub-overview
  • album-sliders
  • arne/2091-improve-visuals
  • back-option-for-edits
  • chore/2406-compose-modularity-scope
  • develop
  • develop-password-reset
  • env-file-cleanup
  • feat/2091-improve-visuals
  • fix-amd64-docker-build-gfortran
  • fix-gitpod
  • fix-plugins-dev-setup
  • fix-rate-limit-serializer
  • fix-schema-channel-metadata-choices
  • flupsi/2803-improve-visuals
  • flupsi/2804-new-upload-process
  • funkwhale-fix_pwa_manifest
  • funkwhale-petitminion-2136-bug-fix-prune-skipped-upload
  • funkwhale-ui-buttons
  • georg/add-typescript
  • gitpod/test-1866
  • global-button-experiment
  • global-buttons
  • juniorjpdj/pkg-repo
  • manage-py-reference
  • merge-review
  • minimal-python-version
  • petitminion-develop-patch-84496
  • pin-mutagen-to-1.46
  • pipenv
  • plugins
  • plugins-v2
  • plugins-v3
  • pre-release/1.3.0
  • prune_skipped_uploads_docs
  • renovate/front-all-dependencies
  • renovate/front-major-all-dependencies
  • schema-updates
  • small-gitpod-improvements
  • spectacular_schema
  • stable
  • tempArne
  • ui-buttons
  • update-frontend-dependencies
  • upload-process-spec
  • user-concept-docs
  • v2-artists
  • vite-ws-ssl-compatible
  • wip/2091-improve-visuals
  • wvffle/dependency-maintenance
  • wvffle/new-upload-process
  • wvffle/ui-rewrite-sidebar
  • wvffle/ui-sidebar
  • 0.1
  • 0.10
  • 0.11
  • 0.12
  • 0.13
  • 0.14
  • 0.14.1
  • 0.14.2
  • 0.15
  • 0.16
  • 0.16.1
  • 0.16.2
  • 0.16.3
  • 0.17
  • 0.18
  • 0.18.1
  • 0.18.2
  • 0.18.3
  • 0.19.0
  • 0.19.0-rc1
  • 0.19.0-rc2
  • 0.19.1
  • 0.2
  • 0.2.1
  • 0.2.2
  • 0.2.3
  • 0.2.4
  • 0.2.5
  • 0.2.6
  • 0.20.0
  • 0.20.0-rc1
  • 0.20.1
  • 0.21
  • 0.21-rc1
  • 0.21-rc2
  • 0.21.1
  • 0.21.2
  • 0.3
  • 0.3.1
  • 0.3.2
  • 0.3.3
  • 0.3.4
  • 0.3.5
  • 0.4
  • 0.5
  • 0.5.1
  • 0.5.2
  • 0.5.3
  • 0.5.4
  • 0.6
  • 0.6.1
  • 0.7
  • 0.8
  • 0.9
  • 0.9.1
  • 1.0
  • 1.0-rc1
  • 1.0.1
  • 1.1
  • 1.1-rc1
  • 1.1-rc2
  • 1.1.1
  • 1.1.2
  • 1.1.3
  • 1.1.4
  • 1.2.0
  • 1.2.0-rc1
  • 1.2.0-rc2
  • 1.2.0-testing
  • 1.2.0-testing2
  • 1.2.0-testing3
  • 1.2.0-testing4
  • 1.2.1
  • 1.2.10
  • 1.2.2
  • 1.2.3
  • 1.2.4
  • 1.2.5
  • 1.2.6
  • 1.2.6-1
  • 1.2.7
  • 1.2.8
  • 1.2.9
  • 1.3.0
  • 1.3.0-rc1
  • 1.3.0-rc2
  • 1.3.0-rc3
  • 1.3.0-rc4
  • 1.3.0-rc5
  • 1.3.0-rc6
  • 1.3.1
  • 1.3.2
  • 1.3.3
  • 1.3.4
  • 1.4.0
  • 1.4.0-rc1
  • 1.4.0-rc2
  • 1.4.1
  • 2.0.0-alpha.1
  • 2.0.0-alpha.2
189 results
Show changes
Commits on Source (3)
...@@ -178,12 +178,13 @@ class ArtistQuerySet(common_models.LocalFromFidQuerySet, models.QuerySet): ...@@ -178,12 +178,13 @@ class ArtistQuerySet(common_models.LocalFromFidQuerySet, models.QuerySet):
return self.annotate(is_playable_by_actor=subquery) return self.annotate(is_playable_by_actor=subquery)
def playable_by(self, actor, include=True): def playable_by(self, actor, include=True):
tracks = Track.objects.playable_by(actor, include) query = get_viewable_by_query(actor, "tracks__uploads__library") & models.Q(
matches = self.filter(tracks__in=tracks).values_list("pk") tracks__uploads__import_status="finished"
)
if include: if include:
return self.filter(pk__in=matches) return self.filter(query)
else: else:
return self.exclude(pk__in=matches) return self.exclude(query)
class Artist(APIModelMixin): class Artist(APIModelMixin):
...@@ -262,12 +263,13 @@ class AlbumQuerySet(common_models.LocalFromFidQuerySet, models.QuerySet): ...@@ -262,12 +263,13 @@ class AlbumQuerySet(common_models.LocalFromFidQuerySet, models.QuerySet):
return self.annotate(is_playable_by_actor=subquery) return self.annotate(is_playable_by_actor=subquery)
def playable_by(self, actor, include=True): def playable_by(self, actor, include=True):
tracks = Track.objects.playable_by(actor, include) query = get_viewable_by_query(actor, "tracks__uploads__library") & models.Q(
matches = self.filter(tracks__in=tracks).values_list("pk") tracks__uploads__import_status="finished"
)
if include: if include:
return self.filter(pk__in=matches) return self.filter(query)
else: else:
return self.exclude(pk__in=matches) return self.exclude(query)
def with_prefetched_tracks_and_playable_uploads(self, actor): def with_prefetched_tracks_and_playable_uploads(self, actor):
tracks = Track.objects.with_playable_uploads(actor) tracks = Track.objects.with_playable_uploads(actor)
...@@ -418,12 +420,13 @@ class TrackQuerySet(common_models.LocalFromFidQuerySet, models.QuerySet): ...@@ -418,12 +420,13 @@ class TrackQuerySet(common_models.LocalFromFidQuerySet, models.QuerySet):
return self.annotate(is_playable_by_actor=subquery) return self.annotate(is_playable_by_actor=subquery)
def playable_by(self, actor, include=True): def playable_by(self, actor, include=True):
files = Upload.objects.playable_by(actor, include) query = get_viewable_by_query(actor, "uploads__library") & models.Q(
matches = self.filter(uploads__in=files).values_list("pk") uploads__import_status="finished"
)
if include: if include:
return self.filter(pk__in=matches) return self.filter(query)
else: else:
return self.exclude(pk__in=matches) return self.exclude(query)
def with_playable_uploads(self, actor): def with_playable_uploads(self, actor):
uploads = Upload.objects.playable_by(actor).select_related("track") uploads = Upload.objects.playable_by(actor).select_related("track")
...@@ -598,11 +601,10 @@ class Track(APIModelMixin): ...@@ -598,11 +601,10 @@ class Track(APIModelMixin):
class UploadQuerySet(common_models.NullsLastQuerySet): class UploadQuerySet(common_models.NullsLastQuerySet):
def playable_by(self, actor, include=True): def playable_by(self, actor, include=True):
libraries = Library.objects.viewable_by(actor) query = get_viewable_by_query(actor, "library")
if include: if include:
return self.filter(library__in=libraries, import_status="finished") return self.filter(query, import_status="finished")
return self.exclude(library__in=libraries, import_status="finished") return self.exclude(query, import_status="finished")
def local(self, include=True): def local(self, include=True):
return self.exclude(library__actor__user__isnull=include) return self.exclude(library__actor__user__isnull=include)
...@@ -1025,34 +1027,50 @@ LIBRARY_PRIVACY_LEVEL_CHOICES = [ ...@@ -1025,34 +1027,50 @@ LIBRARY_PRIVACY_LEVEL_CHOICES = [
] ]
class LibraryQuerySet(models.QuerySet): def prefixed_query(path, **kwargs):
def with_follows(self, actor): if not path:
return self.prefetch_related( return models.Q(**kwargs)
models.Prefetch(
"received_follows",
queryset=federation_models.LibraryFollow.objects.filter(actor=actor),
to_attr="_follows",
)
)
def viewable_by(self, actor): prefixed_kwargs = {
"{}__{}".format(path, key): value for key, value in kwargs.items()
}
return models.Q(**prefixed_kwargs)
def get_viewable_by_query(actor, path=None):
from funkwhale_api.federation.models import LibraryFollow from funkwhale_api.federation.models import LibraryFollow
if actor is None: if actor is None:
return Library.objects.filter(privacy_level="everyone") return prefixed_query(path, privacy_level="everyone")
me_query = models.Q(privacy_level="me", actor=actor) me_query = prefixed_query(path, privacy_level="me", actor=actor)
instance_query = models.Q(privacy_level="instance", actor__domain=actor.domain) instance_query = prefixed_query(
path, privacy_level="instance", actor__domain=actor.domain
)
followed_libraries = LibraryFollow.objects.filter( followed_libraries = LibraryFollow.objects.filter(
actor=actor, approved=True actor=actor, approved=True
).values_list("target", flat=True) ).values_list("target", flat=True)
return Library.objects.filter( return (
me_query me_query
| instance_query | instance_query
| models.Q(privacy_level="everyone") | prefixed_query(path, privacy_level="everyone")
| models.Q(pk__in=followed_libraries) | prefixed_query(path, pk__in=followed_libraries)
)
class LibraryQuerySet(models.QuerySet):
def with_follows(self, actor):
return self.prefetch_related(
models.Prefetch(
"received_follows",
queryset=federation_models.LibraryFollow.objects.filter(actor=actor),
to_attr="_follows",
)
) )
def viewable_by(self, actor):
return self.filter(get_viewable_by_query(actor))
class Library(federation_models.FederationMixin): class Library(federation_models.FederationMixin):
uuid = models.UUIDField(unique=True, db_index=True, default=uuid.uuid4) uuid = models.UUIDField(unique=True, db_index=True, default=uuid.uuid4)
......
...@@ -11,3 +11,4 @@ pytest-env ...@@ -11,3 +11,4 @@ pytest-env
requests-mock requests-mock
pytest-randomly pytest-randomly
pytest-profiling<1.4 pytest-profiling<1.4
django-perf-rec
test_album_playable_by_anonymous:
- db: 'SELECT ... FROM "music_album" INNER JOIN "music_track" ON ("music_album"."id" = "music_track"."album_id") INNER JOIN "music_upload" ON ("music_track"."id" = "music_upload"."track_id") INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") WHERE ("music_library"."privacy_level" = # AND "music_upload"."import_status" = #) ORDER BY "music_album"."creation_date" DESC'
test_album_playable_by_anonymous.2:
- db: 'SELECT ... FROM "music_album" INNER JOIN "music_track" ON ("music_album"."id" = "music_track"."album_id") INNER JOIN "music_upload" ON ("music_track"."id" = "music_upload"."track_id") INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") WHERE ("music_library"."privacy_level" = # AND "music_upload"."import_status" = #) ORDER BY "music_album"."creation_date" DESC'
test_album_playable_by_correct_actor:
- db: 'SELECT ... FROM "music_album" INNER JOIN "music_track" ON ("music_album"."id" = "music_track"."album_id") INNER JOIN "music_upload" ON ("music_track"."id" = "music_upload"."track_id") INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") INNER JOIN "federation_actor" ON ("music_library"."actor_id" = "federation_actor"."id") WHERE ((("music_library"."actor_id" = # AND "music_library"."privacy_level" = #) OR ("federation_actor"."domain_id" = # AND "music_library"."privacy_level" = #) OR "music_library"."privacy_level" = # OR "music_upload"."library_id" IN (SELECT U0."target_id" FROM "federation_libraryfollow" U0 WHERE (U0."actor_id" = # AND U0."approved" = true))) AND "music_upload"."import_status" = #) ORDER BY "music_album"."creation_date" DESC'
test_album_playable_by_instance_actor:
- db: 'SELECT ... FROM "music_album" INNER JOIN "music_track" ON ("music_album"."id" = "music_track"."album_id") INNER JOIN "music_upload" ON ("music_track"."id" = "music_upload"."track_id") INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") INNER JOIN "federation_actor" ON ("music_library"."actor_id" = "federation_actor"."id") WHERE ((("music_library"."actor_id" = # AND "music_library"."privacy_level" = #) OR ("federation_actor"."domain_id" = # AND "music_library"."privacy_level" = #) OR "music_library"."privacy_level" = # OR "music_upload"."library_id" IN (SELECT U0."target_id" FROM "federation_libraryfollow" U0 WHERE (U0."actor_id" = # AND U0."approved" = true))) AND "music_upload"."import_status" = #) ORDER BY "music_album"."creation_date" DESC'
test_artist_playable_by_anonymous:
- db: 'SELECT ... FROM "music_artist" INNER JOIN "music_track" ON ("music_artist"."id" = "music_track"."artist_id") INNER JOIN "music_upload" ON ("music_track"."id" = "music_upload"."track_id") INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") WHERE ("music_library"."privacy_level" = # AND "music_upload"."import_status" = #) ORDER BY "music_artist"."creation_date" DESC'
test_artist_playable_by_correct_actor:
- db: 'SELECT ... FROM "music_artist" INNER JOIN "music_track" ON ("music_artist"."id" = "music_track"."artist_id") INNER JOIN "music_upload" ON ("music_track"."id" = "music_upload"."track_id") INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") INNER JOIN "federation_actor" ON ("music_library"."actor_id" = "federation_actor"."id") WHERE ((("music_library"."actor_id" = # AND "music_library"."privacy_level" = #) OR ("federation_actor"."domain_id" = # AND "music_library"."privacy_level" = #) OR "music_library"."privacy_level" = # OR "music_upload"."library_id" IN (SELECT U0."target_id" FROM "federation_libraryfollow" U0 WHERE (U0."actor_id" = # AND U0."approved" = true))) AND "music_upload"."import_status" = #) ORDER BY "music_artist"."creation_date" DESC'
test_artist_playable_by_instance_actor:
- db: 'SELECT ... FROM "music_artist" INNER JOIN "music_track" ON ("music_artist"."id" = "music_track"."artist_id") INNER JOIN "music_upload" ON ("music_track"."id" = "music_upload"."track_id") INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") INNER JOIN "federation_actor" ON ("music_library"."actor_id" = "federation_actor"."id") WHERE ((("music_library"."actor_id" = # AND "music_library"."privacy_level" = #) OR ("federation_actor"."domain_id" = # AND "music_library"."privacy_level" = #) OR "music_library"."privacy_level" = # OR "music_upload"."library_id" IN (SELECT U0."target_id" FROM "federation_libraryfollow" U0 WHERE (U0."actor_id" = # AND U0."approved" = true))) AND "music_upload"."import_status" = #) ORDER BY "music_artist"."creation_date" DESC'
test_artist_playable_by_instance_actor.2:
- db: 'SELECT ... FROM "music_artist" INNER JOIN "music_track" ON ("music_artist"."id" = "music_track"."artist_id") INNER JOIN "music_upload" ON ("music_track"."id" = "music_upload"."track_id") INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") INNER JOIN "federation_actor" ON ("music_library"."actor_id" = "federation_actor"."id") WHERE ((("music_library"."actor_id" = # AND "music_library"."privacy_level" = #) OR ("federation_actor"."domain_id" = # AND "music_library"."privacy_level" = #) OR "music_library"."privacy_level" = # OR "music_upload"."library_id" IN (SELECT U0."target_id" FROM "federation_libraryfollow" U0 WHERE (U0."actor_id" = # AND U0."approved" = true))) AND "music_upload"."import_status" = #) ORDER BY "music_artist"."creation_date" DESC'
test_playable_by_anonymous:
- db: 'SELECT ... FROM "music_upload" INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") WHERE ("music_upload"."library_id" = # AND "music_library"."privacy_level" = # AND "music_upload"."import_status" = #)'
test_playable_by_correct_actor:
- db: 'SELECT ... FROM "music_upload" INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") INNER JOIN "federation_actor" ON ("music_library"."actor_id" = "federation_actor"."id") WHERE ("music_upload"."library_id" = # AND (("music_library"."actor_id" = # AND "music_library"."privacy_level" = #) OR ("federation_actor"."domain_id" = # AND "music_library"."privacy_level" = #) OR "music_library"."privacy_level" = # OR "music_upload"."library_id" IN (SELECT U0."target_id" FROM "federation_libraryfollow" U0 WHERE (U0."actor_id" = # AND U0."approved" = true))) AND "music_upload"."import_status" = #)'
test_playable_by_correct_actor.2:
- db: 'SELECT ... FROM "music_upload" INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") INNER JOIN "federation_actor" ON ("music_library"."actor_id" = "federation_actor"."id") WHERE ("music_upload"."library_id" = # AND (("music_library"."actor_id" = # AND "music_library"."privacy_level" = #) OR ("federation_actor"."domain_id" = # AND "music_library"."privacy_level" = #) OR "music_library"."privacy_level" = # OR "music_upload"."library_id" IN (SELECT U0."target_id" FROM "federation_libraryfollow" U0 WHERE (U0."actor_id" = # AND U0."approved" = true))) AND "music_upload"."import_status" = #)'
test_playable_by_correct_status:
- db: 'SELECT ... FROM "music_upload" INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") WHERE ("music_upload"."library_id" = # AND "music_library"."privacy_level" = # AND "music_upload"."import_status" = #)'
test_playable_by_follower:
- db: 'SELECT ... FROM "music_upload" INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") INNER JOIN "federation_actor" ON ("music_library"."actor_id" = "federation_actor"."id") WHERE ("music_upload"."library_id" = # AND (("music_library"."actor_id" = # AND "music_library"."privacy_level" = #) OR ("federation_actor"."domain_id" = # AND "music_library"."privacy_level" = #) OR "music_library"."privacy_level" = # OR "music_upload"."library_id" IN (SELECT U0."target_id" FROM "federation_libraryfollow" U0 WHERE (U0."actor_id" = # AND U0."approved" = true))) AND "music_upload"."import_status" = #)'
test_playable_by_instance_actor:
- db: 'SELECT ... FROM "music_upload" INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") INNER JOIN "federation_actor" ON ("music_library"."actor_id" = "federation_actor"."id") WHERE ("music_upload"."library_id" = # AND (("music_library"."actor_id" = # AND "music_library"."privacy_level" = #) OR ("federation_actor"."domain_id" = # AND "music_library"."privacy_level" = #) OR "music_library"."privacy_level" = # OR "music_upload"."library_id" IN (SELECT U0."target_id" FROM "federation_libraryfollow" U0 WHERE (U0."actor_id" = # AND U0."approved" = true))) AND "music_upload"."import_status" = #)'
test_playable_by_instance_actor.2:
- db: 'SELECT ... FROM "music_upload" INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") INNER JOIN "federation_actor" ON ("music_library"."actor_id" = "federation_actor"."id") WHERE ("music_upload"."library_id" = # AND (("music_library"."actor_id" = # AND "music_library"."privacy_level" = #) OR ("federation_actor"."domain_id" = # AND "music_library"."privacy_level" = #) OR "music_library"."privacy_level" = # OR "music_upload"."library_id" IN (SELECT U0."target_id" FROM "federation_libraryfollow" U0 WHERE (U0."actor_id" = # AND U0."approved" = true))) AND "music_upload"."import_status" = #)'
test_track_playable_by_anonymous:
- db: 'SELECT ... FROM "music_track" INNER JOIN "music_upload" ON ("music_track"."id" = "music_upload"."track_id") INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") LEFT OUTER JOIN "music_album" ON ("music_track"."album_id" = "music_album"."id") WHERE ("music_library"."privacy_level" = # AND "music_upload"."import_status" = #) ORDER BY "music_album"."creation_date" DESC, "music_track"."disc_number" ASC, "music_track"."position" ASC'
test_track_playable_by_correct_actor:
- db: 'SELECT ... FROM "music_track" INNER JOIN "music_upload" ON ("music_track"."id" = "music_upload"."track_id") INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") INNER JOIN "federation_actor" ON ("music_library"."actor_id" = "federation_actor"."id") LEFT OUTER JOIN "music_album" ON ("music_track"."album_id" = "music_album"."id") WHERE ((("music_library"."actor_id" = # AND "music_library"."privacy_level" = #) OR ("federation_actor"."domain_id" = # AND "music_library"."privacy_level" = #) OR "music_library"."privacy_level" = # OR "music_upload"."library_id" IN (SELECT U0."target_id" FROM "federation_libraryfollow" U0 WHERE (U0."actor_id" = # AND U0."approved" = true))) AND "music_upload"."import_status" = #) ORDER BY "music_album"."creation_date" DESC, "music_track"."disc_number" ASC, "music_track"."position" ASC'
test_track_playable_by_instance_actor:
- db: 'SELECT ... FROM "music_track" INNER JOIN "music_upload" ON ("music_track"."id" = "music_upload"."track_id") INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") INNER JOIN "federation_actor" ON ("music_library"."actor_id" = "federation_actor"."id") LEFT OUTER JOIN "music_album" ON ("music_track"."album_id" = "music_album"."id") WHERE ((("music_library"."actor_id" = # AND "music_library"."privacy_level" = #) OR ("federation_actor"."domain_id" = # AND "music_library"."privacy_level" = #) OR "music_library"."privacy_level" = # OR "music_upload"."library_id" IN (SELECT U0."target_id" FROM "federation_libraryfollow" U0 WHERE (U0."actor_id" = # AND U0."approved" = true))) AND "music_upload"."import_status" = #) ORDER BY "music_album"."creation_date" DESC, "music_track"."disc_number" ASC, "music_track"."position" ASC'
test_track_playable_by_instance_actor.2:
- db: 'SELECT ... FROM "music_track" INNER JOIN "music_upload" ON ("music_track"."id" = "music_upload"."track_id") INNER JOIN "music_library" ON ("music_upload"."library_id" = "music_library"."id") INNER JOIN "federation_actor" ON ("music_library"."actor_id" = "federation_actor"."id") LEFT OUTER JOIN "music_album" ON ("music_track"."album_id" = "music_album"."id") WHERE ((("music_library"."actor_id" = # AND "music_library"."privacy_level" = #) OR ("federation_actor"."domain_id" = # AND "music_library"."privacy_level" = #) OR "music_library"."privacy_level" = # OR "music_upload"."library_id" IN (SELECT U0."target_id" FROM "federation_libraryfollow" U0 WHERE (U0."actor_id" = # AND U0."approved" = true))) AND "music_upload"."import_status" = #) ORDER BY "music_album"."creation_date" DESC, "music_track"."disc_number" ASC, "music_track"."position" ASC'
import os import os
import django_perf_rec
import pytest import pytest
from django.utils import timezone from django.utils import timezone
...@@ -215,6 +216,7 @@ def test_playable_by_correct_status(status, expected, factories): ...@@ -215,6 +216,7 @@ def test_playable_by_correct_status(status, expected, factories):
library__privacy_level="everyone", import_status=status library__privacy_level="everyone", import_status=status
) )
queryset = upload.library.uploads.playable_by(None) queryset = upload.library.uploads.playable_by(None)
with django_perf_rec.record():
match = upload in list(queryset) match = upload in list(queryset)
assert match is expected assert match is expected
...@@ -227,6 +229,7 @@ def test_playable_by_correct_actor(privacy_level, expected, factories): ...@@ -227,6 +229,7 @@ def test_playable_by_correct_actor(privacy_level, expected, factories):
library__privacy_level=privacy_level, import_status="finished" library__privacy_level=privacy_level, import_status="finished"
) )
queryset = upload.library.uploads.playable_by(upload.library.actor) queryset = upload.library.uploads.playable_by(upload.library.actor)
with django_perf_rec.record():
match = upload in list(queryset) match = upload in list(queryset)
assert match is expected assert match is expected
...@@ -240,6 +243,7 @@ def test_playable_by_instance_actor(privacy_level, expected, factories): ...@@ -240,6 +243,7 @@ def test_playable_by_instance_actor(privacy_level, expected, factories):
) )
instance_actor = factories["federation.Actor"](domain=upload.library.actor.domain) instance_actor = factories["federation.Actor"](domain=upload.library.actor.domain)
queryset = upload.library.uploads.playable_by(instance_actor) queryset = upload.library.uploads.playable_by(instance_actor)
with django_perf_rec.record():
match = upload in list(queryset) match = upload in list(queryset)
assert match is expected assert match is expected
...@@ -252,6 +256,7 @@ def test_playable_by_anonymous(privacy_level, expected, factories): ...@@ -252,6 +256,7 @@ def test_playable_by_anonymous(privacy_level, expected, factories):
library__privacy_level=privacy_level, import_status="finished" library__privacy_level=privacy_level, import_status="finished"
) )
queryset = upload.library.uploads.playable_by(None) queryset = upload.library.uploads.playable_by(None)
with django_perf_rec.record():
match = upload in list(queryset) match = upload in list(queryset)
assert match is expected assert match is expected
...@@ -266,6 +271,7 @@ def test_playable_by_follower(approved, factories): ...@@ -266,6 +271,7 @@ def test_playable_by_follower(approved, factories):
target=upload.library, actor=actor, approved=approved target=upload.library, actor=actor, approved=approved
) )
queryset = upload.library.uploads.playable_by(actor) queryset = upload.library.uploads.playable_by(actor)
with django_perf_rec.record():
match = upload in list(queryset) match = upload in list(queryset)
expected = approved expected = approved
assert match is expected assert match is expected
...@@ -279,6 +285,7 @@ def test_track_playable_by_correct_actor(privacy_level, expected, factories): ...@@ -279,6 +285,7 @@ def test_track_playable_by_correct_actor(privacy_level, expected, factories):
queryset = models.Track.objects.playable_by( queryset = models.Track.objects.playable_by(
upload.library.actor upload.library.actor
).annotate_playable_by_actor(upload.library.actor) ).annotate_playable_by_actor(upload.library.actor)
with django_perf_rec.record():
match = upload.track in list(queryset) match = upload.track in list(queryset)
assert match is expected assert match is expected
if expected: if expected:
...@@ -296,6 +303,7 @@ def test_track_playable_by_instance_actor(privacy_level, expected, factories): ...@@ -296,6 +303,7 @@ def test_track_playable_by_instance_actor(privacy_level, expected, factories):
queryset = models.Track.objects.playable_by( queryset = models.Track.objects.playable_by(
instance_actor instance_actor
).annotate_playable_by_actor(instance_actor) ).annotate_playable_by_actor(instance_actor)
with django_perf_rec.record():
match = upload.track in list(queryset) match = upload.track in list(queryset)
assert match is expected assert match is expected
if expected: if expected:
...@@ -310,6 +318,7 @@ def test_track_playable_by_anonymous(privacy_level, expected, factories): ...@@ -310,6 +318,7 @@ def test_track_playable_by_anonymous(privacy_level, expected, factories):
library__privacy_level=privacy_level, import_status="finished" library__privacy_level=privacy_level, import_status="finished"
) )
queryset = models.Track.objects.playable_by(None).annotate_playable_by_actor(None) queryset = models.Track.objects.playable_by(None).annotate_playable_by_actor(None)
with django_perf_rec.record():
match = upload.track in list(queryset) match = upload.track in list(queryset)
assert match is expected assert match is expected
if expected: if expected:
...@@ -325,6 +334,7 @@ def test_album_playable_by_correct_actor(privacy_level, expected, factories): ...@@ -325,6 +334,7 @@ def test_album_playable_by_correct_actor(privacy_level, expected, factories):
queryset = models.Album.objects.playable_by( queryset = models.Album.objects.playable_by(
upload.library.actor upload.library.actor
).annotate_playable_by_actor(upload.library.actor) ).annotate_playable_by_actor(upload.library.actor)
with django_perf_rec.record():
match = upload.track.album in list(queryset) match = upload.track.album in list(queryset)
assert match is expected assert match is expected
if expected: if expected:
...@@ -342,6 +352,7 @@ def test_album_playable_by_instance_actor(privacy_level, expected, factories): ...@@ -342,6 +352,7 @@ def test_album_playable_by_instance_actor(privacy_level, expected, factories):
queryset = models.Album.objects.playable_by( queryset = models.Album.objects.playable_by(
instance_actor instance_actor
).annotate_playable_by_actor(instance_actor) ).annotate_playable_by_actor(instance_actor)
with django_perf_rec.record():
match = upload.track.album in list(queryset) match = upload.track.album in list(queryset)
assert match is expected assert match is expected
if expected: if expected:
...@@ -356,6 +367,7 @@ def test_album_playable_by_anonymous(privacy_level, expected, factories): ...@@ -356,6 +367,7 @@ def test_album_playable_by_anonymous(privacy_level, expected, factories):
library__privacy_level=privacy_level, import_status="finished" library__privacy_level=privacy_level, import_status="finished"
) )
queryset = models.Album.objects.playable_by(None).annotate_playable_by_actor(None) queryset = models.Album.objects.playable_by(None).annotate_playable_by_actor(None)
with django_perf_rec.record():
match = upload.track.album in list(queryset) match = upload.track.album in list(queryset)
assert match is expected assert match is expected
if expected: if expected:
...@@ -371,6 +383,7 @@ def test_artist_playable_by_correct_actor(privacy_level, expected, factories): ...@@ -371,6 +383,7 @@ def test_artist_playable_by_correct_actor(privacy_level, expected, factories):
queryset = models.Artist.objects.playable_by( queryset = models.Artist.objects.playable_by(
upload.library.actor upload.library.actor
).annotate_playable_by_actor(upload.library.actor) ).annotate_playable_by_actor(upload.library.actor)
with django_perf_rec.record():
match = upload.track.artist in list(queryset) match = upload.track.artist in list(queryset)
assert match is expected assert match is expected
if expected: if expected:
...@@ -388,6 +401,7 @@ def test_artist_playable_by_instance_actor(privacy_level, expected, factories): ...@@ -388,6 +401,7 @@ def test_artist_playable_by_instance_actor(privacy_level, expected, factories):
queryset = models.Artist.objects.playable_by( queryset = models.Artist.objects.playable_by(
instance_actor instance_actor
).annotate_playable_by_actor(instance_actor) ).annotate_playable_by_actor(instance_actor)
with django_perf_rec.record():
match = upload.track.artist in list(queryset) match = upload.track.artist in list(queryset)
assert match is expected assert match is expected
if expected: if expected:
...@@ -402,6 +416,7 @@ def test_artist_playable_by_anonymous(privacy_level, expected, factories): ...@@ -402,6 +416,7 @@ def test_artist_playable_by_anonymous(privacy_level, expected, factories):
library__privacy_level=privacy_level, import_status="finished" library__privacy_level=privacy_level, import_status="finished"
) )
queryset = models.Artist.objects.playable_by(None).annotate_playable_by_actor(None) queryset = models.Artist.objects.playable_by(None).annotate_playable_by_actor(None)
with django_perf_rec.record():
match = upload.track.artist in list(queryset) match = upload.track.artist in list(queryset)
assert match is expected assert match is expected
if expected: if expected:
......