스태프만 포스트를 작성할 수 있게 만들기

Posted on 2021-08-25 by GKSRUDTN99
Django로 웹사이트 만들기 장고

테스트 코드 작성하기

1. setUp()에서 obama유저에게만 스태프 권한을 부여한다.

2. trump는 작성 페이지에 접근이 불가능 해야 한다.

3. obama는 작성 페이지에 정상적인 접근이 가능하다.

# blog/tests.py

    def setUp(self):
        self.client = Client()
        self.user_trump = User.objects.create(username='trump')
        self.user_trump.set_password('somepassword')
        self.user_trump.save()
        self.user_obama = User.objects.create(username='obama')
        self.user_obama.set_password('somepassword')
        self.user_obama.is_staff = True
        self.user_obama.save()

        self.category_programming = Category.objects.create(name='programming', slug='programming')
        self.category_music = Category.objects.create(name='music', slug='music')

        self.tag_python_kor = Tag.objects.create(name='파이썬 공부', slug='파이썬 공부')
        self.tag_python = Tag.objects.create(name='python', slug='python')
        self.tag_hello = Tag.objects.create(name='hello', slug='hello')

        self.post_001 = Post.objects.create(
            title='첫 번째 포스트입니다.',
            content='Hello World. We are the world.',
            category=self.category_programming,
            author=self.user_trump,
        )
        self.post_001.tags.add(self.tag_hello)
        self.post_002 = Post.objects.create(
            title='두 번째 포스트입니다.',
            content='1등이 전부는 아니잖아요!',
            category=self.category_music,
            author=self.user_obama,
        )
        self.post_003 = Post.objects.create(
            title='세 번째 포스트입니다',
            content='category가 없을수도 있죠',
            author=self.user_obama,
        )
        self.post_003.tags.add(self.tag_python_kor)
        self.post_003.tags.add(self.tag_python)

(... 생략 ...)

    def test_create_post(self):
        # 로그인 하지 않으면 status code가 200이면 안된다!
        response = self.client.get('/blog/create_post/')
        self.assertNotEqual(response.status_code, 200)

        # staff가 아닌 trump가 로그인을 한다.
        self.client.login(username='trump', password='somepassword')
        response = self.client.get('/blog/create_post/')
        self.assertNotEqual(response.status_code, 200)

        # staff인 obama로 로그인한다.
        self.client.login(username='obama', password='somepassword')
        response = self.client.get('/blog/create_post/')
        self.assertEqual(response.status_code, 200)
        soup = BeautifulSoup(response.content, 'html.parser')

        self.assertEqual('Create Post - Blog', soup.title.text)
        main_area = soup.find('div', id='main-area')
        self.assertIn('Create New Post', main_area.text)

        self.client.post(
            '/blog/create_post/',
            {
                'title': 'Post form 만들기',
                'content': "Post Form 페이지를 만듭시다.",
            }
        )


        last_post = Post.objects.last()
        self.assertEqual(last_post.title, "Post form 만들기")
        self.assertEqual(last_post.author.username, 'obama')

views.py에 UserPassesTestMixin 추가하기

PostCreate에 UserPassesTestMixin을 추가한다.

test_func()함수를 추가해 접근 가능한 사용자를 제한한다.

# blog/views.py
from django.shortcuts import render, redirect
from django.views.generic import ListView, DetailView, CreateView
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from .models import Post, Category, Tag

(... 생략 ...)

class PostCreate(LoginRequiredMixin, UserPassesTestMixin, CreateView):
    model = Post
    fields = ['title', 'hook_text', 'content', 'head_image', 'file_upload', 'category']

    def test_func(self):
        return self.request.user.is_superuser or self.request.user.is_staff

    def form_valid(self, form):
        current_user = self.request.user
        if current_user.is_authenticated and (current_user.is_staff or current_user.is_superuser):
            form.instance.author = current_user
            return super(PostCreate, self).form_valid(form)
        else:
            return redirect('/blog/')

post_list.html에 New Post 버튼 추가하기

해당 버튼은 관리자 혹은 스태프에게만 보인다.

<!--blog/templates/blog/post_list.html-->
{% extends 'blog/base.html' %}
{% block main_area %}
    {% if user.is_authenticated %}
        {% if user.is_superuser or user.is_staff %}
            <a class="btn btn-info btn-sm float-end" href="/blog/create_post/" role="button"><i class="fas fa-pen"></i>&nbsp;&nbsp;New Post</a>
        {% endif %}
    {% endif %}
    <h1>Blog
        {% if category %}<span class="badge bg-secondary float-end">{{ category }}</span>{% endif %}
        {% if tag %}<span class="badge bg-warning float-end"><i
                class="fas fa-tags"></i>{{ tag }} ({{ tag.post_set.count }})</span>{% endif %}
    </h1>

(... 생략 ...)