Skip to content
Snippets Groups Projects
Verified Commit 663600d5 authored by Eliot Berriot's avatar Eliot Berriot
Browse files

Merge branch 'master' into develop

parents f56c9aa0 353ac081
No related branches found
No related tags found
No related merge requests found
......@@ -323,7 +323,7 @@ if AWS_ACCESS_KEY_ID:
AWS_S3_REGION_NAME = env("AWS_S3_REGION_NAME", default=None)
AWS_S3_SIGNATURE_VERSION = "s3v4"
AWS_LOCATION = env("AWS_LOCATION", default="")
DEFAULT_FILE_STORAGE = "storages.backends.s3boto3.S3Boto3Storage"
DEFAULT_FILE_STORAGE = "funkwhale_api.common.storage.ASCIIS3Boto3Storage"
# See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_DIRS
STATICFILES_DIRS = (str(APPS_DIR.path("static")),)
......
import unicodedata
import slugify
from django.core.files.storage import FileSystemStorage
from storages.backends.s3boto3 import S3Boto3Storage
class ASCIIFileSystemStorage(FileSystemStorage):
def asciionly(name):
"""
Convert unicode characters in name to ASCII characters.
"""
return slugify.slugify(name, ok=slugify.SLUG_OK + ".", only_ascii=True)
class ASCIIFileSystemStorage(FileSystemStorage):
def get_valid_name(self, name):
return super().get_valid_name(asciionly(name))
class ASCIIS3Boto3Storage(S3Boto3Storage):
def get_valid_name(self, name):
name = unicodedata.normalize("NFKD", name).encode("ascii", "ignore")
return super().get_valid_name(name)
return super().get_valid_name(asciionly(name))
......@@ -69,3 +69,4 @@ autobahn>=19.3.3
django-oauth-toolkit==1.2
django-storages==1.7.1
boto3<3
unicode-slugify
import pytest
from funkwhale_api.common import storage
@pytest.mark.parametrize(
"filename, expected",
[("집으로 가는 길.mp3", "jibeuro-ganeun-gil.mp3"), ("éàe*$i$.ogg", "eaei.ogg")],
)
def test_asciionly(filename, expected):
assert storage.asciionly(filename) == expected
@pytest.mark.parametrize(
"storage_class, parent_class",
[
(storage.ASCIIFileSystemStorage, storage.FileSystemStorage),
(storage.ASCIIS3Boto3Storage, storage.S3Boto3Storage),
],
)
def test_ascii_storage_call_asciionly(storage_class, parent_class, mocker):
"""Cf #847"""
asciionly = mocker.patch.object(storage, "asciionly")
parent_get_valid_filename = mocker.patch.object(parent_class, "get_valid_name")
st = storage_class()
assert st.get_valid_name("test") == parent_get_valid_filename.return_value
asciionly.assert_called_once_with("test")
parent_get_valid_filename.assert_called_once_with(asciionly.return_value)
Hide pod statistics on about page if those are disabled (#835)
Use ASCII filename before upload to S3 to avoid playback issues (#847)
<template>
<div>
<div v-if="stats" class="ui stackable two column grid">
<div v-if="stats && stats.trackFavorites !== undefined" class="ui stackable two column grid">
<div class="column">
<h3 class="ui left aligned header">
<translate translate-context="Content/About/Title/Noun">User activity</translate>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment