feat: add people sections and opt-in read more

This commit is contained in:
mohamad
2026-10-14 18:33:11 +03:30
parent 4bcb5f196d
commit 473637f477
33 changed files with 722 additions and 68 deletions
@@ -0,0 +1,33 @@
# Generated by Django 5.2.16 on 2026-10-12 04:39
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pages', '0019_blogpost_alter_aboutsection_video_styled_background_and_more'),
]
operations = [
migrations.CreateModel(
name='BlogPostPartner',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('role', models.CharField(choices=[('organizer', 'Organizer'), ('collaborator', 'Collaborator')], default='collaborator', max_length=20)),
('name', models.CharField(max_length=200)),
('description', models.TextField(blank=True)),
('image', models.ImageField(blank=True, null=True, upload_to='blog/partners/')),
('image_alt', models.CharField(blank=True, max_length=240)),
('url', models.URLField(blank=True)),
('order', models.PositiveIntegerField(default=0)),
('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='partners', to='pages.blogpost')),
],
options={
'verbose_name': 'Article organizer or collaborator',
'verbose_name_plural': 'Article organizers and collaborators',
'ordering': ['role', 'order', 'pk'],
},
),
]
@@ -0,0 +1,17 @@
# Generated by Django 5.2.16 on 2026-10-12 04:42
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('pages', '0020_blogpostpartner'),
]
operations = [
migrations.AlterModelOptions(
name='blogpostpartner',
options={'ordering': ['order', 'pk'], 'verbose_name': 'Article organizer or collaborator', 'verbose_name_plural': 'Article organizers and collaborators'},
),
]
@@ -0,0 +1,53 @@
# Generated by Django 5.2.16 on 2026-10-12 04:52
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pages', '0021_alter_blogpostpartner_options'),
]
operations = [
migrations.AddField(
model_name='aboutsection',
name='read_more_content',
field=models.BooleanField(default=False, help_text='Collapse this text with a Read more button.'),
),
migrations.AddField(
model_name='aboutsectionitem',
name='read_more_content',
field=models.BooleanField(default=False, help_text='Collapse this text with a Read more button.'),
),
migrations.AddField(
model_name='blogpost',
name='read_more_content',
field=models.BooleanField(default=False, help_text='Collapse article text with a Read more button.'),
),
migrations.AddField(
model_name='custompagesection',
name='read_more_content',
field=models.BooleanField(default=False, help_text='Collapse this text with a Read more button.'),
),
migrations.AddField(
model_name='custompagesection',
name='read_more_description',
field=models.BooleanField(default=False, help_text='Collapse this description with a Read more button.'),
),
migrations.AddField(
model_name='custompagesectionitem',
name='read_more_content',
field=models.BooleanField(default=False, help_text='Collapse this text with a Read more button.'),
),
migrations.AddField(
model_name='homepagesection',
name='read_more_description',
field=models.BooleanField(default=False, help_text='Collapse this description with a Read more button.'),
),
migrations.AddField(
model_name='homepagesectionitem',
name='read_more_content',
field=models.BooleanField(default=False, help_text='Collapse this text with a Read more button.'),
),
]
@@ -0,0 +1,22 @@
# Generated by Django 5.2.16 on 2026-10-12 11:03
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pages', '0022_aboutsection_read_more_content_and_more'),
]
operations = [
migrations.AlterModelOptions(
name='blogpostpartner',
options={'ordering': ['-role', 'order', 'pk'], 'verbose_name': 'Article organizer or collaborator', 'verbose_name_plural': 'Article organizers and collaborators'},
),
migrations.AlterField(
model_name='blogpostpartner',
name='order',
field=models.PositiveIntegerField(default=0, help_text='Smaller numbers appear first within each role. Organizers always appear before collaborators.', verbose_name='Display order'),
),
]
@@ -0,0 +1,58 @@
# Generated by Django 5.2.16 on 2026-10-12 11:11
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pages', '0023_alter_blogpostpartner_options_and_more'),
]
operations = [
migrations.AddField(
model_name='aboutsection',
name='read_more_subtitle',
field=models.BooleanField(default=False, help_text='Collapse a long hero subtitle with Read more.'),
),
migrations.AddField(
model_name='blogpost',
name='partners_eyebrow',
field=models.CharField(blank=True, default='The people behind this article', max_length=160),
),
migrations.AddField(
model_name='blogpost',
name='partners_title',
field=models.CharField(default='Organizers & collaborators', max_length=200),
),
migrations.AddField(
model_name='blogpost',
name='read_more_excerpt',
field=models.BooleanField(default=False, help_text='Collapse a long excerpt with Read more on the listing and article page.'),
),
migrations.AddField(
model_name='blogpostpartner',
name='read_more_description',
field=models.BooleanField(default=False, help_text="Collapse this person's description with Read more when it is long."),
),
migrations.AddField(
model_name='custompagesection',
name='read_more_subtitle',
field=models.BooleanField(default=False, help_text='Collapse a long hero subtitle with Read more.'),
),
migrations.AddField(
model_name='herosection',
name='read_more_description',
field=models.BooleanField(default=False, help_text='Collapse this description with Read more when it is long.'),
),
migrations.AddField(
model_name='herosection',
name='read_more_subtitle',
field=models.BooleanField(default=False, help_text='Collapse the subtitle with Read more when it is long.'),
),
migrations.AddField(
model_name='pagevideo',
name='read_more_description',
field=models.BooleanField(default=False, help_text='Collapse this video description with Read more.'),
),
]
@@ -0,0 +1,35 @@
# Generated by Django 5.2.16 on 2026-10-12 11:20
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pages', '0024_aboutsection_read_more_subtitle_and_more'),
]
operations = [
migrations.AlterModelOptions(
name='blogpostpartner',
options={'ordering': [models.Case(models.When(role__iexact='organizer', then=models.Value(0)), models.When(role__iexact='collaborator', then=models.Value(1)), default=models.Value(2), output_field=models.IntegerField()), 'order', 'pk'], 'verbose_name': 'Article organizer or collaborator', 'verbose_name_plural': 'Article organizers and collaborators'},
),
migrations.RemoveField(
model_name='blogpost',
name='partners_eyebrow',
),
migrations.RemoveField(
model_name='blogpost',
name='partners_title',
),
migrations.AlterField(
model_name='blogpostpartner',
name='order',
field=models.PositiveIntegerField(default=0, help_text='Smaller numbers appear first. Organizers appear before collaborators, then custom roles.', verbose_name='Display order'),
),
migrations.AlterField(
model_name='blogpostpartner',
name='role',
field=models.CharField(default='Collaborator', help_text='Type Organizer, Collaborator, or any other role name you want to display.', max_length=100, verbose_name='Role / group'),
),
]
@@ -0,0 +1,17 @@
# Generated by Django 5.2.16 on 2026-10-12 11:20
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pages', '0025_alter_blogpostpartner_options_and_more'),
]
operations = [
migrations.AlterModelOptions(
name='blogpostpartner',
options={'ordering': [models.Case(models.When(role__iexact='organizer', then=models.Value(0)), models.When(role__iexact='collaborator', then=models.Value(1)), default=models.Value(2), output_field=models.IntegerField()), 'order', 'pk'], 'verbose_name': 'Article person', 'verbose_name_plural': 'Article people'},
),
]
@@ -0,0 +1,23 @@
# Generated by Django 5.2.16 on 2026-10-14 15:01
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('pages', '0026_alter_blogpostpartner_options'),
]
operations = [
migrations.AddField(
model_name='aboutsectionitem',
name='role',
field=models.CharField(blank=True, help_text='For People sections: Organizer, Collaborator, or any custom role name.', max_length=100, verbose_name='Role / group'),
),
migrations.AlterField(
model_name='aboutsection',
name='section_type',
field=models.CharField(choices=[('hero', 'Hero'), ('intro', 'Intro Card'), ('grid', 'Grid Cards'), ('history', 'History Block'), ('custom', 'Custom Content'), ('supporters', 'Supporters'), ('people', 'People / Organizers & Collaborators'), ('video', 'Video')], default='custom', max_length=30),
),
]