views/program: allow changing program cover

This commit is contained in:
Chris Tactic 2023-11-22 08:23:14 +01:00
parent b4539481e6
commit 5986d86da3
5 changed files with 49 additions and 5 deletions

View File

@ -1,7 +1,9 @@
from django import forms 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): class CommentForm(ModelForm):
@ -16,3 +18,18 @@ class CommentForm(ModelForm):
class Meta: class Meta:
model = Comment model = Comment
fields = ["nickname", "email", "content"] 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)

View File

@ -1,6 +1,7 @@
from datetime import time, timedelta from datetime import time, timedelta
import itertools import itertools
import logging import logging
import os
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
@ -162,3 +163,10 @@ def tracks(episode, sound):
@pytest.fixture @pytest.fixture
def user(): def user():
return User.objects.create_user(username="user1", password="bar") 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()

BIN
aircox/tests/image.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 B

View File

@ -1,5 +1,8 @@
import pytest import pytest
from django.urls import reverse from django.urls import reverse
from django.core.files.uploadedfile import SimpleUploadedFile
from aircox.models import Program
@pytest.mark.django_db() @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.post(reverse("program-edit", kwargs={"pk": program.pk}), {"content": "foobar"})
response = client.get(reverse("program-detail", kwargs={"slug": program.slug})) response = client.get(reverse("program-detail", kwargs={"slug": program.slug}))
assert b"foobar" in response.content 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

View File

@ -1,10 +1,12 @@
import random import random
from django.contrib.auth.mixins import UserPassesTestMixin
from django.urls import reverse 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 .mixins import ParentMixin
from .page import PageDetailView, PageListView from .page import PageDetailView, PageListView, PageUpdateView
__all__ = ["ProgramPageDetailView", "ProgramDetailView", "ProgramPageListView"] __all__ = ["ProgramPageDetailView", "ProgramDetailView", "ProgramPageListView"]
@ -52,7 +54,7 @@ class ProgramDetailView(BaseProgramMixin, PageDetailView):
class ProgramUpdateView(UserPassesTestMixin, BaseProgramMixin, PageUpdateView): class ProgramUpdateView(UserPassesTestMixin, BaseProgramMixin, PageUpdateView):
model = Program model = Program
fields = ["content"] form_class = ProgramForm
def get_sidebar_queryset(self): def get_sidebar_queryset(self):
return super().get_sidebar_queryset().filter(parent=self.program) return super().get_sidebar_queryset().filter(parent=self.program)