init commit

This commit is contained in:
2025-05-06 20:44:33 +09:00
commit 91f0d54563
5567 changed files with 948185 additions and 0 deletions

View File

View File

@@ -0,0 +1,11 @@
# backend/apps/customization/admin.py
from django.contrib import admin
from .models import DesignSettings
@admin.register(DesignSettings)
class DesignSettingsAdmin(admin.ModelAdmin):
list_display = ('user', 'theme_color', 'font_family', 'updated_at')
list_filter = ('theme_color',)
search_fields = ('user__username',)
readonly_fields = ('updated_at',)

View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class CustomizationConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'customization'

View File

@@ -0,0 +1,35 @@
# Generated by Django 5.2 on 2025-05-06 01:51
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='DesignSettings',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('theme_color', models.CharField(default='#ffffff', help_text='Основной цвет темы (hex)', max_length=7)),
('background_image', models.ImageField(blank=True, help_text='Фоновое изображение', null=True, upload_to='backgrounds/')),
('font_family', models.CharField(default='sans-serif', help_text='Название шрифта', max_length=100)),
('custom_css', models.TextField(blank=True, help_text='Дополнительный CSS')),
('updated_at', models.DateTimeField(auto_now=True, help_text='Дата и время последнего изменения')),
('user', models.OneToOneField(help_text='Пользователь, которому принадлежат настройки', on_delete=django.db.models.deletion.CASCADE, related_name='design', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Настройки дизайна',
'verbose_name_plural': 'Настройки дизайна',
'ordering': ['user'],
'unique_together': {('user',)},
},
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.2 on 2025-05-06 09:53
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('customization', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='designsettings',
name='background_image',
field=models.ImageField(blank=True, help_text='Фоновое изображение', null=True, upload_to='customization/'),
),
]

View File

@@ -0,0 +1,110 @@
# customization/models.py
from django.db import models
from django.conf import settings
from django.utils import timezone
class DesignSettings(models.Model):
"""
Настройки дизайна для публичной страницы пользователя.
"""
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
related_name='design',
help_text='Пользователь, которому принадлежат настройки'
)
theme_color = models.CharField(
max_length=7,
default='#ffffff',
help_text='Основной цвет темы (hex)'
)
background_image = models.ImageField(
upload_to='customization/',
null=True,
blank=True,
help_text='Фоновое изображение'
)
font_family = models.CharField(
max_length=100,
default='sans-serif',
help_text='Название шрифта'
)
custom_css = models.TextField(
blank=True,
help_text='Дополнительный CSS'
)
updated_at = models.DateTimeField(
auto_now=True,
help_text='Дата и время последнего изменения'
)
class Meta:
verbose_name = 'Настройки дизайна'
verbose_name_plural = 'Настройки дизайна'
ordering = ['user']
unique_together = ('user',)
def __str__(self):
return f"Design for {self.user.username}"
def get_background_image_url(self):
"""
Возвращает URL фонового изображения.
"""
return self.background_image.url if self.background_image else None
def get_custom_css(self):
"""
Возвращает пользовательский CSS.
"""
return self.custom_css or ""
def get_design_settings(self):
"""
Возвращает словарь с настройками дизайна.
"""
return {
'theme_color': self.theme_color,
'background_image': self.get_background_image_url(),
'font_family': self.font_family,
'custom_css': self.get_custom_css()
}
def save(self, *args, **kwargs):
"""
Переопределяем метод save, чтобы автоматически обновлять дату изменения.
"""
self.updated_at = timezone.now()
super().save(*args, **kwargs)
def delete(self, *args, **kwargs):
"""
Переопределяем метод delete, чтобы удалять связанные изображения.
"""
if self.background_image:
self.background_image.delete(save=False)
super().delete(*args, **kwargs)
# Вспомогательные методы для доступа к данным пользователя
def get_user(self):
return self.user
def get_user_id(self):
return self.user.id
def get_user_username(self):
return self.user.username
def get_user_email(self):
return self.user.email or "Нет email"
def get_user_full_name(self):
return self.user.get_full_name() or "Нет полного имени"
def get_user_bio(self):
return self.user.bio or "Нет биографии"
def get_user_avatar(self):
return self.user.avatar.url if self.user.avatar else None

View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

View File

@@ -0,0 +1,5 @@
from django.urls import path
urlpatterns = [
# дополнительные эндпоинты по ссылкам
]

View File

@@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.