api.py 4.14 KB
Newer Older
Jamesie Pic's avatar
Jamesie Pic committed
1 2
from django.db import models

Jamesie Pic's avatar
Jamesie Pic committed
3 4
from rest_framework import (
    filters,
5 6
    pagination,
    renderers,
Jamesie Pic's avatar
Jamesie Pic committed
7 8 9
    viewsets,
)

10 11
from rql_filter.backend import RQLFilterBackend

Jamesie Pic's avatar
Jamesie Pic committed
12
from representatives.serializers import (
Nicolas Joyard's avatar
Nicolas Joyard committed
13
    ChamberSerializer,
Jamesie Pic's avatar
Jamesie Pic committed
14
    ConstituencySerializer,
Nicolas Joyard's avatar
Nicolas Joyard committed
15
    CountrySerializer,
Jamesie Pic's avatar
Jamesie Pic committed
16 17 18 19 20 21 22
    GroupSerializer,
    MandateSerializer,
    RepresentativeDetailSerializer,
    RepresentativeSerializer,
)

from .models import (
Jamesie Pic's avatar
Jamesie Pic committed
23
    Address,
Nicolas Joyard's avatar
Nicolas Joyard committed
24
    Chamber,
Jamesie Pic's avatar
Jamesie Pic committed
25
    Constituency,
Nicolas Joyard's avatar
Nicolas Joyard committed
26
    Country,
Jamesie Pic's avatar
Jamesie Pic committed
27 28
    Group,
    Mandate,
Jamesie Pic's avatar
Jamesie Pic committed
29
    Phone,
Jamesie Pic's avatar
Jamesie Pic committed
30 31 32 33
    Representative,
)


34 35 36 37 38 39 40 41 42 43 44 45 46 47
class DefaultWebPagination(pagination.PageNumberPagination):
    default_web_page_size = 10

    def get_page_size(self, request):
        web = isinstance(request.accepted_renderer,
                         renderers.BrowsableAPIRenderer)
        size = pagination.PageNumberPagination.get_page_size(self, request)

        if web and not size:
            return self.default_web_page_size

        return size


Jamesie Pic's avatar
Jamesie Pic committed
48 49 50 51 52
class RepresentativeViewSet(viewsets.ReadOnlyModelViewSet):
    """
    API endpoint that allows representatives to be viewed.
    """
    queryset = Representative.objects.all()
Jamesie Pic's avatar
PEP8  
Jamesie Pic committed
53 54 55
    filter_backends = (
        filters.DjangoFilterBackend,
        filters.SearchFilter,
56 57
        filters.OrderingFilter,
        RQLFilterBackend
Jamesie Pic's avatar
PEP8  
Jamesie Pic committed
58
    )
Jamesie Pic's avatar
Jamesie Pic committed
59 60 61 62 63
    filter_fields = {
        'active': ['exact'],
        'slug': ['exact', 'icontains'],
        'id': ['exact'],
        'first_name': ['exact', 'icontains'],
Jamesie Pic's avatar
PEP8  
Jamesie Pic committed
64
        'last_name': ['exact', 'icontains'],
Jamesie Pic's avatar
Jamesie Pic committed
65 66 67 68 69 70 71
        'full_name': ['exact', 'icontains'],
        'gender': ['exact'],
        'birth_place': ['exact'],
        'birth_date': ['exact', 'gte', 'lte'],
    }
    search_fields = ('first_name', 'last_name', 'slug')
    ordering_fields = ('id', 'birth_date', 'last_name', 'full_name')
72
    pagination_class = DefaultWebPagination
Jamesie Pic's avatar
Jamesie Pic committed
73

Jamesie Pic's avatar
Jamesie Pic committed
74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
    def get_queryset(self):
        qs = super(RepresentativeViewSet, self).get_queryset()
        qs = qs.prefetch_related(
            'email_set',
            'website_set',
            models.Prefetch(
                'address_set',
                queryset=Address.objects.select_related('country')
            ),
            models.Prefetch(
                'phone_set',
                queryset=Phone.objects.select_related('address__country')
            ),
            'mandates',
        )
        return qs

Jamesie Pic's avatar
Jamesie Pic committed
91 92 93 94 95 96 97 98 99 100 101 102 103
    def list(self, request):
        self.serializer_class = RepresentativeSerializer
        return super(RepresentativeViewSet, self).list(request)

    def retrieve(self, request, pk=None):
        self.serializer_class = RepresentativeDetailSerializer
        return super(RepresentativeViewSet, self).retrieve(request, pk)


class MandateViewSet(viewsets.ReadOnlyModelViewSet):
    """
    API endpoint that allows mandates to be viewed.
    """
104 105
    pagination_class = DefaultWebPagination
    queryset = Mandate.objects.select_related('representative')
Jamesie Pic's avatar
Jamesie Pic committed
106 107
    serializer_class = MandateSerializer

Jamesie Pic's avatar
PEP8  
Jamesie Pic committed
108 109 110
    filter_backends = (
        filters.DjangoFilterBackend,
        filters.SearchFilter,
111 112
        filters.OrderingFilter,
        RQLFilterBackend
Jamesie Pic's avatar
PEP8  
Jamesie Pic committed
113
    )
Jamesie Pic's avatar
Jamesie Pic committed
114 115 116 117 118 119
    filter_fields = {
        'id': ['exact'],
        'group__name': ['exact', 'icontains'],
        'group__abbreviation': ['exact'],
    }
    search_fields = ('group__name', 'group__abbreviation')
Jamesie Pic's avatar
Jamesie Pic committed
120

Jamesie Pic's avatar
Jamesie Pic committed
121 122

class ConstituencyViewSet(viewsets.ReadOnlyModelViewSet):
123
    pagination_class = DefaultWebPagination
Jamesie Pic's avatar
Jamesie Pic committed
124 125 126
    queryset = Constituency.objects.all()
    serializer_class = ConstituencySerializer

127 128 129 130
    filter_backends = (
        RQLFilterBackend,
    )

Jamesie Pic's avatar
Jamesie Pic committed
131 132

class GroupViewSet(viewsets.ReadOnlyModelViewSet):
133
    pagination_class = DefaultWebPagination
Jamesie Pic's avatar
Jamesie Pic committed
134 135
    queryset = Group.objects.all()
    serializer_class = GroupSerializer
Nicolas Joyard's avatar
Nicolas Joyard committed
136

137 138 139 140
    filter_backends = (
        RQLFilterBackend,
    )

Nicolas Joyard's avatar
Nicolas Joyard committed
141 142 143 144 145

class ChamberViewSet(viewsets.ReadOnlyModelViewSet):
    pagination_class = DefaultWebPagination
    queryset = Chamber.objects.all()
    serializer_class = ChamberSerializer
Nicolas Joyard's avatar
Nicolas Joyard committed
146

147 148 149 150
    filter_backends = (
        RQLFilterBackend,
    )

Nicolas Joyard's avatar
Nicolas Joyard committed
151 152 153 154 155

class CountryViewSet(viewsets.ReadOnlyModelViewSet):
    pagination_class = DefaultWebPagination
    queryset = Country.objects.all()
    serializer_class = CountrySerializer
156 157 158 159

    filter_backends = (
        RQLFilterBackend,
    )