Skip to content

Commit

Permalink
Pass current revision to Editor.get_widget/get_admin_widget - #1249
Browse files Browse the repository at this point in the history
* Pass current revision to Editor.get_widget()/get_admin_widget()

Sometimes it is useful to have the current revision in the editor
widget instance, for example to create preview and upload links,
autocomplete, etc.

<textarea name="content" data-upload-url='/wiki/my-page/_plugin/attachments/...'>

Previously, EditorBase had an instance attribute "instance", but that
doesn't make sense (there is only one global instance of Editor) and
wasn't ever filled anyway. 

This patch removes that, renames the "instance" parameter in 
get_widget()/get_admin_widget() to "revision"
(to make clear what this parameter is) and fills it appropriately and also
add tests to improve coverage.
  • Loading branch information
chrisv2 committed Jan 16, 2023
1 parent 77550be commit 85d4dd1
Show file tree
Hide file tree
Showing 5 changed files with 87 additions and 9 deletions.
2 changes: 1 addition & 1 deletion src/wiki/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# TODO: This pattern is too weird
editor = editors.getEditor()
self.fields["content"].widget = editor.get_admin_widget()
self.fields["content"].widget = editor.get_admin_widget(self.instance)


class ArticleRevisionAdmin(admin.ModelAdmin):
Expand Down
6 changes: 3 additions & 3 deletions src/wiki/editors/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,10 @@ class BaseEditor:
media_admin = ()
media_frontend = ()

def __init__(self, instance=None):
self.instance = instance
def get_admin_widget(self, revision=None):
return forms.Textarea()

def get_admin_widget(self):
def get_widget(self, revision=None):
return forms.Textarea()

class AdminMedia:
Expand Down
4 changes: 2 additions & 2 deletions src/wiki/editors/markitup.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ class MarkItUpAdminWidget(MarkItUpWidget):
class MarkItUp(BaseEditor):
editor_id = "markitup"

def get_admin_widget(self, instance=None):
def get_admin_widget(self, revision=None):
return MarkItUpAdminWidget()

def get_widget(self, instance=None):
def get_widget(self, revision=None):
return MarkItUpWidget()

class AdminMedia:
Expand Down
5 changes: 2 additions & 3 deletions src/wiki/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -227,9 +227,7 @@ class EditForm(forms.Form, SpamProtectionMixin):
title = forms.CharField(
label=_("Title"),
)
content = forms.CharField(
label=_("Contents"), required=False, widget=getEditor().get_widget()
) # @UndefinedVariable
content = forms.CharField(label=_("Contents"), required=False) # @UndefinedVariable

summary = forms.CharField(
label=pgettext_lazy("Revision comment", "Summary"),
Expand Down Expand Up @@ -294,6 +292,7 @@ def __init__(self, request, current_revision, *args, **kwargs):
kwargs["initial"] = initial

super().__init__(*args, **kwargs)
self.fields["content"].widget = getEditor().get_widget(current_revision)

def clean_title(self):
title = self.cleaned_data.get("title", None)
Expand Down
79 changes: 79 additions & 0 deletions tests/core/test_editor.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import wiki.editors
from django.forms import Textarea
from wiki.editors.base import BaseEditor

from ..base import RequireRootArticleMixin
from ..base import WebTestBase
from ..base import wiki_override_settings


class CustomEditor(BaseEditor):
def get_widget(self, revision=None):
return Textarea(attrs={"data-revision": revision.pk})

def get_admin_widget(self, revision=None):
return Textarea(attrs={"data-revision": revision.pk})


class EditorTest(RequireRootArticleMixin, WebTestBase):
def setUp(self):
super().setUp()
# reset the cached editor class and instance
wiki.editors._editor, wiki.editors._EditorClass = None, None

def test_editor_widget_markitup(self):
response = self.get_url("wiki:edit", path="")
self.assertContains(
response,
'<textarea name="content" class="markItUp" rows="10" cols="40" id="id_content">',
)

def test_admin_widget_markitup(self):
response = self.get_url(
"admin:wiki_articlerevision_change",
object_id=self.root_article.current_revision.id,
)
self.assertContains(
response,
'<textarea name="content" class="markItUp" rows="10" cols="40" id="id_content">',
)

@wiki_override_settings(WIKI_EDITOR="wiki.editors.base.BaseEditor")
def test_editor_widget_base(self):
response = self.get_url("wiki:edit", path="")
self.assertContains(
response, '<textarea name="content" cols="40" rows="10" id="id_content">'
)

@wiki_override_settings(WIKI_EDITOR="wiki.editors.base.BaseEditor")
def test_admin_widget_base(self):
response = self.get_url(
"admin:wiki_articlerevision_change",
object_id=self.root_article.current_revision.id,
)
self.assertContains(
response, '<textarea name="content" cols="40" rows="10" id="id_content">'
)

@wiki_override_settings(WIKI_EDITOR="tests.core.test_editor.CustomEditor")
def test_editor_widget_custom(self):
response = self.get_url("wiki:edit", path="")
self.assertContains(
response,
'<textarea name="content" cols="40" rows="10" data-revision="{}" id="id_content">'.format(
self.root_article.current_revision.id
),
)

@wiki_override_settings(WIKI_EDITOR="tests.core.test_editor.CustomEditor")
def test_admin_widget_custom(self):
response = self.get_url(
"admin:wiki_articlerevision_change",
object_id=self.root_article.current_revision.id,
)
self.assertContains(
response,
'<textarea name="content" cols="40" rows="10" data-revision="{}" id="id_content">'.format(
self.root_article.current_revision.id
),
)

0 comments on commit 85d4dd1

Please sign in to comment.