Merge branch 'feature/restapi2' into develop
This commit is contained in:
+15
-1
@@ -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:
|
||||||
|
|||||||
@@ -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
@@ -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),
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user