Skip to content

Commit

Permalink
Respect config endpoints
Browse files Browse the repository at this point in the history
  • Loading branch information
christophehenry committed Apr 5, 2023
1 parent 2c745fe commit fda8843
Show file tree
Hide file tree
Showing 6 changed files with 134 additions and 23 deletions.
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -137,12 +137,19 @@ MARTOR_MARKDOWN_EXTENSIONS = [
MARTOR_MARKDOWN_EXTENSION_CONFIGS = {}

# Markdown urls
MARTOR_UPLOAD_URL = '' # Completely disable the endpoint
# or:
MARTOR_UPLOAD_URL = '/martor/uploader/' # default

MARTOR_SEARCH_USERS_URL = '' # Completely disables the endpoint
# or:
MARTOR_SEARCH_USERS_URL = '/martor/search-user/' # default

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

# If you need to use your own themed "bootstrap" or "semantic ui" dependency
Expand Down
24 changes: 15 additions & 9 deletions martor/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,24 +85,30 @@
)

# Markdown urls
MARTOR_UPLOAD_URL = getattr(
settings, "MARTOR_UPLOAD_URL", "/martor/uploader/" # for imgur
MARTOR_UPLOAD_URL = (
# Allows to disable this endpoint
settings.MARTOR_UPLOAD_URL if hasattr(settings, "MARTOR_UPLOAD_URL")
else "/martor/uploader/"
)
MARTOR_SEARCH_USERS_URL = getattr(
settings, "MARTOR_SEARCH_USERS_URL", "/martor/search-user/" # for mention

MARTOR_SEARCH_USERS_URL = (
# Allows to disable this endpoint
settings.MARTOR_SEARCH_USERS_URL if hasattr(settings, "MARTOR_SEARCH_USERS_URL")
else "/martor/search-user/"
)

# Markdown Extensions
MARTOR_MARKDOWN_BASE_EMOJI_URL = getattr(
settings,
"MARTOR_MARKDOWN_BASE_EMOJI_URL",
"https://github.githubassets.com/images/icons/emoji/",
MARTOR_MARKDOWN_BASE_EMOJI_URL = (
# Allows to disable this endpoint
settings.MARTOR_MARKDOWN_BASE_EMOJI_URL
if hasattr(settings, "MARTOR_MARKDOWN_BASE_EMOJI_URL")
else "https://github.githubassets.com/images/icons/emoji/"
)

MARTOR_MARKDOWN_BASE_MENTION_URL = getattr(
settings,
"MARTOR_MARKDOWN_BASE_MENTION_URL",
"https://python.web.id/author/",
"",
)

# If you need to use your own themed "bootstrap" or "semantic ui" dependency
Expand Down
50 changes: 49 additions & 1 deletion martor/tests/tests.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,23 @@
from django.test import TestCase, override_settings
import sys
from importlib import reload

from django.contrib.auth.models import User
from django.core.signals import setting_changed
from django.test import TestCase, override_settings
from django.urls import resolve, reverse, NoReverseMatch, clear_url_caches

from martor.utils import markdownify
from martor.views import markdownfy_view, markdown_imgur_uploader, markdown_search_user


class SimpleTest(TestCase):
def _on_settings_changed(self, sender, **kwargs):
# Reload settings.py and urls.py when @override_settings is called
clear_url_caches()
reload(sys.modules["martor.settings"])
reload(sys.modules["martor.urls"])
reload(sys.modules["martor.tests.urls"])

def setUp(self):
self.user_password = "TestEgg@1234"
self.user = User.objects.create_user(
Expand All @@ -16,6 +30,11 @@ def setUp(self):
password=self.user_password,
)

setting_changed.connect(self._on_settings_changed)

def tearDown(self):
setting_changed.disconnect(self._on_settings_changed)

def test_form(self):
response = self.client.get("/test-form-view/")
self.assertEqual(response.status_code, 200)
Expand Down Expand Up @@ -108,3 +127,32 @@ def test_markdownify_xss_handled(self):
response_3,
'<p><a href="&quot; onmouseover=alert(document.domain)">xss</a>)</p>', # noqa: E501
)

def test_urls(self):
with override_settings(
MARTOR_MARKDOWNIFY_URL="test/url",
MARTOR_UPLOAD_URL="",
MARTOR_SEARCH_USERS_URL="",
):
found = resolve(reverse("martor_markdownfy"))
self.assertEqual(found.func, markdownfy_view)

with self.assertRaises(NoReverseMatch):
reverse("imgur_uploader")

with self.assertRaises(NoReverseMatch):
reverse("search_user_json")

with override_settings(
MARTOR_MARKDOWNIFY_URL="test/url",
MARTOR_UPLOAD_URL="test/upload",
MARTOR_SEARCH_USERS_URL="test/search",
):
found = resolve(reverse("martor_markdownfy"))
self.assertEqual(found.func, markdownfy_view)

found = resolve(reverse("imgur_uploader"))
self.assertEqual(found.func, markdown_imgur_uploader)

found = resolve(reverse("search_user_json"))
self.assertEqual(found.func, markdown_search_user)
2 changes: 1 addition & 1 deletion martor/tests/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

urlpatterns = [
path("test-form-view/", TestFormView.as_view()),
path("martor/", include("martor.urls")),
path("", include("martor.urls")),
]
else:
from django.conf.urls import url, include
Expand Down
58 changes: 52 additions & 6 deletions martor/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,72 @@
from __future__ import unicode_literals

import django

from .settings import MARTOR_MARKDOWNIFY_URL, MARTOR_UPLOAD_URL, MARTOR_SEARCH_USERS_URL
from .views import (
markdownfy_view,
markdown_imgur_uploader,
markdown_search_user,
)


def __normalize(path):
return path.removeprefix('/').removesuffix('/')


if django.VERSION >= (2, 0):
from django.urls import path

urlpatterns = [
path("markdownify/", markdownfy_view, name="martor_markdownfy"),
path("uploader/", markdown_imgur_uploader, name="imgur_uploader"),
path("search-user/", markdown_search_user, name="search_user_json"),
path(
f"{__normalize(MARTOR_MARKDOWNIFY_URL)}/",
markdownfy_view,
name="martor_markdownfy",
),
]

if MARTOR_UPLOAD_URL:
urlpatterns.append(
path(
f"{__normalize(MARTOR_UPLOAD_URL)}/",
markdown_imgur_uploader,
name="imgur_uploader",
),
)

if MARTOR_SEARCH_USERS_URL:
urlpatterns.append(
path(
f"{__normalize(MARTOR_SEARCH_USERS_URL)}/",
markdown_search_user,
name="search_user_json",
),
)
else:
from django.conf.urls import url

urlpatterns = [
url(r"^markdownify/$", markdownfy_view, name="martor_markdownfy"),
url(r"^uploader/$", markdown_imgur_uploader, name="imgur_uploader"),
url(r"^search-user/$", markdown_search_user, name="search_user_json"),
url(
r"^%s/$" % __normalize(MARTOR_MARKDOWNIFY_URL),
markdownfy_view,
name="martor_markdownfy"
),
]

if MARTOR_UPLOAD_URL:
urlpatterns.append(
url(
r"^%s/$" % __normalize(MARTOR_UPLOAD_URL),
markdown_imgur_uploader,
name="imgur_uploader",
),
)

if MARTOR_SEARCH_USERS_URL:
urlpatterns.append(
url(
r"^%s/$" % __normalize(MARTOR_SEARCH_USERS_URL),
markdown_search_user,
name="search_user_json",
),
)
16 changes: 10 additions & 6 deletions martor/widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
from __future__ import unicode_literals

from django import forms
from django.template.loader import get_template
from django.contrib.admin import widgets
from django.template.loader import get_template
from django.urls import reverse

from .settings import (
MARTOR_THEME,
MARTOR_ENABLE_CONFIGS,
MARTOR_UPLOAD_URL,
MARTOR_MARKDOWNIFY_URL,
MARTOR_SEARCH_USERS_URL,
MARTOR_MARKDOWN_BASE_EMOJI_URL,
MARTOR_TOOLBAR_BUTTONS,
Expand All @@ -32,12 +32,16 @@ def render(self, name, value, attrs=None, renderer=None, **kwargs):
# Make the settings the default attributes to pass
attributes_to_pass = {
"data-enable-configs": MARTOR_ENABLE_CONFIGS,
"data-upload-url": MARTOR_UPLOAD_URL,
"data-markdownfy-url": MARTOR_MARKDOWNIFY_URL,
"data-search-users-url": MARTOR_SEARCH_USERS_URL,
"data-base-emoji-url": MARTOR_MARKDOWN_BASE_EMOJI_URL,
"data-markdownfy-url": reverse("martor_markdownfy"),
}

if MARTOR_UPLOAD_URL:
attributes_to_pass["data-upload-url"] = reverse("imgur_uploader")
if MARTOR_SEARCH_USERS_URL:
attributes_to_pass["data-search-users-url"] = reverse("search_user_json")
if MARTOR_SEARCH_USERS_URL:
attributes_to_pass["data-base-emoji-url"] = MARTOR_MARKDOWN_BASE_EMOJI_URL

# Make sure that the martor value is in the class attr passed in
if "class" in attrs:
attrs["class"] += " martor"
Expand Down

0 comments on commit fda8843

Please sign in to comment.