diff --git a/myproject/accounts/management/__init__.py b/myproject/accounts/management/__init__.py index e69de29..8b13789 100644 --- a/myproject/accounts/management/__init__.py +++ b/myproject/accounts/management/__init__.py @@ -0,0 +1 @@ + diff --git a/myproject/accounts/management/commands/__init__.py b/myproject/accounts/management/commands/__init__.py index e69de29..8b13789 100644 --- a/myproject/accounts/management/commands/__init__.py +++ b/myproject/accounts/management/commands/__init__.py @@ -0,0 +1 @@ + diff --git a/myproject/accounts/migrations/0002_fix_owner_staff_flags.py b/myproject/accounts/migrations/0002_fix_owner_staff_flags.py deleted file mode 100644 index 06a54eb..0000000 --- a/myproject/accounts/migrations/0002_fix_owner_staff_flags.py +++ /dev/null @@ -1,94 +0,0 @@ -# -*- coding: utf-8 -*- -""" -Миграция данных для исправления флагов is_staff/is_superuser у существующих пользователей. - -SECURITY FIX: Убираем флаги is_staff и is_superuser у владельцев тенантов и обычных пользователей, -которые могли быть созданы до внедрения явных проверок безопасности. - -Эта миграция должна быть запущена: -1. На public схеме: python manage.py migrate accounts -2. На всех tenant схемах: python manage.py migrate_schemas -""" -from django.db import migrations - - -def fix_owner_staff_flags(apps, schema_editor): - """ - Исправляет флаги is_staff/is_superuser у существующих владельцев тенантов и обычных пользователей. - """ - User = apps.get_model('accounts', 'CustomUser') - - # Пытаемся получить модели системы ролей (могут не существовать на момент миграции) - try: - UserRole = apps.get_model('user_roles', 'UserRole') - Role = apps.get_model('user_roles', 'Role') - - # Находим роль owner - try: - owner_role = Role.objects.get(code='owner') - - # Получаем всех пользователей с ролью owner - owner_user_ids = UserRole.objects.filter( - role=owner_role, - is_active=True - ).values_list('user_id', flat=True) - - # Убираем is_staff и is_superuser у всех владельцев - updated_staff = User.objects.filter( - id__in=owner_user_ids, - is_staff=True - ).update(is_staff=False) - - updated_super = User.objects.filter( - id__in=owner_user_ids, - is_superuser=True - ).update(is_superuser=False) - - if updated_staff > 0 or updated_super > 0: - print(f"[SECURITY FIX] Исправлено владельцев: is_staff={updated_staff}, is_superuser={updated_super}") - - except Role.DoesNotExist: - print("[SECURITY FIX] Роль 'owner' не найдена, пропускаем исправление владельцев") - - except LookupError: - # Модели user_roles еще не существуют - это нормально для новых инсталляций - print("[SECURITY FIX] Модели user_roles не найдены (это нормально для новых инсталляций)") - - # Убираем is_staff у всех НЕ-суперпользователей (дополнительная безопасность) - # Только суперпользователи должны иметь is_staff=True - updated = User.objects.filter( - is_staff=True, - is_superuser=False - ).update(is_staff=False) - - if updated > 0: - print(f"[SECURITY FIX] Убран is_staff у {updated} НЕ-суперпользователей") - - # Итоговая статистика - total_staff = User.objects.filter(is_staff=True).count() - total_super = User.objects.filter(is_superuser=True).count() - print(f"[SECURITY FIX] Текущее состояние: is_staff={total_staff}, is_superuser={total_super}") - - -def reverse_fix(apps, schema_editor): - """ - Откат не требуется - мы только исправляем безопасность, не меняем структуру данных. - """ - pass - - -class Migration(migrations.Migration): - """ - Миграция данных для исправления флагов безопасности. - - ВАЖНО: Эту миграцию нужно запустить на всех тенантах командой: - python manage.py migrate_schemas - """ - - dependencies = [ - ('accounts', '0001_initial'), - ] - - operations = [ - migrations.RunPython(fix_owner_staff_flags, reverse_fix), - ] diff --git a/myproject/tenants/templates/tenants/base.html b/myproject/tenants/templates/tenants/base.html index 120b818..f3acf9d 100644 --- a/myproject/tenants/templates/tenants/base.html +++ b/myproject/tenants/templates/tenants/base.html @@ -98,6 +98,29 @@ border-radius: 6px; font-size: 0.85rem; padding: 0.65rem 0.875rem; + color: #1f2937 !important; + background-color: #ffffff; + border: 1px solid rgba(0, 0, 0, 0.1); + } + .alert-success { + background-color: #d1fae5 !important; + border-color: #10b981 !important; + color: #065f46 !important; + } + .alert-error, .alert-danger { + background-color: #fee2e2 !important; + border-color: #ef4444 !important; + color: #991b1b !important; + } + .alert-warning { + background-color: #fef3c7 !important; + border-color: #f59e0b !important; + color: #92400e !important; + } + .alert-info { + background-color: #dbeafe !important; + border-color: #3b82f6 !important; + color: #1e40af !important; } small.text-muted { font-size: 0.8125rem; @@ -119,12 +142,14 @@
{% if messages %} - {% for message in messages %} - - {% endfor %} +
+ {% for message in messages %} + + {% endfor %} +
{% endif %} {% block content %}{% endblock %}