Blacked the code

This commit is contained in:
Eliot Berriot 2018-06-09 15:36:16 +02:00
commit 62ca3bd736
No known key found for this signature in database
GPG key ID: DD6965E2476E5C27
279 changed files with 8890 additions and 9556 deletions

View file

@ -5,11 +5,10 @@ from dynamic_preferences.registries import global_preferences_registry
class FunkwhaleAccountAdapter(DefaultAccountAdapter):
def is_open_for_signup(self, request):
manager = global_preferences_registry.manager()
return manager['users__registration_enabled']
return manager["users__registration_enabled"]
def send_mail(self, template_prefix, email, context):
context['funkwhale_url'] = settings.FUNKWHALE_URL
context["funkwhale_url"] = settings.FUNKWHALE_URL
return super().send_mail(template_prefix, email, context)

View file

@ -17,9 +17,9 @@ class MyUserChangeForm(UserChangeForm):
class MyUserCreationForm(UserCreationForm):
error_message = UserCreationForm.error_messages.update({
'duplicate_username': 'This username has already been taken.'
})
error_message = UserCreationForm.error_messages.update(
{"duplicate_username": "This username has already been taken."}
)
class Meta(UserCreationForm.Meta):
model = User
@ -30,7 +30,7 @@ class MyUserCreationForm(UserCreationForm):
User.objects.get(username=username)
except User.DoesNotExist:
return username
raise forms.ValidationError(self.error_messages['duplicate_username'])
raise forms.ValidationError(self.error_messages["duplicate_username"])
@admin.register(User)
@ -38,38 +38,39 @@ class UserAdmin(AuthUserAdmin):
form = MyUserChangeForm
add_form = MyUserCreationForm
list_display = [
'username',
'email',
'date_joined',
'last_login',
'is_staff',
'is_superuser',
"username",
"email",
"date_joined",
"last_login",
"is_staff",
"is_superuser",
]
list_filter = [
'is_superuser',
'is_staff',
'privacy_level',
'permission_settings',
'permission_library',
'permission_federation',
"is_superuser",
"is_staff",
"privacy_level",
"permission_settings",
"permission_library",
"permission_federation",
]
fieldsets = (
(None, {'fields': ('username', 'password', 'privacy_level')}),
(_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
(_('Permissions'), {
'fields': (
'is_active',
'is_staff',
'is_superuser',
'permission_upload',
'permission_library',
'permission_settings',
'permission_federation')}),
(_('Important dates'), {'fields': ('last_login', 'date_joined')}),
(_('Useless fields'), {
'fields': (
'user_permissions',
'groups',
)})
)
(None, {"fields": ("username", "password", "privacy_level")}),
(_("Personal info"), {"fields": ("first_name", "last_name", "email")}),
(
_("Permissions"),
{
"fields": (
"is_active",
"is_staff",
"is_superuser",
"permission_upload",
"permission_library",
"permission_settings",
"permission_federation",
)
},
),
(_("Important dates"), {"fields": ("last_login", "date_joined")}),
(_("Useless fields"), {"fields": ("user_permissions", "groups")}),
)

View file

@ -2,6 +2,6 @@ from rest_framework import routers
from . import views
router = routers.SimpleRouter()
router.register(r'users', views.UserViewSet, 'users')
router.register(r"users", views.UserViewSet, "users")
urlpatterns = router.urls

View file

@ -5,36 +5,26 @@ from funkwhale_api.common import preferences as common_preferences
from . import models
users = types.Section('users')
users = types.Section("users")
@global_preferences_registry.register
class RegistrationEnabled(types.BooleanPreference):
show_in_api = True
section = users
name = 'registration_enabled'
name = "registration_enabled"
default = False
verbose_name = 'Open registrations to new users'
help_text = (
'When enabled, new users will be able to register on this instance.'
)
verbose_name = "Open registrations to new users"
help_text = "When enabled, new users will be able to register on this instance."
@global_preferences_registry.register
class DefaultPermissions(common_preferences.StringListPreference):
show_in_api = True
section = users
name = 'default_permissions'
name = "default_permissions"
default = []
verbose_name = 'Default permissions'
help_text = (
'A list of default preferences to give to all registered users.'
)
choices = [
(k, c['label'])
for k, c in models.PERMISSIONS_CONFIGURATION.items()
]
field_kwargs = {
'choices': choices,
'required': False,
}
verbose_name = "Default permissions"
help_text = "A list of default preferences to give to all registered users."
choices = [(k, c["label"]) for k, c in models.PERMISSIONS_CONFIGURATION.items()]
field_kwargs = {"choices": choices, "required": False}

View file

@ -6,10 +6,10 @@ from django.contrib.auth.models import Permission
@registry.register
class GroupFactory(factory.django.DjangoModelFactory):
name = factory.Sequence(lambda n: 'group-{0}'.format(n))
name = factory.Sequence(lambda n: "group-{0}".format(n))
class Meta:
model = 'auth.Group'
model = "auth.Group"
@factory.post_generation
def perms(self, create, extracted, **kwargs):
@ -20,8 +20,7 @@ class GroupFactory(factory.django.DjangoModelFactory):
if extracted:
perms = [
Permission.objects.get(
content_type__app_label=p.split('.')[0],
codename=p.split('.')[1],
content_type__app_label=p.split(".")[0], codename=p.split(".")[1]
)
for p in extracted
]
@ -31,15 +30,15 @@ class GroupFactory(factory.django.DjangoModelFactory):
@registry.register
class UserFactory(factory.django.DjangoModelFactory):
username = factory.Sequence(lambda n: 'user-{0}'.format(n))
email = factory.Sequence(lambda n: 'user-{0}@example.com'.format(n))
password = factory.PostGenerationMethodCall('set_password', 'test')
username = factory.Sequence(lambda n: "user-{0}".format(n))
email = factory.Sequence(lambda n: "user-{0}@example.com".format(n))
password = factory.PostGenerationMethodCall("set_password", "test")
subsonic_api_token = None
groups = ManyToManyFromList('groups')
groups = ManyToManyFromList("groups")
class Meta:
model = 'users.User'
django_get_or_create = ('username', )
model = "users.User"
django_get_or_create = ("username",)
@factory.post_generation
def perms(self, create, extracted, **kwargs):
@ -50,8 +49,7 @@ class UserFactory(factory.django.DjangoModelFactory):
if extracted:
perms = [
Permission.objects.get(
content_type__app_label=p.split('.')[0],
codename=p.split('.')[1],
content_type__app_label=p.split(".")[0], codename=p.split(".")[1]
)
for p in extracted
]
@ -59,7 +57,7 @@ class UserFactory(factory.django.DjangoModelFactory):
self.user_permissions.add(*perms)
@registry.register(name='users.SuperUser')
@registry.register(name="users.SuperUser")
class SuperUserFactory(UserFactory):
is_staff = True
is_superuser = True

View file

@ -9,36 +9,129 @@ import django.core.validators
class Migration(migrations.Migration):
dependencies = [
('auth', '0006_require_contenttypes_0002'),
]
dependencies = [("auth", "0006_require_contenttypes_0002")]
operations = [
migrations.CreateModel(
name='User',
name="User",
fields=[
('id', models.AutoField(primary_key=True, verbose_name='ID', serialize=False, auto_created=True)),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(null=True, verbose_name='last login', blank=True)),
('is_superuser', models.BooleanField(help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status', default=False)),
('username', models.CharField(max_length=30, validators=[django.core.validators.RegexValidator('^[\\w.@+-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.', 'invalid')], verbose_name='username', error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.', unique=True)),
('first_name', models.CharField(max_length=30, verbose_name='first name', blank=True)),
('last_name', models.CharField(max_length=30, verbose_name='last name', blank=True)),
('email', models.EmailField(max_length=254, verbose_name='email address', blank=True)),
('is_staff', models.BooleanField(help_text='Designates whether the user can log into this admin site.', verbose_name='staff status', default=False)),
('is_active', models.BooleanField(help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active', default=True)),
('date_joined', models.DateTimeField(verbose_name='date joined', default=django.utils.timezone.now)),
('groups', models.ManyToManyField(related_name='user_set', blank=True, verbose_name='groups', to='auth.Group', help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_query_name='user')),
('user_permissions', models.ManyToManyField(related_name='user_set', blank=True, verbose_name='user permissions', to='auth.Permission', help_text='Specific permissions for this user.', related_query_name='user')),
('name', models.CharField(max_length=255, verbose_name='Name of User', blank=True)),
(
"id",
models.AutoField(
primary_key=True,
verbose_name="ID",
serialize=False,
auto_created=True,
),
),
("password", models.CharField(max_length=128, verbose_name="password")),
(
"last_login",
models.DateTimeField(
null=True, verbose_name="last login", blank=True
),
),
(
"is_superuser",
models.BooleanField(
help_text="Designates that this user has all permissions without explicitly assigning them.",
verbose_name="superuser status",
default=False,
),
),
(
"username",
models.CharField(
max_length=30,
validators=[
django.core.validators.RegexValidator(
"^[\\w.@+-]+$",
"Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.",
"invalid",
)
],
verbose_name="username",
error_messages={
"unique": "A user with that username already exists."
},
help_text="Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.",
unique=True,
),
),
(
"first_name",
models.CharField(
max_length=30, verbose_name="first name", blank=True
),
),
(
"last_name",
models.CharField(
max_length=30, verbose_name="last name", blank=True
),
),
(
"email",
models.EmailField(
max_length=254, verbose_name="email address", blank=True
),
),
(
"is_staff",
models.BooleanField(
help_text="Designates whether the user can log into this admin site.",
verbose_name="staff status",
default=False,
),
),
(
"is_active",
models.BooleanField(
help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.",
verbose_name="active",
default=True,
),
),
(
"date_joined",
models.DateTimeField(
verbose_name="date joined", default=django.utils.timezone.now
),
),
(
"groups",
models.ManyToManyField(
related_name="user_set",
blank=True,
verbose_name="groups",
to="auth.Group",
help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.",
related_query_name="user",
),
),
(
"user_permissions",
models.ManyToManyField(
related_name="user_set",
blank=True,
verbose_name="user permissions",
to="auth.Permission",
help_text="Specific permissions for this user.",
related_query_name="user",
),
),
(
"name",
models.CharField(
max_length=255, verbose_name="Name of User", blank=True
),
),
],
options={
'verbose_name': 'user',
'abstract': False,
'verbose_name_plural': 'users',
"verbose_name": "user",
"abstract": False,
"verbose_name_plural": "users",
},
managers=[
('objects', django.contrib.auth.models.UserManager()),
],
),
managers=[("objects", django.contrib.auth.models.UserManager())],
)
]

View file

@ -9,20 +9,23 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0001_initial'),
]
dependencies = [("users", "0001_initial")]
operations = [
migrations.AlterModelManagers(
name='user',
managers=[
('objects', django.contrib.auth.models.UserManager()),
],
name="user",
managers=[("objects", django.contrib.auth.models.UserManager())],
),
migrations.AlterField(
model_name='user',
name='username',
field=models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username'),
model_name="user",
name="username",
field=models.CharField(
error_messages={"unique": "A user with that username already exists."},
help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.",
max_length=150,
unique=True,
validators=[django.contrib.auth.validators.UnicodeUsernameValidator()],
verbose_name="username",
),
),
]

View file

@ -6,19 +6,19 @@ import uuid
class Migration(migrations.Migration):
dependencies = [
('users', '0002_auto_20171214_2205'),
]
dependencies = [("users", "0002_auto_20171214_2205")]
operations = [
migrations.AddField(
model_name='user',
name='secret_key',
model_name="user",
name="secret_key",
field=models.UUIDField(default=uuid.uuid4, null=True),
),
migrations.AlterField(
model_name='user',
name='last_name',
field=models.CharField(blank=True, max_length=150, verbose_name='last name'),
model_name="user",
name="last_name",
field=models.CharField(
blank=True, max_length=150, verbose_name="last name"
),
),
]

View file

@ -5,14 +5,21 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0003_auto_20171226_1357'),
]
dependencies = [("users", "0003_auto_20171226_1357")]
operations = [
migrations.AddField(
model_name='user',
name='privacy_level',
field=models.CharField(choices=[('me', 'Only me'), ('followers', 'Me and my followers'), ('instance', 'Everyone on my instance, and my followers'), ('everyone', 'Everyone, including people on other instances')], default='instance', max_length=30),
),
model_name="user",
name="privacy_level",
field=models.CharField(
choices=[
("me", "Only me"),
("followers", "Me and my followers"),
("instance", "Everyone on my instance, and my followers"),
("everyone", "Everyone, including people on other instances"),
],
default="instance",
max_length=30,
),
)
]

View file

@ -5,14 +5,12 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0004_user_privacy_level'),
]
dependencies = [("users", "0004_user_privacy_level")]
operations = [
migrations.AddField(
model_name='user',
name='subsonic_api_token',
model_name="user",
name="subsonic_api_token",
field=models.CharField(blank=True, max_length=255, null=True),
),
)
]

View file

@ -5,24 +5,22 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0005_user_subsonic_api_token'),
]
dependencies = [("users", "0005_user_subsonic_api_token")]
operations = [
migrations.AddField(
model_name='user',
name='permission_federation',
model_name="user",
name="permission_federation",
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='user',
name='permission_library',
model_name="user",
name="permission_library",
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='user',
name='permission_settings',
model_name="user",
name="permission_settings",
field=models.BooleanField(default=False),
),
]

View file

@ -5,29 +5,37 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0006_auto_20180517_2324'),
]
dependencies = [("users", "0006_auto_20180517_2324")]
operations = [
migrations.AddField(
model_name='user',
name='permission_upload',
field=models.BooleanField(default=False, verbose_name='Upload new content to the library'),
model_name="user",
name="permission_upload",
field=models.BooleanField(
default=False, verbose_name="Upload new content to the library"
),
),
migrations.AlterField(
model_name='user',
name='permission_federation',
field=models.BooleanField(default=False, help_text='Follow other instances, accept/deny library follow requests...', verbose_name='Manage library federation'),
model_name="user",
name="permission_federation",
field=models.BooleanField(
default=False,
help_text="Follow other instances, accept/deny library follow requests...",
verbose_name="Manage library federation",
),
),
migrations.AlterField(
model_name='user',
name='permission_library',
field=models.BooleanField(default=False, help_text='Manage library', verbose_name='Manage library'),
model_name="user",
name="permission_library",
field=models.BooleanField(
default=False, help_text="Manage library", verbose_name="Manage library"
),
),
migrations.AlterField(
model_name='user',
name='permission_settings',
field=models.BooleanField(default=False, verbose_name='Manage instance-level settings'),
model_name="user",
name="permission_settings",
field=models.BooleanField(
default=False, verbose_name="Manage instance-level settings"
),
),
]

View file

@ -17,26 +17,20 @@ from funkwhale_api.common import preferences
def get_token():
return binascii.b2a_hex(os.urandom(15)).decode('utf-8')
return binascii.b2a_hex(os.urandom(15)).decode("utf-8")
PERMISSIONS_CONFIGURATION = {
'federation': {
'label': 'Manage library federation',
'help_text': 'Follow other instances, accept/deny library follow requests...',
"federation": {
"label": "Manage library federation",
"help_text": "Follow other instances, accept/deny library follow requests...",
},
'library': {
'label': 'Manage library',
'help_text': 'Manage library, delete files, tracks, artists, albums...',
},
'settings': {
'label': 'Manage instance-level settings',
'help_text': '',
},
'upload': {
'label': 'Upload new content to the library',
'help_text': '',
"library": {
"label": "Manage library",
"help_text": "Manage library, delete files, tracks, artists, albums...",
},
"settings": {"label": "Manage instance-level settings", "help_text": ""},
"upload": {"label": "Upload new content to the library", "help_text": ""},
}
PERMISSIONS = sorted(PERMISSIONS_CONFIGURATION.keys())
@ -58,51 +52,54 @@ class User(AbstractUser):
# anyway since django use stronger schemes for storing passwords.
# Users that want to use the subsonic API from external client
# should set this token and use it as their password in such clients
subsonic_api_token = models.CharField(
blank=True, null=True, max_length=255)
subsonic_api_token = models.CharField(blank=True, null=True, max_length=255)
# permissions
permission_federation = models.BooleanField(
PERMISSIONS_CONFIGURATION['federation']['label'],
help_text=PERMISSIONS_CONFIGURATION['federation']['help_text'],
default=False)
PERMISSIONS_CONFIGURATION["federation"]["label"],
help_text=PERMISSIONS_CONFIGURATION["federation"]["help_text"],
default=False,
)
permission_library = models.BooleanField(
PERMISSIONS_CONFIGURATION['library']['label'],
help_text=PERMISSIONS_CONFIGURATION['library']['help_text'],
default=False)
PERMISSIONS_CONFIGURATION["library"]["label"],
help_text=PERMISSIONS_CONFIGURATION["library"]["help_text"],
default=False,
)
permission_settings = models.BooleanField(
PERMISSIONS_CONFIGURATION['settings']['label'],
help_text=PERMISSIONS_CONFIGURATION['settings']['help_text'],
default=False)
PERMISSIONS_CONFIGURATION["settings"]["label"],
help_text=PERMISSIONS_CONFIGURATION["settings"]["help_text"],
default=False,
)
permission_upload = models.BooleanField(
PERMISSIONS_CONFIGURATION['upload']['label'],
help_text=PERMISSIONS_CONFIGURATION['upload']['help_text'],
default=False)
PERMISSIONS_CONFIGURATION["upload"]["label"],
help_text=PERMISSIONS_CONFIGURATION["upload"]["help_text"],
default=False,
)
def __str__(self):
return self.username
def get_permissions(self):
defaults = preferences.get('users__default_permissions')
defaults = preferences.get("users__default_permissions")
perms = {}
for p in PERMISSIONS:
v = (
self.is_superuser or
getattr(self, 'permission_{}'.format(p)) or
p in defaults
self.is_superuser
or getattr(self, "permission_{}".format(p))
or p in defaults
)
perms[p] = v
return perms
def has_permissions(self, *perms, operator='and'):
if operator not in ['and', 'or']:
raise ValueError('Invalid operator {}'.format(operator))
def has_permissions(self, *perms, operator="and"):
if operator not in ["and", "or"]:
raise ValueError("Invalid operator {}".format(operator))
permissions = self.get_permissions()
checker = all if operator == 'and' else any
checker = all if operator == "and" else any
return checker([permissions[p] for p in perms])
def get_absolute_url(self):
return reverse('users:detail', kwargs={'username': self.username})
return reverse("users:detail", kwargs={"username": self.username})
def update_secret_key(self):
self.secret_key = uuid.uuid4()
@ -119,4 +116,4 @@ class User(AbstractUser):
self.update_subsonic_api_token()
def get_activity_url(self):
return settings.FUNKWHALE_URL + '/@{}'.format(self.username)
return settings.FUNKWHALE_URL + "/@{}".format(self.username)

View file

@ -11,11 +11,13 @@ class HasUserPermission(BasePermission):
permission_classes = [HasUserPermission]
required_permissions = ['federation']
"""
def has_permission(self, request, view):
if not hasattr(request, 'user') or not request.user:
if not hasattr(request, "user") or not request.user:
return False
if request.user.is_anonymous:
return False
operator = getattr(view, 'permission_operator', 'and')
operator = getattr(view, "permission_operator", "and")
return request.user.has_permissions(
*view.required_permissions, operator=operator)
*view.required_permissions, operator=operator
)

View file

@ -8,25 +8,30 @@ from . import views
urlpatterns = [
url(r'^$', views.RegisterView.as_view(), name='rest_register'),
url(r'^verify-email/$',
url(r"^$", views.RegisterView.as_view(), name="rest_register"),
url(
r"^verify-email/$",
registration_views.VerifyEmailView.as_view(),
name='rest_verify_email'),
url(r'^change-password/$',
name="rest_verify_email",
),
url(
r"^change-password/$",
rest_auth_views.PasswordChangeView.as_view(),
name='change_password'),
name="change_password",
),
# This url is used by django-allauth and empty TemplateView is
# defined just to allow reverse() call inside app, for example when email
# with verification link is being sent, then it's required to render email
# content.
# account_confirm_email - You should override this view to handle it in
# your API client somehow and then, send post to /verify-email/ endpoint
# with proper key.
# If you don't want to use API on that step, then just use ConfirmEmailView
# view from:
# djang-allauth https://github.com/pennersr/django-allauth/blob/master/allauth/account/views.py#L190
url(r'^account-confirm-email/(?P<key>\w+)/$', TemplateView.as_view(),
name='account_confirm_email'),
url(
r"^account-confirm-email/(?P<key>\w+)/$",
TemplateView.as_view(),
name="account_confirm_email",
),
]

View file

@ -9,35 +9,27 @@ from . import models
class UserActivitySerializer(activity_serializers.ModelSerializer):
type = serializers.SerializerMethodField()
name = serializers.CharField(source='username')
local_id = serializers.CharField(source='username')
name = serializers.CharField(source="username")
local_id = serializers.CharField(source="username")
class Meta:
model = models.User
fields = [
'id',
'local_id',
'name',
'type'
]
fields = ["id", "local_id", "name", "type"]
def get_type(self, obj):
return 'Person'
return "Person"
class UserBasicSerializer(serializers.ModelSerializer):
class Meta:
model = models.User
fields = ['id', 'username', 'name', 'date_joined']
fields = ["id", "username", "name", "date_joined"]
class UserWriteSerializer(serializers.ModelSerializer):
class Meta:
model = models.User
fields = [
'name',
'privacy_level'
]
fields = ["name", "privacy_level"]
class UserReadSerializer(serializers.ModelSerializer):
@ -47,15 +39,15 @@ class UserReadSerializer(serializers.ModelSerializer):
class Meta:
model = models.User
fields = [
'id',
'username',
'name',
'email',
'is_staff',
'is_superuser',
'permissions',
'date_joined',
'privacy_level',
"id",
"username",
"name",
"email",
"is_staff",
"is_superuser",
"permissions",
"date_joined",
"privacy_level",
]
def get_permissions(self, o):
@ -64,8 +56,4 @@ class UserReadSerializer(serializers.ModelSerializer):
class PasswordResetSerializer(PRS):
def get_email_options(self):
return {
'extra_email_context': {
'funkwhale_url': settings.FUNKWHALE_URL
}
}
return {"extra_email_context": {"funkwhale_url": settings.FUNKWHALE_URL}}

View file

@ -13,12 +13,9 @@ from . import serializers
class RegisterView(BaseRegisterView):
def create(self, request, *args, **kwargs):
if not self.is_open_for_signup(request):
r = {
'detail': 'Registration has been disabled',
}
r = {"detail": "Registration has been disabled"}
return Response(r, status=403)
return super().create(request, *args, **kwargs)
@ -26,47 +23,42 @@ class RegisterView(BaseRegisterView):
return get_adapter().is_open_for_signup(request)
class UserViewSet(
mixins.UpdateModelMixin,
viewsets.GenericViewSet):
class UserViewSet(mixins.UpdateModelMixin, viewsets.GenericViewSet):
queryset = models.User.objects.all()
serializer_class = serializers.UserWriteSerializer
lookup_field = 'username'
lookup_field = "username"
@list_route(methods=['get'])
@list_route(methods=["get"])
def me(self, request, *args, **kwargs):
"""Return information about the current user"""
serializer = serializers.UserReadSerializer(request.user)
return Response(serializer.data)
@detail_route(
methods=['get', 'post', 'delete'], url_path='subsonic-token')
@detail_route(methods=["get", "post", "delete"], url_path="subsonic-token")
def subsonic_token(self, request, *args, **kwargs):
if not self.request.user.username == kwargs.get('username'):
if not self.request.user.username == kwargs.get("username"):
return Response(status=403)
if not preferences.get('subsonic__enabled'):
if not preferences.get("subsonic__enabled"):
return Response(status=405)
if request.method.lower() == 'get':
return Response({
'subsonic_api_token': self.request.user.subsonic_api_token
})
if request.method.lower() == 'delete':
if request.method.lower() == "get":
return Response(
{"subsonic_api_token": self.request.user.subsonic_api_token}
)
if request.method.lower() == "delete":
self.request.user.subsonic_api_token = None
self.request.user.save(update_fields=['subsonic_api_token'])
self.request.user.save(update_fields=["subsonic_api_token"])
return Response(status=204)
self.request.user.update_subsonic_api_token()
self.request.user.save(update_fields=['subsonic_api_token'])
data = {
'subsonic_api_token': self.request.user.subsonic_api_token
}
self.request.user.save(update_fields=["subsonic_api_token"])
data = {"subsonic_api_token": self.request.user.subsonic_api_token}
return Response(data)
def update(self, request, *args, **kwargs):
if not self.request.user.username == kwargs.get('username'):
if not self.request.user.username == kwargs.get("username"):
return Response(status=403)
return super().update(request, *args, **kwargs)
def partial_update(self, request, *args, **kwargs):
if not self.request.user.username == kwargs.get('username'):
if not self.request.user.username == kwargs.get("username"):
return Response(status=403)
return super().partial_update(request, *args, **kwargs)