diff --git a/rowers/serializers.py b/rowers/serializers.py index e0c8b560..8842d18d 100644 --- a/rowers/serializers.py +++ b/rowers/serializers.py @@ -1,5 +1,5 @@ from rest_framework import serializers -from rowers.models import Workout,Rower,StrokeData +from rowers.models import Workout,Rower,StrokeData,FavoriteChart import datetime @@ -8,6 +8,7 @@ class RowerSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Rower fields = ( + 'id', 'weightcategory', 'max', 'rest', @@ -19,6 +20,19 @@ class RowerSerializer(serializers.HyperlinkedModelSerializer): 'ftp', ) +class FavoriteChartSerializer(serializers.ModelSerializer): + class Meta: + model = FavoriteChart + fields = ( + 'id', + 'xparam', + 'yparam1', + 'yparam2', + 'plottype', + 'workouttype', + 'reststrokes', + 'user' + ) class WorkoutSerializer(serializers.ModelSerializer): class Meta: diff --git a/rowers/templates/rower_form.html b/rowers/templates/rower_form.html index e103f631..90674a5c 100644 --- a/rowers/templates/rower_form.html +++ b/rowers/templates/rower_form.html @@ -9,7 +9,7 @@

{% endif %}
-

Heart Rate Bands

+

Heart Rate Bands

@@ -22,8 +22,8 @@
-

Functional Threshold Power

+

Functional Threshold Power

{{ powerform.as_table }} @@ -34,6 +34,31 @@

+ {% if grants %} +

+

Applications

+
+ + + + + + + + + {% for grant in grants %} + + + + + + {% endfor %} + +
ApplicationScopeRevoke
{{ grant.application }}{{ grant.scope }} + Revoke +
+

+ {% endif %}
diff --git a/rowers/urls.py b/rowers/urls.py index 8ca46c3e..94febda1 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -2,7 +2,7 @@ from django.conf import settings from django.conf.urls import url, include from django.contrib.auth.models import User -from models import Workout,Rower,StrokeData +from models import Workout,Rower,StrokeData,FavoriteChart from rest_framework import routers, serializers, viewsets,permissions from rest_framework.urlpatterns import format_suffix_patterns @@ -19,8 +19,18 @@ from rowers.serializers import ( WorkoutSerializer, RowerSerializer, StrokeDataSerializer, + FavoriteChartSerializer, ) - + +from oauth2_provider.views import ( + AuthorizedTokensListView, + AuthorizedTokenDeleteView, + ) + +from oauth2_provider.views.base import ( + RevokeTokenView + ) + class WorkoutViewSet(viewsets.ModelViewSet): model = Workout #queryset = Workout.objects.all().order_by("-date", "-starttime") @@ -36,12 +46,32 @@ class WorkoutViewSet(viewsets.ModelViewSet): IsOwnerOrNot, ) +class RowerViewSet(viewsets.ModelViewSet): + model = Rower + serializer_class = RowerSerializer + #queryset = Rower.objects.all() + + def get_queryset(self): + r = Rower.objects.filter(user=self.request.user) + return r + + permission_classes = ( + IsOwnerOrNot, + ) + +class FavoriteChartViewSet(viewsets.ModelViewSet): + model = FavoriteChart + serializer_class = FavoriteChartSerializer + queryset = FavoriteChart.objects.all() + class StrokeDataViewSet(viewsets.ModelViewSet): serializer_class = StrokeDataSerializer # 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/me',RowerViewSet, 'rower') +router.register(r'api/charts',FavoriteChartViewSet, 'charts') handler500 = 'views.error500_view' @@ -159,6 +189,7 @@ urlpatterns = [ url(r'^me/edit/$',views.rower_edit_view), url(r'^me/edit/(.+.*)/$',views.rower_edit_view), url(r'^me/c2authorize/$',views.rower_c2_authorize), + url(r'^me/revokeapp/(\d+)$',views.rower_revokeapp_view), url(r'^me/stravaauthorize/$',views.rower_strava_authorize), url(r'^me/sporttracksauthorize/$',views.rower_sporttracks_authorize), url(r'^me/sporttracksrefresh/$',views.rower_sporttracks_token_refresh), diff --git a/rowers/views.py b/rowers/views.py index 167ecb92..d6c8792b 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -75,6 +75,8 @@ import stravalib from stravalib.exc import ActivityUploadFailed,TimeoutExceeded from weather import get_wind_data +from oauth2_provider.models import Application,Grant,AccessToken + import django_rq queue = django_rq.get_queue('default') queuelow = django_rq.get_queue('low') @@ -4780,14 +4782,38 @@ def rower_edit_view(request,message=""): r = Rower.objects.get(user=request.user) form = RowerForm(instance=r) powerform = RowerPowerForm(instance=r) + grants = AccessToken.objects.filter(user=request.user) return render(request, 'rower_form.html', { 'form':form, 'powerform':powerform, + 'grants':grants, }) except Rower.DoesNotExist: return HttpResponse("This user doesn't exist") +@login_required() +def rower_revokeapp_view(request,id=0): + tokens = AccessToken.objects.filter(user=request.user,application=id) + refreshtokens = AccessToken.objects.filter(user=request.user,application=id) + for token in tokens: + token.revoke() + for token in refreshtokens: + token.revoke() + + r = Rower.objects.get(user=request.user) + form = RowerForm(instance=r) + powerform = RowerPowerForm(instance=r) + grants = AccessToken.objects.filter(user=request.user) + return render(request, 'rower_form.html', + { + 'form':form, + 'powerform':powerform, + 'grants':grants, + }) + + + class JSONResponse(HttpResponse): def __init__(self, data, **kwargs): content = JSONRenderer().render(data)