From 2666f3f78f202030e4348d72700672586e90514a Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 19 Jul 2020 09:58:10 +0200 Subject: [PATCH] adding GeoCourse to API --- rowers/models.py | 4 +-- rowers/permissions.py | 7 +++++ rowers/serializers.py | 66 ++++++++++++++++++++++++++++++++++++++++++- rowers/urls.py | 17 ++++++++++- 4 files changed, 90 insertions(+), 4 deletions(-) diff --git a/rowers/models.py b/rowers/models.py index 492269c4..75d44c25 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -1261,7 +1261,7 @@ class GeoCourseEditForm(ModelForm): @python_2_unicode_compatible class GeoPolygon(models.Model): name = models.CharField(max_length=150,blank=True) - course = models.ForeignKey(GeoCourse, blank=True,on_delete=models.CASCADE) + course = models.ForeignKey(GeoCourse, blank=True,on_delete=models.CASCADE,related_name='polygons') order_in_course = models.IntegerField(default=0) def __str__(self): @@ -1280,7 +1280,7 @@ class GeoPolygon(models.Model): class GeoPoint(models.Model): latitude = models.FloatField(default=0) longitude = models.FloatField(default=0) - polygon = models.ForeignKey(GeoPolygon,blank=True,on_delete=models.CASCADE) + polygon = models.ForeignKey(GeoPolygon,blank=True,on_delete=models.CASCADE,related_name='points') order_in_poly = models.IntegerField(default=0) # need error checking to "insert" new point into existing polygon? This affects order_in_poly diff --git a/rowers/permissions.py b/rowers/permissions.py index 0fa0db2d..8ea8540e 100644 --- a/rowers/permissions.py +++ b/rowers/permissions.py @@ -31,3 +31,10 @@ class IsCompetitorOrNot(permissions.BasePermission): def has_object_permission(self, request, view, obj): return (obj.userid == request.user.id) + +class IsManagerOrReadOnly(permissions.BasePermission): + def has_object_permission(self, request, view, obj): + if request.method in permissions.SAFE_METHODS: + return True + + return obj.manager == request.user.rower diff --git a/rowers/serializers.py b/rowers/serializers.py index a5c9a8d3..234804ac 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, ) import datetime @@ -245,3 +245,67 @@ class StrokeDataSerializer(serializers.Serializer): # do something return 1 + +class GeoPointSerializer(serializers.ModelSerializer): + class Meta: + model = GeoPoint + fields = ( + 'id', + 'latitude', + 'longitude', + 'order_in_poly', + ) + extra_kwargs = {'id': {'read_only': False, 'required': True}} + +class GeoPolygonSerializer(serializers.ModelSerializer): + points = GeoPointSerializer(many=True) + class Meta: + model = GeoPolygon + fields = ( + 'id', + 'name', + 'order_in_course', + 'points', + ) + extra_kwargs = {'id': {'read_only': False, 'required': True}} + +class GeoCourseSerializer(serializers.ModelSerializer): + polygons = GeoPolygonSerializer(many=True) + class Meta: + model = GeoCourse + fields = ( + 'id', + 'name', + 'distance', + 'country', + 'notes', + 'polygons', + ) + + def update(self, instance, validated_data): + instance.name = validated_data.get('name',instance.name) + instance.country = validated_data.get('country',instance.country) + instance.notes = validated_data.get('notes',instance.notes) + instance.save() + + polygons = validated_data.get('polygons') + for polygon in polygons: + polygon_id = polygon.get('id',None) + if polygon_id: + p = GeoPolygon.objects.get(id=polygon_id) + p.name = polygon.get('name',p.name) + p.order_in_course = polygon.get('order_in_course',p.order_in_course) + p.save() + + points = polygon.get('points') + + for point in points: + point_id = point.get('id',None) + if point_id: + pt = GeoPoint.objects.get(id=point_id) + pt.latitude = point.get('latitude',pt.latitude) + pt.longitude = point.get('longitude',pt.longitude) + pt.order_in_poly = point.get('order_in_poly',pt.order_in_poly) + pt.save() + + return instance diff --git a/rowers/urls.py b/rowers/urls.py index 030524f6..c815b68c 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -9,7 +9,7 @@ from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required, permission_required from rowers.models import ( Workout,Rower,FavoriteChart,VirtualRaceResult, - VirtualRace,StandardCollection,CourseStandard, + VirtualRace,StandardCollection,CourseStandard,GeoCourse, ) from rest_framework import routers, serializers, viewsets,permissions @@ -32,6 +32,9 @@ from rowers.serializers import ( CourseStandardSerializer, StandardCollectionSerializer, VirtualRaceSerializer, + GeoCourseSerializer, + GeoPolygonSerializer, + GeoPointSerializer, ) from oauth2_provider.views import ( @@ -152,6 +155,17 @@ class StandardCollectionViewSet(viewsets.ModelViewSet): http_method_names = ['get'] +class GeoCourseViewSet(viewsets.ModelViewSet): + model = GeoCourse, + serializer_class = GeoCourseSerializer + + def get_queryset(self): + try: + return GeoCourse.objects.all() + except TypeError: + return [] + http_method_names = ['get','patch'] + class StrokeDataViewSet(viewsets.ModelViewSet): serializer_class = StrokeDataSerializer @@ -164,6 +178,7 @@ 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') +router.register(r'api/geocourses',GeoCourseViewSet,'geocourses') def permissiondenied_view(request): raise PermissionDenied