Blacked the code
This commit is contained in:
parent
b6fc0051fa
commit
62ca3bd736
279 changed files with 8890 additions and 9556 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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")}),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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())],
|
||||
)
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
),
|
||||
),
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
),
|
||||
),
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
),
|
||||
)
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
),
|
||||
)
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
),
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
),
|
||||
),
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
),
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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}}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue