Private
Public Access
1
0

Merge branch 'feature/restapi2' into develop

This commit is contained in:
Sander Roosendaal
2017-01-04 10:35:50 +01:00
4 changed files with 101 additions and 5 deletions
+15 -1
View File
@@ -1,5 +1,5 @@
from rest_framework import serializers from rest_framework import serializers
from rowers.models import Workout,Rower,StrokeData from rowers.models import Workout,Rower,StrokeData,FavoriteChart
import datetime import datetime
@@ -8,6 +8,7 @@ class RowerSerializer(serializers.HyperlinkedModelSerializer):
class Meta: class Meta:
model = Rower model = Rower
fields = ( fields = (
'id',
'weightcategory', 'weightcategory',
'max', 'max',
'rest', 'rest',
@@ -19,6 +20,19 @@ class RowerSerializer(serializers.HyperlinkedModelSerializer):
'ftp', 'ftp',
) )
class FavoriteChartSerializer(serializers.ModelSerializer):
class Meta:
model = FavoriteChart
fields = (
'id',
'xparam',
'yparam1',
'yparam2',
'plottype',
'workouttype',
'reststrokes',
'user'
)
class WorkoutSerializer(serializers.ModelSerializer): class WorkoutSerializer(serializers.ModelSerializer):
class Meta: class Meta:
+27 -2
View File
@@ -9,7 +9,7 @@
</p> </p>
{% endif %} {% endif %}
<div class="grid_6 alpha"> <div class="grid_6 alpha">
<h1>Heart Rate Bands</h1> <h2>Heart Rate Bands</h2>
<form enctype="multipart/form-data" action="" method="post"> <form enctype="multipart/form-data" action="" method="post">
<table> <table>
@@ -22,8 +22,8 @@
</div> </div>
</div> </div>
<div class="grid_6 omega"> <div class="grid_6 omega">
<h1>Functional Threshold Power</h1>
<p> <p>
<h2>Functional Threshold Power</h2>
<form enctype="multipart/form-data" action="" method="post"> <form enctype="multipart/form-data" action="" method="post">
<table> <table>
{{ powerform.as_table }} {{ powerform.as_table }}
@@ -34,6 +34,31 @@
</form> </form>
</div> </div>
</p> </p>
{% if grants %}
<p>
<h2>Applications</h2>
<table width="100%">
<thead>
<tr>
<th>Application</th>
<th>Scope</th>
<th>Revoke</th>
</tr>
</thead>
<tbody>
{% for grant in grants %}
<tr>
<td>{{ grant.application }}</td>
<td>{{ grant.scope }}</td>
<td>
<a class="button red small" href="/rowers/me/revokeapp/{{ grant.application.id }}">Revoke</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</p>
{% endif %}
</div> </div>
+33 -2
View File
@@ -2,7 +2,7 @@ from django.conf import settings
from django.conf.urls import url, include from django.conf.urls import url, include
from django.contrib.auth.models import User 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 import routers, serializers, viewsets,permissions
from rest_framework.urlpatterns import format_suffix_patterns from rest_framework.urlpatterns import format_suffix_patterns
@@ -19,8 +19,18 @@ from rowers.serializers import (
WorkoutSerializer, WorkoutSerializer,
RowerSerializer, RowerSerializer,
StrokeDataSerializer, StrokeDataSerializer,
FavoriteChartSerializer,
) )
from oauth2_provider.views import (
AuthorizedTokensListView,
AuthorizedTokenDeleteView,
)
from oauth2_provider.views.base import (
RevokeTokenView
)
class WorkoutViewSet(viewsets.ModelViewSet): class WorkoutViewSet(viewsets.ModelViewSet):
model = Workout model = Workout
#queryset = Workout.objects.all().order_by("-date", "-starttime") #queryset = Workout.objects.all().order_by("-date", "-starttime")
@@ -36,12 +46,32 @@ class WorkoutViewSet(viewsets.ModelViewSet):
IsOwnerOrNot, 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): class StrokeDataViewSet(viewsets.ModelViewSet):
serializer_class = StrokeDataSerializer serializer_class = StrokeDataSerializer
# Routers provide an easy way of automatically determining the URL conf. # Routers provide an easy way of automatically determining the URL conf.
router = routers.DefaultRouter() router = routers.DefaultRouter()
router.register(r'api/workouts',WorkoutViewSet, 'workout') 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' 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/edit/(.+.*)/$',views.rower_edit_view), url(r'^me/edit/(.+.*)/$',views.rower_edit_view),
url(r'^me/c2authorize/$',views.rower_c2_authorize), 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/stravaauthorize/$',views.rower_strava_authorize),
url(r'^me/sporttracksauthorize/$',views.rower_sporttracks_authorize), url(r'^me/sporttracksauthorize/$',views.rower_sporttracks_authorize),
url(r'^me/sporttracksrefresh/$',views.rower_sporttracks_token_refresh), url(r'^me/sporttracksrefresh/$',views.rower_sporttracks_token_refresh),
+26
View File
@@ -75,6 +75,8 @@ import stravalib
from stravalib.exc import ActivityUploadFailed,TimeoutExceeded from stravalib.exc import ActivityUploadFailed,TimeoutExceeded
from weather import get_wind_data from weather import get_wind_data
from oauth2_provider.models import Application,Grant,AccessToken
import django_rq import django_rq
queue = django_rq.get_queue('default') queue = django_rq.get_queue('default')
queuelow = django_rq.get_queue('low') queuelow = django_rq.get_queue('low')
@@ -4780,14 +4782,38 @@ def rower_edit_view(request,message=""):
r = Rower.objects.get(user=request.user) r = Rower.objects.get(user=request.user)
form = RowerForm(instance=r) form = RowerForm(instance=r)
powerform = RowerPowerForm(instance=r) powerform = RowerPowerForm(instance=r)
grants = AccessToken.objects.filter(user=request.user)
return render(request, 'rower_form.html', return render(request, 'rower_form.html',
{ {
'form':form, 'form':form,
'powerform':powerform, 'powerform':powerform,
'grants':grants,
}) })
except Rower.DoesNotExist: except Rower.DoesNotExist:
return HttpResponse("This user doesn't exist") 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): class JSONResponse(HttpResponse):
def __init__(self, data, **kwargs): def __init__(self, data, **kwargs):
content = JSONRenderer().render(data) content = JSONRenderer().render(data)