2

I have teams and I have members (players). The Team owner is inviting a player to his team by email. And player is accepting invitation to join team. After acceptation they become a member of a invitated team.

Now what I want to do is to make it possible for player to leave the team and also give possibility for the team owner remove player from their team. Since I am new with Django I can't achieve it yet. I've tried to create delete_member.html and function delete_member in Views first for Team owner to remove Its member but I don't see anything in that page. What Am I doing wrong?

Apps:

Team app - Views

from django.conf import settings
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect, get_object_or_404    


from .models import Team, Invitation  
 

from .utilities import send_invitation, send_invitation_accepted    


@login_required
def team(request, team_id):
    team = get_object_or_404(Team, pk=team_id, status=Team.ACTIVE, members__in=[request.user])
    invitations = team.invitations.filter(status=Invitation.INVITED)   

    return render(request, 'team/team.html', {'team': team, 'invitations': invitations})

@login_required
def activate_team(request, team_id):
    team = get_object_or_404(Team, pk=team_id, status=Team.ACTIVE, members__in=[request.user])
    userprofile = request.user.userprofile
    userprofile.active_team_id = team.id
    userprofile.save()

    messages.info(request, 'The team was activated')

    return redirect('team:team', team_id=team.id)


@login_required
def add(request):
    if request.method == 'POST':
        title = request.POST.get('title')

        if title:
            team = Team.objects.create(title=title, created_by=request.user)
            team.members.add(request.user)
            team.save()

            userprofile = request.user.userprofile
            userprofile.active_team_id = team.id
            userprofile.save()

            return redirect('myaccount')
    
    return render(request, 'team/add.html')

@login_required
def delete_member(request):
team = get_object_or_404(Team, pk=request.user.userprofile.active_team_id, status=Team.ACTIVE, members__in=[request.user])

if request.method == 'POST':
    members = request.POST.get('members')

    if members:
        team.members = members
        team.delete()

        messages.info(request, 'The changes was saved')

        return redirect('team:team', team_id=team.id)            

return render(request, 'team/delete_member.html')

@login_required
def edit(request):
    team = get_object_or_404(Team, pk=request.user.userprofile.active_team_id, status=Team.ACTIVE, members__in=[request.user])

    if request.method == 'POST':
        title = request.POST.get('title')

        if title:
            team.title = title
            team.save()

            messages.info(request, 'The changes was saved')

            return redirect('team:team', team_id=team.id)

    return render(request, 'team/edit.html', {'team': team})

@login_required
def invite(request):
    team = get_object_or_404(Team, pk=request.user.userprofile.active_team_id, status=Team.ACTIVE)

    if request.method == 'POST':
        email = request.POST.get('email')

        if email:
            invitations = Invitation.objects.filter(team=team, email=email)

            if not invitations:
                code = ''.join(random.choice('abcdefghijklmnopqrstuvwxyz123456789') for i in range(4))
                invitation = Invitation.objects.create(team=team, email=email, code=code)

                messages.info(request, 'The user was invited')

                send_invitation(email, code, team)

                return redirect('team:team', team_id=team.id)
            else:
                messages.info(request, 'The users has already been invited')

    return render(request, 'team/invite.html', {'team': team})

Team App - Models

from django.contrib.auth.models import User
from django.db import models


    class Team(models.Model):
    
        ACTIVE = 'active'
        DELETED = 'deleted'
    
        CHOICES_STATUS = (
            (ACTIVE, 'Active'),
            (DELETED, 'Deleted')
        )
    
    
        title = models.CharField(max_length=255)
        members = models.ManyToManyField(User, related_name='teams')
        created_by = models.ForeignKey(User, related_name='created_teams', on_delete=models.CASCADE)
        created_at = models.DateTimeField(auto_now_add=True)
        status = models.CharField(max_length=10, choices=CHOICES_STATUS, default=ACTIVE)    
    
        class Meta:
            ordering = ['title']
        
        def __str__(self):
            return self.title
    
    class Invitation(models.Model):
    
        INVITED = 'invited'
        ACCEPTED = 'accepted'
        REJECTED = 'rejected'
    
        CHOICES_STATUS = (
            (INVITED, 'Invited'),
            (ACCEPTED, 'Accepted'),
            (REJECTED, 'Rejected')
        )
    
        team = models.ForeignKey(Team, related_name='invitations', on_delete=models.CASCADE)
        email = models.EmailField()
        code = models.CharField(max_length=20)
        status = models.CharField(max_length=20, choices=CHOICES_STATUS, default=INVITED)
        date_sent = models.DateTimeField(auto_now_add=True)
    
        def __str__(self):
            return self.email

Team App - Urls

from django.urls import path
from .views import team, add, edit, activate_team, invite, delete_member

app_name = 'team'


urlpatterns = [
    path('add/', add, name='add'),
    path('edit/', edit, name='edit'),
    path('delete_member/', delete_member, name='delete_member'),
    path('invite/', invite, name='invite'),
    path('activate_team/<int:team_id>/', activate_team, name='activate_team'),
    path('<int:team_id>/', team, name='team')
]

Team App - Templates/delete_member.html

{% extends 'core/base.html' %}

{% block title %}Delete member | {% endblock %}

{% block content %}
    <nav class="breadcrumb" aria-label="breadcrumbs">
        <ul>
            <li><a href="#">Dashboard</a></li>
            <li><a href="{% url 'myaccount' %}">My account</a></li>
            <li class="is-active"><a href="{% url 'team:add' %}" aria-current="page">Add team</a></li>
        </ul>
    </nav>

    <div class="columns" id="team-app">
        <div class="column is-4">
            <h1 class="title">Delete member</h1>

            <form method="post" action="." @submit="validateForm">
                {% csrf_token %}

                

                <div class="field">
                    <label>Member</label>

                    {% for member in team.members.all %}
                    <p>{{ member.username }}</p>
                    <div class="field">
                        <div class="control">
                            <button class="button is-success">Delete</button>
                        </div>
                    </div>
                    {% endfor %}
                </div>

                <div class="notification is-danger" v-if="errors.length">
                    <p v-for="error in errors">[[ error ]]</p>
                </div>

                
            </form>
        </div>
    </div>
Vagner
  • 383
  • 2
  • 10
  • Why are you creating a team in the delete view? `team = Team.objects.create(title=title, created_by=request.user)` – Lewis Dec 06 '21 at 12:15
  • Should it be like this? `@login_required def delete_member(request): team = get_object_or_404(Team, pk=request.user.userprofile.active_team_id, status=Team.ACTIVE, members__in=[request.user]) if request.method == 'POST': members = request.POST.get('members') if members: team.members = members team.delete() messages.info(request, 'The changes was saved') return redirect('team:team', team_id=team.id) return render(request, 'team/delete_member.html')` – Vagner Dec 06 '21 at 12:47
  • Sort of, but you do not delete the team. You want to remove the members from the team. See https://stackoverflow.com/a/4719762/11475846 for removing multiple manytomany objects – Lewis Dec 06 '21 at 13:03

0 Answers0