diff --git a/donations/admin.py b/donations/admin.py index 141fe32d9..b7a01b075 100644 --- a/donations/admin.py +++ b/donations/admin.py @@ -3,7 +3,7 @@ import csv from django.shortcuts import render from django.http import JsonResponse, HttpResponse -from .models import ThankYouNote, DonationPopup +from .models import ThankYouNote, DonationPopup, Fundraiser class ThankYouNoteAdmin(admin.ModelAdmin): @@ -56,5 +56,20 @@ class DonationPopupAdmin(admin.ModelAdmin): 'hide_donation_popup') +class FundraiserAdmin(admin.ModelAdmin): + display_list = ('color_scheme', + 'message_type', + 'headline', + 'message', + 'button_text', + 'button_url', + 'box_headline', + 'box_html', + 'fundraiser_image', + 'goal_amount', + 'goal_time',) + + admin.site.register(ThankYouNote, ThankYouNoteAdmin) admin.site.register(DonationPopup, DonationPopupAdmin) +admin.site.register(Fundraiser, FundraiserAdmin) diff --git a/donations/migrations/0006_fundraiser.py b/donations/migrations/0006_fundraiser.py new file mode 100644 index 000000000..6d05d9435 --- /dev/null +++ b/donations/migrations/0006_fundraiser.py @@ -0,0 +1,30 @@ +# Generated by Django 3.2.9 on 2022-01-06 14:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('donations', '0005_auto_20211021_1045'), + ] + + operations = [ + migrations.CreateModel( + name='Fundraiser', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('color_scheme', models.CharField(blank=True, choices=[('Red', 'red'), ('Blue', 'blue'), ('Green', 'green'), ('Orange', 'orange')], default='', max_length=255)), + ('message_type', models.CharField(blank=True, choices=[('Goal', 'goal'), ('Message', 'message')], default='', max_length=255)), + ('headline', models.TextField(blank=True, default='', null=True)), + ('message', models.TextField(blank=True, default='', null=True)), + ('button_text', models.CharField(max_length=255)), + ('button_url', models.CharField(max_length=255)), + ('box_headline', models.TextField(blank=True, default='', null=True)), + ('box_html', models.TextField(blank=True, default='', null=True)), + ('fundraiser_image', models.ImageField(blank=True, null=True, upload_to='')), + ('goal_amount', models.IntegerField(blank=True, null=True)), + ('goal_time', models.DateTimeField(blank=True, null=True)), + ], + ), + ] diff --git a/donations/models.py b/donations/models.py index 7dba9f590..714fe2b05 100644 --- a/donations/models.py +++ b/donations/models.py @@ -1,5 +1,18 @@ from django.db import models +COLOR_SCHEME_CHOICES = ( + ('red', 'Red'), + ('blue', 'Blue'), + ('green', 'Green'), + ('orange', 'Orange'), +) + +MESSAGE_TYPE_CHOICES = ( + ('goal', 'Goal'), + ('message', 'Message'), +) + + class ThankYouNote(models.Model): thank_you_note = models.TextField(default="", blank=True) first_name = models.CharField(max_length=255, default="", blank=True) @@ -28,5 +41,27 @@ def __str__(self): def save(self, *args, **kwargs): if DonationPopup.objects.exists() and not self.pk: - raise ValidationError('There is can be only one donation popup instance') + raise ValidationError('There can be only one donation popup instance') return super(DonationPopup, self).save(*args, **kwargs) + + +class Fundraiser(models.Model): + color_scheme = models.CharField(max_length=255, + choices=COLOR_SCHEME_CHOICES, + blank=True, + default='') + message_type = models.CharField(max_length=255, + choices=MESSAGE_TYPE_CHOICES, + blank=True, + default='') + headline = models.TextField(blank=True, null=True, default="") + message = models.TextField(blank=True, null=True, default="") + button_text = models.CharField(max_length=255) + button_url = models.CharField(max_length=255) + box_headline = models.TextField(blank=True, null=True, default="") + box_html = models.TextField(blank=True, null=True, default="") + fundraiser_image = models.ImageField(null=True, blank=True) + goal_amount = models.IntegerField(blank=True, null=True) + goal_time = models.DateTimeField(blank=True, null=True) + + diff --git a/donations/serializers.py b/donations/serializers.py index bff858ff5..c15559185 100644 --- a/donations/serializers.py +++ b/donations/serializers.py @@ -1,4 +1,4 @@ -from .models import ThankYouNote, DonationPopup +from .models import ThankYouNote, DonationPopup, Fundraiser from rest_framework import serializers @@ -36,3 +36,20 @@ class Meta: 'giving_optional', 'go_to_pdf_link_text', 'hide_donation_popup') + + +class FundraiserSerializer(serializers.ModelSerializer): + class Meta: + model = Fundraiser + fields = ('color_scheme', + 'message_type', + 'headline', + 'message', + 'button_text', + 'button_url', + 'box_headline', + 'box_html', + 'fundraiser_image', + 'goal_amount', + 'goal_time',) + diff --git a/donations/tests.py b/donations/tests.py index 8a4e03b29..81cedbc97 100644 --- a/donations/tests.py +++ b/donations/tests.py @@ -1,7 +1,7 @@ from django.test import TestCase -from donations.models import DonationPopup, ThankYouNote -from donations.serializers import DonationPopupSerializer +from donations.models import DonationPopup, ThankYouNote, Fundraiser +from donations.serializers import DonationPopupSerializer, FundraiserSerializer from rest_framework import status from rest_framework.test import APITestCase @@ -44,3 +44,29 @@ def test_thank_you_note_api_post(self): self.assertEqual(tyn[0]['first_name'], 'Jessica') self.assertEqual(tyn[0]['consent_to_share_or_contact'], True) self.assertEqual(tyn[0]['contact_email_address'], 'jess@example.com') + + +class FundraiserTest(APITestCase, TestCase): + + def setUp(self): + fr = Fundraiser.objects.create( + color_scheme="blue", + message_type="goal", + headline="this is a headline", + message="Test message", + button_text="Give Today", + button_url="https://openstax.org/give", + box_headline="This is a box headline", + box_html="this goes in a box", + fundraiser_image="data-science3x.max-165x165.png", + goal_amount=2314, + goal_time="2022-01-12T09:07:01-06:00" + ) + fr.save() + + def test_fundraiser_api_get(self): + response = self.client.get('/apps/cms/api/donations/fundraiser/', format='json') + fundraiser = Fundraiser.objects.all() + serializer = FundraiserSerializer(fundraiser, many=True) + self.assertEqual(response.data[0]['headline'], serializer.data[0]['headline']) + self.assertEqual(response.status_code, status.HTTP_200_OK) diff --git a/donations/urls.py b/donations/urls.py index fad250b60..8ec7800a0 100644 --- a/donations/urls.py +++ b/donations/urls.py @@ -4,6 +4,7 @@ router = routers.SimpleRouter() router.register(r'donation-popup', views.DonationPopupViewSet, basename='DonationPopup') +router.register(r'fundraiser', views.FundraiserViewSet, basename='Fundraiser') urlpatterns = [ url(r'', include(router.urls)), diff --git a/donations/views.py b/donations/views.py index 9e842ee76..0724f38a8 100644 --- a/donations/views.py +++ b/donations/views.py @@ -1,6 +1,6 @@ from rest_framework import viewsets -from .models import ThankYouNote, DonationPopup -from .serializers import ThankYouNoteSerializer, DonationPopupSerializer +from .models import ThankYouNote, DonationPopup, Fundraiser +from .serializers import ThankYouNoteSerializer, DonationPopupSerializer, FundraiserSerializer from rest_framework.decorators import action from django.utils import timezone from django.http import JsonResponse @@ -33,4 +33,10 @@ def post(self, request): class DonationPopupViewSet(viewsets.ModelViewSet): serializer_class = DonationPopupSerializer queryset = DonationPopup.objects.all() + http_method_names = ['get'] + + +class FundraiserViewSet(viewsets.ModelViewSet): + serializer_class = FundraiserSerializer + queryset = Fundraiser.objects.all() http_method_names = ['get'] \ No newline at end of file