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>