From 394fbec7d702b451eced3ab94509c08bd9934b75 Mon Sep 17 00:00:00 2001 From: Nicolas Joyard <joyard.nicolas@gmail.com> Date: Sat, 14 May 2016 21:45:54 +0200 Subject: [PATCH] Add scores, scoredvotes, recommendations to api --- memopol/api.py | 10 +++ representatives_recommendations/api.py | 87 +++++++++++++++++++ .../serializers.py | 37 ++++++++ 3 files changed, 134 insertions(+) create mode 100644 representatives_recommendations/api.py create mode 100644 representatives_recommendations/serializers.py diff --git a/memopol/api.py b/memopol/api.py index f5c44470..6a1fd863 100644 --- a/memopol/api.py +++ b/memopol/api.py @@ -13,6 +13,13 @@ from representatives_votes.api import ( VoteViewSet, ) +from representatives_recommendations.api import ( + RecommendationViewSet, + RepresentativeScoreViewSet, + ScoredVoteViewSet +) + + router = routers.DefaultRouter() router.register(r'constituencies', ConstituencyViewSet) @@ -20,5 +27,8 @@ router.register(r'dossiers', DossierViewSet) router.register(r'groups', GroupViewSet) router.register(r'mandates', MandateViewSet) router.register(r'proposals', ProposalViewSet) +router.register(r'recommendations', RecommendationViewSet) router.register(r'representatives', RepresentativeViewSet) +router.register(r'scores', RepresentativeScoreViewSet) +router.register(r'scored_votes', ScoredVoteViewSet) router.register(r'votes', VoteViewSet) diff --git a/representatives_recommendations/api.py b/representatives_recommendations/api.py new file mode 100644 index 00000000..3ca026b7 --- /dev/null +++ b/representatives_recommendations/api.py @@ -0,0 +1,87 @@ +from rest_framework import ( + filters, + viewsets, +) + +from representatives.api import DefaultWebPagination + +from .models import ( + Recommendation, + RepresentativeScore, + ScoredVote +) + +from .serializers import ( + RecommendationSerializer, + RepresentativeScoreSerializer, + ScoredVoteSerializer +) + + +class RecommendationViewSet(viewsets.ReadOnlyModelViewSet): + """ + API endpoint that allows recommendations to be viewed. + """ + queryset = Recommendation.objects.select_related('proposal') + filter_backends = ( + filters.DjangoFilterBackend, + filters.SearchFilter, + filters.OrderingFilter + ) + filter_fields = { + 'id': ['exact'], + 'recommendation': ['exact'], + 'title': ['exact', 'icontains'], + 'description': ['exact', 'icontains'], + 'weight': ['exact', 'gte', 'lte'] + } + search_fields = ('title', 'description') + ordering_fields = ('id', 'weight', 'title') + pagination_class = DefaultWebPagination + serializer_class = RecommendationSerializer + + +class RepresentativeScoreViewSet(viewsets.ReadOnlyModelViewSet): + """ + API endpoint to view representative scores + """ + queryset = RepresentativeScore.objects.select_related('representative') + filter_backends = ( + filters.DjangoFilterBackend, + filters.SearchFilter, + filters.OrderingFilter + ) + filter_fields = { + 'representative': ['exact'], + 'score': ['exact', 'gte', 'lte'] + } + search_fields = ('representative', 'score') + ordering_fields = ('representative', 'score') + pagination_class = DefaultWebPagination + serializer_class = RepresentativeScoreSerializer + + +class ScoredVoteViewSet(viewsets.ReadOnlyModelViewSet): + """ + API endpoint to view votes with their score impact. + This endpoint only shows votes that have a matching recommendation. + """ + queryset = ScoredVote.objects.select_related( + 'representative', + 'proposal', + 'proposal__recommendation' + ).filter( + proposal__recommendation__isnull=False + ) + + filter_backends = ( + filters.DjangoFilterBackend, + filters.SearchFilter, + filters.OrderingFilter + ) + + filter_fields = { + } + + pagination_class = DefaultWebPagination + serializer_class = ScoredVoteSerializer diff --git a/representatives_recommendations/serializers.py b/representatives_recommendations/serializers.py new file mode 100644 index 00000000..df42c26e --- /dev/null +++ b/representatives_recommendations/serializers.py @@ -0,0 +1,37 @@ +from rest_framework import serializers + +from .models import ( + Recommendation, + RepresentativeScore, + ScoredVote +) + + +class RecommendationSerializer(serializers.HyperlinkedModelSerializer): + + class Meta: + model = Recommendation + fields = ('recommendation', 'title', 'description', 'weight', + 'proposal') + + +class RepresentativeScoreSerializer(serializers.HyperlinkedModelSerializer): + + class Meta: + model = RepresentativeScore + fields = ('representative', 'score') + + +class ScoredVoteSerializer(serializers.HyperlinkedModelSerializer): + """ + Scored Vote serializer + """ + + class Meta: + model = ScoredVote + fields = ( + 'proposal', + 'representative', + 'position', + 'absolute_score' + ) -- GitLab