diff --git a/aircox/tests/test_program.py b/aircox/tests/test_program.py index 89a575e..4fc94e9 100644 --- a/aircox/tests/test_program.py +++ b/aircox/tests/test_program.py @@ -1,5 +1,14 @@ import pytest from django.urls import reverse +from django.core.files.uploadedfile import SimpleUploadedFile + +from aircox.models import Program + + +png_content = ( + b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x02\x00\x00\x00\x90wS\xde" + + b"\x00\x00\x00\x0cIDATx\x9cc`\xf8\xcf\x00\x00\x02\x02\x01\x00{\t\x81x\x00\x00\x00\x00IEND\xaeB`\x82" +) @pytest.mark.django_db() @@ -15,3 +24,17 @@ def test_edit_program(user, client, program): response = client.post(reverse("program-edit", kwargs={"pk": program.pk}), {"content": "foobar"}) response = client.get(reverse("program-detail", kwargs={"slug": program.slug})) assert b"foobar" in response.content + + +@pytest.mark.django_db() +def test_add_cover(user, client, program): + assert program.cover is None + user.groups.add(program.editors) + client.force_login(user) + cover = SimpleUploadedFile("cover1.png", png_content, content_type="image/png") + r = client.post( + reverse("program-edit", kwargs={"pk": program.pk}), {"content": "foobar", "new_cover": cover}, follow=True + ) + assert r.status_code == 200 + p = Program.objects.get(pk=program.pk) + assert "cover1.png" in p.cover.url diff --git a/aircox/views/program.py b/aircox/views/program.py index 2b2c9fe..56e27cf 100644 --- a/aircox/views/program.py +++ b/aircox/views/program.py @@ -1,6 +1,8 @@ +from django.contrib.auth.mixins import UserPassesTestMixin +from django.forms import ModelForm, ImageField from django.urls import reverse -from django.contrib.auth.mixins import UserPassesTestMixin +from filer.models.imagemodels import Image from ..models import Page, Program, StaticPage from .mixins import ParentMixin @@ -32,9 +34,24 @@ class ProgramDetailView(BaseProgramMixin, PageDetailView): return super().get_sidebar_queryset().filter(parent=self.program) +class ProgramForm(ModelForm): + new_cover = ImageField(required=False) + + class Meta: + model = Program + fields = ["content"] + + def save(self, commit=True): + file_obj = self.cleaned_data["new_cover"] + if file_obj: + obj, _ = Image.objects.get_or_create(original_filename=file_obj.name, file=file_obj) + self.instance.cover = obj + super().save(commit=commit) + + class ProgramUpdateView(UserPassesTestMixin, BaseProgramMixin, PageUpdateView): model = Program - fields = ["content"] + form_class = ProgramForm def get_sidebar_queryset(self): return super().get_sidebar_queryset().filter(parent=self.program) @@ -43,6 +60,9 @@ class ProgramUpdateView(UserPassesTestMixin, BaseProgramMixin, PageUpdateView): program = self.get_object() return self.request.user.has_perm("aircox.%s" % program.change_permission_codename) + def get_success_url(self): + return reverse("program-detail", kwargs={"slug": self.get_object().slug}) + class ProgramListView(PageListView): model = Program