1
0
Fork 0
mirror of https://github.com/EDeev/deev.space.git synced 2026-10-07 20:49:59 +03:00
deev.space/main/migrations/0003_article_extensions.py
Egor Deev 878b4580e4 Версия 2.0: код с продакшена deev.space
Перенесено всё, что накопилось на сервере с декабря 2025:
- анонимный посетитель по подписанной cookie (main/middleware.py), лайки и дизлайки
  без регистрации с антинакруткой, уникальные просмотры статей;
- карточка-паспорт, стек в одну строку, блок «В цифрах»;
- миграции 0005–0008, команды load_initial_data и populate_demo, robots.txt;
- обновлённые шаблоны, стили и скрипты.

Безопасность и порядок:
- все секреты только из окружения, значения по умолчанию пустые;
- DEBUG по умолчанию выключен, без DJANGO_SECRET_KEY запуск в бою невозможен;
- ALLOWED_HOSTS, путь к базе и SSL-редирект настраиваются переменными;
- убрана статика админки Django (результат collectstatic) и media из git;
- добавлены .gitignore и .gitattributes (переводы строк — LF).
2026-10-02 11:58:54 +00:00

154 lines
No EOL
8.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('main', '0002_sitesettings_alter_category_options_and_more'),
]
operations = [
# ProjectStatus model
migrations.CreateModel(
name='ProjectStatus',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=50, verbose_name='Название')),
('slug', models.SlugField(max_length=50, unique=True, verbose_name='Код')),
('color', models.CharField(default='primary', max_length=20, verbose_name='Цвет (CSS класс)')),
('is_release',
models.BooleanField(default=False, help_text='Проекты с этим статусом попадают в "Завершённые"',
verbose_name='Это релиз')),
('order', models.PositiveIntegerField(default=0, verbose_name='Порядок')),
],
options={
'verbose_name': 'Статус проекта',
'verbose_name_plural': 'Статусы проектов',
'ordering': ['order'],
},
),
# ArticleImage model
migrations.CreateModel(
name='ArticleImage',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('image', models.ImageField(upload_to='articles/gallery/', verbose_name='Изображение')),
('caption', models.CharField(blank=True, max_length=255, verbose_name='Подпись')),
('order', models.PositiveIntegerField(default=0, verbose_name='Порядок')),
('is_inline',
models.BooleanField(default=False, help_text='Отметьте, если это изображение вставлено в текст статьи',
verbose_name='Добавлено через редактор')),
('article',
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='gallery_images',
to='main.article', verbose_name='Статья')),
],
options={
'verbose_name': 'Изображение статьи',
'verbose_name_plural': 'Изображения статьи',
'ordering': ['order'],
},
),
# ArticleFile model
migrations.CreateModel(
name='ArticleFile',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('file', models.FileField(upload_to='articles/files/', verbose_name='Файл')),
('title', models.CharField(max_length=255, verbose_name='Название файла')),
('description', models.TextField(blank=True, verbose_name='Описание')),
('order', models.PositiveIntegerField(default=0, verbose_name='Порядок')),
('is_inline', models.BooleanField(default=False,
help_text='Отметьте, если ссылка на этот файл вставлена в текст статьи',
verbose_name='Добавлено через редактор')),
('article',
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attached_files',
to='main.article', verbose_name='Статья')),
],
options={
'verbose_name': 'Файл статьи',
'verbose_name_plural': 'Файлы статьи',
'ordering': ['order'],
},
),
# ArticleLink model
migrations.CreateModel(
name='ArticleLink',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('url', models.URLField(verbose_name='URL')),
('title', models.CharField(blank=True, max_length=255, verbose_name='Заголовок')),
('description', models.TextField(blank=True, verbose_name='Описание')),
('preview_image', models.URLField(blank=True, verbose_name='URL изображения превью')),
('order', models.PositiveIntegerField(default=0, verbose_name='Порядок')),
('is_inline',
models.BooleanField(default=False, help_text='Отметьте, если эта ссылка вставлена в текст статьи',
verbose_name='Добавлено через редактор')),
('article',
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attached_links',
to='main.article', verbose_name='Статья')),
],
options={
'verbose_name': 'Ссылка статьи',
'verbose_name_plural': 'Ссылки статьи',
'ordering': ['order'],
},
),
# Article new fields
migrations.AddField(
model_name='article',
name='comments_enabled',
field=models.BooleanField(default=True, verbose_name='Включить комментарии'),
),
migrations.AddField(
model_name='article',
name='show_cover_in_article',
field=models.BooleanField(default=True, verbose_name='Показывать обложку в начале статьи'),
),
migrations.AddField(
model_name='article',
name='gallery_display_mode',
field=models.CharField(choices=[('carousel', 'Карусель'), ('collage', 'Коллаж')], default='carousel',
max_length=20, verbose_name='Режим отображения галереи'),
),
migrations.AddField(
model_name='article',
name='exclude_inline_from_blocks',
field=models.BooleanField(default=False,
help_text='Если включено, изображения/файлы/ссылки, добавленные через редактор в текст, не будут отображаться в общих блоках',
verbose_name='Не дублировать медиа из редактора в блоках'),
),
# Project new fields
migrations.AddField(
model_name='project',
name='show_on_homepage',
field=models.BooleanField(default=False, verbose_name='Показывать на главной'),
),
migrations.AddField(
model_name='project',
name='homepage_order',
field=models.PositiveIntegerField(default=0, verbose_name='Порядок на главной'),
),
migrations.AddField(
model_name='project',
name='programming_languages',
field=models.CharField(blank=True, help_text='Например: Python, JavaScript', max_length=200,
verbose_name='Языки программирования (через запятую)'),
),
# Change Project.status to ForeignKey
migrations.RemoveField(
model_name='project',
name='status',
),
migrations.AddField(
model_name='project',
name='status',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
to='main.projectstatus', verbose_name='Статус'),
),
]