From 7baffaf4903bfc6bf35b545fa3fbc2d76bbefac0 Mon Sep 17 00:00:00 2001 From: "davide.borgonovo" Date: Thu, 28 Apr 2022 18:34:28 +0200 Subject: [PATCH] =?UTF-8?q?Ora=20pi=C3=B9=20utenti=20possono=20avere=20lo?= =?UTF-8?q?=20stesso=20tema=20e=20li=20setto=20con=20una=20Inline?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- admin_interface/admin.py | 22 ++++++----- admin_interface/context_processor.py | 2 +- .../migrations/0027_usertheme_m2m.py | 37 +++++++++++++++++++ admin_interface/models.py | 27 +++++++++++--- 4 files changed, 72 insertions(+), 16 deletions(-) create mode 100644 admin_interface/migrations/0027_usertheme_m2m.py diff --git a/admin_interface/admin.py b/admin_interface/admin.py index c93db23..00d60c3 100644 --- a/admin_interface/admin.py +++ b/admin_interface/admin.py @@ -1,13 +1,20 @@ # -*- coding: utf-8 -*- -from admin_interface.compat import gettext_lazy as _ -from admin_interface.models import Theme - -from django.contrib.auth import models as auth_models from django.contrib import admin +from django.contrib.auth import models as auth_models + +from admin_interface.compat import gettext_lazy as _ +from admin_interface.models import Theme, UserTheme + + +class UserInline(admin.TabularInline): + model = UserTheme + extra = 0 + autocomplete_fields = ('user', ) class ThemeAdmin(admin.ModelAdmin): + inlines = [UserInline, ] list_display = ( "name", @@ -136,7 +143,8 @@ class ThemeAdmin(admin.ModelAdmin): ), }, ), - (_("Navigation Bar"), {"classes": ("wide",), "fields": ("foldable_apps",)}), + (_("Navigation Bar"), {"classes": ( + "wide",), "fields": ("foldable_apps",)}), ( _("Related Modal"), { @@ -174,10 +182,6 @@ class ThemeAdmin(admin.ModelAdmin): _("Recent Actions"), {"classes": ("wide",), "fields": ("recent_actions_visible",)}, ), - ( - _("Users theme"), - {"classes": ("wide",), "fields": ("user",)}, - ), ) save_on_top = True diff --git a/admin_interface/context_processor.py b/admin_interface/context_processor.py index cae12f3..ba772d4 100644 --- a/admin_interface/context_processor.py +++ b/admin_interface/context_processor.py @@ -7,7 +7,7 @@ def get_active_theme(request): objs_active_count = len(objs_active_ls) if objs_active_count == 0: - obj = objs_manager.all().first() + obj = objs_manager.first() if obj: obj.set_active() else: diff --git a/admin_interface/migrations/0027_usertheme_m2m.py b/admin_interface/migrations/0027_usertheme_m2m.py new file mode 100644 index 0000000..4d79017 --- /dev/null +++ b/admin_interface/migrations/0027_usertheme_m2m.py @@ -0,0 +1,37 @@ +# Generated by Django 3.2.13 on 2022-04-28 16:03 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('admin_interface', '0026_add_user_option'), + ] + + operations = [ + migrations.RemoveField( + model_name='theme', + name='user', + ), + migrations.CreateModel( + name='UserTheme', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('theme', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='admin_interface.theme')), + ('user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, unique=True)), + ], + options={ + 'verbose_name': 'Users theme', + 'verbose_name_plural': 'Users themes', + }, + ), + migrations.AddField( + model_name='theme', + name='users', + field=models.ManyToManyField(through='admin_interface.UserTheme', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/admin_interface/models.py b/admin_interface/models.py index 49574e2..549d0ab 100644 --- a/admin_interface/models.py +++ b/admin_interface/models.py @@ -14,6 +14,17 @@ from admin_interface.compat import FileExtensionValidator, force_str from admin_interface.compat import gettext_lazy as _ +@python_2_unicode_compatible +class UserTheme(models.Model): + class Meta: + verbose_name = 'Users theme' + verbose_name_plural = 'Users themes' + + user = models.ForeignKey( + 'auth.User', on_delete=models.CASCADE, null=True, unique=True) + theme = models.ForeignKey('Theme', on_delete=models.CASCADE) + + @python_2_unicode_compatible class Theme(models.Model): @staticmethod @@ -62,7 +73,7 @@ class Theme(models.Model): elif objs_active_count > 1: for frame_record in inspect.stack(): - if frame_record[3]=='get_response': + if frame_record[3] == 'get_response': request = frame_record[0].f_locals['request'] user = request.user break @@ -83,7 +94,7 @@ class Theme(models.Model): active = models.BooleanField(default=True, verbose_name=_("active")) demo = models.BooleanField(default=False, verbose_name=_("is demo")) - user = models.ForeignKey('auth.User', on_delete=models.CASCADE, null=True, blank=True, verbose_name=_("active for user")) + users = models.ManyToManyField('auth.User', through=UserTheme) title = models.CharField( max_length=50, @@ -98,7 +109,8 @@ class Theme(models.Model): max_length=10, verbose_name=_("color"), ) - title_visible = models.BooleanField(default=True, verbose_name=_("visible")) + title_visible = models.BooleanField( + default=True, verbose_name=_("visible")) logo = models.FileField( upload_to="admin-interface/logo/", @@ -138,7 +150,8 @@ class Theme(models.Model): verbose_name=_("favicon"), ) - env_name = models.CharField(blank=True, max_length=50, verbose_name=_("name")) + env_name = models.CharField( + blank=True, max_length=50, verbose_name=_("name")) env_color = ColorField( blank=True, default="#E74C3C", @@ -309,7 +322,8 @@ class Theme(models.Model): verbose_name=_("text color"), ) - related_modal_active = models.BooleanField(default=True, verbose_name=_("active")) + related_modal_active = models.BooleanField( + default=True, verbose_name=_("active")) related_modal_background_color = ColorField( blank=True, default="#000000", @@ -376,7 +390,8 @@ class Theme(models.Model): default=True, verbose_name=_("sticky position") ) - foldable_apps = models.BooleanField(default=True, verbose_name=_("foldable apps")) + foldable_apps = models.BooleanField( + default=True, verbose_name=_("foldable apps")) recent_actions_visible = models.BooleanField( default=True, verbose_name=_("visible")