Skip to content

Commit 068fedf

Browse files
authored
Merge pull request #201 from christophehenry/respect-config-endpoints
Respect config endpoints
2 parents 2c745fe + fda8843 commit 068fedf

File tree

6 files changed

+134
-23
lines changed

6 files changed

+134
-23
lines changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,12 +137,19 @@ MARTOR_MARKDOWN_EXTENSIONS = [
137137
MARTOR_MARKDOWN_EXTENSION_CONFIGS = {}
138138

139139
# Markdown urls
140+
MARTOR_UPLOAD_URL = '' # Completely disable the endpoint
141+
# or:
140142
MARTOR_UPLOAD_URL = '/martor/uploader/' # default
143+
144+
MARTOR_SEARCH_USERS_URL = '' # Completely disables the endpoint
145+
# or:
141146
MARTOR_SEARCH_USERS_URL = '/martor/search-user/' # default
142147

143148
# Markdown Extensions
144149
# MARTOR_MARKDOWN_BASE_EMOJI_URL = 'https://www.webfx.com/tools/emoji-cheat-sheet/graphics/emojis/' # from webfx
145150
MARTOR_MARKDOWN_BASE_EMOJI_URL = 'https://github.githubassets.com/images/icons/emoji/' # default from github
151+
# or:
152+
MARTOR_MARKDOWN_BASE_EMOJI_URL = '' # Completely disables the endpoint
146153
MARTOR_MARKDOWN_BASE_MENTION_URL = 'https://python.web.id/author/' # please change this to your domain
147154

148155
# If you need to use your own themed "bootstrap" or "semantic ui" dependency

martor/settings.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,24 +85,30 @@
8585
)
8686

8787
# Markdown urls
88-
MARTOR_UPLOAD_URL = getattr(
89-
settings, "MARTOR_UPLOAD_URL", "/martor/uploader/" # for imgur
88+
MARTOR_UPLOAD_URL = (
89+
# Allows to disable this endpoint
90+
settings.MARTOR_UPLOAD_URL if hasattr(settings, "MARTOR_UPLOAD_URL")
91+
else "/martor/uploader/"
9092
)
91-
MARTOR_SEARCH_USERS_URL = getattr(
92-
settings, "MARTOR_SEARCH_USERS_URL", "/martor/search-user/" # for mention
93+
94+
MARTOR_SEARCH_USERS_URL = (
95+
# Allows to disable this endpoint
96+
settings.MARTOR_SEARCH_USERS_URL if hasattr(settings, "MARTOR_SEARCH_USERS_URL")
97+
else "/martor/search-user/"
9398
)
9499

95100
# Markdown Extensions
96-
MARTOR_MARKDOWN_BASE_EMOJI_URL = getattr(
97-
settings,
98-
"MARTOR_MARKDOWN_BASE_EMOJI_URL",
99-
"https://github.githubassets.com/images/icons/emoji/",
101+
MARTOR_MARKDOWN_BASE_EMOJI_URL = (
102+
# Allows to disable this endpoint
103+
settings.MARTOR_MARKDOWN_BASE_EMOJI_URL
104+
if hasattr(settings, "MARTOR_MARKDOWN_BASE_EMOJI_URL")
105+
else "https://github.githubassets.com/images/icons/emoji/"
100106
)
101107

102108
MARTOR_MARKDOWN_BASE_MENTION_URL = getattr(
103109
settings,
104110
"MARTOR_MARKDOWN_BASE_MENTION_URL",
105-
"https://python.web.id/author/",
111+
"",
106112
)
107113

108114
# If you need to use your own themed "bootstrap" or "semantic ui" dependency

martor/tests/tests.py

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,23 @@
1-
from django.test import TestCase, override_settings
1+
import sys
2+
from importlib import reload
3+
24
from django.contrib.auth.models import User
5+
from django.core.signals import setting_changed
6+
from django.test import TestCase, override_settings
7+
from django.urls import resolve, reverse, NoReverseMatch, clear_url_caches
8+
39
from martor.utils import markdownify
10+
from martor.views import markdownfy_view, markdown_imgur_uploader, markdown_search_user
411

512

613
class SimpleTest(TestCase):
14+
def _on_settings_changed(self, sender, **kwargs):
15+
# Reload settings.py and urls.py when @override_settings is called
16+
clear_url_caches()
17+
reload(sys.modules["martor.settings"])
18+
reload(sys.modules["martor.urls"])
19+
reload(sys.modules["martor.tests.urls"])
20+
721
def setUp(self):
822
self.user_password = "TestEgg@1234"
923
self.user = User.objects.create_user(
@@ -16,6 +30,11 @@ def setUp(self):
1630
password=self.user_password,
1731
)
1832

33+
setting_changed.connect(self._on_settings_changed)
34+
35+
def tearDown(self):
36+
setting_changed.disconnect(self._on_settings_changed)
37+
1938
def test_form(self):
2039
response = self.client.get("/test-form-view/")
2140
self.assertEqual(response.status_code, 200)
@@ -108,3 +127,32 @@ def test_markdownify_xss_handled(self):
108127
response_3,
109128
'<p><a href="&quot; onmouseover=alert(document.domain)">xss</a>)</p>', # noqa: E501
110129
)
130+
131+
def test_urls(self):
132+
with override_settings(
133+
MARTOR_MARKDOWNIFY_URL="test/url",
134+
MARTOR_UPLOAD_URL="",
135+
MARTOR_SEARCH_USERS_URL="",
136+
):
137+
found = resolve(reverse("martor_markdownfy"))
138+
self.assertEqual(found.func, markdownfy_view)
139+
140+
with self.assertRaises(NoReverseMatch):
141+
reverse("imgur_uploader")
142+
143+
with self.assertRaises(NoReverseMatch):
144+
reverse("search_user_json")
145+
146+
with override_settings(
147+
MARTOR_MARKDOWNIFY_URL="test/url",
148+
MARTOR_UPLOAD_URL="test/upload",
149+
MARTOR_SEARCH_USERS_URL="test/search",
150+
):
151+
found = resolve(reverse("martor_markdownfy"))
152+
self.assertEqual(found.func, markdownfy_view)
153+
154+
found = resolve(reverse("imgur_uploader"))
155+
self.assertEqual(found.func, markdown_imgur_uploader)
156+
157+
found = resolve(reverse("search_user_json"))
158+
self.assertEqual(found.func, markdown_search_user)

martor/tests/urls.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
urlpatterns = [
1010
path("test-form-view/", TestFormView.as_view()),
11-
path("martor/", include("martor.urls")),
11+
path("", include("martor.urls")),
1212
]
1313
else:
1414
from django.conf.urls import url, include

martor/urls.py

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,72 @@
22
from __future__ import unicode_literals
33

44
import django
5+
6+
from .settings import MARTOR_MARKDOWNIFY_URL, MARTOR_UPLOAD_URL, MARTOR_SEARCH_USERS_URL
57
from .views import (
68
markdownfy_view,
79
markdown_imgur_uploader,
810
markdown_search_user,
911
)
1012

1113

14+
def __normalize(path):
15+
return path.removeprefix('/').removesuffix('/')
16+
17+
1218
if django.VERSION >= (2, 0):
1319
from django.urls import path
1420

1521
urlpatterns = [
16-
path("markdownify/", markdownfy_view, name="martor_markdownfy"),
17-
path("uploader/", markdown_imgur_uploader, name="imgur_uploader"),
18-
path("search-user/", markdown_search_user, name="search_user_json"),
22+
path(
23+
f"{__normalize(MARTOR_MARKDOWNIFY_URL)}/",
24+
markdownfy_view,
25+
name="martor_markdownfy",
26+
),
1927
]
28+
29+
if MARTOR_UPLOAD_URL:
30+
urlpatterns.append(
31+
path(
32+
f"{__normalize(MARTOR_UPLOAD_URL)}/",
33+
markdown_imgur_uploader,
34+
name="imgur_uploader",
35+
),
36+
)
37+
38+
if MARTOR_SEARCH_USERS_URL:
39+
urlpatterns.append(
40+
path(
41+
f"{__normalize(MARTOR_SEARCH_USERS_URL)}/",
42+
markdown_search_user,
43+
name="search_user_json",
44+
),
45+
)
2046
else:
2147
from django.conf.urls import url
2248

2349
urlpatterns = [
24-
url(r"^markdownify/$", markdownfy_view, name="martor_markdownfy"),
25-
url(r"^uploader/$", markdown_imgur_uploader, name="imgur_uploader"),
26-
url(r"^search-user/$", markdown_search_user, name="search_user_json"),
50+
url(
51+
r"^%s/$" % __normalize(MARTOR_MARKDOWNIFY_URL),
52+
markdownfy_view,
53+
name="martor_markdownfy"
54+
),
2755
]
56+
57+
if MARTOR_UPLOAD_URL:
58+
urlpatterns.append(
59+
url(
60+
r"^%s/$" % __normalize(MARTOR_UPLOAD_URL),
61+
markdown_imgur_uploader,
62+
name="imgur_uploader",
63+
),
64+
)
65+
66+
if MARTOR_SEARCH_USERS_URL:
67+
urlpatterns.append(
68+
url(
69+
r"^%s/$" % __normalize(MARTOR_SEARCH_USERS_URL),
70+
markdown_search_user,
71+
name="search_user_json",
72+
),
73+
)

martor/widgets.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
from __future__ import unicode_literals
33

44
from django import forms
5-
from django.template.loader import get_template
65
from django.contrib.admin import widgets
6+
from django.template.loader import get_template
7+
from django.urls import reverse
78

89
from .settings import (
910
MARTOR_THEME,
1011
MARTOR_ENABLE_CONFIGS,
1112
MARTOR_UPLOAD_URL,
12-
MARTOR_MARKDOWNIFY_URL,
1313
MARTOR_SEARCH_USERS_URL,
1414
MARTOR_MARKDOWN_BASE_EMOJI_URL,
1515
MARTOR_TOOLBAR_BUTTONS,
@@ -32,12 +32,16 @@ def render(self, name, value, attrs=None, renderer=None, **kwargs):
3232
# Make the settings the default attributes to pass
3333
attributes_to_pass = {
3434
"data-enable-configs": MARTOR_ENABLE_CONFIGS,
35-
"data-upload-url": MARTOR_UPLOAD_URL,
36-
"data-markdownfy-url": MARTOR_MARKDOWNIFY_URL,
37-
"data-search-users-url": MARTOR_SEARCH_USERS_URL,
38-
"data-base-emoji-url": MARTOR_MARKDOWN_BASE_EMOJI_URL,
35+
"data-markdownfy-url": reverse("martor_markdownfy"),
3936
}
4037

38+
if MARTOR_UPLOAD_URL:
39+
attributes_to_pass["data-upload-url"] = reverse("imgur_uploader")
40+
if MARTOR_SEARCH_USERS_URL:
41+
attributes_to_pass["data-search-users-url"] = reverse("search_user_json")
42+
if MARTOR_SEARCH_USERS_URL:
43+
attributes_to_pass["data-base-emoji-url"] = MARTOR_MARKDOWN_BASE_EMOJI_URL
44+
4145
# Make sure that the martor value is in the class attr passed in
4246
if "class" in attrs:
4347
attrs["class"] += " martor"

0 commit comments

Comments
 (0)