api.py 3.44 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
10
11
12
13
14
15
16
17
18
    viewsets,
)

from representatives.serializers import (
    ConstituencySerializer,
    GroupSerializer,
    MandateSerializer,
    RepresentativeDetailSerializer,
    RepresentativeSerializer,
)

from .models import (
Jamesie Pic's avatar
Jamesie Pic committed
19
    Address,
Jamesie Pic's avatar
Jamesie Pic committed
20
21
22
    Constituency,
    Group,
    Mandate,
Jamesie Pic's avatar
Jamesie Pic committed
23
    Phone,
Jamesie Pic's avatar
Jamesie Pic committed
24
25
26
27
    Representative,
)


28
29
30
31
32
33
34
35
36
37
38
39
40
41
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
42
43
44
45
46
class RepresentativeViewSet(viewsets.ReadOnlyModelViewSet):
    """
    API endpoint that allows representatives to be viewed.
    """
    queryset = Representative.objects.all()
Jamesie Pic's avatar
PEP8    
Jamesie Pic committed
47
48
49
50
51
    filter_backends = (
        filters.DjangoFilterBackend,
        filters.SearchFilter,
        filters.OrderingFilter
    )
Jamesie Pic's avatar
Jamesie Pic committed
52
53
54
55
56
57
    filter_fields = {
        'active': ['exact'],
        'slug': ['exact', 'icontains'],
        'id': ['exact'],
        'remote_id': ['exact'],
        'first_name': ['exact', 'icontains'],
Jamesie Pic's avatar
PEP8    
Jamesie Pic committed
58
        'last_name': ['exact', 'icontains'],
Jamesie Pic's avatar
Jamesie Pic committed
59
60
61
62
63
64
65
        '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')
66
    pagination_class = DefaultWebPagination
Jamesie Pic's avatar
Jamesie Pic committed
67

Jamesie Pic's avatar
Jamesie Pic committed
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
    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
85
86
87
88
89
90
91
92
93
94
95
96
97
    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.
    """
98
99
    pagination_class = DefaultWebPagination
    queryset = Mandate.objects.select_related('representative')
Jamesie Pic's avatar
Jamesie Pic committed
100
101
    serializer_class = MandateSerializer

Jamesie Pic's avatar
PEP8    
Jamesie Pic committed
102
103
104
105
106
    filter_backends = (
        filters.DjangoFilterBackend,
        filters.SearchFilter,
        filters.OrderingFilter
    )
Jamesie Pic's avatar
Jamesie Pic committed
107
108
109
110
111
112
    filter_fields = {
        'id': ['exact'],
        'group__name': ['exact', 'icontains'],
        'group__abbreviation': ['exact'],
    }
    search_fields = ('group__name', 'group__abbreviation')
Jamesie Pic's avatar
Jamesie Pic committed
113

Jamesie Pic's avatar
Jamesie Pic committed
114
115

class ConstituencyViewSet(viewsets.ReadOnlyModelViewSet):
116
    pagination_class = DefaultWebPagination
Jamesie Pic's avatar
Jamesie Pic committed
117
118
119
120
121
    queryset = Constituency.objects.all()
    serializer_class = ConstituencySerializer


class GroupViewSet(viewsets.ReadOnlyModelViewSet):
122
    pagination_class = DefaultWebPagination
Jamesie Pic's avatar
Jamesie Pic committed
123
124
    queryset = Group.objects.all()
    serializer_class = GroupSerializer