Skip to content

Commit 4fbcf7d

Browse files
sarahboycebmispelon
authored andcommitted
Added latest DSF board meeting minutes to complementary sidebar.
1 parent 2d19190 commit 4fbcf7d

File tree

6 files changed

+95
-20
lines changed

6 files changed

+95
-20
lines changed

djangoproject/scss/_style.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1459,7 +1459,7 @@ a.cta {
14591459
margin-bottom: 5px;
14601460
}
14611461

1462-
li {
1462+
> li {
14631463
border-top: 1px solid var(--hairline-color);
14641464
margin-top: 35px;
14651465
padding-top: 10px;

djangoproject/templates/base_foundation.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{% extends "base.html" %}
2-
{% load fundraising_extras %}
2+
{% load fundraising_extras meetings i18n %}
33

44
{% block og_title %}Django Software Foundation{% endblock %}
55

@@ -25,5 +25,8 @@ <h2>About the foundation</h2>
2525
<li><a href="/foundation/cla/">Contributor license agreements</a></li>
2626
<li><a href="/foundation/conferences/">Organizing a Django conference</a></li>
2727
</ul>
28+
<h3>{% translate "Latest DSF meeting minutes" %}</h3>
29+
{% render_latest_meeting_minute_entries 2 %}
30+
<a href="{% url 'foundation_meeting_archive_index' %}" class="link-readmore">{% translate "More meeting minutes" %}</a>
2831
</div>
2932
{% endblock %}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{% load i18n %}
2+
<ul class="list-news">
3+
{% for m in meetings %}
4+
<li>
5+
<h4>
6+
<a href="{{ m.get_absolute_url }}">{{ m }}</a>
7+
</h4>
8+
{% with m.business.all as businesses %}
9+
{% if businesses %}
10+
<div class="meta">
11+
<b>{% translate "New and Ongoing business" %}</b>
12+
<ul>
13+
{% for b in businesses %}
14+
<li>{{ b.title }}</li>
15+
{% endfor %}
16+
</ul>
17+
</div>
18+
{% endif %}
19+
{% endwith %}
20+
<a class="link-readmore" href="{{ m.get_absolute_url }}">
21+
{% translate "Read more" context "Following meeting minutes summary" %}
22+
</a>
23+
</li>
24+
{% endfor %}
25+
</ul>

foundation/templatetags/__init__.py

Whitespace-only changes.

foundation/templatetags/meetings.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from django import template
2+
3+
from ..models import Meeting
4+
5+
register = template.Library()
6+
7+
8+
@register.inclusion_tag("foundation/meeting_snippet.html")
9+
def render_latest_meeting_minute_entries(num):
10+
meetings = Meeting.objects.order_by("-date").prefetch_related("business")[:num]
11+
return {"meetings": meetings}

foundation/tests.py

Lines changed: 54 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,23 @@
55
from django.urls import reverse
66
from djmoney.money import Money
77

8-
from .models import ApprovedGrant, BoardMember, Meeting, Office, Term
8+
from .models import ApprovedGrant, BoardMember, Business, Meeting, Office, Term
99

1010

1111
class MeetingTestCase(TestCase):
12+
@classmethod
13+
def setUpTestData(cls):
14+
cls.user = User.objects.create_superuser(
15+
"admin", "admin@example.com", "password"
16+
)
17+
cls.member = BoardMember.objects.create(
18+
account=cls.user,
19+
office=Office.objects.create(name="treasurer"),
20+
term=Term.objects.create(year=2023),
21+
)
22+
1223
def test_meeting_initial(self):
13-
user = User.objects.create_superuser("admin", "admin@example.com", "password")
14-
self.client.force_login(user)
24+
self.client.force_login(self.user)
1525
response = self.client.get(reverse("admin:foundation_meeting_add"))
1626
self.assertContains(response, "DSF Board monthly meeting")
1727
self.assertContains(response, "dsf-board-monthly-meeting")
@@ -20,17 +30,11 @@ def test_meeting_minutes_feed(self):
2030
"""
2131
Make sure that the meeting minutes RSS feed works
2232
"""
23-
user = User.objects.create_superuser("admin", "admin@example.com", "password")
24-
member = BoardMember.objects.create(
25-
account=user,
26-
office=Office.objects.create(name="treasurer"),
27-
term=Term.objects.create(year=2023),
28-
)
2933
Meeting.objects.create(
3034
date=date.today(),
3135
title="DSF Board monthly meeting",
3236
slug="dsf-board-monthly-meeting",
33-
leader=member,
37+
leader=self.member,
3438
treasurer_report="Hello World",
3539
)
3640

@@ -39,18 +43,11 @@ def test_meeting_minutes_feed(self):
3943
self.assertIn(b"DSF Board monthly meeting", response.content)
4044

4145
def test_meeting_details(self):
42-
user = User.objects.create_superuser("admin", "admin@example.com", "password")
43-
self.client.force_login(user)
44-
member = BoardMember.objects.create(
45-
account=user,
46-
office=Office.objects.create(name="treasurer"),
47-
term=Term.objects.create(year=2023),
48-
)
4946
meeting = Meeting.objects.create(
5047
date=date(2023, 1, 12),
5148
title="DSF Board monthly meeting",
5249
slug="dsf-board-monthly-meeting",
53-
leader=member,
50+
leader=self.member,
5451
treasurer_report="Hello World",
5552
)
5653
ApprovedGrant.objects.create(
@@ -77,3 +74,42 @@ def test_meeting_details(self):
7774
self.assertContains(response, "DSF Board monthly meeting")
7875
self.assertContains(response, "USD $10,000.00")
7976
self.assertContains(response, "EUR €5,000.00")
77+
78+
def test_latest_meeting_minutes(self):
79+
common_meeting_data = {
80+
"slug": "dsf-board-monthly-meeting",
81+
"leader": self.member,
82+
"treasurer_report": "Hello World",
83+
"title": "DSF Board monthly meeting",
84+
}
85+
latest_meeting = Meeting.objects.create(
86+
date=date(2023, 5, 12), **common_meeting_data
87+
)
88+
previous_meeting = Meeting.objects.create(
89+
date=date(2023, 4, 12), **common_meeting_data
90+
)
91+
Meeting.objects.create(date=date(2023, 3, 12), **common_meeting_data)
92+
common_business_data = {
93+
"body": "Example",
94+
"body_html": "Example",
95+
"business_type": "New",
96+
"meeting": latest_meeting,
97+
}
98+
Business.objects.create(title="Business item 1", **common_business_data)
99+
Business.objects.create(title="Business item 2", **common_business_data)
100+
Business.objects.create(title="Business item 3", **common_business_data)
101+
102+
response = self.client.get(reverse("foundation_meeting_archive_index"))
103+
104+
self.assertContains(response, "Latest DSF meeting minutes")
105+
106+
self.assertContains(response, "DSF Board monthly meeting, May 12, 2023")
107+
self.assertContains(response, latest_meeting.get_absolute_url())
108+
self.assertContains(response, "DSF Board monthly meeting, April 12, 2023")
109+
self.assertContains(response, previous_meeting.get_absolute_url())
110+
self.assertNotContains(response, "DSF Board monthly meeting, March 12, 2023")
111+
112+
self.assertContains(response, "New and Ongoing business", count=1)
113+
self.assertContains(response, "Business item 1")
114+
self.assertContains(response, "Business item 2")
115+
self.assertContains(response, "Business item 3")

0 commit comments

Comments
 (0)