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 0000000..e970424 Binary files /dev/null and b/aircox/tests/image.png differ 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)