Skip to content
10 changes: 10 additions & 0 deletions djangoproject/templates/foundation/meeting_snippet.html
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,13 @@ <h4>
</li>
{% endfor %}
</ul>
<p>
{% blocktranslate trimmed %}
Board meetings are generally the second Thursday of the month but are
occasionally rescheduled for attendance.
{% endblocktranslate %}
{% if next_meeting_date %}
{% translate "The next meeting is scheduled for: " context "Following meetings schedule" %}{{next_meeting_date|date:"DATE_FORMAT"}}
{% endif %}
Comment on lines +31 to +33
Copy link
Author

@house-ben house-ben Sep 24, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unsure if there is a better to do this, so that line 32 isn't as long. While not having a \n between The next meeting is scheduled for: and the date. I know django {% spaceless %} tag would work here, but seems a bit overkill.


</p>
18 changes: 18 additions & 0 deletions foundation/migrations/0008_meeting_next_meeting_date.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 5.2 on 2025-09-24 13:18

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('foundation', '0007_boardmember_account_protect'),
]

operations = [
migrations.AddField(
model_name='meeting',
name='next_meeting_date',
field=models.DateField(blank=True, help_text="This will be shown on the website as the board's next meeting date. The latest meeting's Next Meeting Date will be used.", null=True),
),
]
7 changes: 7 additions & 0 deletions foundation/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,13 @@ class Meeting(models.Model):
)
treasurer_report = models.TextField(blank=True)
treasurer_report_html = models.TextField(editable=False)
next_meeting_date = models.DateField(
null=True,
blank=True,
help_text=_(
"This will be shown on the website as the board's next meeting date. The latest meeting's Next Meeting Date will be used."
),
)

def __str__(self):
return "{}, {}".format(self.title, date_format(self.date, "F j, Y"))
Expand Down
3 changes: 2 additions & 1 deletion foundation/templatetags/meetings.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@
@register.inclusion_tag("foundation/meeting_snippet.html")
def render_latest_meeting_minute_entries(num):
meetings = Meeting.objects.order_by("-date").prefetch_related("business")[:num]
return {"meetings": meetings}
next_meeting_date = meetings[0].next_meeting_date if meetings else None
return {"meetings": meetings, "next_meeting_date": next_meeting_date}
37 changes: 36 additions & 1 deletion foundation/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,9 @@ def test_latest_meeting_minutes(self):
"title": "DSF Board monthly meeting",
}
latest_meeting = Meeting.objects.create(
date=date(2023, 5, 12), **common_meeting_data
date=date(2023, 5, 12),
next_meeting_date=date(2023, 6, 13),
**common_meeting_data
)
previous_meeting = Meeting.objects.create(
date=date(2023, 4, 12), **common_meeting_data
Expand All @@ -104,6 +106,9 @@ def test_latest_meeting_minutes(self):
self.assertContains(response, "Latest DSF meeting minutes")

self.assertContains(response, "DSF Board monthly meeting, May 12, 2023")
self.assertContains(
response, "The next meeting is scheduled for: June 13, 2023"
)
self.assertContains(response, latest_meeting.get_absolute_url())
self.assertContains(response, "DSF Board monthly meeting, April 12, 2023")
self.assertContains(response, previous_meeting.get_absolute_url())
Expand All @@ -113,3 +118,33 @@ def test_latest_meeting_minutes(self):
self.assertContains(response, "Business item 1")
self.assertContains(response, "Business item 2")
self.assertContains(response, "Business item 3")

def test_latest_meeting_minutes_without_next_meeting_date(self):
common_meeting_data = {
"slug": "dsf-board-monthly-meeting",
"leader": self.member,
"treasurer_report": "Hello World",
"title": "DSF Board monthly meeting",
}
latest_meeting = Meeting.objects.create(
date=date(2023, 5, 12),
next_meeting_date=None, # Explicitly left out
**common_meeting_data
)
Meeting.objects.create(date=date(2023, 4, 12), **common_meeting_data)

Business.objects.create(
title="Business item 1",
body="Example",
body_html="Example",
business_type="New",
meeting=latest_meeting,
)

response = self.client.get(reverse("foundation_meeting_archive_index"))

self.assertContains(response, "Latest DSF meeting minutes")
self.assertContains(response, "DSF Board monthly meeting, May 12, 2023")

# Key check for no meeting schedule
self.assertNotContains(response, "The next meeting is scheduled for: ")
Loading