# Path: boards/models.py
# class Board(models.Model):
#     name = models.CharField(max_length=30, unique=True)
#     description = models.CharField(max_length=100)
# 
#     def __str__(self):
#         return self.name
# 
#     def get_posts_count(self):
#         return Post.objects.filter(topic__board=self).count()
# 
#     def get_last_post(self):
#         return Post.objects.filter(topic__board=self).order_by('-created_at').first()
# 
# class Post(models.Model):
#     message = models.TextField(max_length=4000)
#     topic = models.ForeignKey(Topic, related_name='posts')
#     created_at = models.DateTimeField(auto_now_add=True)
#     updated_at = models.DateTimeField(null=True)
#     created_by = models.ForeignKey(User, related_name='posts')
#     updated_by = models.ForeignKey(User, null=True, related_name='+')
# 
#     def __str__(self):
#         truncated_message = Truncator(self.message)
#         return truncated_message.chars(30)
# 
#     def get_message_as_markdown(self):
#         return mark_safe(markdown(self.message, safe_mode='escape'))
# 
# class Topic(models.Model):
#     subject = models.CharField(max_length=255)
#     last_updated = models.DateTimeField(auto_now_add=True)
#     board = models.ForeignKey(Board, related_name='topics')
#     starter = models.ForeignKey(User, related_name='topics')
#     views = models.PositiveIntegerField(default=0)
# 
#     def __str__(self):
#         return self.subject
# 
#     def get_page_count(self):
#         count = self.posts.count()
#         pages = count / 20
#         return math.ceil(pages)
# 
#     def has_many_pages(self, count=None):
#         if count is None:
#             count = self.get_page_count()
#         return count > 6
# 
#     def get_page_range(self):
#         count = self.get_page_count()
#         if self.has_many_pages(count):
#             return range(1, 5)
#         return range(1, count + 1)
# 
#     def get_last_ten_posts(self):
#         return self.posts.order_by('-created_at')[:10]
# 
# Path: boards/views.py
# class PostListView(ListView):
#     model = Post
#     context_object_name = 'posts'
#     template_name = 'topic_posts.html'
#     paginate_by = 20
# 
#     def get_context_data(self, **kwargs):
#         session_key = 'viewed_topic_{}'.format(self.topic.pk)
#         if not self.request.session.get(session_key, False):
#             self.topic.views += 1
#             self.topic.save()
#             self.request.session[session_key] = True
#         kwargs['topic'] = self.topic
#         return super().get_context_data(**kwargs)
# 
#     def get_queryset(self):
#         self.topic = get_object_or_404(Topic, board__pk=self.kwargs.get('pk'), pk=self.kwargs.get('topic_pk'))
#         queryset = self.topic.posts.order_by('created_at')
#         return queryset


from django.contrib.auth.models import User
from django.test import TestCase
from django.urls import resolve, reverse
from ..models import Board, Post, Topic
from ..views import PostListView



class TopicPostsTests(TestCase):
    def setUp(self):
        board = Board.objects.create(name='Django', description='Django board.')

# Path: boards/models.py
# class Board(models.Model):
#     name = models.CharField(max_length=30, unique=True)
#     description = models.CharField(max_length=100)
# 
#     def __str__(self):
#         return self.name
# 
#     def get_posts_count(self):
#         return Post.objects.filter(topic__board=self).count()
# 
#     def get_last_post(self):
#         return Post.objects.filter(topic__board=self).order_by('-created_at').first()
# 
# class Post(models.Model):
#     message = models.TextField(max_length=4000)
#     topic = models.ForeignKey(Topic, related_name='posts')
#     created_at = models.DateTimeField(auto_now_add=True)
#     updated_at = models.DateTimeField(null=True)
#     created_by = models.ForeignKey(User, related_name='posts')
#     updated_by = models.ForeignKey(User, null=True, related_name='+')
# 
#     def __str__(self):
#         truncated_message = Truncator(self.message)
#         return truncated_message.chars(30)
# 
#     def get_message_as_markdown(self):
#         return mark_safe(markdown(self.message, safe_mode='escape'))
# 
# class Topic(models.Model):
#     subject = models.CharField(max_length=255)
#     last_updated = models.DateTimeField(auto_now_add=True)
#     board = models.ForeignKey(Board, related_name='topics')
#     starter = models.ForeignKey(User, related_name='topics')
#     views = models.PositiveIntegerField(default=0)
# 
#     def __str__(self):
#         return self.subject
# 
#     def get_page_count(self):
#         count = self.posts.count()
#         pages = count / 20
#         return math.ceil(pages)
# 
#     def has_many_pages(self, count=None):
#         if count is None:
#             count = self.get_page_count()
#         return count > 6
# 
#     def get_page_range(self):
#         count = self.get_page_count()
#         if self.has_many_pages(count):
#             return range(1, 5)
#         return range(1, count + 1)
# 
#     def get_last_ten_posts(self):
#         return self.posts.order_by('-created_at')[:10]
# 
# Path: boards/views.py
# class PostListView(ListView):
#     model = Post
#     context_object_name = 'posts'
#     template_name = 'topic_posts.html'
#     paginate_by = 20
# 
#     def get_context_data(self, **kwargs):
#         session_key = 'viewed_topic_{}'.format(self.topic.pk)
#         if not self.request.session.get(session_key, False):
#             self.topic.views += 1
#             self.topic.save()
#             self.request.session[session_key] = True
#         kwargs['topic'] = self.topic
#         return super().get_context_data(**kwargs)
# 
#     def get_queryset(self):
#         self.topic = get_object_or_404(Topic, board__pk=self.kwargs.get('pk'), pk=self.kwargs.get('topic_pk'))
#         queryset = self.topic.posts.order_by('created_at')
#         return queryset


# Path: boards/tests/test_view_topic_posts.py
from django.contrib.auth.models import User
from django.test import TestCase
from django.urls import resolve, reverse
from ..models import Board, Post, Topic
from ..views import PostListView




class TopicPostsTests(TestCase):
    def setUp(self):
        board = Board.objects.create(name='Django', description='Django board.')

        user = User.objects.create_user(username='john', email='john@doe.com', password='123')