diff --git a/rowers/admin.py b/rowers/admin.py index 887bbd25..6c8da968 100644 --- a/rowers/admin.py +++ b/rowers/admin.py @@ -32,7 +32,7 @@ class TeamAdmin(admin.ModelAdmin): list_display = ('name','manager') class TeamInviteAdmin(admin.ModelAdmin): - list_display = ('issuedate','team','user') + list_display = ('issuedate','team','user','code') admin.site.unregister(User) admin.site.register(User,UserAdmin) diff --git a/rowers/models.py b/rowers/models.py index 18591001..c801799f 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -83,7 +83,7 @@ class PowerZonesField(models.TextField): # For future Team functionality class Team(models.Model): - name = models.CharField(max_length=150) + name = models.CharField(max_length=150,unique=True) notes = models.CharField(blank=True,max_length=200) manager = models.ForeignKey(User) @@ -92,9 +92,9 @@ class Team(models.Model): class TeamInvite(models.Model): team = models.ForeignKey(Team) - user = models.ForeignKey(User) + user = models.ForeignKey(User,null=True) issuedate = models.DateField(default=timezone.now) - code = models.CharField(max_length=150) + code = models.CharField(max_length=150,unique=True) # Extension of User with rowing specific data diff --git a/rowers/teams.py b/rowers/teams.py new file mode 100644 index 00000000..1d52b44a --- /dev/null +++ b/rowers/teams.py @@ -0,0 +1,95 @@ +# 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.models import ( + Rower, Workout, Team, TeamInvite,User + ) + +# Low level functions - to be called by higher level methods + +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) + return (1,'Member added') + +def remove_member(id,rower): + t = Team.objects.get(id=id) + rower.team.remove(t) + return (1,'Member removed') + +def mgr_remove_member(id,manager,rower): + t = Team.objects.get(id=id) + if t.manager == manager: + rower.team.remove(t) + return (1,'Member added') + else: + return (0,'You are not the team manager') + + return 0 + +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) + +# Medium level functionality + +def create_invite(team,manager,user=None): + 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) < 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 code + + + else: + return (0,'You are at your club size limit') + + return (0,'Nothing done') diff --git a/rowers/templates/advancededit.html b/rowers/templates/advancededit.html index 0e40362b..fe002787 100644 --- a/rowers/templates/advancededit.html +++ b/rowers/templates/advancededit.html @@ -51,7 +51,7 @@
- {% if user.rower.rowerplan == 'pro' %} + {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} Edit Intervals {% else %} Edit Intervals @@ -88,7 +88,7 @@
- {% if user.rower.rowerplan == 'pro' %} + {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} Dist Metrics Plot {% else %} Dist Metrics Plot @@ -100,7 +100,7 @@
- {% if user.rower.rowerplan == 'pro' %} + {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} Time Metrics Plot {% else %} Time Metrics Plot @@ -123,7 +123,7 @@
- {% if user.rower.rowerplan == 'pro' %} + {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} Power Histogram {% else %} Dist Metrics Plot diff --git a/rowers/templates/advancedotw.html b/rowers/templates/advancedotw.html index 2892dcc4..e6c03f20 100644 --- a/rowers/templates/advancedotw.html +++ b/rowers/templates/advancedotw.html @@ -51,7 +51,7 @@
- {% if user.rower.rowerplan == 'pro' %} + {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} Compare Workouts {% else %} Compare Workouts @@ -73,7 +73,7 @@
- {% if user.rower.rowerplan == 'pro' %} + {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} Edit Intervals {% else %} Edit Intervals @@ -90,7 +90,7 @@
- {% if user.rower.rowerplan == 'pro' %} + {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} CrewNerd Summary {% else %} CrewNerd Summary @@ -104,7 +104,7 @@
- {% if user.rower.rowerplan == 'pro' %} + {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} Stroke Profile (Empower) {% else %} Stroke Profile (Empower) @@ -117,7 +117,7 @@
- {% if user.rower.rowerplan == 'pro' %} + {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} OTW Power Plot {% else %} OTW Power Plot @@ -137,7 +137,7 @@
- {% if user.rower.rowerplan == 'pro' %} + {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} Geeky Stuff {% else %} Geeky Stuff @@ -152,7 +152,7 @@
- {% if user.rower.rowerplan == 'pro' %} + {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} Smooth out Pace Data {% else %} Smooth out Pace Data @@ -169,7 +169,7 @@
- {% if user.rower.rowerplan == 'pro' %} + {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} Raw Data {% else %} Reset Smoothing diff --git a/rowers/templates/analysis.html b/rowers/templates/analysis.html index c0deb3cd..4cdbf511 100644 --- a/rowers/templates/analysis.html +++ b/rowers/templates/analysis.html @@ -41,7 +41,7 @@
- {% if user.rower.rowerplan == 'pro' %} + {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} Power Histogram {% else %} Power Histogram @@ -53,7 +53,7 @@
- {% if user.rower.rowerplan == 'pro' %} + {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} Statistics {% else %} Statistics diff --git a/rowers/templates/base.html b/rowers/templates/base.html index 1f583a2f..57ee2294 100644 --- a/rowers/templates/base.html +++ b/rowers/templates/base.html @@ -24,7 +24,7 @@ {% analytical_body_top %}
Free Data and Analysis. For Rowers. By Rowers.
diff --git a/rowers/templates/bases.html b/rowers/templates/bases.html index 57e283b6..a61c155d 100644 --- a/rowers/templates/bases.html +++ b/rowers/templates/bases.html @@ -19,7 +19,7 @@
Free Data and Analysis. For Rowers. By Rowers.
diff --git a/rowers/templates/flexchart3.html b/rowers/templates/flexchart3.html index 1fac349a..aa49ff65 100644 --- a/rowers/templates/flexchart3.html +++ b/rowers/templates/flexchart3.html @@ -168,7 +168,7 @@
- {% if user.rower.rowerplan == 'pro' %} + {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} Edit Wind Data {% else %} Edit Wind Data @@ -70,7 +70,7 @@
- {% if user.rower.rowerplan == 'pro' %} + {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} Edit Stream Data {% else %} Edit Stream Data @@ -83,7 +83,7 @@
- {% if user.rower.rowerplan == 'pro' %} + {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} OTW Power {% else %} OTW Power @@ -100,7 +100,7 @@
- {% if user.rower.rowerplan == 'pro' %} + {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} Corrected Pace Plot {% else %} Corrected Pace Plot @@ -159,4 +159,4 @@