api.py 3.39 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
66
        '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')

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

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

Jamesie Pic's avatar
Jamesie Pic committed
113
114

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


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