Добавлен полнофункциональный экспорт/импорт профилей

- Кнопки 'убрать фон' для всех элементов: профиль, группы, ссылки
- Кнопка 'сбросить настройки интерфейса' с подтверждением
- Django app export_import с полным API для бэкапа и восстановления
- Экспорт: создание ZIP архивов с данными профиля и медиафайлами
- Импорт: селективная загрузка групп, ссылок, стилей, медиа
- Обработка мультипарт форм, Django транзакции, управление ошибками
- Полное тестирование: экспорт → импорт данных между пользователями
- API эндпоинты: /api/export/, /api/import/, превью архивов
- Готовая система для производственного развертывания
This commit is contained in:
2025-11-09 14:28:45 +09:00
parent ae54fb7ed1
commit d78c296e5a
16 changed files with 1110 additions and 1 deletions

View File

@@ -464,13 +464,23 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate }: Custom
{settings.background_image_url && (
<div className="mb-2">
<label className="form-label small">Текущее изображение:</label>
<div>
<div className="d-flex align-items-center gap-2">
<img
src={settings.background_image_url}
alt="Текущий фон"
className="img-thumbnail"
style={{ maxWidth: '200px', maxHeight: '100px', objectFit: 'cover' }}
/>
<button
type="button"
className="btn btn-outline-danger btn-sm"
onClick={() => {
handleChange('background_image_url', '')
}}
title="Убрать фон"
>
<i className="bi bi-trash"></i> Убрать фон
</button>
</div>
</div>
)}
@@ -1019,6 +1029,49 @@ export function CustomizationPanel({ isOpen, onClose, onSettingsUpdate }: Custom
>
Отмена
</button>
<button
type="button"
className="btn btn-outline-warning"
onClick={() => {
if (confirm('Вы уверены, что хотите сбросить все настройки интерфейса к значениям по умолчанию? Это действие нельзя отменить.')) {
// Сброс к дефолтным настройкам
const defaultSettings = {
theme_color: '#007bff',
background_image_url: '',
dashboard_layout: 'list' as const,
groups_default_expanded: true,
show_group_icons: true,
show_link_icons: true,
dashboard_background_color: '#ffffff',
font_family: 'Inter, sans-serif',
custom_css: '',
group_text_color: '',
link_text_color: '',
header_text_color: '',
cover_overlay_enabled: false,
cover_overlay_color: '#000000',
cover_overlay_opacity: 0.3,
group_overlay_enabled: false,
group_overlay_color: '#000000',
group_overlay_opacity: 0.3,
show_groups_title: true,
group_description_text_color: '',
body_font_family: 'Inter, sans-serif',
heading_font_family: 'Inter, sans-serif',
link_overlay_enabled: false,
link_overlay_color: '#000000',
link_overlay_opacity: 0.3
}
setSettings(defaultSettings)
onSettingsUpdate(defaultSettings)
}
}}
disabled={loading}
title="Сбросить все настройки к значениям по умолчанию"
>
<i className="bi bi-arrow-counterclockwise me-2"></i>
Сбросить настройки
</button>
<button
type="button"
className="btn btn-primary"