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())