Skip to content

Commit c01416c

Browse files
authored
Merge pull request #5370 from mitodl/shanbady/api-endpoint-for-program-page-config
api endpoint for program page config
2 parents 9a1032f + 3a4f646 commit c01416c

File tree

6 files changed

+120
-0
lines changed

6 files changed

+120
-0
lines changed

cms/api.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
"""
2+
Integrate Wagtail's builtin api endpointss
3+
"""
4+
from wagtail.api.v2.views import PagesAPIViewSet
5+
from wagtail.api.v2.router import WagtailAPIRouter
6+
from wagtail.images.api.v2.views import ImagesAPIViewSet
7+
from wagtail.documents.api.v2.views import DocumentsAPIViewSet
8+
9+
# Create the router. "wagtailapi" is the URL namespace
10+
api_router = WagtailAPIRouter('wagtailapi')
11+
12+
# Register wagtail built-in api routes
13+
api_router.register_endpoint('pages', PagesAPIViewSet)
14+
api_router.register_endpoint('images', ImagesAPIViewSet)
15+
api_router.register_endpoint('documents', DocumentsAPIViewSet)

cms/models.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from wagtail.contrib.table_block.blocks import TableBlock
2121
from wagtail.images.models import Image
2222
from wagtail.images.edit_handlers import ImageChooserPanel
23+
from wagtail.api import APIField
2324

2425
from courses.models import Program
2526
from micromasters.serializers import serialize_maybe_user
@@ -28,6 +29,7 @@
2829
from cms.util import get_coupon_code
2930
from cms.blocks import CourseTeamBlock, ImageWithLinkBlock, ResourceBlock
3031

32+
3133
common_table_options = {
3234
'startRows': 3,
3335
'startCols': 2,
@@ -450,6 +452,18 @@ def get_context(self, request, *args, **kwargs):
450452

451453
return context
452454

455+
api_fields = [
456+
APIField('title'),
457+
APIField('description'),
458+
APIField('program_id'),
459+
APIField('program_letter_footer'),
460+
APIField('program_letter_footer_text'),
461+
APIField('program_letter_header_text'),
462+
APIField('program_letter_logo'),
463+
APIField('program_letter_text'),
464+
APIField('program_letter_signatories'),
465+
]
466+
453467

454468
def get_program_page_context(programpage, request):
455469
""" Get context for the program page"""
@@ -718,3 +732,10 @@ class ProgramLetterSignatory(Orderable):
718732
]
719733
)
720734
]
735+
736+
api_fields = [
737+
APIField('name'),
738+
APIField('title_line_1'),
739+
APIField('title_line_2'),
740+
APIField('signature_image'),
741+
]

cms/urls.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
"""URLs for courses and programs"""
2+
3+
from django.conf.urls import url
4+
from cms.api import api_router
5+
6+
urlpatterns = [
7+
url('api/v0/wagtail/', api_router.urls),
8+
]

cms/wagtail_api_test.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
"""
2+
Tests for wagtail built-in endpoints
3+
"""
4+
from django.urls import reverse
5+
from cms.factories import ProgramPageFactory, ProgramLetterSignatoryFactory
6+
from search.base import MockedESTestCase
7+
8+
9+
class WagtailAPITestCase(MockedESTestCase):
10+
"""
11+
Tests for Wagtail api
12+
"""
13+
def test_program_page_api_detail(self):
14+
"""
15+
Basic test to ensure the page detail endpoint returns data
16+
"""
17+
page = ProgramPageFactory(title="test program page title")
18+
response = self.client.get(
19+
reverse("wagtailapi:pages:detail", args=[page.id]))
20+
json = response.json()
21+
self.assertTrue(json["title"] == page.title)
22+
23+
def test_program_page_api_serializes_signatories(self):
24+
"""
25+
Test that program letter signatories
26+
are included along with image data
27+
"""
28+
page = ProgramPageFactory(
29+
description="test program page description", title="test program page title"
30+
)
31+
ProgramLetterSignatoryFactory.create_batch(3, program_page=page)
32+
response = self.client.get(
33+
reverse("wagtailapi:pages:detail", args=[page.id]))
34+
json = response.json()
35+
signatories = json["program_letter_signatories"]
36+
self.assertTrue(len(signatories) == 3)
37+
self.assertTrue("signature_image" in signatories[0].keys())
38+
self.assertTrue(
39+
"download_url" in signatories[0]["signature_image"]["meta"].keys()
40+
)
41+
42+
def test_program_page_api_list_view_details(self):
43+
"""
44+
Tests that we can get all the program letter
45+
related detail from the list view directly
46+
"""
47+
page = ProgramPageFactory(
48+
description="test program page description", title="test program page title"
49+
)
50+
ProgramLetterSignatoryFactory.create_batch(3, program_page=page)
51+
response = self.client.get(
52+
reverse("wagtailapi:pages:listing"),
53+
{"id": page.id, "type": "cms.ProgramPage", "fields": "*"},
54+
)
55+
json = response.json()
56+
response_keys = list(json["items"][0].keys())
57+
self.assertTrue(
58+
all(
59+
[
60+
key in response_keys
61+
for key in [
62+
"title",
63+
"program_id",
64+
"program_letter_footer",
65+
"program_letter_footer_text",
66+
"program_letter_header_text",
67+
"program_letter_logo",
68+
"program_letter_text",
69+
"program_letter_signatories",
70+
]
71+
]
72+
)
73+
)

micromasters/settings.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,12 @@
8888
'django.contrib.sites',
8989
'rest_framework',
9090
'rest_framework.authtoken',
91+
'django_filters',
9192
'server_status',
9293
'social_django',
9394

9495
# WAGTAIL
96+
'wagtail.api.v2',
9597
'wagtail.contrib.forms',
9698
'wagtail.contrib.redirects',
9799
'wagtail.contrib.table_block',

micromasters/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
url(r'', include('backends.urls')),
2626
url(r'^admin/', admin.site.urls),
2727
url('', include('courses.urls')),
28+
url("", include("cms.urls")),
2829
url('', include('dashboard.urls')),
2930
url('', include('ecommerce.urls')),
3031
url('', include('financialaid.urls')),

0 commit comments

Comments
 (0)