feat: rebuild site content management

Replace legacy FAQ, downloads, and release flows with project and blog publishing. Add configurable branding and theme fields plus clean-start Compose seeding support.
This commit is contained in:
mohamad
2026-09-24 02:32:27 +03:30
parent 4fc4282f0f
commit 588d95f889
43 changed files with 703 additions and 1193 deletions
@@ -0,0 +1,72 @@
# Generated by Django 5.2.16 on 2026-09-23 22:42
import django.utils.timezone
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pages', '0018_alter_herosection_title'),
]
operations = [
migrations.CreateModel(
name='BlogPost',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=240)),
('slug', models.SlugField(blank=True, max_length=240, unique=True)),
('excerpt', models.CharField(blank=True, help_text='Short summary shown on the blog listing and in search previews.', max_length=400)),
('content', models.TextField()),
('content_format', models.CharField(choices=[('plain', 'Plain Text'), ('markdown', 'Markdown'), ('html', 'HTML')], default='markdown', max_length=20)),
('cover_image', models.ImageField(blank=True, null=True, upload_to='blog/')),
('cover_image_alt', models.CharField(blank=True, max_length=240)),
('author_name', models.CharField(blank=True, max_length=120)),
('status', models.CharField(choices=[('draft', 'Draft'), ('published', 'Published')], default='draft', max_length=20)),
('published_at', models.DateTimeField(default=django.utils.timezone.now)),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
],
options={
'verbose_name': 'Blog post',
'verbose_name_plural': 'Blog posts',
'ordering': ['-published_at', '-pk'],
},
),
migrations.AlterField(
model_name='aboutsection',
name='video_styled_background',
field=models.BooleanField(default=False, help_text='Show the video in a glass panel with an ambient glow.'),
),
migrations.AlterField(
model_name='custompagesection',
name='section_type',
field=models.CharField(choices=[('hero', 'Hero'), ('intro', 'Intro Card'), ('grid', 'Grid Cards'), ('history', 'History Block'), ('custom', 'Custom Content'), ('features', 'Features Grid'), ('screenshots', 'Screenshots Gallery'), ('products', 'Projects Grid'), ('products_catalog', 'Projects with sub-projects'), ('problems', 'Problems / Value Proposition'), ('supporters', 'Supporters'), ('about_strip', 'About Strip'), ('video', 'Video')], default='custom', max_length=30),
),
migrations.AlterField(
model_name='custompagesection',
name='video_styled_background',
field=models.BooleanField(default=False, help_text='Show the video in a glass panel with an ambient glow.'),
),
migrations.AlterField(
model_name='homepagesection',
name='section_type',
field=models.CharField(choices=[('features', 'Features'), ('screenshots', 'Screenshots Gallery'), ('products', 'Projects'), ('products_catalog', 'Projects with sub-projects'), ('problems', 'Problems / Value Proposition'), ('about_strip', 'About Strip'), ('supporters', 'Supporters'), ('video', 'Video')], max_length=30),
),
migrations.AlterField(
model_name='homepagesection',
name='video_styled_background',
field=models.BooleanField(default=False, help_text='Show the video in a glass panel with an ambient glow.'),
),
migrations.AlterField(
model_name='pagevideo',
name='page',
field=models.CharField(choices=[('contact', 'Become a Member')], max_length=20),
),
migrations.AlterField(
model_name='pagevideo',
name='video_styled_background',
field=models.BooleanField(default=False, help_text='Show the video in a glass panel with an ambient glow.'),
),
]