api.py 4.19 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
class RepresentativeViewSet(viewsets.ReadOnlyModelViewSet):
    """
    API endpoint that allows representatives to be viewed.
    """
52
    queryset = Representative.objects.order_by('slug')
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
        'full_name': ['exact', 'icontains'],
        'gender': ['exact'],
        'birth_place': ['exact'],
        'birth_date': ['exact', 'gte', 'lte'],
    }
    search_fields = ('first_name', 'last_name', 'slug')
71
    pagination_class = DefaultWebPagination
Jamesie Pic's avatar
Jamesie Pic committed
72

Jamesie Pic's avatar
Jamesie Pic committed
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
    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
90
91
92
93
94
95
96
97
98
99
100
101
102
    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.
    """
103
    pagination_class = DefaultWebPagination
104
105
    queryset = Mandate.objects.select_related('representative') \
                              .order_by('representative_id', 'id')
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
124
    queryset = Constituency.objects.order_by('id')
Jamesie Pic's avatar
Jamesie Pic committed
125
126
    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
134
    queryset = Group.objects.order_by('id')
Jamesie Pic's avatar
Jamesie Pic committed
135
    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

class ChamberViewSet(viewsets.ReadOnlyModelViewSet):
    pagination_class = DefaultWebPagination
144
    queryset = Chamber.objects.order_by('id')
Nicolas Joyard's avatar
Nicolas Joyard committed
145
    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

class CountryViewSet(viewsets.ReadOnlyModelViewSet):
    pagination_class = DefaultWebPagination
154
    queryset = Country.objects.order_by('id')
Nicolas Joyard's avatar
Nicolas Joyard committed
155
    serializer_class = CountrySerializer
156
157
158
159

    filter_backends = (
        RQLFilterBackend,
    )