Private
Public Access
1
0
Files
rowsandall/rowers/teams.py
2017-04-12 17:39:18 +02:00

466 lines
14 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 django.conf import settings
import django_rq
queue = django_rq.get_queue('default')
queuelow = django_rq.get_queue('low')
queuehigh = django_rq.get_queue('low')
from rowers.models import (
Rower, Workout, Team, TeamInvite,User,TeamRequest
)
from rowers.tasks import (
handle_sendemail_invite,
handle_sendemail_request,
handle_sendemail_member_dropped,handle_sendemail_request_accept,
handle_sendemail_request_reject,handle_sendemail_invite_reject,
handle_sendemail_invite_accept,handle_sendemail_team_removed,
)
# Low level functions - to be called by higher level methods
inviteduration = 14 # days
def handle_remove_workouts_team(ws,t):
for w in ws:
w.team.remove(t)
return 1
def handle_add_workouts_team(ws,t):
for w in ws:
w.team.add(t)
return 1
def update_team(t,name,manager,private,notes,viewing):
if t.manager != manager:
return (0,'You are not the manager of this team')
try:
t.name = name
t.manager = manager
t.private = private
t.notes = notes
t.viewing = viewing
t.save()
except IntegrityError:
return (0,'Team name duplication')
return (1,'Team Updated')
def create_team(name,manager,private='open',notes='',viewing='allmembers'):
# needs some error testing
try:
t = Team(name=name,manager=manager,notes=notes,
private=private,viewing=viewing)
t.save()
r = Rower.objects.get(user=manager)
res = add_member(t.id,r)
except IntegrityError:
return (0,'Team name duplication')
return (t.id,'Team created')
def remove_team(id):
t = Team.objects.get(id=id)
for r in Rower.objects.filter(team=t):
send_team_delete_mail(t,r)
return t.delete()
def set_teamplanexpires(rower):
ts = Team.objects.filter(rower=rower)
texp = datetime.date(timezone.now())
for t in ts:
mr = Rower.objects.get(user=t.manager)
if mr.teamplanexpires > texp:
rower.teamplanexpires = mr.teamplanexpires
t.save()
return (1,'Updated rower team expiry')
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)
res = handle_add_workouts_team(ws,t)
set_teamplanexpires(rower)
return (id,'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,team=t)
res = handle_remove_workouts_team(ws,t)
set_teamplanexpires(rower)
return (id,'Member removed')
def mgr_remove_member(id,manager,rower):
t = Team.objects.get(id=id)
if t.manager == manager:
remove_member(id,rower)
send_email_member_dropped(id,rower)
return (id,'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_request(team,user):
r2 = Rower.objects.get(user=user)
r = Rower.objects.get(user=team.manager)
if r2 in Rower.objects.filter(team=team):
return (0,'Already a member of that team')
if count_club_members(team.manager)+count_invites(team.manager) <= r.clubsize:
codes = [i.code for i in TeamRequest.objects.all()]
code = uuid.uuid4().hex[:10].upper()
# prevent duplicates
while code in codes:
code = uuid.uuid4().hex[:10].upper()
u = User.objects.get(id=user)
rekwest = TeamRequest(team=team,user=u,code=code)
rekwest.save()
send_request_email(rekwest)
return (rekwest.id,'The request was created')
else:
return (0,'That team has reached its maximum number of members')
return (0,'Something went wrong in create_request')
def create_invite(team,manager,user=None,email=''):
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')
elif email==None or email=='':
return (0,'Invalid request - missing email or user')
else:
try:
r2 = Rower.objects.get(user__email=email)
user = User.objects.get(rower=r2)
except Rower.DoesNotExist:
user=None
except Rower.MultipleObjectsReturned:
return (0,'There is more than one user with that email address')
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,email=email)
invite.save()
return (invite.id,'Invitation created')
else:
return (0,'You are at your club size limit')
return (0,'Nothing done')
def revoke_request(user,id):
try:
rekwest = TeamRequest.objects.get(id=id)
except TeamRequest.DoesNotExist:
return (0,'The request is invalid')
t = rekwest.team
if rekwest.user==user:
rekwest.delete()
return (1,'Request revoked')
else:
return (0,'You are not the requestor')
def revoke_invite(manager,id):
try:
invite = TeamInvite.objects.get(id=id)
except TeamInvite.DoesNotExist:
return (0,'The invitation is invalid')
if invite.team.manager==manager:
invite.delete()
return (1,'Invitation revoked')
else:
return (0,'You are not the team manager')
def reject_request(manager,id):
try:
rekwest = TeamRequest.objects.get(id=id)
except TeamRequest.DoesNotExist:
return (0,'The request is invalid')
if rekwest.team.manager==manager:
send_request_reject_email(rekwest)
rekwest.delete()
return (1,'Request rejected')
else:
return (0,'You are not the manager for this request')
def reject_invitation(user,id):
try:
invite = TeamInvite.objects.get(id=id)
except TeamInvite.DoesNotExist:
return (0,'The invitation is invalid')
if invite.user==user:
send_invite_reject_email(invite)
invite.delete()
return (1,'Invitation rejected')
else:
return (0,'This request was not for you')
def send_invite_email(id):
try:
invitation = TeamInvite.objects.get(id=id)
except TeamInvite.DoesNotExist:
return (0,'Invitation doesn not exist')
if invitation.user:
email = invitation.user.email
name = invitation.user.first_name + " " + invitation.user.last_name
else:
email = invitation.email
name = ''
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.delay(email,name,code,teamname,manager)
else:
res = queuehigh.enqueue(handle_sendemail_invite,
email,name,code,teamname,manager)
return (1,'Invitation email sent')
def send_team_delete_mail(t,rower):
u = rower.user
teamname = t.name
email = u.email
name = u.first_name+' '+u.last_name
manager = t.manager.first_name+' '+t.manager.last_name
if settings.DEBUG:
res = handle_sendemail_team_removed.delay(email,name,teamname,manager)
else:
res = queuehigh.enqueue(handle_sendemail_team_removed,
email,name,teamname,manager)
return (1,'Team delete email sent')
def send_email_member_dropped(teamid,rower):
t = Team.objects.get(id=teamid)
u = rower.user
teamname = t.name
email = u.email
name = u.first_name+' '+u.last_name
manager = t.manager.first_name+' '+t.manager.last_name
if settings.DEBUG:
res = handle_sendemail_member_dropped.delay(email,name,teamname,manager)
else:
res = queuehigh.enqueue(handle_sendemail_member_dropped,
email,name,teamname,manager)
return (1,'Member dropped email sent')
def send_request_accept_email(rekwest):
id = rekwest.id
email = rekwest.user.email
teamname = rekwest.team.name
name = rekwest.user.first_name+' '+rekwest.user.last_name
manager = rekwest.team.manager.first_name+' '+rekwest.team.manager.last_name
if settings.DEBUG:
res = handle_sendemail_request_accept.delay(email,name,teamname,manager)
else:
res = queuehigh.enqueue(handle_sendemail_request_accept,
email,name,teamname,manager)
return (1,'Invitation email sent')
def send_request_reject_email(rekwest):
id = rekwest.id
teamname = rekwest.team.name
email = rekwest.user.email
name = rekwest.user.first_name+' '+rekwest.user.last_name
manager = rekwest.team.manager.first_name+' '+rekwest.team.manager.last_name
if settings.DEBUG:
res = handle_sendemail_request_reject.delay(email,name,teamname,manager)
else:
res = queuehigh.enqueue(handle_sendemail_request_reject,
email,name,teamname,manager)
return (1,'Invitation email sent')
def send_invite_reject_email(invitation):
id = invitation.id
email = invitation.team.manager.email
if invitation.user:
name = invitation.user.first_name+' '+invitation.user.last_name
else:
name = invitation.email
teamname = invitation.team.name
manager = invitation.team.manager.first_name+' '+invitation.team.manager.last_name
if settings.DEBUG:
res = handle_sendemail_invite_reject.delay(email,name,teamname,manager)
else:
res = queuehigh.enqueue(handle_sendemail_invite_reject,
email,name,teamname,manager)
return (1,'Invitation email sent')
def send_invite_accept_email(invitation):
id = invitation.id
email = invitation.team.manager.email
if invitation.user:
name = invitation.user.first_name+' '+invitation.user.last_name
else:
name = invitation.email
teamname = invitation.team.name
manager = invitation.team.manager.first_name+' '+invitation.team.manager.last_name
if settings.DEBUG:
res = handle_sendemail_invite_accept.delay(email,name,teamname,manager)
else:
res = queuehigh.enqueue(handle_sendemail_invite_accept,
email,name,teamname,manager)
return (1,'Invitation email sent')
def send_request_email(rekwest):
email = rekwest.team.manager.email
id = rekwest.id
name = rekwest.team.manager.first_name + " " + rekwest.team.manager.last_name
code = rekwest.code
teamname = rekwest.team.name
requestor = rekwest.user.first_name+' '+rekwest.user.last_name
if settings.DEBUG:
res = handle_sendemail_request.delay(email,name,code,teamname,
requestor,id)
else:
res = queuehigh.enqueue(handle_sendemail_request,
email,name,code,teamname,requestor,id)
return (1,'Invitation email sent')
def process_request_code(manager,code):
code = code.upper()
try:
rekwest = TeamRequest.objects.get(code=code)
except TeamRequest.DoesNotExist:
return (0,'The request has been revoked or the code is invalid')
r = Rower.objects.get(user=rekwest.user)
t = rekwest.team
if rekwest.team.manager != manager:
return (0,'You are not the manager of this team')
result = add_member(t.id,r)
send_request_accept_email(rekwest)
rekwest.delete()
return result
def process_invite_code(user,code):
code = code.upper()
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.team.manager,invitation.id)
return (0,'The invitation has expired')
t = invitation.team
result = add_member(t.id,r)
send_invite_accept_email(invitation)
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.team.manager,i.id)
return (1,'Expired invitations deleted')