Skip to content

Commit 7dde203

Browse files
committed
feat: add dynamic announcement modal with database management
1 parent 416bc07 commit 7dde203

File tree

11 files changed

+905
-0
lines changed

11 files changed

+905
-0
lines changed

app/announcements/__init__.py

Whitespace-only changes.

app/announcements/admin.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from django.contrib import admin
2+
3+
from .models import Announcement
4+
5+
6+
@admin.register(Announcement)
7+
class AnnouncementAdmin(admin.ModelAdmin):
8+
list_display = ("title", "is_published", "created_at", "updated_at")
9+
list_filter = ("is_published", "created_at")
10+
search_fields = ("title", "content")
11+
readonly_fields = ("created_at", "updated_at")
12+
fieldsets = (
13+
("Content", {"fields": ("title", "content")}),
14+
("Status", {"fields": ("is_published",)}),
15+
("Metadata", {"fields": ("created_at", "updated_at")}),
16+
)

app/announcements/apps.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from django.apps import AppConfig
2+
3+
4+
class AnnouncementsConfig(AppConfig):
5+
default_auto_field = "django.db.models.BigAutoField"
6+
name = "app.announcements"
7+
verbose_name = "Announcements"
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Generated by Django 5.2.7 on 2026-03-12 13:53
2+
3+
import tinymce.models
4+
from django.db import migrations, models
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
initial = True
10+
11+
dependencies = [
12+
]
13+
14+
operations = [
15+
migrations.CreateModel(
16+
name='Announcement',
17+
fields=[
18+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19+
('title', models.CharField(max_length=255)),
20+
('content', tinymce.models.HTMLField()),
21+
('is_published', models.BooleanField(default=False)),
22+
('created_at', models.DateTimeField(auto_now_add=True)),
23+
('updated_at', models.DateTimeField(auto_now=True)),
24+
],
25+
options={
26+
'verbose_name': 'Announcement',
27+
'verbose_name_plural': 'Announcements',
28+
'ordering': ['-created_at'],
29+
},
30+
),
31+
]

app/announcements/migrations/__init__.py

Whitespace-only changes.

app/announcements/models.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from django.db import models
2+
from tinymce.models import HTMLField
3+
4+
5+
class Announcement(models.Model):
6+
title = models.CharField(max_length=255)
7+
content = HTMLField()
8+
is_published = models.BooleanField(default=False)
9+
created_at = models.DateTimeField(auto_now_add=True)
10+
updated_at = models.DateTimeField(auto_now=True)
11+
12+
def __str__(self):
13+
return self.title
14+
15+
@classmethod
16+
def get_latest_published(cls):
17+
"""Get the latest published announcement."""
18+
return cls.objects.filter(is_published=True).order_by("-created_at").first()
19+
20+
class Meta:
21+
ordering = ["-created_at"]
22+
verbose_name = "Announcement"
23+
verbose_name_plural = "Announcements"

config/context_processors.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
def announcement_context(request):
2+
"""Inject latest published announcement into template context."""
3+
from app.announcements.models import Announcement
4+
5+
return {"latest_announcement": Announcement.get_latest_published()}

config/settings.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@
6969
"app.speakers",
7070
"app.sponsors",
7171
"app.pages",
72+
"app.announcements.apps.AnnouncementsConfig",
7273
]
7374

7475
INSTALLED_APPS = [
@@ -119,6 +120,7 @@
119120
"django.contrib.auth.context_processors.auth",
120121
"django.contrib.messages.context_processors.messages",
121122
"app.pages.context_processors.navigation",
123+
"config.context_processors.announcement_context",
122124
],
123125
},
124126
},

0 commit comments

Comments
 (0)