Projet

Général

Profil

0004-api-list-subscriptions-endpoint-61079.patch

Lauréline Guérin, 27 janvier 2022 09:56

Télécharger (9,15 ko)

Voir les différences:

Subject: [PATCH 4/4] api: list subscriptions endpoint (#61079)

 chrono/api/serializers.py      |   2 +
 chrono/api/views.py            |  38 +++++++++-
 tests/api/test_subscription.py | 129 +++++++++++++++++++++++++++++++++
 3 files changed, 166 insertions(+), 3 deletions(-)
chrono/api/serializers.py
335 335
    class Meta:
336 336
        model = Subscription
337 337
        fields = [
338
            'id',
338 339
            'user_external_id',
339 340
            'user_first_name',
340 341
            'user_last_name',
......
343 344
            'date_start',
344 345
            'date_end',
345 346
        ]
347
        read_only_fields = ['id']
346 348

  
347 349
    def validate(self, attrs):
348 350
        super().validate(attrs)
chrono/api/views.py
1880 1880
agendas_events_fillslots = MultipleAgendasEventsFillslots.as_view()
1881 1881

  
1882 1882

  
1883
class SubscriptionAPI(APIView):
1883
class SubscriptionFilter(filters.FilterSet):
1884
    date_start = filters.DateFilter(lookup_expr='gte')
1885
    date_end = filters.DateFilter(lookup_expr='lte')
1886

  
1887
    class Meta:
1888
        model = Subscription
1889
        fields = [
1890
            'user_external_id',
1891
            'date_start',
1892
            'date_end',
1893
        ]
1894

  
1895

  
1896
class SubscriptionAPI(ListAPIView):
1897
    filter_backends = (filters.DjangoFilterBackend,)
1884 1898
    serializer_class = serializers.SubscriptionSerializer
1899
    filterset_class = SubscriptionFilter
1885 1900
    permission_classes = (permissions.IsAuthenticated,)
1886 1901

  
1902
    def get_agenda(self, agenda_identifier):
1903
        return get_object_or_404(Agenda, slug=agenda_identifier, kind='events')
1904

  
1905
    def get(self, request, agenda_identifier):
1906
        self.agenda = self.get_agenda(agenda_identifier)
1907

  
1908
        try:
1909
            subscriptions = self.filter_queryset(self.get_queryset())
1910
        except ValidationError as e:
1911
            raise APIErrorBadRequest(N_('invalid payload'), errors=e.detail)
1912

  
1913
        serializer = self.serializer_class(subscriptions, many=True)
1914
        return Response({'err': 0, 'data': serializer.data})
1915

  
1916
    def get_queryset(self):
1917
        return self.agenda.subscriptions.order_by('date_start', 'date_end', 'user_external_id', 'pk')
1918

  
1887 1919
    def post(self, request, agenda_identifier):
1888
        agenda = get_object_or_404(Agenda, slug=agenda_identifier, kind='events')
1920
        self.agenda = self.get_agenda(agenda_identifier)
1889 1921

  
1890 1922
        serializer = self.serializer_class(data=request.data)
1891 1923
        if not serializer.is_valid():
......
1893 1925
        extra_data = {k: v for k, v in request.data.items() if k not in serializer.validated_data}
1894 1926

  
1895 1927
        subscription = Subscription.objects.create(
1896
            agenda=agenda, extra_data=extra_data, **serializer.validated_data
1928
            agenda=self.agenda, extra_data=extra_data, **serializer.validated_data
1897 1929
        )
1898 1930
        return Response({'err': 0, 'id': subscription.pk})
1899 1931

  
tests/api/test_subscription.py
7 7
pytestmark = pytest.mark.django_db
8 8

  
9 9

  
10
def test_api_list_subscription(app, user):
11
    agenda = Agenda.objects.create(label='Foo bar', kind='events')
12
    subscription = Subscription.objects.create(
13
        agenda=agenda,
14
        user_external_id='xxx',
15
        user_first_name='Foo',
16
        user_last_name='BAR',
17
        user_email='foo@bar.com',
18
        user_phone_number='06',
19
        extra_data={'foo': 'bar'},
20
        date_start=datetime.date(year=2021, month=9, day=1),
21
        date_end=datetime.date(year=2021, month=10, day=1),
22
    )
23

  
24
    resp = app.get('/api/agenda/%s/subscription/' % agenda.slug, status=401)
25

  
26
    app.authorization = ('Basic', ('john.doe', 'password'))
27

  
28
    resp = app.get('/api/agenda/%s/subscription/' % agenda.slug)
29
    assert len(resp.json['data']) == 1
30
    assert resp.json['data'][0] == {
31
        'id': subscription.pk,
32
        'user_external_id': 'xxx',
33
        'user_first_name': 'Foo',
34
        'user_last_name': 'BAR',
35
        'user_email': 'foo@bar.com',
36
        'user_phone_number': '06',
37
        'date_start': '2021-09-01',
38
        'date_end': '2021-10-01',
39
    }
40

  
41

  
42
def test_api_list_subscription_filter_user_external_id(app, user):
43
    agenda = Agenda.objects.create(label='Foo bar', kind='events')
44
    subscription1 = Subscription.objects.create(
45
        agenda=agenda,
46
        user_external_id='xxx',
47
        user_first_name='Foo',
48
        user_last_name='BAR',
49
        user_email='foo@bar.com',
50
        user_phone_number='06',
51
        extra_data={'foo': 'bar'},
52
        date_start=datetime.date(year=2021, month=9, day=1),
53
        date_end=datetime.date(year=2021, month=10, day=1),
54
    )
55
    subscription2 = Subscription.objects.create(
56
        agenda=agenda,
57
        user_external_id='yyy',
58
        date_start=datetime.date(year=2021, month=9, day=1),
59
        date_end=datetime.date(year=2021, month=10, day=1),
60
    )
61
    other_agenda = Agenda.objects.create(label='Foo bar 2', kind='events')
62
    Subscription.objects.create(
63
        agenda=other_agenda,
64
        user_external_id='xxx',
65
        date_start=datetime.date(year=2000, month=1, day=1),
66
        date_end=datetime.date(year=2099, month=12, day=31),
67
    )
68

  
69
    app.authorization = ('Basic', ('john.doe', 'password'))
70

  
71
    resp = app.get('/api/agenda/%s/subscription/' % agenda.slug, params={'user_external_id': 'xxx'})
72
    assert [d['id'] for d in resp.json['data']] == [subscription1.pk]
73
    resp = app.get('/api/agenda/%s/subscription/' % agenda.slug, params={'user_external_id': 'yyy'})
74
    assert [d['id'] for d in resp.json['data']] == [subscription2.pk]
75
    resp = app.get('/api/agenda/%s/subscription/' % agenda.slug, params={'user_external_id': 'zzz'})
76
    assert [d['id'] for d in resp.json['data']] == []
77

  
78

  
79
def test_api_list_subscription_filter_date_start(app, user):
80
    agenda = Agenda.objects.create(label='Foo bar', kind='events')
81
    subscription1 = Subscription.objects.create(
82
        agenda=agenda,
83
        user_external_id='xxx',
84
        user_first_name='Foo',
85
        user_last_name='BAR',
86
        user_email='foo@bar.com',
87
        user_phone_number='06',
88
        extra_data={'foo': 'bar'},
89
        date_start=datetime.date(year=2021, month=9, day=1),
90
        date_end=datetime.date(year=2021, month=10, day=1),
91
    )
92
    subscription2 = Subscription.objects.create(
93
        agenda=agenda,
94
        user_external_id='xxx',
95
        date_start=datetime.date(year=2022, month=9, day=1),
96
        date_end=datetime.date(year=2022, month=10, day=1),
97
    )
98

  
99
    app.authorization = ('Basic', ('john.doe', 'password'))
100

  
101
    resp = app.get('/api/agenda/%s/subscription/' % agenda.slug, params={'date_start': '2021-08-31'})
102
    assert [d['id'] for d in resp.json['data']] == [subscription1.pk, subscription2.pk]
103
    resp = app.get('/api/agenda/%s/subscription/' % agenda.slug, params={'date_start': '2021-09-02'})
104
    assert [d['id'] for d in resp.json['data']] == [subscription2.pk]
105
    resp = app.get('/api/agenda/%s/subscription/' % agenda.slug, params={'date_start': '2022-09-02'})
106
    assert [d['id'] for d in resp.json['data']] == []
107

  
108

  
109
def test_api_list_subscription_filter_date_end(app, user):
110
    agenda = Agenda.objects.create(label='Foo bar', kind='events')
111
    subscription1 = Subscription.objects.create(
112
        agenda=agenda,
113
        user_external_id='xxx',
114
        user_first_name='Foo',
115
        user_last_name='BAR',
116
        user_email='foo@bar.com',
117
        user_phone_number='06',
118
        extra_data={'foo': 'bar'},
119
        date_start=datetime.date(year=2021, month=9, day=1),
120
        date_end=datetime.date(year=2021, month=10, day=1),
121
    )
122
    subscription2 = Subscription.objects.create(
123
        agenda=agenda,
124
        user_external_id='xxx',
125
        date_start=datetime.date(year=2022, month=9, day=1),
126
        date_end=datetime.date(year=2022, month=10, day=1),
127
    )
128

  
129
    app.authorization = ('Basic', ('john.doe', 'password'))
130

  
131
    resp = app.get('/api/agenda/%s/subscription/' % agenda.slug, params={'date_end': '2022-10-02'})
132
    assert [d['id'] for d in resp.json['data']] == [subscription1.pk, subscription2.pk]
133
    resp = app.get('/api/agenda/%s/subscription/' % agenda.slug, params={'date_end': '2021-10-02'})
134
    assert [d['id'] for d in resp.json['data']] == [subscription1.pk]
135
    resp = app.get('/api/agenda/%s/subscription/' % agenda.slug, params={'date_end': '2021-09-30'})
136
    assert [d['id'] for d in resp.json['data']] == []
137

  
138

  
10 139
def test_api_create_subscription(app, user):
11 140
    agenda = Agenda.objects.create(label='Foo bar', kind='events')
12 141

  
13
-