Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions snippets/migrations/0019_givebanner.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Generated by Django 3.2.9 on 2022-03-14 20:09

from django.db import migrations, models
import django.db.models.deletion
import uuid


class Migration(migrations.Migration):

dependencies = [
('wagtailimages', '0023_add_choose_permissions'),
('wagtailcore', '0066_collection_management_permissions'),
('snippets', '0018_subject_subject_color'),
]

operations = [
migrations.CreateModel(
name='GiveBanner',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('translation_key', models.UUIDField(default=uuid.uuid4, editable=False)),
('html_message', models.TextField(default='')),
('link_text', models.CharField(blank=True, max_length=255, null=True)),
('link_url', models.URLField(blank=True, null=True)),
('locale', models.ForeignKey(editable=False, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='wagtailcore.locale')),
('thumbnail', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='wagtailimages.image')),
],
options={
'abstract': False,
'unique_together': {('translation_key', 'locale')},
},
),
]
43 changes: 43 additions & 0 deletions snippets/models.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from django.db import models
from django.core.exceptions import ValidationError
from modelcluster.fields import ParentalKey
from wagtail.search import index
from wagtail.admin.edit_handlers import FieldPanel, InlinePanel
Expand Down Expand Up @@ -225,3 +226,45 @@ def __str__(self):

register_snippet(SubjectCategory)


class GiveBanner(TranslatableMixin, models.Model):
html_message = models.TextField(default='')
link_text = models.CharField(max_length=255, null=True, blank=True)
link_url = models.URLField(null=True, blank=True)
thumbnail = models.ForeignKey(
'wagtailimages.Image',
null=True,
blank=True,
on_delete=models.SET_NULL,
related_name='+'
)

def get_banner_thumbnail(self):
return build_image_url(self.thumbnail)

banner_thumbnail = property(get_banner_thumbnail)

api_fields = ('html_message', 'link_text', 'link_url', 'banner_thumbnail')

panels = [
FieldPanel('html_message'),
FieldPanel('link_text'),
FieldPanel('link_url'),
ImageChooserPanel('thumbnail'),
]

def __str__(self):
return 'Give Banner'

def clean(self):
if GiveBanner.objects.exists() and not self.pk:
raise ValidationError('There can be only one Give Banner instance')

def save(self, *args, **kwargs):
self.clean()
return super(GiveBanner, self).save(*args, **kwargs)


register_snippet(GiveBanner)


11 changes: 10 additions & 1 deletion snippets/serializers.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from .models import Role, Subject, ErrataContent, SubjectCategory
from .models import Role, Subject, ErrataContent, SubjectCategory, GiveBanner

from rest_framework import serializers, generics

Expand Down Expand Up @@ -39,3 +39,12 @@ class Meta:
fields = ('subject_name',
'subject_category',
'description')


class GiveBannerSerializer(serializers.ModelSerializer):
class Meta:
model = GiveBanner
fields = ('html_message',
'link_text',
'link_url',
'banner_thumbnail')
9 changes: 8 additions & 1 deletion snippets/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from django.conf import settings
from django.urls import reverse

from snippets.models import Subject, ErrataContent
from snippets.models import Subject, ErrataContent, GiveBanner


class SnippetsTestCase(TestCase):
Expand All @@ -26,6 +26,9 @@ def setUp(self):
self.deprecated = ErrataContent(heading='Errata Content - Deprecated', book_state='deprecated', content='No more corrections will be made')
self.deprecated.save()

self.give_banner = GiveBanner(html_message="Help students around the world succeed with <strong>contributions of $5, $10 or $20</strong>", link_text="Make a difference now", link_url='https://example.com')
self.give_banner.save()

def test_can_create_subject(self):
subject = Subject(name="Science", page_content="Science page content.", seo_title="Science SEO Title",
search_description="Science page description.")
Expand All @@ -50,3 +53,7 @@ def test_can_fetch_all_errata_content(self):
def test_can_query_errata_content_by_book_state(self):
response = self.client.get('/apps/cms/api/snippets/erratacontent/?book_state=deprecated&format=json')
self.assertIn(b"deprecated", response.content)

def test_can_fetch_all_give_banners(self):
response = self.client.get('/apps/cms/api/snippets/givebanner/?format=json')
self.assertIn(b"Help students", response.content)
1 change: 1 addition & 0 deletions snippets/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@
router.register(r'subjects', views.SubjectList, basename="Subjects")
router.register(r'erratacontent', views.ErrataContentViewSet, basename="ErrataContent")
router.register(r'subjectcategory', views.SubjectCategoryViewSet, basename="SubjectCategory")
router.register(r'givebanner', views.GiveBannerViewSet, basename="GiveBanner")
urlpatterns = router.urls
10 changes: 8 additions & 2 deletions snippets/views.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from rest_framework import viewsets

from .models import Role, Subject, ErrataContent, SubjectCategory
from .serializers import RoleSerializer, SubjectSerializer, ErrataContentSerializer, SubjectCategorySerializer
from .models import Role, Subject, ErrataContent, SubjectCategory, GiveBanner
from .serializers import RoleSerializer, SubjectSerializer, ErrataContentSerializer, SubjectCategorySerializer, GiveBannerSerializer

from rest_framework import generics, viewsets
from django_filters.rest_framework import DjangoFilterBackend
Expand Down Expand Up @@ -61,6 +61,12 @@ def get_queryset(self):
return queryset


class GiveBannerViewSet(viewsets.ModelViewSet):
# validation prevents multiple Give Banners, so this is safe
queryset = GiveBanner.objects.all()
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do you want to make sure only one is returned here?
queryset = GiveBanner.objects.first()

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

or all()[0]

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I added a validation so only one banner is created. Tests were failing if there was not a GiveBanner created using the list

serializer_class = GiveBannerSerializer


def convert_locale(locale):
if locale == 'es':
return SPANISH_LOCALE_ID
Expand Down