176 lines
4.9 KiB
Python
176 lines
4.9 KiB
Python
# All the Team related methods
|
|
|
|
# Python
|
|
from django.utils import timezone
|
|
from datetime import datetime
|
|
from datetime import timedelta
|
|
import time
|
|
from django.db import IntegrityError
|
|
import uuid
|
|
|
|
from rowers.tasks import handle_sendemail_invite
|
|
|
|
from rowers.models import (
|
|
Rower, Workout, Team, TeamInvite,User
|
|
)
|
|
|
|
# Low level functions - to be called by higher level methods
|
|
|
|
inviteduration = 14 # days
|
|
|
|
def create_team(name,manager,notes=''):
|
|
# needs some error testing
|
|
try:
|
|
t = Team(name=name,manager=manager,notes=notes)
|
|
t.save()
|
|
r = Rower.objects.get(user=manager)
|
|
r.team.add(t)
|
|
except IntegrityError:
|
|
return (0,'Team name duplication')
|
|
return (t.id,'Team created')
|
|
|
|
def remove_team(id):
|
|
t = Team.objects.get(id=id)
|
|
return t.delete()
|
|
|
|
def add_member(id,rower):
|
|
t= Team.objects.get(id=id)
|
|
rower.team.add(t)
|
|
# code to add all workouts
|
|
ws = Workout.objects.filter(user=rower)
|
|
for w in ws:
|
|
w.team.add(t)
|
|
|
|
return (1,'Member added')
|
|
|
|
def remove_member(id,rower):
|
|
t = Team.objects.get(id=id)
|
|
rower.team.remove(t)
|
|
# remove the team from rower's workouts:
|
|
ws = Workout.objects.filter(user=rower)
|
|
for w in ws:
|
|
w.team.remove(t)
|
|
|
|
return (1,'Member removed')
|
|
|
|
def mgr_remove_member(id,manager,rower):
|
|
t = Team.objects.get(id=id)
|
|
if t.manager == manager:
|
|
remove_member(id,rower)
|
|
return (1,'Member removed')
|
|
else:
|
|
return (0,'You are not the team manager')
|
|
|
|
return 0
|
|
|
|
def count_invites(manager):
|
|
ts = Team.objects.filter(manager=manager)
|
|
count = 0
|
|
for t in ts:
|
|
count += TeamInvite.objects.filter(team=t).count()
|
|
|
|
return count
|
|
|
|
def count_members(id):
|
|
t = Team.objects.get(id=id)
|
|
return Rower.objects.filter(team=t).count()
|
|
|
|
def count_club_members(manager):
|
|
ts = Team.objects.filter(manager=manager)
|
|
return Rower.objects.filter(team__in=ts).distinct().count()
|
|
|
|
def get_club_members(manager):
|
|
ts = Team.objects.filter(manager=manager)
|
|
return Rower.objects.filter(team__in=ts).distinct()
|
|
|
|
def get_team_members(id):
|
|
t = Team.objects.get(id=id)
|
|
return Rower.objects.filter(team=t)
|
|
|
|
def get_team_workouts(id):
|
|
t = Team.objects.get(id=id)
|
|
return Workout.objects.filter(team=t).order_by("-date", "-starttime")
|
|
|
|
# Medium level functionality
|
|
|
|
def create_invite(team,manager,user=None):
|
|
r = Rower.objects.get(user=manager)
|
|
if team.manager != manager:
|
|
return (0,'Not the team manager')
|
|
if user:
|
|
try:
|
|
r2 = Rower.objects.get(user=user)
|
|
except Rower.DoesNotExist:
|
|
return (0,'Rower does not exist')
|
|
if r2 in Rower.objects.filter(team=team):
|
|
return (0,'Already member of that team')
|
|
if count_club_members(team.manager)+count_invites(team.manager) < r.clubsize:
|
|
codes = [i.code for i in TeamInvite.objects.all()]
|
|
code = uuid.uuid4().hex[:10].upper()
|
|
# prevent duplicates
|
|
while code in codes:
|
|
code = uuid.uuid4().hex[:10].upper()
|
|
|
|
invite = TeamInvite(team=team,code=code,user=user)
|
|
invite.save()
|
|
return (invite.id,'Invitation created')
|
|
|
|
|
|
else:
|
|
return (0,'You are at your club size limit')
|
|
|
|
return (0,'Nothing done')
|
|
|
|
def revoke_invite(id):
|
|
invitation = TeamInvite.objects.get(id=id)
|
|
invitation.delete()
|
|
|
|
return (1,'Invitation revoked')
|
|
|
|
def send_invite_email(id):
|
|
invitation = TeamInvite.objects.get(id=id)
|
|
if invitation.user:
|
|
email = invitation.user.email
|
|
name = invitation.user.first_name + " " + invitation.user.last_name
|
|
else:
|
|
email = invitation.email
|
|
|
|
code = invitation.code
|
|
teamname = invitation.team.name
|
|
manager = invitation.team.manager.first_name+' '+invitation.team.manager.last_name
|
|
|
|
if settings.DEBUG:
|
|
res = handle_sendemail_invite(email,name,code,teamname,manager)
|
|
else:
|
|
res = queue.enqueue(handle_sendemail_invite(email,name,code,
|
|
teamname,
|
|
manager))
|
|
|
|
return (1,'Invitation email sent')
|
|
|
|
def process_invite_code(user,code):
|
|
try:
|
|
invitation = TeamInvite.objects.get(code=code)
|
|
except TeamInvite.DoesNotExist:
|
|
return (0,'The invitation has expired or the code is invalid')
|
|
|
|
r = Rower.objects.get(user=user)
|
|
nu = datetime.date(timezone.now())
|
|
if nu > invitation.issuedate+timedelta(days=inviteduration):
|
|
revoke_invite(invitation.id)
|
|
return (0,'The invitation has expired')
|
|
|
|
t = invitation.team
|
|
result = add_member(t.id,r)
|
|
invitation.delete()
|
|
return result
|
|
|
|
def remove_expired_invites():
|
|
issuedate = timezone.now()-timedelta(days=inviteduration)
|
|
issuedate = datetime.date(issuedate)
|
|
invitations = TeamInvite.objects.filter(issuedate__lt=issuedate)
|
|
for i in invitations:
|
|
revoke_invite(i.id)
|
|
|
|
return (1,'Expired invitations deleted')
|