api.py 3.61 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
    viewsets,
)

from representatives.serializers import (
Nicolas Joyard's avatar
Nicolas Joyard committed
11
    ChamberSerializer,
Jamesie Pic's avatar
Jamesie Pic committed
12
13
14
15
16
17
18
19
    ConstituencySerializer,
    GroupSerializer,
    MandateSerializer,
    RepresentativeDetailSerializer,
    RepresentativeSerializer,
)

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


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

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

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

Jamesie Pic's avatar
Jamesie Pic committed
115
116

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


class GroupViewSet(viewsets.ReadOnlyModelViewSet):
123
    pagination_class = DefaultWebPagination
Jamesie Pic's avatar
Jamesie Pic committed
124
125
    queryset = Group.objects.all()
    serializer_class = GroupSerializer
Nicolas Joyard's avatar
Nicolas Joyard committed
126
127
128
129
130
131


class ChamberViewSet(viewsets.ReadOnlyModelViewSet):
    pagination_class = DefaultWebPagination
    queryset = Chamber.objects.all()
    serializer_class = ChamberSerializer