From 3858c95426fce057a258fe18d93dfdfa9409de7d Mon Sep 17 00:00:00 2001 From: Marnanel Thurman Date: Sat, 25 Apr 2020 16:40:06 +0100 Subject: [PATCH] Content of statuses, and notes (bios) of users, are interpreted as markdown and returned as HTML. --- kepi/trilby_api/serializers.py | 15 ++++++++++++++- kepi/trilby_api/tests/__init__.py | 2 +- kepi/trilby_api/tests/test_notifications.py | 2 +- kepi/trilby_api/tests/test_status.py | 2 +- kepi/trilby_api/tests/test_timelines.py | 2 +- 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/kepi/trilby_api/serializers.py b/kepi/trilby_api/serializers.py index 21d016a..cf06a44 100644 --- a/kepi/trilby_api/serializers.py +++ b/kepi/trilby_api/serializers.py @@ -3,6 +3,7 @@ from kepi.trilby_api.models import * from rest_framework_recursive.fields import RecursiveField from oauth2_provider.models import Application import kepi.trilby_api.utils as trilby_utils +import markdown ######################################### @@ -37,6 +38,14 @@ class UserSerializer(serializers.ModelSerializer): created_at = serializers.DateTimeField( ) + note = serializers.SerializerMethodField() + def get_note(self, user): + result = markdown.markdown(user.note) + return result + def set_note(self, user, note): + user.note = note + + note = serializers.CharField( ) @@ -184,13 +193,17 @@ class StatusSerializer(serializers.ModelSerializer): # "content" is read-only for HTML; # "status" is write-only for text (or Markdown) - content = serializers.CharField( + content = serializers.SerializerMethodField( read_only = True) status = serializers.CharField( source='source_text', write_only = True) + def get_content(self, status): + result = markdown.markdown(status.content) + return result + created_at = serializers.DateTimeField( required = False, read_only = True) diff --git a/kepi/trilby_api/tests/__init__.py b/kepi/trilby_api/tests/__init__.py index ff4a1d4..32773cf 100644 --- a/kepi/trilby_api/tests/__init__.py +++ b/kepi/trilby_api/tests/__init__.py @@ -35,7 +35,7 @@ ACCOUNT_SOURCE_EXPECTED = { STATUS_EXPECTED = { 'in_reply_to_account_id': None, - 'content': 'Hello world.', + 'content': '

Hello world.

', 'emojis': [], 'reblogs_count': 0, 'favourites_count': 0, diff --git a/kepi/trilby_api/tests/test_notifications.py b/kepi/trilby_api/tests/test_notifications.py index 265d7ac..9528892 100644 --- a/kepi/trilby_api/tests/test_notifications.py +++ b/kepi/trilby_api/tests/test_notifications.py @@ -116,7 +116,7 @@ class TestNotifications(TrilbyTestCase): self.assertDictContainsSubset( { 'id': str(status.id), - 'content': 'Curiouser and curiouser!', + 'content': '

Curiouser and curiouser!

', }, content[0]['status'], ) diff --git a/kepi/trilby_api/tests/test_status.py b/kepi/trilby_api/tests/test_status.py index dc995fe..661504d 100644 --- a/kepi/trilby_api/tests/test_status.py +++ b/kepi/trilby_api/tests/test_status.py @@ -646,7 +646,7 @@ class TestGetStatus(TrilbyTestCase): self.assertEqual( details['content'], - 'Daisies are our silver.', + '

Daisies are our silver.

', ) def test_view_specific_status_404(self): diff --git a/kepi/trilby_api/tests/test_timelines.py b/kepi/trilby_api/tests/test_timelines.py index 2da161e..efd6776 100644 --- a/kepi/trilby_api/tests/test_timelines.py +++ b/kepi/trilby_api/tests/test_timelines.py @@ -58,7 +58,7 @@ class TestTimelines(TrilbyTestCase): expected = [] for (id, visibility, visible_in) in TIMELINE_DATA: if situation in visible_in: - expected.append(id) + expected.append(f'

{id}

') expected = sorted(expected) details = sorted([x['content'] \