api.py 4.79 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,
27
    Email,
Jamesie Pic's avatar
Jamesie Pic committed
28 29
    Group,
    Mandate,
Jamesie Pic's avatar
Jamesie Pic committed
30
    Phone,
Jamesie Pic's avatar
Jamesie Pic committed
31
    Representative,
32
    WebSite,
Jamesie Pic's avatar
Jamesie Pic committed
33 34
)

okhin's avatar
okhin committed
35 36
from .filters import (ActiveMandateQueryFilterBackend,
    ActiveConstituencyFilterBackend)
Jamesie Pic's avatar
Jamesie Pic committed
37

okhin's avatar
okhin committed
38

39 40 41 42 43 44 45 46 47 48 49 50 51 52
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
53 54 55 56
class RepresentativeViewSet(viewsets.ReadOnlyModelViewSet):
    """
    API endpoint that allows representatives to be viewed.
    """
57
    queryset = Representative.objects.order_by('slug')
Jamesie Pic's avatar
PEP8  
Jamesie Pic committed
58 59 60
    filter_backends = (
        filters.DjangoFilterBackend,
        filters.SearchFilter,
61
        filters.OrderingFilter,
62
        RQLFilterBackend,
okhin's avatar
okhin committed
63 64
        ActiveMandateQueryFilterBackend,
        ActiveConstituencyFilterBackend
Jamesie Pic's avatar
PEP8  
Jamesie Pic committed
65
    )
Jamesie Pic's avatar
Jamesie Pic committed
66 67 68 69 70
    filter_fields = {
        'active': ['exact'],
        'slug': ['exact', 'icontains'],
        'id': ['exact'],
        'first_name': ['exact', 'icontains'],
Jamesie Pic's avatar
PEP8  
Jamesie Pic committed
71
        'last_name': ['exact', 'icontains'],
Jamesie Pic's avatar
Jamesie Pic committed
72 73 74 75 76 77
        'full_name': ['exact', 'icontains'],
        'gender': ['exact'],
        'birth_place': ['exact'],
        'birth_date': ['exact', 'gte', 'lte'],
    }
    search_fields = ('first_name', 'last_name', 'slug')
78
    pagination_class = DefaultWebPagination
Jamesie Pic's avatar
Jamesie Pic committed
79

Jamesie Pic's avatar
Jamesie Pic committed
80 81 82
    def get_queryset(self):
        qs = super(RepresentativeViewSet, self).get_queryset()
        qs = qs.prefetch_related(
83 84 85 86 87 88 89 90
            models.Prefetch(
                'email_set',
                queryset=Email.objects.order_by('id')
            ),
            models.Prefetch(
                'website_set',
                queryset=WebSite.objects.order_by('id')
            ),
Jamesie Pic's avatar
Jamesie Pic committed
91 92 93
            models.Prefetch(
                'address_set',
                queryset=Address.objects.select_related('country')
94
                                        .order_by('id')
Jamesie Pic's avatar
Jamesie Pic committed
95 96 97 98
            ),
            models.Prefetch(
                'phone_set',
                queryset=Phone.objects.select_related('address__country')
99
                                      .order_by('id')
Jamesie Pic's avatar
Jamesie Pic committed
100
            ),
101 102 103 104
            models.Prefetch(
                'mandates',
                queryset=Mandate.objects.order_by('id')
            )
Jamesie Pic's avatar
Jamesie Pic committed
105 106 107
        )
        return qs

Jamesie Pic's avatar
Jamesie Pic committed
108 109 110 111 112 113 114 115 116 117 118 119 120
    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.
    """
121
    pagination_class = DefaultWebPagination
122 123
    queryset = Mandate.objects.select_related('representative') \
                              .order_by('representative_id', 'id')
Jamesie Pic's avatar
Jamesie Pic committed
124 125
    serializer_class = MandateSerializer

Jamesie Pic's avatar
PEP8  
Jamesie Pic committed
126 127 128
    filter_backends = (
        filters.DjangoFilterBackend,
        filters.SearchFilter,
129 130
        filters.OrderingFilter,
        RQLFilterBackend
Jamesie Pic's avatar
PEP8  
Jamesie Pic committed
131
    )
Jamesie Pic's avatar
Jamesie Pic committed
132 133 134 135 136 137
    filter_fields = {
        'id': ['exact'],
        'group__name': ['exact', 'icontains'],
        'group__abbreviation': ['exact'],
    }
    search_fields = ('group__name', 'group__abbreviation')
Jamesie Pic's avatar
Jamesie Pic committed
138

Jamesie Pic's avatar
Jamesie Pic committed
139 140

class ConstituencyViewSet(viewsets.ReadOnlyModelViewSet):
141
    pagination_class = DefaultWebPagination
142
    queryset = Constituency.objects.order_by('id')
Jamesie Pic's avatar
Jamesie Pic committed
143 144
    serializer_class = ConstituencySerializer

145 146 147 148
    filter_backends = (
        RQLFilterBackend,
    )

Jamesie Pic's avatar
Jamesie Pic committed
149 150

class GroupViewSet(viewsets.ReadOnlyModelViewSet):
151
    pagination_class = DefaultWebPagination
152
    queryset = Group.objects.order_by('id')
Jamesie Pic's avatar
Jamesie Pic committed
153
    serializer_class = GroupSerializer
Nicolas Joyard's avatar
Nicolas Joyard committed
154

155 156 157 158
    filter_backends = (
        RQLFilterBackend,
    )

Nicolas Joyard's avatar
Nicolas Joyard committed
159 160 161

class ChamberViewSet(viewsets.ReadOnlyModelViewSet):
    pagination_class = DefaultWebPagination
162
    queryset = Chamber.objects.order_by('id')
Nicolas Joyard's avatar
Nicolas Joyard committed
163
    serializer_class = ChamberSerializer
Nicolas Joyard's avatar
Nicolas Joyard committed
164

165 166 167 168
    filter_backends = (
        RQLFilterBackend,
    )

Nicolas Joyard's avatar
Nicolas Joyard committed
169 170 171

class CountryViewSet(viewsets.ReadOnlyModelViewSet):
    pagination_class = DefaultWebPagination
172
    queryset = Country.objects.order_by('id')
Nicolas Joyard's avatar
Nicolas Joyard committed
173
    serializer_class = CountrySerializer
174 175 176 177

    filter_backends = (
        RQLFilterBackend,
    )