diff --git a/rowers/models.py b/rowers/models.py index 9aab3e1b..492269c4 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -2223,7 +2223,7 @@ class CourseStandard(models.Model): weightclass = models.CharField(max_length=150,default='hwt') adaptiveclass = models.CharField(choices=mytypes.adaptivetypes,max_length=50,default="None") skillclass = models.CharField(max_length=150,default='Open') - standardcollection = models.ForeignKey(StandardCollection,on_delete=models.CASCADE) + standardcollection = models.ForeignKey(StandardCollection,on_delete=models.CASCADE,related_name='standards') class Meta: unique_together = ( diff --git a/rowers/permissions.py b/rowers/permissions.py index 4950f910..0fa0db2d 100644 --- a/rowers/permissions.py +++ b/rowers/permissions.py @@ -26,3 +26,8 @@ class IsOwnerOrNot(permissions.BasePermission): def has_object_permission(self, request, view, obj): r = Rower.objects.get(user=request.user) return (obj.user == r) + +class IsCompetitorOrNot(permissions.BasePermission): + + def has_object_permission(self, request, view, obj): + return (obj.userid == request.user.id) diff --git a/rowers/serializers.py b/rowers/serializers.py index d5ea3e84..3bba3727 100644 --- a/rowers/serializers.py +++ b/rowers/serializers.py @@ -7,7 +7,11 @@ from __future__ import unicode_literals # Also optionally define POST, PATCH methods (create, update) from rest_framework import serializers -from rowers.models import Workout,Rower,FavoriteChart +from rowers.models import ( + Workout,Rower,FavoriteChart,VirtualRaceResult, + VirtualRace,GeoCourse,StandardCollection, CourseStandard, + + ) import datetime @@ -42,7 +46,80 @@ class FavoriteChartSerializer(serializers.ModelSerializer): 'reststrokes', 'user' ) - + + + + + + +class CourseStandardSerializer(serializers.ModelSerializer): + + class Meta: + model = CourseStandard + fields = ( + 'id', + 'name', + 'coursedistance', + 'coursetime', + 'agemin', + 'agemax', + 'boatclass', + 'boattype', + 'sex', + 'weightclass', + 'adaptiveclass', + 'skillclass', + 'standardcollection', + ) + +class StandardCollectionSerializer(serializers.ModelSerializer): + standards = CourseStandardSerializer(many=True,read_only=True) + class Meta: + model = StandardCollection + fields = ( + 'id', + 'notes', + 'active', + 'standards' + ) + +class EntrySerializer(serializers.ModelSerializer): + entrycategory = CourseStandardSerializer(read_only=True) + class Meta: + model = VirtualRaceResult + fields = ( + 'id', + 'teamname', + 'adaptiveclass', + 'skillclass', + 'race', + 'distance', + 'duration', + 'points', + 'boattype', + 'sex', + 'age', + 'entrycategory', + ) + +class VirtualRaceSerializer(serializers.ModelSerializer): + coursestandards = StandardCollectionSerializer(read_only=True) + class Meta: + model = VirtualRace + fields = ( + 'id', + 'registration_closure', + 'evaluation_closure', + 'start_time', + 'end_time', + 'country', + 'timezone', + 'contact_phone', + 'contact_email', + 'coursestandards', + ) + + class WorkoutSerializer(serializers.ModelSerializer): class Meta: model = Workout @@ -58,7 +135,7 @@ class WorkoutSerializer(serializers.ModelSerializer): 'maxhr', 'notes', 'summary', - 'boattype', + 'boattype', 'timezone', 'forceunit', 'inboard', @@ -101,7 +178,7 @@ class WorkoutSerializer(serializers.ModelSerializer): rankingpiece=validated_data['rankingpiece'],) w.save() return w - + def update(self, instance, validated_data): d = validated_data['date'] t = validated_data['starttime'] @@ -138,7 +215,7 @@ class WorkoutSerializer(serializers.ModelSerializer): class StrokeDataSerializer(serializers.Serializer): workoutid = serializers.IntegerField strokedata = serializers.JSONField - + def create(self, workoutid, strokedata): """ Create and enter a new set of stroke data into the DB @@ -146,6 +223,3 @@ class StrokeDataSerializer(serializers.Serializer): # do something return 1 - - - diff --git a/rowers/stravastuff.py b/rowers/stravastuff.py index f79b6947..2788e34e 100644 --- a/rowers/stravastuff.py +++ b/rowers/stravastuff.py @@ -356,7 +356,8 @@ def async_get_workout(user,stravaid): try: token = strava_open(user) except NoTokenError: - return 0 + return 0 + csvfilename = 'media/{code}_{stravaid}.csv'.format(code=uuid4().hex[:16],stravaid=stravaid) job = myqueue(queue, fetch_strava_workout, diff --git a/rowers/urls.py b/rowers/urls.py index 5e53e52f..030524f6 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -7,7 +7,10 @@ from django.conf.urls import url, include from django.urls import path, re_path from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required, permission_required -from rowers.models import Workout,Rower,FavoriteChart +from rowers.models import ( + Workout,Rower,FavoriteChart,VirtualRaceResult, + VirtualRace,StandardCollection,CourseStandard, + ) from rest_framework import routers, serializers, viewsets,permissions from rest_framework.urlpatterns import format_suffix_patterns @@ -16,12 +19,19 @@ from rowers import views from django.contrib.auth import views as auth_views from django.views.generic.base import TemplateView -from rowers.permissions import IsOwnerOrNot,IsOwnerOrReadOnly +from rowers.permissions import ( + IsOwnerOrNot,IsOwnerOrReadOnly, + IsCompetitorOrNot, + ) from rowers.serializers import ( WorkoutSerializer, RowerSerializer, StrokeDataSerializer, FavoriteChartSerializer, + EntrySerializer, + CourseStandardSerializer, + StandardCollectionSerializer, + VirtualRaceSerializer, ) from oauth2_provider.views import ( @@ -78,7 +88,7 @@ class FavoriteChartViewSet(viewsets.ModelViewSet): def get_queryset(self): try: - r = Rower.objects.filter(user=self.request.user) + r = Rower.objects.get(user=self.request.user) return FavoriteChart.objects.filter(user=r) except TypeError: return [] @@ -89,6 +99,59 @@ class FavoriteChartViewSet(viewsets.ModelViewSet): http_method_names = ['get','put','patch','delete'] +class EntryViewSet(viewsets.ModelViewSet): + model = VirtualRaceResult + serializer_class = EntrySerializer + + def get_queryset(self): + try: + return VirtualRaceResult.objects.filter(userid=self.request.user.id) + except TypeError: + return [] + + http_method_names = ['get'] + + permission_classes = ( + IsCompetitorOrNot, + ) + +class VirtualRaceViewSet(viewsets.ModelViewSet): + model = VirtualRace + serializer_class = VirtualRaceSerializer + + def get_queryset(self): + try: + return VirtualRace.objects.all() + except TypeError: + return [] + + http_method_names = ['get'] + +class CourseStandardViewSet(viewsets.ModelViewSet): + model = CourseStandard + serializer_class = CourseStandardSerializer + + def get_queryset(self): + try: + return CourseStandard.objects.all() + except TypeError: + return [] + + http_method_names = ['get'] + +class StandardCollectionViewSet(viewsets.ModelViewSet): + model = StandardCollection + + serializer_class = StandardCollectionSerializer + + def get_queryset(self): + try: + return StandardCollection.objects.all() + except TypeError: + return [] + + http_method_names = ['get'] + class StrokeDataViewSet(viewsets.ModelViewSet): serializer_class = StrokeDataSerializer @@ -97,6 +160,10 @@ router = routers.DefaultRouter() router.register(r'api/workouts',WorkoutViewSet, 'workout') router.register(r'api/me',RowerViewSet, 'rower') router.register(r'api/charts',FavoriteChartViewSet, 'charts') +router.register(r'api/entries',EntryViewSet,'entries') +router.register(r'api/challenges',VirtualRaceViewSet,'challenges') +router.register(r'api/standards',CourseStandardViewSet,'standards') +router.register(r'api/standardcollections',StandardCollectionViewSet,'standardcollections') def permissiondenied_view(request): raise PermissionDenied diff --git a/rowers/views/statements.py b/rowers/views/statements.py index 2b34446f..4a0f46a1 100644 --- a/rowers/views/statements.py +++ b/rowers/views/statements.py @@ -643,7 +643,7 @@ except ImportError: from rest_framework.decorators import api_view, renderer_classes -from rowers.permissions import IsOwnerOrNot +from rowers.permissions import IsOwnerOrNot, IsCompetitorOrNot import rowers.plots as plots import rowers.mailprocessing as mailprocessing