views/program: allow changing program cover
This commit is contained in:
		@ -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)
 | 
				
			||||||
 | 
				
			|||||||
@ -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
									
								
							
							
						
						
									
										
											BIN
										
									
								
								aircox/tests/image.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 69 B  | 
@ -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
 | 
				
			||||||
 | 
				
			|||||||
@ -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)
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user