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,
    )