diff --git a/rowers/models.py b/rowers/models.py index 9c657e00..c75106ce 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -2292,6 +2292,7 @@ class PlannedSession(models.Model): if self.sessionvalue <= 0: self.sessionvalue = 1 + manager = self.manager if self.sessiontype not in ['race','indoorrace']: if not can_add_session(self.manager): diff --git a/rowers/permissions.py b/rowers/permissions.py index 8ea8540e..614057b0 100644 --- a/rowers/permissions.py +++ b/rowers/permissions.py @@ -27,6 +27,16 @@ class IsOwnerOrNot(permissions.BasePermission): r = Rower.objects.get(user=request.user) return (obj.user == r) +class IsRowerOrNot(permissions.BasePermission): + def has_object_permission(self, request, view, obj): + r = Rower.objects.get(user=request.user) + return (r in obj.rower.all()) + +class IsPlanOrHigher(permissions.BasePermission): + def has_object_permission(self, request, view, obj): + r = Rower.objects.get(user=request.user) + return r not in ['basic','pro','freecoach'] + class IsCompetitorOrNot(permissions.BasePermission): def has_object_permission(self, request, view, obj): diff --git a/rowers/serializers.py b/rowers/serializers.py index 7bc3e8e9..fc01865f 100644 --- a/rowers/serializers.py +++ b/rowers/serializers.py @@ -10,7 +10,7 @@ from rest_framework import serializers from rowers.models import ( Workout,Rower,FavoriteChart,VirtualRaceResult, VirtualRace,GeoCourse,StandardCollection, CourseStandard, - GeoCourse, GeoPolygon, GeoPoint, + GeoCourse, GeoPolygon, GeoPoint,PlannedSession, ) from django.core.exceptions import PermissionDenied @@ -31,8 +31,11 @@ class RowerSerializer(serializers.HyperlinkedModelSerializer): 'at', 'tr', 'an', + 'hrzones', 'ftp', + 'hrftp', 'sex', + 'defaulttimezone', ) class FavoriteChartSerializer(serializers.ModelSerializer): @@ -127,6 +130,34 @@ class VirtualRaceSerializer(serializers.ModelSerializer): 'coursestandards', ) +class PlannedSessionSerializer(serializers.ModelSerializer): + class Meta: + model = VirtualRace + fields = ( + 'id', + 'name', + 'comment', + 'startdate', + 'enddate', + 'preferreddate', + 'sessiontype', + 'sessionvalue', + 'sessionunit', + 'sessionmode', + 'course', + ) + + def create(self, validated_data): + if self.context['request'].user.is_authenticated: + r = Rower.objects.get(user=self.context['request'].user) + else: + raise PermissionDenied("Not allowed") + + ps = PlannedSession.objects.create(manager=r.user,**validated_data) + ps.rower.add(r) + ps.save() + return ps + class EntrySerializer(serializers.ModelSerializer): entrycategory = CourseStandardSerializer(read_only=True) race = VirtualRaceSerializer(read_only=True) @@ -172,7 +203,6 @@ class WorkoutSerializer(serializers.ModelSerializer): ) def create(self, validated_data): - print(validated_data) if self.context['request'].user.is_authenticated: r = Rower.objects.get(user=self.context['request'].user) else: diff --git a/rowers/templates/developers.html b/rowers/templates/developers.html index bebe6949..9dbbf9e9 100644 --- a/rowers/templates/developers.html +++ b/rowers/templates/developers.html @@ -208,6 +208,32 @@ + + Planned Session + /rowers/api/plannedsessions/ +
+ /rowers/api/plannedsessions/{id} + GET, POST, DELETE + +
{
+            "id": 17,
+            "name": "Test Session",
+            "comment": "",
+            "startdate": "2021-01-25",
+            "enddate": "2021-01-31",
+            "preferreddate": "2021-01-29",
+            "sessiontype": "session",
+            "sessionvalue": 60,
+            "sessionunit": "min",
+            "sessionmode": "time",
+            "manager": 1,
+            "course": null
+        }
+              
+ + + + Challenge /rowers/api/challenges/ diff --git a/rowers/urls.py b/rowers/urls.py index b6c189e3..87a5cfb8 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -11,7 +11,7 @@ from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator from rowers.models import ( Workout,Rower,FavoriteChart,VirtualRaceResult, - VirtualRace,StandardCollection,CourseStandard,GeoCourse, + VirtualRace,StandardCollection,CourseStandard,GeoCourse,PlannedSession, ) from rest_framework import routers, serializers, viewsets,permissions @@ -24,7 +24,8 @@ from django.utils.decorators import method_decorator from rowers.permissions import ( IsOwnerOrNot,IsOwnerOrReadOnly, - IsCompetitorOrNot, + IsCompetitorOrNot,IsRowerOrNot, + IsPlanOrHigher, ) from rowers.serializers import ( WorkoutSerializer, @@ -38,6 +39,7 @@ from rowers.serializers import ( GeoCourseSerializer, GeoPolygonSerializer, GeoPointSerializer, + PlannedSessionSerializer, ) from oauth2_provider.views import ( @@ -49,6 +51,25 @@ from oauth2_provider.views.base import ( RevokeTokenView ) +class PlannedSessionViewSet(viewsets.ModelViewSet): + model = PlannedSession + serializer_class = PlannedSessionSerializer + + def get_queryset(self): + try: + r = Rower.objects.get(user=self.request.user) + if r.rowerplan not in ['basic','pro']: + return PlannedSession.objects.filter(rower=r).order_by("-preferreddate") + else: + return [] + except TypeError: + return [] + + permission_classes = ( + IsRowerOrNot, + IsPlanOrHigher, + ) + class WorkoutViewSet(viewsets.ModelViewSet): model = Workout #queryset = Workout.objects.all().order_by("-date", "-starttime") @@ -175,6 +196,7 @@ class StrokeDataViewSet(viewsets.ModelViewSet): # Routers provide an easy way of automatically determining the URL conf. router = routers.DefaultRouter() router.register(r'api/workouts',WorkoutViewSet, 'workout') +router.register(r'api/plannedsessions',PlannedSessionViewSet,'plannedsession') router.register(r'api/me',RowerViewSet, 'rower') router.register(r'api/charts',FavoriteChartViewSet, 'charts') router.register(r'api/entries',EntryViewSet,'entries')