From 5986d86da3fbbbf1da806df5e1651f301d8189c6 Mon Sep 17 00:00:00 2001 From: Christophe Siraut Date: Wed, 22 Nov 2023 08:23:14 +0100 Subject: [PATCH] views/program: allow changing program cover --- aircox/forms.py | 21 +++++++++++++++++++-- aircox/tests/conftest.py | 8 ++++++++ aircox/tests/image.png | Bin 0 -> 69 bytes aircox/tests/test_program.py | 17 +++++++++++++++++ aircox/views/program.py | 8 +++++--- 5 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 aircox/tests/image.png diff --git a/aircox/forms.py b/aircox/forms.py index 3984695..9555119 100644 --- a/aircox/forms.py +++ b/aircox/forms.py @@ -1,7 +1,9 @@ from django import forms -from django.forms import ModelForm +from django.forms import ModelForm, ImageField -from .models import Comment +from filer.models.imagemodels import Image + +from aircox.models import Comment, Program class CommentForm(ModelForm): @@ -16,3 +18,18 @@ class CommentForm(ModelForm): class Meta: model = Comment fields = ["nickname", "email", "content"] + + +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) diff --git a/aircox/tests/conftest.py b/aircox/tests/conftest.py index a02a67f..3284dee 100644 --- a/aircox/tests/conftest.py +++ b/aircox/tests/conftest.py @@ -1,6 +1,7 @@ from datetime import time, timedelta import itertools import logging +import os from django.conf import settings from django.contrib.auth.models import User @@ -162,3 +163,10 @@ def tracks(episode, sound): @pytest.fixture def user(): return User.objects.create_user(username="user1", password="bar") + + +@pytest.fixture +def png_content(): + image_file = "{}/image.png".format(os.path.dirname(__file__)) + with open(image_file, "rb") as fh: + return fh.read() diff --git a/aircox/tests/image.png b/aircox/tests/image.png new file mode 100644 index 0000000000000000000000000000000000000000..e9704248d0ba0f11d2663ff82aad0cba348af222 GIT binary patch literal 69 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Ar*6y6Mmd$U|?cmWT@tB RtN@BLc)I$ztaD0e0syL!4q^ZR literal 0 HcmV?d00001 diff --git a/aircox/tests/test_program.py b/aircox/tests/test_program.py index bf56b7f..0f74d44 100644 --- a/aircox/tests/test_program.py +++ b/aircox/tests/test_program.py @@ -1,5 +1,8 @@ import pytest from django.urls import reverse +from django.core.files.uploadedfile import SimpleUploadedFile + +from aircox.models import Program @pytest.mark.django_db() @@ -15,3 +18,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, png_content): + 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..c594619 100644 --- a/aircox/views/program.py +++ b/aircox/views/program.py @@ -1,10 +1,12 @@ import random +from django.contrib.auth.mixins import UserPassesTestMixin from django.urls import reverse -from ..models import Article, Page, Program, StaticPage, Episode +from aircox.forms import ProgramForm +from aircox.models import Article, Episode, Page, Program, StaticPage from .mixins import ParentMixin -from .page import PageDetailView, PageListView +from .page import PageDetailView, PageListView, PageUpdateView __all__ = ["ProgramPageDetailView", "ProgramDetailView", "ProgramPageListView"] @@ -52,7 +54,7 @@ class ProgramDetailView(BaseProgramMixin, PageDetailView): 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)