Skip to content

Commit c6e23e3

Browse files
Maffoochclaude
andcommitted
Enable nl2br in expanded markdown and fold module into dojo.announcement
Single newlines in the expanded body now render as <br>, so authored markdown lays out multi-line. Module folded into the existing dojo/announcement/ app and test patch paths updated. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 957aa8c commit c6e23e3

4 files changed

Lines changed: 16 additions & 16 deletions

File tree

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
logger = logging.getLogger(__name__)
99

10-
BUCKET_URL = "https://storage.googleapis.com/defectdojo-os-messages-prod/open_source_message.md"
10+
BUCKET_URL = "https://storage.googleapis.com/defectdojo-os-messages-dev/open_source_message.md"
1111
CACHE_SECONDS = 3600
1212
HTTP_TIMEOUT_SECONDS = 2
1313
CACHE_KEY = "os_message:v1"
@@ -96,7 +96,7 @@ def parse_os_message(text):
9696
if expanded_source:
9797
expanded_rendered = markdown.markdown(
9898
expanded_source,
99-
extensions=["extra", "fenced_code"],
99+
extensions=["extra", "fenced_code", "nl2br"],
100100
)
101101
expanded_html = bleach.clean(
102102
expanded_rendered,

dojo/announcements/__init__.py

Whitespace-only changes.

dojo/context_processors.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from django.conf import settings
66
from django.contrib import messages
77

8-
from dojo.announcements.os_message import get_os_banner
8+
from dojo.announcement.os_message import get_os_banner
99
from dojo.labels import get_labels
1010
from dojo.models import Alerts, System_Settings, UserAnnouncement
1111

@@ -40,8 +40,8 @@ def globalize_vars(request):
4040
# V3 Feature Flags
4141
"V3_FEATURE_LOCATIONS": settings.V3_FEATURE_LOCATIONS,
4242
}
43-
os_banner = get_os_banner()
44-
if os_banner is not None:
43+
44+
if (os_banner := get_os_banner()) is not None:
4545
context["additional_banners"] = [{
4646
"message": os_banner["message"],
4747
"style": "info",

unittests/test_os_message.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from django.test import RequestFactory, SimpleTestCase, override_settings
77

88
from dojo import context_processors
9-
from dojo.announcements import os_message
9+
from dojo.announcement import os_message
1010

1111

1212
class _Resp:
@@ -105,44 +105,44 @@ def setUp(self):
105105

106106
def test_200_with_body_caches_body(self):
107107
body = "# headline\n"
108-
with patch("dojo.announcements.os_message.requests.get", return_value=_Resp(200, body)) as mock_get:
108+
with patch("dojo.announcement.os_message.requests.get", return_value=_Resp(200, body)) as mock_get:
109109
result = os_message.fetch_os_message()
110110
self.assertEqual(result, body)
111111
self.assertEqual(cache.get(os_message.CACHE_KEY), body)
112112
mock_get.assert_called_once()
113113

114114
def test_404_caches_none(self):
115-
with patch("dojo.announcements.os_message.requests.get", return_value=_Resp(404, "not found")):
115+
with patch("dojo.announcement.os_message.requests.get", return_value=_Resp(404, "not found")):
116116
result = os_message.fetch_os_message()
117117
self.assertIsNone(result)
118118
self.assertIsNone(cache.get(os_message.CACHE_KEY, default="sentinel"))
119119

120120
def test_timeout_caches_none(self):
121-
with patch("dojo.announcements.os_message.requests.get", side_effect=requests.exceptions.Timeout):
121+
with patch("dojo.announcement.os_message.requests.get", side_effect=requests.exceptions.Timeout):
122122
result = os_message.fetch_os_message()
123123
self.assertIsNone(result)
124124
self.assertIsNone(cache.get(os_message.CACHE_KEY, default="sentinel"))
125125

126126
def test_connection_error_caches_none(self):
127-
with patch("dojo.announcements.os_message.requests.get", side_effect=requests.exceptions.ConnectionError):
127+
with patch("dojo.announcement.os_message.requests.get", side_effect=requests.exceptions.ConnectionError):
128128
result = os_message.fetch_os_message()
129129
self.assertIsNone(result)
130130
self.assertIsNone(cache.get(os_message.CACHE_KEY, default="sentinel"))
131131

132132
def test_empty_body_caches_none(self):
133-
with patch("dojo.announcements.os_message.requests.get", return_value=_Resp(200, " \n\n")):
133+
with patch("dojo.announcement.os_message.requests.get", return_value=_Resp(200, " \n\n")):
134134
result = os_message.fetch_os_message()
135135
self.assertIsNone(result)
136136
self.assertIsNone(cache.get(os_message.CACHE_KEY, default="sentinel"))
137137

138138
def test_second_call_hits_cache(self):
139-
with patch("dojo.announcements.os_message.requests.get", return_value=_Resp(200, "# h\n")) as mock_get:
139+
with patch("dojo.announcement.os_message.requests.get", return_value=_Resp(200, "# h\n")) as mock_get:
140140
os_message.fetch_os_message()
141141
os_message.fetch_os_message()
142142
self.assertEqual(mock_get.call_count, 1)
143143

144144
def test_second_call_after_failure_also_hits_cache(self):
145-
with patch("dojo.announcements.os_message.requests.get", side_effect=requests.exceptions.Timeout) as mock_get:
145+
with patch("dojo.announcement.os_message.requests.get", side_effect=requests.exceptions.Timeout) as mock_get:
146146
os_message.fetch_os_message()
147147
os_message.fetch_os_message()
148148
self.assertEqual(mock_get.call_count, 1)
@@ -155,12 +155,12 @@ def setUp(self):
155155
cache.clear()
156156

157157
def test_returns_none_when_fetch_returns_none(self):
158-
with patch("dojo.announcements.os_message.fetch_os_message", return_value=None):
158+
with patch("dojo.announcement.os_message.fetch_os_message", return_value=None):
159159
self.assertIsNone(os_message.get_os_banner())
160160

161161
def test_swallows_parse_exception(self):
162-
with patch("dojo.announcements.os_message.fetch_os_message", return_value="# ok\n"), \
163-
patch("dojo.announcements.os_message.parse_os_message", side_effect=RuntimeError("boom")):
162+
with patch("dojo.announcement.os_message.fetch_os_message", return_value="# ok\n"), \
163+
patch("dojo.announcement.os_message.parse_os_message", side_effect=RuntimeError("boom")):
164164
self.assertIsNone(os_message.get_os_banner())
165165

166166

0 commit comments

Comments
 (0)