From 7763092fd8fb26f08dbc0a0664bc7bd769442c50 Mon Sep 17 00:00:00 2001
From: Ben Houses
Date: Fri, 12 Sep 2025 12:07:53 -0400
Subject: [PATCH 1/9] Add next meeting date field and update meeting snippet
template
---
.../templates/foundation/meeting_snippet.html | 6 ++++++
.../0008_meeting_next_meeting_date.py | 18 ++++++++++++++++++
foundation/models.py | 1 +
foundation/templatetags/meetings.py | 3 ++-
foundation/tests.py | 5 ++++-
5 files changed, 31 insertions(+), 2 deletions(-)
create mode 100644 foundation/migrations/0008_meeting_next_meeting_date.py
diff --git a/djangoproject/templates/foundation/meeting_snippet.html b/djangoproject/templates/foundation/meeting_snippet.html
index 0e72198eb..3400214bb 100644
--- a/djangoproject/templates/foundation/meeting_snippet.html
+++ b/djangoproject/templates/foundation/meeting_snippet.html
@@ -23,3 +23,9 @@
{% endfor %}
+
+ Board meetings are generally the second Thursday of the month but are
+ occasionally rescheduled for attendance. {% if next_meeting_date %}
+ Next meeting scheduled for: {{ next_meeting_date |date:"DATE_FORMAT"}}
+ {% endif %}
+
\ No newline at end of file
diff --git a/foundation/migrations/0008_meeting_next_meeting_date.py b/foundation/migrations/0008_meeting_next_meeting_date.py
new file mode 100644
index 000000000..37ff315ec
--- /dev/null
+++ b/foundation/migrations/0008_meeting_next_meeting_date.py
@@ -0,0 +1,18 @@
+# Generated by Django 5.2 on 2025-09-12 09:54
+
+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, null=True),
+ ),
+ ]
diff --git a/foundation/models.py b/foundation/models.py
index 7ae1fa4ac..b405d2d08 100644
--- a/foundation/models.py
+++ b/foundation/models.py
@@ -95,6 +95,7 @@ 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)
def __str__(self):
return "{}, {}".format(self.title, date_format(self.date, "F j, Y"))
diff --git a/foundation/templatetags/meetings.py b/foundation/templatetags/meetings.py
index 80aeec8e8..a8098e355 100644
--- a/foundation/templatetags/meetings.py
+++ b/foundation/templatetags/meetings.py
@@ -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}
diff --git a/foundation/tests.py b/foundation/tests.py
index 38569f375..d3b24e95a 100644
--- a/foundation/tests.py
+++ b/foundation/tests.py
@@ -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
@@ -104,6 +106,7 @@ 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, "Next meeting 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())
From 49d13964e4f4341ad26e6d189f126a95802ffd55 Mon Sep 17 00:00:00 2001
From: "pre-commit-ci[bot]"
<66853113+pre-commit-ci[bot]@users.noreply.github.com>
Date: Fri, 12 Sep 2025 16:14:25 +0000
Subject: [PATCH 2/9] [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
---
djangoproject/templates/foundation/meeting_snippet.html | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/djangoproject/templates/foundation/meeting_snippet.html b/djangoproject/templates/foundation/meeting_snippet.html
index 3400214bb..d0d3f2dc1 100644
--- a/djangoproject/templates/foundation/meeting_snippet.html
+++ b/djangoproject/templates/foundation/meeting_snippet.html
@@ -24,8 +24,8 @@
{% endfor %}
- Board meetings are generally the second Thursday of the month but are
- occasionally rescheduled for attendance. {% if next_meeting_date %}
- Next meeting scheduled for: {{ next_meeting_date |date:"DATE_FORMAT"}}
+ Board meetings are generally the second Thursday of the month but are
+ occasionally rescheduled for attendance. {% if next_meeting_date %}
+ Next meeting scheduled for: {{ next_meeting_date |date:"DATE_FORMAT"}}
{% endif %}
-
\ No newline at end of file
+
From 5c907db44b3e3a3d4132e94518330c536cf52aa8 Mon Sep 17 00:00:00 2001
From: Ben Houses
Date: Fri, 12 Sep 2025 13:56:47 -0400
Subject: [PATCH 3/9] Add translate into next schedule board meeting date
---
.../templates/foundation/meeting_snippet.html | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/djangoproject/templates/foundation/meeting_snippet.html b/djangoproject/templates/foundation/meeting_snippet.html
index d0d3f2dc1..067de0418 100644
--- a/djangoproject/templates/foundation/meeting_snippet.html
+++ b/djangoproject/templates/foundation/meeting_snippet.html
@@ -24,8 +24,13 @@
{% endfor %}
- Board meetings are generally the second Thursday of the month but are
- occasionally rescheduled for attendance. {% if next_meeting_date %}
- Next meeting scheduled for: {{ next_meeting_date |date:"DATE_FORMAT"}}
+ {% blocktranslate trimmed %}
+ Board meetings are generally the second Thursday of the month but are
+ occasionally rescheduled for attendance.
+ {% endblocktranslate %}
+ {% if next_meeting_date %}
+ {% translate "Next meeting scheduled for: " context "Following meetings schedule" %}
+ {{next_meeting_date|date:"DATE_FORMAT"}}
{% endif %}
+
From dc66e09ec9ba5c9fcc5505d50d2d71b6769a2bae Mon Sep 17 00:00:00 2001
From: "pre-commit-ci[bot]"
<66853113+pre-commit-ci[bot]@users.noreply.github.com>
Date: Fri, 12 Sep 2025 17:57:34 +0000
Subject: [PATCH 4/9] [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
---
djangoproject/templates/foundation/meeting_snippet.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/djangoproject/templates/foundation/meeting_snippet.html b/djangoproject/templates/foundation/meeting_snippet.html
index 067de0418..a20aa1c0c 100644
--- a/djangoproject/templates/foundation/meeting_snippet.html
+++ b/djangoproject/templates/foundation/meeting_snippet.html
@@ -26,7 +26,7 @@
{% blocktranslate trimmed %}
Board meetings are generally the second Thursday of the month but are
- occasionally rescheduled for attendance.
+ occasionally rescheduled for attendance.
{% endblocktranslate %}
{% if next_meeting_date %}
{% translate "Next meeting scheduled for: " context "Following meetings schedule" %}
From 854524c57424e62569514789ced574f3223c27ee Mon Sep 17 00:00:00 2001
From: Ben Houses
Date: Wed, 24 Sep 2025 14:19:03 -0400
Subject: [PATCH 5/9] Increased clarity of next meeting date
---
djangoproject/templates/foundation/meeting_snippet.html | 2 +-
foundation/migrations/0008_meeting_next_meeting_date.py | 4 ++--
foundation/models.py | 6 +++++-
3 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/djangoproject/templates/foundation/meeting_snippet.html b/djangoproject/templates/foundation/meeting_snippet.html
index a20aa1c0c..9dfc05f09 100644
--- a/djangoproject/templates/foundation/meeting_snippet.html
+++ b/djangoproject/templates/foundation/meeting_snippet.html
@@ -29,7 +29,7 @@
occasionally rescheduled for attendance.
{% endblocktranslate %}
{% if next_meeting_date %}
- {% translate "Next meeting scheduled for: " context "Following meetings schedule" %}
+ {% translate "The next meeting is scheduled for: " context "Following meetings schedule" %}
{{next_meeting_date|date:"DATE_FORMAT"}}
{% endif %}
diff --git a/foundation/migrations/0008_meeting_next_meeting_date.py b/foundation/migrations/0008_meeting_next_meeting_date.py
index 37ff315ec..7e9220a5b 100644
--- a/foundation/migrations/0008_meeting_next_meeting_date.py
+++ b/foundation/migrations/0008_meeting_next_meeting_date.py
@@ -1,4 +1,4 @@
-# Generated by Django 5.2 on 2025-09-12 09:54
+# Generated by Django 5.2 on 2025-09-24 13:18
from django.db import migrations, models
@@ -13,6 +13,6 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='meeting',
name='next_meeting_date',
- field=models.DateField(blank=True, null=True),
+ 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),
),
]
diff --git a/foundation/models.py b/foundation/models.py
index b405d2d08..9190c6ae7 100644
--- a/foundation/models.py
+++ b/foundation/models.py
@@ -95,7 +95,11 @@ 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)
+ 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"))
From d9656085544794f89ed39a63f89cc2c196d0f935 Mon Sep 17 00:00:00 2001
From: Ben Houses
Date: Wed, 24 Sep 2025 14:19:25 -0400
Subject: [PATCH 6/9] Add test for latest meeting date without next meeting
date
---
foundation/tests.py | 30 ++++++++++++++++++++++++++++++
1 file changed, 30 insertions(+)
diff --git a/foundation/tests.py b/foundation/tests.py
index d3b24e95a..cb6d694d7 100644
--- a/foundation/tests.py
+++ b/foundation/tests.py
@@ -116,3 +116,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, "Next meeting scheduled for")
\ No newline at end of file
From 9de961436aedb3934e0fc35241c264cd44abf001 Mon Sep 17 00:00:00 2001
From: "pre-commit-ci[bot]"
<66853113+pre-commit-ci[bot]@users.noreply.github.com>
Date: Wed, 24 Sep 2025 18:19:59 +0000
Subject: [PATCH 7/9] [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
---
djangoproject/templates/foundation/meeting_snippet.html | 2 +-
foundation/models.py | 4 +++-
foundation/tests.py | 2 +-
3 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/djangoproject/templates/foundation/meeting_snippet.html b/djangoproject/templates/foundation/meeting_snippet.html
index 9dfc05f09..71f994157 100644
--- a/djangoproject/templates/foundation/meeting_snippet.html
+++ b/djangoproject/templates/foundation/meeting_snippet.html
@@ -29,7 +29,7 @@
occasionally rescheduled for attendance.
{% endblocktranslate %}
{% if next_meeting_date %}
- {% translate "The next meeting is scheduled for: " context "Following meetings schedule" %}
+ {% translate "The next meeting is scheduled for: " context "Following meetings schedule" %}
{{next_meeting_date|date:"DATE_FORMAT"}}
{% endif %}
diff --git a/foundation/models.py b/foundation/models.py
index 9190c6ae7..4547d310d 100644
--- a/foundation/models.py
+++ b/foundation/models.py
@@ -98,7 +98,9 @@ class Meeting(models.Model):
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.")
+ 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):
diff --git a/foundation/tests.py b/foundation/tests.py
index cb6d694d7..7a6909a9d 100644
--- a/foundation/tests.py
+++ b/foundation/tests.py
@@ -145,4 +145,4 @@ def test_latest_meeting_minutes_without_next_meeting_date(self):
self.assertContains(response, "DSF Board monthly meeting, May 12, 2023")
# Key check for no meeting schedule
- self.assertNotContains(response, "Next meeting scheduled for")
\ No newline at end of file
+ self.assertNotContains(response, "Next meeting scheduled for")
From 1981a45013ec61afff9537f4035dd5ea53cd174e Mon Sep 17 00:00:00 2001
From: Ben Houses
Date: Wed, 24 Sep 2025 14:50:34 -0400
Subject: [PATCH 8/9] Remove newline in meeting_snippet
---
djangoproject/templates/foundation/meeting_snippet.html | 3 +--
foundation/tests.py | 4 ++--
2 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/djangoproject/templates/foundation/meeting_snippet.html b/djangoproject/templates/foundation/meeting_snippet.html
index 71f994157..92dbf013d 100644
--- a/djangoproject/templates/foundation/meeting_snippet.html
+++ b/djangoproject/templates/foundation/meeting_snippet.html
@@ -29,8 +29,7 @@
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"}}
+ {% translate "The next meeting is scheduled for: " context "Following meetings schedule" %}{{next_meeting_date|date:"DATE_FORMAT"}}
{% endif %}
diff --git a/foundation/tests.py b/foundation/tests.py
index 7a6909a9d..c2b869f55 100644
--- a/foundation/tests.py
+++ b/foundation/tests.py
@@ -106,7 +106,7 @@ 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, "Next meeting scheduled for: June 13, 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())
@@ -145,4 +145,4 @@ def test_latest_meeting_minutes_without_next_meeting_date(self):
self.assertContains(response, "DSF Board monthly meeting, May 12, 2023")
# Key check for no meeting schedule
- self.assertNotContains(response, "Next meeting scheduled for")
+ self.assertNotContains(response, "The next meeting is scheduled for: ")
From c035d9a9b2322e8c2c17b96749dcec54a041e6ab Mon Sep 17 00:00:00 2001
From: "pre-commit-ci[bot]"
<66853113+pre-commit-ci[bot]@users.noreply.github.com>
Date: Wed, 24 Sep 2025 18:50:56 +0000
Subject: [PATCH 9/9] [pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
---
foundation/tests.py | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/foundation/tests.py b/foundation/tests.py
index c2b869f55..69db2891a 100644
--- a/foundation/tests.py
+++ b/foundation/tests.py
@@ -106,7 +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, "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())