feat: add direct-save CMS and About archive

This commit is contained in:
2026-09-28 20:29:00 +03:30
parent 94b32310af
commit 0f6220f72c
12 changed files with 957 additions and 41 deletions

View File

@@ -0,0 +1,78 @@
"""Add editable Home actions, About team/gallery content, and the footer badge."""
from django.db import migrations, models
import django.db.models.deletion
import apps.content.current
class Migration(migrations.Migration):
dependencies = [("content", "0005_seed_current_website_copy")]
operations = [
migrations.AddField(
model_name="sitecontent",
name="enamad_image",
field=models.ImageField(blank=True, upload_to=apps.content.current.content_upload_path, verbose_name="eNAMAD certificate image"),
),
migrations.AddField(
model_name="sitecontent",
name="enamad_image_alt",
field=models.CharField(blank=True, max_length=180, verbose_name="eNAMAD image description"),
),
migrations.AddField(
model_name="sitecontent",
name="enamad_url",
field=models.URLField(blank=True, verbose_name="eNAMAD verification URL"),
),
migrations.AddField(model_name="homecontent", name="hero_action_url", field=models.CharField(blank=True, max_length=500)),
migrations.AddField(model_name="homecontent", name="hero_secondary_action_label", field=models.CharField(blank=True, max_length=40)),
migrations.AddField(model_name="homecontent", name="hero_secondary_action_url", field=models.CharField(blank=True, max_length=500)),
migrations.AddField(model_name="homecontent", name="featured_events_url", field=models.CharField(blank=True, max_length=500)),
migrations.AddField(model_name="homecontent", name="featured_event_action_label", field=models.CharField(blank=True, max_length=40)),
migrations.AddField(model_name="homecontent", name="featured_posts_url", field=models.CharField(blank=True, max_length=500)),
migrations.AddField(model_name="homecontent", name="featured_post_action_label", field=models.CharField(blank=True, max_length=40)),
migrations.AddField(model_name="homecontent", name="participation_action_url", field=models.CharField(blank=True, max_length=500)),
migrations.AddField(model_name="homecontent", name="participation_secondary_action_label", field=models.CharField(blank=True, max_length=40)),
migrations.AddField(model_name="homecontent", name="participation_secondary_action_url", field=models.CharField(blank=True, max_length=500)),
migrations.AddField(model_name="aboutcontent", name="members_heading", field=models.CharField(blank=True, max_length=120)),
migrations.AddField(model_name="aboutcontent", name="members_intro", field=models.CharField(blank=True, max_length=300)),
migrations.AddField(model_name="aboutcontent", name="gallery_heading", field=models.CharField(blank=True, max_length=120)),
migrations.AddField(model_name="aboutcontent", name="gallery_intro", field=models.CharField(blank=True, max_length=300)),
migrations.AddField(model_name="aboutcontent", name="past_events_heading", field=models.CharField(blank=True, max_length=120)),
migrations.CreateModel(
name="AboutMember",
fields=[
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
("name", models.CharField(max_length=120)),
("role", models.CharField(max_length=120)),
("entry_year", models.CharField(max_length=16, verbose_name="Year joined the association")),
("bio", models.CharField(blank=True, max_length=500)),
("photo", models.ImageField(blank=True, upload_to=apps.content.current.content_upload_path)),
("photo_alt", models.CharField(blank=True, max_length=180)),
("position", models.PositiveSmallIntegerField(default=0)),
("about", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="members", to="content.aboutcontent")),
],
options={
"verbose_name": "Association member",
"verbose_name_plural": "Association members",
"ordering": ["position", "pk"],
},
),
migrations.CreateModel(
name="AboutGalleryImage",
fields=[
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
("image", models.ImageField(upload_to=apps.content.current.content_upload_path)),
("image_alt", models.CharField(max_length=180)),
("caption", models.CharField(blank=True, max_length=180)),
("position", models.PositiveSmallIntegerField(default=0)),
("about", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="gallery_images", to="content.aboutcontent")),
],
options={
"verbose_name": "About page gallery image",
"verbose_name_plural": "About page gallery images",
"ordering": ["position", "pk"],
},
),
]

View File

@@ -0,0 +1,113 @@
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("content", "0006_home_actions_about_members_gallery_enamad"),
("events", "0014_remove_registration_cancellation_email_sent_at_and_more"),
]
operations = [
migrations.AddField(
model_name="aboutcontent",
name="vision_heading",
field=models.CharField(blank=True, max_length=120),
),
migrations.AddField(
model_name="aboutcontent",
name="vision_body",
field=models.TextField(blank=True),
),
migrations.AddField(
model_name="aboutcontent",
name="history_heading",
field=models.CharField(blank=True, max_length=120),
),
migrations.AddField(
model_name="aboutcontent",
name="audience_heading",
field=models.CharField(blank=True, max_length=120),
),
migrations.AddField(
model_name="aboutcontent",
name="year_events_heading",
field=models.CharField(blank=True, max_length=120),
),
migrations.AddField(
model_name="aboutcontent",
name="cta_heading",
field=models.CharField(blank=True, max_length=120),
),
migrations.AddField(
model_name="aboutcontent",
name="cta_body",
field=models.CharField(blank=True, max_length=300),
),
migrations.AddField(
model_name="aboutcontent",
name="cta_action_label",
field=models.CharField(blank=True, max_length=40),
),
migrations.AddField(
model_name="aboutcontent",
name="cta_action_url",
field=models.CharField(blank=True, max_length=500),
),
migrations.CreateModel(
name="AboutAudience",
fields=[
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
("title", models.CharField(max_length=120)),
("text", models.CharField(max_length=300)),
("icon", models.CharField(choices=[("students", "Students"), ("alumni", "Alumni"), ("faculty", "Faculty and researchers"), ("partners", "Industry and community partners")], default="students", max_length=20)),
("position", models.PositiveSmallIntegerField(default=0)),
("about", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="audiences", to="content.aboutcontent")),
],
options={
"verbose_name": "About page audience",
"verbose_name_plural": "About page audiences",
"ordering": ["position", "pk"],
},
),
migrations.CreateModel(
name="AboutMilestone",
fields=[
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
("year_label", models.CharField(max_length=32, verbose_name="Year")),
("title", models.CharField(max_length=120)),
("description", models.CharField(max_length=500)),
("position", models.PositiveSmallIntegerField(default=0)),
("about", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="milestones", to="content.aboutcontent")),
],
options={
"verbose_name": "Association history milestone",
"verbose_name_plural": "Association history milestones",
"ordering": ["position", "pk"],
},
),
migrations.CreateModel(
name="AboutYear",
fields=[
("id", models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
("year_label", models.CharField(max_length=32, verbose_name="Academic year")),
("position", models.PositiveSmallIntegerField(default=0, help_text="Order years from oldest to newest; the last year is selected by default on the page.")),
("about", models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name="years", to="content.aboutcontent")),
("events", models.ManyToManyField(blank=True, help_text="Choose past, published or completed events. Draft, cancelled, and upcoming events are not shown.", related_name="about_year_highlights", to="events.event")),
],
options={
"verbose_name": "Association year",
"verbose_name_plural": "Association years",
"ordering": ["position", "pk"],
},
),
migrations.AddConstraint(
model_name="aboutyear",
constraint=models.UniqueConstraint(fields=("about", "year_label"), name="content_about_year_label_unique"),
),
migrations.AddField(
model_name="aboutmember",
name="year_group",
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="members", to="content.aboutyear"),
),
]