Skip to content

Commit df65943

Browse files
authored
Merge pull request #62 from zorexsalvo/feature/announcements
Feature/announcements
2 parents 416bc07 + c475295 commit df65943

File tree

12 files changed

+1009
-0
lines changed

12 files changed

+1009
-0
lines changed

app/announcements/__init__.py

Whitespace-only changes.

app/announcements/admin.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
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", "modal_size", "is_published", "created_at", "updated_at")
9+
list_filter = ("is_published", "modal_size", "created_at")
10+
search_fields = ("title", "content")
11+
readonly_fields = ("created_at", "updated_at")
12+
fieldsets = (
13+
("Content", {"fields": ("title", "content")}),
14+
("Display", {"fields": ("modal_size",)}),
15+
("Status", {"fields": ("is_published",)}),
16+
("Metadata", {"fields": ("created_at", "updated_at")}),
17+
)

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+
]
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 5.2.7 on 2026-03-12 13:57
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('announcements', '0001_initial'),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name='announcement',
15+
name='modal_size',
16+
field=models.CharField(choices=[('md', 'Medium (default)'), ('lg', 'Large'), ('xl', 'Extra Large')], default='md', help_text='Width of the announcement modal', max_length=10),
17+
),
18+
]

app/announcements/migrations/__init__.py

Whitespace-only changes.

app/announcements/models.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from django.db import models
2+
from tinymce.models import HTMLField
3+
4+
5+
class Announcement(models.Model):
6+
MODAL_SIZES = [
7+
("md", "Medium (default)"),
8+
("lg", "Large"),
9+
("xl", "Extra Large"),
10+
]
11+
12+
title = models.CharField(max_length=255)
13+
content = HTMLField()
14+
modal_size = models.CharField(
15+
max_length=10,
16+
choices=MODAL_SIZES,
17+
default="md",
18+
help_text="Width of the announcement modal",
19+
)
20+
is_published = models.BooleanField(default=False)
21+
created_at = models.DateTimeField(auto_now_add=True)
22+
updated_at = models.DateTimeField(auto_now=True)
23+
24+
def __str__(self):
25+
return self.title
26+
27+
@classmethod
28+
def get_latest_published(cls):
29+
"""Get the latest published announcement."""
30+
return cls.objects.filter(is_published=True).order_by("-created_at").first()
31+
32+
class Meta:
33+
ordering = ["-created_at"]
34+
verbose_name = "Announcement"
35+
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)