api.py 4.62 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
35
)


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

Jamesie Pic's avatar
Jamesie Pic committed
75
76
77
    def get_queryset(self):
        qs = super(RepresentativeViewSet, self).get_queryset()
        qs = qs.prefetch_related(
78
79
80
81
82
83
84
85
            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
86
87
88
            models.Prefetch(
                'address_set',
                queryset=Address.objects.select_related('country')
89
                                        .order_by('id')
Jamesie Pic's avatar
Jamesie Pic committed
90
91
92
93
            ),
            models.Prefetch(
                'phone_set',
                queryset=Phone.objects.select_related('address__country')
94
                                      .order_by('id')
Jamesie Pic's avatar
Jamesie Pic committed
95
            ),
96
97
98
99
            models.Prefetch(
                'mandates',
                queryset=Mandate.objects.order_by('id')
            )
Jamesie Pic's avatar
Jamesie Pic committed
100
101
102
        )
        return qs

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

Jamesie Pic's avatar
PEP8    
Jamesie Pic committed
121
122
123
    filter_backends = (
        filters.DjangoFilterBackend,
        filters.SearchFilter,
124
125
        filters.OrderingFilter,
        RQLFilterBackend
Jamesie Pic's avatar
PEP8    
Jamesie Pic committed
126
    )
Jamesie Pic's avatar
Jamesie Pic committed
127
128
129
130
131
132
    filter_fields = {
        'id': ['exact'],
        'group__name': ['exact', 'icontains'],
        'group__abbreviation': ['exact'],
    }
    search_fields = ('group__name', 'group__abbreviation')
Jamesie Pic's avatar
Jamesie Pic committed
133

Jamesie Pic's avatar
Jamesie Pic committed
134
135

class ConstituencyViewSet(viewsets.ReadOnlyModelViewSet):
136
    pagination_class = DefaultWebPagination
137
    queryset = Constituency.objects.order_by('id')
Jamesie Pic's avatar
Jamesie Pic committed
138
139
    serializer_class = ConstituencySerializer

140
141
142
143
    filter_backends = (
        RQLFilterBackend,
    )

Jamesie Pic's avatar
Jamesie Pic committed
144
145

class GroupViewSet(viewsets.ReadOnlyModelViewSet):
146
    pagination_class = DefaultWebPagination
147
    queryset = Group.objects.order_by('id')
Jamesie Pic's avatar
Jamesie Pic committed
148
    serializer_class = GroupSerializer
Nicolas Joyard's avatar
Nicolas Joyard committed
149

150
151
152
153
    filter_backends = (
        RQLFilterBackend,
    )

Nicolas Joyard's avatar
Nicolas Joyard committed
154
155
156

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

160
161
162
163
    filter_backends = (
        RQLFilterBackend,
    )

Nicolas Joyard's avatar
Nicolas Joyard committed
164
165
166

class CountryViewSet(viewsets.ReadOnlyModelViewSet):
    pagination_class = DefaultWebPagination
167
    queryset = Country.objects.order_by('id')
Nicolas Joyard's avatar
Nicolas Joyard committed
168
    serializer_class = CountrySerializer
169
170
171
172

    filter_backends = (
        RQLFilterBackend,
    )