diff --git a/aircox/tests/test_program.py b/aircox/tests/test_program.py index bf56b7f..a434bb6 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 1b1e66a..38956cc 100644 --- a/aircox/views/program.py +++ b/aircox/views/program.py @@ -1,10 +1,14 @@ import random +from django.contrib.auth.mixins import UserPassesTestMixin +from django.forms import ModelForm, ImageField from django.urls import reverse -from ..models import Article, Page, Program, StaticPage, Episode +from filer.models.imagemodels import Image + +from ..models import Page, Program, StaticPage from .mixins import ParentMixin -from .page import PageDetailView, PageListView +from .page import PageDetailView, PageListView, PageUpdateView __all__ = ["ProgramPageDetailView", "ProgramDetailView", "ProgramPageListView"] @@ -50,9 +54,24 @@ class ProgramDetailView(BaseProgramMixin, PageDetailView): return super().get_template_names() + ["aircox/program_detail.html"] +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)