Private
Public Access
1
0
Files
rowsandall/rowers/teams.py
2017-02-09 12:23:56 +01:00

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')