Fix #996: Persist theme and language settings accross sessions
This commit is contained in:
parent
f6a81a9ecf
commit
84d49754a7
11 changed files with 108 additions and 3 deletions
|
|
@ -0,0 +1,26 @@
|
|||
# Generated by Django 3.0.8 on 2020-07-05 08:29
|
||||
|
||||
import django.contrib.postgres.fields.jsonb
|
||||
from django.db import migrations
|
||||
import funkwhale_api.users.models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('users', '0017_actor_avatar'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterModelManagers(
|
||||
name='user',
|
||||
managers=[
|
||||
('objects', funkwhale_api.users.models.UserManager()),
|
||||
],
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='user',
|
||||
name='settings',
|
||||
field=django.contrib.postgres.fields.jsonb.JSONField(default=None, null=True, blank=True, max_length=50000),
|
||||
),
|
||||
]
|
||||
|
|
@ -10,7 +10,8 @@ import uuid
|
|||
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.models import AbstractUser, UserManager as BaseUserManager
|
||||
from django.db import models
|
||||
from django.contrib.postgres.fields import JSONField
|
||||
from django.db import models, transaction
|
||||
from django.dispatch import receiver
|
||||
from django.urls import reverse
|
||||
from django.utils import timezone
|
||||
|
|
@ -191,6 +192,7 @@ class User(AbstractUser):
|
|||
null=True,
|
||||
blank=True,
|
||||
)
|
||||
settings = JSONField(default=None, null=True, blank=True, max_length=50000)
|
||||
|
||||
objects = UserManager()
|
||||
|
||||
|
|
@ -213,6 +215,16 @@ class User(AbstractUser):
|
|||
def all_permissions(self):
|
||||
return self.get_permissions()
|
||||
|
||||
@transaction.atomic
|
||||
def set_settings(self, **settings):
|
||||
u = self.__class__.objects.select_for_update().get(pk=self.pk)
|
||||
if not u.settings:
|
||||
u.settings = {}
|
||||
for key, value in settings.items():
|
||||
u.settings[key] = value
|
||||
u.save(update_fields=["settings"])
|
||||
self.settings = u.settings
|
||||
|
||||
def has_permissions(self, *perms, **kwargs):
|
||||
operator = kwargs.pop("operator", "and")
|
||||
if operator not in ["and", "or"]:
|
||||
|
|
|
|||
|
|
@ -232,6 +232,7 @@ class MeSerializer(UserReadSerializer):
|
|||
"funkwhale_support_message_display_date",
|
||||
"summary",
|
||||
"tokens",
|
||||
"settings",
|
||||
]
|
||||
|
||||
def get_quota_status(self, o):
|
||||
|
|
|
|||
|
|
@ -80,6 +80,13 @@ class UserViewSet(mixins.UpdateModelMixin, viewsets.GenericViewSet):
|
|||
serializer = serializers.MeSerializer(request.user)
|
||||
return Response(serializer.data)
|
||||
|
||||
@action(methods=["post"], detail=False, url_name="settings", url_path="settings")
|
||||
def set_settings(self, request, *args, **kwargs):
|
||||
"""Return information about the current user or delete it"""
|
||||
new_settings = request.data
|
||||
request.user.set_settings(**new_settings)
|
||||
return Response(request.user.settings)
|
||||
|
||||
@action(
|
||||
methods=["get", "post", "delete"],
|
||||
required_scope="security",
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue