k3v1n
k3v1n

Reputation: 391

Check if user is in the group before posting

I have a project called Star Social this project you can only post if you are in group in this case i can still post even if i am not in a group and i can still see that post in the group that i selected. What i want is when user tried to post even out of the group they will receive an error and redirect them to group page so that they can join a group and they can now post.I tried to search on google but i get no result and btw i am new in this field and i am currently learning django.Create Post After create post Still see the post even if i am not a group that i selected

models.py

##########################
## POSTS MODELS.PY FILE ##
##########################

from django.contrib.auth import get_user_model
from django.db import models
from groups.models import Group
from misaka import html
from django.urls import reverse

User = get_user_model()

class Post(models.Model):

    user = models.ForeignKey(User, related_name='posts', on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now=True)
    message = models.TextField()
    message_html = models.TextField(editable=False)
    group = models.ForeignKey(Group, related_name='posts', null=True, blank=True, on_delete=models.CASCADE)

    def __str__(self):
        return self.message

    def save(self, *args, **kwargs):

        self.message_html = html(self.message)
        super().save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse(
            'posts:single',
            kwargs={
                'username': self.user.username,
                'pk': self.pk
            }
        )

    class Meta:

        ordering = ['-created_at']

views.py

#########################
## POSTS VIEWS.PY FILE ##
#########################

from braces.views import SelectRelatedMixin
from django.contrib.auth import get_user_model
from django.views import generic
from posts.models import Post
from django.http import Http404
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from django.contrib import messages
from django.shortcuts import get_object_or_404
from groups.models import Group, GroupMember

User = get_user_model()

class PostList(SelectRelatedMixin, generic.ListView):

    model = Post
    select_related = ('user', 'group')

class UserPost(generic.ListView):

    model = Post
    template_name = 'posts/user_post_list.html'

    def get_queryset(self):

        try:
            self.post_user = User.objects.prefetch_related('posts').get(
                username__iexact=self.kwargs.get('username')
            )
        except User.DoesNotExist:
            raise Http404
        else:
            return self.post_user.posts.all()

    def get_context_data(self, **kwargs):

        context = super().get_context_data(**kwargs)
        context['post_user'] = self.post_user
        return context

class PostDetail(SelectRelatedMixin, generic.DetailView):

    model = Post
    select_related = ('user', 'group')

    def get_queryset(self):

        queryset = super().get_queryset()
        return queryset.filter(
            user__username__iexact=self.kwargs.get('username')
        )

class CreatePost(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):

    model = Post
    fields = ('message', 'group')

    def form_valid(self, form):

        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.save()
        return super().form_valid(form)

class DeletePost(LoginRequiredMixin, SelectRelatedMixin, generic.DeleteView):

    model = Post
    select_related = ('user', 'group')
    success_url = reverse_lazy('posts:all')

    def get_queryset(self):

        queryset = super().get_queryset()
        return queryset.filter(user_id=self.request.user.id)

    def delete(self, *args, **kwargs):

        messages.success(self.request, ('Post Delete'))
        return super().delete(*args, **kwargs)

Upvotes: 1

Views: 2464

Answers (1)

jaandaldethu
jaandaldethu

Reputation: 63

Create a helper function that can help you check the user group.

def has_group(user, group):
    return user.groups.filter(name=group).exists()

Or

def has_groups(user, group):
    return user.groups.filter(name__in=group).exists()

Return true or false and then handle your request from there.

Example:

class CreatePost(LoginRequiredMixin, SelectRelatedMixin, generic.CreateView):

    model = Post
    fields = ('message', 'group')

    def form_valid(self, form):
        if has_group(self.request.user, "HelloDjango"): # Or has_groups(self.request.user, ["HelloDjango", "TEST"])
           self.object = form.save(commit=False)
           self.object.user = self.request.user
           self.object.save()
           return super().form_valid(form)
        else:
           messages.error(self.request, "Not authorized to post in this group",) # Django messages
           return super().form_invalid(form) # Or redirect to group page

Upvotes: 2

Related Questions