Skip to content

Commit

Permalink
feat: add media serialized field for rich media
Browse files Browse the repository at this point in the history
  • Loading branch information
ngurenyaga committed Nov 22, 2021
1 parent e338a17 commit 0d12e8f
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 3 deletions.
2 changes: 2 additions & 0 deletions config/settings/production.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@
INSTALLED_APPS += ["storages"] # noqa F405
GS_BUCKET_NAME = env("DJANGO_GCP_STORAGE_BUCKET_NAME")
GS_DEFAULT_ACL = "publicRead"
GS_QUERYSTRING_AUTH = True

# STATIC
# ------------------------
STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"
Expand Down
2 changes: 1 addition & 1 deletion config/settings/test.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ def gen_func():
# https://django-storages.readthedocs.io/en/latest/#installation
INSTALLED_APPS += ["storages"] # noqa F405
GS_BUCKET_NAME = env("DJANGO_GCP_STORAGE_BUCKET_NAME", default="mycarehub-ya-jamii-test")
GS_DEFAULT_ACL = "project-private"
GS_DEFAULT_ACL = "publicRead"
# STATIC
# ------------------------
STATICFILES_STORAGE = "whitenoise.storage.CompressedManifestStaticFilesStorage"
Expand Down
11 changes: 9 additions & 2 deletions mycarehub/content/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
from wagtailmedia.edit_handlers import MediaChooserPanel

from mycarehub.common.models import AbstractBase
from mycarehub.content.serializers import MediaSerializedField

RICH_TEXT_FIELD_FEATURES = [
"h1",
Expand Down Expand Up @@ -341,14 +342,20 @@ def tag_names(self):
APIField("hero_image"),
APIField(
"hero_image_rendition",
serializer=ImageRenditionField("fill-800x1200|jpegquality-60", source="hero_image"),
serializer=ImageRenditionField(
"fill-800x1200|jpegquality-60",
source="hero_image",
),
),
APIField("like_count"),
APIField("bookmark_count"),
APIField("view_count"),
APIField("share_count"),
APIField("documents"),
APIField("featured_media"),
APIField(
"featured_media",
serializer=MediaSerializedField(),
),
APIField("gallery_images"),
APIField("questionnaires"),
APIField(
Expand Down
25 changes: 25 additions & 0 deletions mycarehub/content/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from rest_framework.fields import Field


class MediaSerializedField(Field):
"""A custom serializer used to serialize media in Wagtails v2 API."""

def to_representation(self, val):
"""Return the media URL, title and dimensions."""
media = []
for value in val.all():
media.append(
{
"url": value.featured_media.file.url,
"title": value.featured_media.title,
"type": value.featured_media.type,
"duration": value.featured_media.duration,
"width": value.featured_media.width,
"height": value.featured_media.height,
"thumbnail": value.featured_media.thumbnail.url
if value.featured_media.thumbnail
else "",
}
)

return media
66 changes: 66 additions & 0 deletions mycarehub/content/tests/test_serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import pytest
from django.utils import timezone
from model_bakery import baker
from wagtail.core.models import Page

from mycarehub.content.models import (
Author,
ContentItem,
ContentItemIndexPage,
ContentItemMediaLink,
)
from mycarehub.content.serializers import MediaSerializedField
from mycarehub.home.models import HomePage

pytestmark = pytest.mark.django_db


def test_media_serialized_field():
# get the root page
root = Page.get_first_root_node().specific

# set up a home page
home = HomePage(
title="Home",
slug="index",
)
root.add_child(instance=home)

# set up a content item index page
content_item_index = ContentItemIndexPage(
title="Content Item Index",
slug="articles",
intro="content",
)
home.add_child(instance=content_item_index)

# set up a content item
author = baker.make(Author)
content_item = ContentItem(
title="An article",
slug="article-1",
intro="intro",
body="body",
item_type="ARTICLE",
date=timezone.now().date(),
author=author,
)
content_item_index.add_child(instance=content_item)

featured_media = baker.make("wagtailmedia.Media", _create_files=True)
media = baker.make(
ContentItemMediaLink,
page=content_item,
_create_files=True,
featured_media=featured_media,
)
serializer_field = MediaSerializedField()
representation = serializer_field.to_representation(content_item.featured_media)

value = representation[0]
assert value["url"] == media.featured_media.file.url
assert value["title"] == media.featured_media.title
assert value["type"] == media.featured_media.type
assert value["duration"] == media.featured_media.duration
assert value["width"] == media.featured_media.width
assert value["height"] == media.featured_media.height

0 comments on commit 0d12e8f

Please sign in to comment.