Merge branch 'master' into develop
This commit is contained in:
commit
88c6c2bdbc
14 changed files with 78 additions and 5 deletions
|
|
@ -218,3 +218,12 @@ class AlbumFilter(
|
|||
def filter_playable(self, queryset, name, value):
|
||||
actor = utils.get_actor_from_request(self.request)
|
||||
return queryset.playable_by(actor, value)
|
||||
|
||||
|
||||
class LibraryFilter(filters.FilterSet):
|
||||
q = fields.SearchFilter(search_fields=["name"],)
|
||||
scope = common_filters.ActorScopeFilter(actor_field="actor", distinct=True)
|
||||
|
||||
class Meta:
|
||||
model = models.Library
|
||||
fields = ["privacy_level", "q", "scope"]
|
||||
|
|
|
|||
|
|
@ -27,7 +27,8 @@ def crawl_dir(dir, extensions, recursive=True, ignored=[]):
|
|||
if os.path.isfile(dir):
|
||||
yield dir
|
||||
return
|
||||
with os.scandir(dir) as scanner:
|
||||
try:
|
||||
scanner = os.scandir(dir)
|
||||
for entry in scanner:
|
||||
if entry.is_file():
|
||||
for e in extensions:
|
||||
|
|
@ -38,6 +39,9 @@ def crawl_dir(dir, extensions, recursive=True, ignored=[]):
|
|||
yield from crawl_dir(
|
||||
entry, extensions, recursive=recursive, ignored=ignored
|
||||
)
|
||||
finally:
|
||||
if hasattr(scanner, "close"):
|
||||
scanner.close()
|
||||
|
||||
|
||||
def batch(iterable, n=1):
|
||||
|
|
|
|||
|
|
@ -273,6 +273,7 @@ class LibraryViewSet(
|
|||
oauth_permissions.ScopePermission,
|
||||
common_permissions.OwnerPermission,
|
||||
]
|
||||
filterset_class = filters.LibraryFilter
|
||||
required_scope = "libraries"
|
||||
anonymous_policy = "setting"
|
||||
owner_field = "actor.user"
|
||||
|
|
@ -282,8 +283,12 @@ class LibraryViewSet(
|
|||
qs = super().get_queryset()
|
||||
# allow retrieving a single library by uuid if request.user isn't
|
||||
# the owner. Any other get should be from the owner only
|
||||
if self.action != "retrieve":
|
||||
if self.action not in ["retrieve", "list"]:
|
||||
qs = qs.filter(actor=self.request.user.actor)
|
||||
if self.action == "list":
|
||||
actor = utils.get_actor_from_request(self.request)
|
||||
qs = qs.viewable_by(actor)
|
||||
|
||||
return qs
|
||||
|
||||
def perform_create(self, serializer):
|
||||
|
|
|
|||
BIN
api/tests/files/nested/valid.ogg
Normal file
BIN
api/tests/files/nested/valid.ogg
Normal file
Binary file not shown.
|
|
@ -631,10 +631,10 @@ def test_user_can_create_library(factories, logged_in_api_client):
|
|||
def test_user_can_list_their_library(factories, logged_in_api_client):
|
||||
actor = logged_in_api_client.user.create_actor()
|
||||
library = factories["music.Library"](actor=actor)
|
||||
factories["music.Library"]()
|
||||
factories["music.Library"](privacy_level="everyone")
|
||||
|
||||
url = reverse("api:v1:libraries-list")
|
||||
response = logged_in_api_client.get(url)
|
||||
response = logged_in_api_client.get(url, {"scope": "me"})
|
||||
|
||||
assert response.status_code == 200
|
||||
assert response.data["count"] == 1
|
||||
|
|
@ -651,6 +651,19 @@ def test_user_can_retrieve_another_user_library(factories, logged_in_api_client)
|
|||
assert response.data["uuid"] == str(library.uuid)
|
||||
|
||||
|
||||
def test_user_can_list_public_libraries(factories, api_client, preferences):
|
||||
preferences["common__api_authentication_required"] = False
|
||||
library = factories["music.Library"](privacy_level="everyone")
|
||||
factories["music.Library"](privacy_level="me")
|
||||
|
||||
url = reverse("api:v1:libraries-list")
|
||||
response = api_client.get(url)
|
||||
|
||||
assert response.status_code == 200
|
||||
assert response.data["count"] == 1
|
||||
assert response.data["results"][0]["uuid"] == str(library.uuid)
|
||||
|
||||
|
||||
def test_library_list_excludes_channel_library(factories, logged_in_api_client):
|
||||
actor = logged_in_api_client.user.create_actor()
|
||||
factories["audio.Channel"](attributed_to=actor)
|
||||
|
|
|
|||
|
|
@ -352,3 +352,17 @@ def test_handle_modified_update_existing_path_if_found_and_attributed_to(
|
|||
event=event, stdout=stdout, library=library, in_place=True,
|
||||
)
|
||||
update_track_metadata.assert_not_called()
|
||||
|
||||
|
||||
def test_import_files(factories, capsys):
|
||||
# smoke test to ensure the command run properly
|
||||
library = factories["music.Library"](actor__local=True)
|
||||
call_command(
|
||||
"import_files", str(library.uuid), DATA_DIR, interactive=False, recursive=True
|
||||
)
|
||||
captured = capsys.readouterr()
|
||||
|
||||
imported = library.uploads.filter(import_status="finished").count()
|
||||
assert imported > 0
|
||||
assert "Successfully imported {} new tracks".format(imported) in captured.out
|
||||
assert "For details, please refer to import reference" in captured.out
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue