# Path: myproject/utils.py
# def recaptcha_is_valid(request):
#     if settings.GOOGLE_RECAPTCHA_ENABLED:
#         recaptcha_response = request.POST.get('g-recaptcha-response')
#         data = {
#             'secret': settings.GOOGLE_RECAPTCHA_SECRET_KEY,
#             'response': recaptcha_response
#         }
#         r = requests.post('https://www.google.com/recaptcha/api/siteverify', data=data)
#         result = r.json()
#         return result['success']
#     return True
# 
# Path: boards/forms.py
# class NewTopicForm(forms.ModelForm):
#     message = forms.CharField(
#         widget=forms.Textarea(
#             attrs={'rows': 5, 'placeholder': 'What is in your mind?'}
#         ),
#         max_length=4000,
#         help_text='The max length of the text is 4000.'
#     )
# 
#     class Meta:
#         model = Topic
#         fields = ['subject', 'message']
# 
# class PostForm(forms.ModelForm):
#     class Meta:
#         model = Post
#         fields = ['message', ]
# 
# 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]


from django.db.models import Count
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.conf import settings
from django.shortcuts import get_object_or_404, redirect, render
from django.views.generic import UpdateView, ListView
from django.utils import timezone
from django.utils.decorators import method_decorator
from django.urls import reverse
from myproject.utils import recaptcha_is_valid
from .forms import NewTopicForm, PostForm
from .models import Board, Post, Topic
            topic.last_updated = timezone.now()
            topic.save()

            topic_url = reverse('topic_posts', kwargs={'pk': pk, 'topic_pk': topic_pk})
            topic_post_url = '{url}?page={page}#{id}'.format(
                url=topic_url,
                id=post.pk,
                page=topic.get_page_count()
            )

            return redirect(topic_post_url)
    else:
        form = PostForm()
    return render(request, 'reply_topic.html', {'topic': topic, 'form': form})


@method_decorator(login_required, name='dispatch')
class PostUpdateView(UpdateView):
    model = Post
    fields = ('message', )
    template_name = 'edit_post.html'
    pk_url_kwarg = 'post_pk'
    context_object_name = 'post'

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(created_by=self.request.user)

    def form_valid(self, form):
        post = form.save(commit=False)

# Path: myproject/utils.py
# def recaptcha_is_valid(request):
#     if settings.GOOGLE_RECAPTCHA_ENABLED:
#         recaptcha_response = request.POST.get('g-recaptcha-response')
#         data = {
#             'secret': settings.GOOGLE_RECAPTCHA_SECRET_KEY,
#             'response': recaptcha_response
#         }
#         r = requests.post('https://www.google.com/recaptcha/api/siteverify', data=data)
#         result = r.json()
#         return result['success']
#     return True
# 
# Path: boards/forms.py
# class NewTopicForm(forms.ModelForm):
#     message = forms.CharField(
#         widget=forms.Textarea(
#             attrs={'rows': 5, 'placeholder': 'What is in your mind?'}
#         ),
#         max_length=4000,
#         help_text='The max length of the text is 4000.'
#     )
# 
#     class Meta:
#         model = Topic
#         fields = ['subject', 'message']
# 
# class PostForm(forms.ModelForm):
#     class Meta:
#         model = Post
#         fields = ['message', ]
# 
# 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
from django.db.models import Count
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.conf import settings
from django.shortcuts import get_object_or_404, redirect, render
from django.views.generic import UpdateView, ListView
from django.utils import timezone
from django.utils.decorators import method_decorator
from django.urls import reverse
from myproject.utils import recaptcha_is_valid
from .forms import NewTopicForm, PostForm
from .models import Board, Post, Topic

            topic.last_updated = timezone.now()
            topic.save()

            topic_url = reverse('topic_posts', kwargs={'pk': pk, 'topic_pk': topic_pk})
            topic_post_url = '{url}?page={page}#{id}'.format(
                url=topic_url,
                id=post.pk,
                page=topic.get_page_count()
            )

            return redirect(topic_post_url)
    else:
        form = PostForm()
    return render(request, 'reply_topic.html', {'topic': topic, 'form': form})


@method_decorator(login_required, name='dispatch')
class PostUpdateView(UpdateView):
    model = Post
    fields = ('message', )
    template_name = 'edit_post.html'
    pk_url_kwarg = 'post_pk'
    context_object_name = 'post'

    def get_queryset(self):
        queryset = super().get_queryset()
        return queryset.filter(created_by=self.request.user)

    def form_valid(self, form):
        post = form.save(commit=False)

        post.updated_by = self.request.user