Projet

Général

Profil

0001-manager-list-subscriptions-on-event-check-page-61069.patch

Lauréline Guérin, 10 février 2022 08:37

Télécharger (23 ko)

Voir les différences:

Subject: [PATCH] manager: list subscriptions on event check page (#61069)

 chrono/agendas/models.py                      |  20 ++
 chrono/manager/forms.py                       |  21 +-
 .../templates/chrono/manager_event_check.html |  14 +-
 chrono/manager/views.py                       |  79 +++++-
 tests/manager/test_event.py                   | 224 ++++++++++++++++--
 5 files changed, 314 insertions(+), 44 deletions(-)
chrono/agendas/models.py
2977 2977
    extra_data = JSONField(null=True)
2978 2978
    date_start = models.DateField()
2979 2979
    date_end = models.DateField()
2980

  
2981
    @property
2982
    def user_name(self):
2983
        return ('%s %s' % (self.user_first_name, self.user_last_name)).strip()
2984

  
2985
    @property
2986
    def label(self):
2987
        return _('Subscription')
2988

  
2989
    def get_user_block(self):
2990
        template_vars = Context(settings.TEMPLATE_VARS)
2991
        template_vars.update(
2992
            {
2993
                'booking': self,
2994
            }
2995
        )
2996
        try:
2997
            return Template(self.agenda.get_booking_user_block_template()).render(template_vars)
2998
        except (VariableDoesNotExist, TemplateSyntaxError):
2999
            return
chrono/manager/forms.py
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 16

  
17 17

  
18
import collections
19 18
import csv
20 19
import datetime
21 20

  
......
43 42
    Event,
44 43
    MeetingType,
45 44
    Resource,
45
    Subscription,
46 46
    TimePeriod,
47 47
    TimePeriodException,
48 48
    TimePeriodExceptionSource,
......
324 324

  
325 325
    def __init__(self, *args, **kwargs):
326 326
        self.agenda = kwargs.pop('agenda')
327
        filters = kwargs.pop('filters')
327 328
        super().__init__(*args, **kwargs)
328 329

  
329
        # build filters from DB
330
        agenda_filters = self.agenda.get_booking_check_filters()
331
        filters = collections.defaultdict(set)
332
        for extra_data in self.queryset.filter(extra_data__has_any_keys=agenda_filters).values_list(
333
            'extra_data', flat=True
334
        ):
335
            for k, v in extra_data.items():
336
                if k in agenda_filters:
337
                    filters[k].add(v)
338
        filters = sorted(filters.items())
339
        filters = {k: sorted(list(v)) for k, v in filters}
340

  
341 330
        # add filters to filterset
342 331
        for key, values in filters.items():
343 332
            self.filters[key] = django_filters.ChoiceFilter(
......
350 339
            )
351 340

  
352 341

  
342
class SubscriptionCheckFilterSet(BookingCheckFilterSet):
343
    class Meta:
344
        model = Subscription
345
        fields = []
346

  
347

  
353 348
class BookingAbsenceReasonForm(forms.Form):
354 349
    reason = forms.ChoiceField(required=False)
355 350

  
chrono/manager/templates/chrono/manager_event_check.html
27 27
    </form>
28 28
    <table class="main check-bookings">
29 29
      <tbody>
30
      {% if booked and not event.checked %}
30
      {% if results and not event.checked %}
31 31
        <tr class="booking">
32 32
          <td class="booking-actions">
33 33
            <form method="post" action="{% url 'chrono-manager-event-checked' pk=agenda.pk event_pk=object.pk %}">
......
63 63
        </tr>
64 64
        {% endif %}
65 65
      {% endif %}
66
      {% for booking in booked %}
66
      {% for result in results %}
67 67
        <tr class="booking">
68
        {% include "chrono/manager_event_check_booking_fragment.html" %}
68
        {% if result.kind == 'booking' %}
69
          {% with result as booking %}{% include "chrono/manager_event_check_booking_fragment.html" %}{% endwith %}
70
        {% elif result.kind == 'subscription' %}
71
          <td class="booking-username main-list">{{ result.get_user_block }}</td>
72
          <td class="booking-status">({% trans "Not booked" %})</td>
73
          {% if not event.checked or not agenda.disable_check_update %}
74
          <td class="booking-actions"></td>
75
          {% endif %}
76
        {% endif %}
69 77
        </tr>
70 78
      {% endfor %}
71 79
      </tbody>
chrono/manager/views.py
14 14
# You should have received a copy of the GNU Affero General Public License
15 15
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 16

  
17
import collections
17 18
import copy
18 19
import csv
19 20
import datetime
......
21 22
import json
22 23
import math
23 24
import uuid
25
from operator import attrgetter
24 26

  
25 27
import requests
26 28
from django.contrib import messages
......
102 104
    NewEventForm,
103 105
    NewMeetingTypeForm,
104 106
    NewTimePeriodExceptionForm,
107
    SubscriptionCheckFilterSet,
105 108
    TimePeriodAddForm,
106 109
    TimePeriodExceptionForm,
107 110
    TimePeriodExceptionSourceReplaceForm,
......
2049 2052
        queryset = super().get_queryset()
2050 2053
        return queryset.filter(agenda=self.agenda, start_datetime__date__lte=now().date(), cancelled=False)
2051 2054

  
2055
    def get_filters(self, booked_queryset, subscription_queryset):
2056
        agenda_filters = self.agenda.get_booking_check_filters()
2057
        filters = collections.defaultdict(set)
2058
        extra_data_from_booked = booked_queryset.filter(extra_data__has_any_keys=agenda_filters).values_list(
2059
            'extra_data', flat=True
2060
        )
2061
        extra_data_from_subscriptions = subscription_queryset.filter(
2062
            extra_data__has_any_keys=agenda_filters
2063
        ).values_list('extra_data', flat=True)
2064
        for extra_data in list(extra_data_from_booked) + list(extra_data_from_subscriptions):
2065
            for k, v in extra_data.items():
2066
                if k in agenda_filters:
2067
                    filters[k].add(v)
2068
        filters = sorted(filters.items())
2069
        filters = {k: sorted(list(v)) for k, v in filters}
2070
        return filters
2071

  
2052 2072
    def get_context_data(self, **kwargs):
2053 2073
        context = super().get_context_data(**kwargs)
2054 2074

  
2055 2075
        event = self.object
2076

  
2077
        # booking base queryset
2056 2078
        booked_qs = event.booking_set.filter(
2057 2079
            cancellation_datetime__isnull=True, in_waiting_list=False, primary_booking__isnull=True
2058 2080
        )
......
2060 2082
            places_count=Value(1)
2061 2083
            + Count('secondary_booking_set', filter=Q(cancellation_datetime__isnull=True))
2062 2084
        )
2063
        filterset = BookingCheckFilterSet(self.request.GET, queryset=booked_qs, agenda=self.agenda)
2064
        context['filterset'] = filterset
2065 2085

  
2066
        # build booking list
2067
        context['booked'] = filterset.qs.order_by('user_last_name', 'user_first_name')
2068
        context['booked_without_status'] = any(e.user_was_present is None for e in context['booked'])
2069
        if context['booked_without_status']:
2070
            context['absence_form'] = BookingAbsenceReasonForm(agenda=self.agenda)
2071
        for booking in context['booked']:
2072
            booking.form = BookingAbsenceReasonForm(
2073
                agenda=self.agenda, initial={'reason': booking.user_absence_reason}
2074
            )
2086
        # waiting list queryset
2075 2087
        waiting_qs = event.booking_set.filter(
2076 2088
            cancellation_datetime__isnull=True, in_waiting_list=True, primary_booking__isnull=True
2077 2089
        ).order_by('user_last_name', 'user_first_name')
......
2079 2091
            places_count=Value(1)
2080 2092
            + Count('secondary_booking_set', filter=Q(cancellation_datetime__isnull=True))
2081 2093
        )
2094

  
2095
        # subscription base queryset
2096
        subscription_qs = (
2097
            self.agenda.subscriptions.filter(
2098
                date_start__lte=event.start_datetime, date_end__gte=event.start_datetime
2099
            )
2100
            # exclude user_external_id from booked_qs and waiting_qs
2101
            .exclude(user_external_id__in=booked_qs.values('user_external_id')).exclude(
2102
                user_external_id__in=waiting_qs.values('user_external_id')
2103
            )
2104
        )
2105

  
2106
        # build filters from booked_qs and subscription_qs
2107
        filters = self.get_filters(booked_queryset=booked_qs, subscription_queryset=subscription_qs)
2108
        # and filter booked and subscriptions
2109
        booked_filterset = BookingCheckFilterSet(
2110
            self.request.GET, queryset=booked_qs, agenda=self.agenda, filters=filters
2111
        )
2112
        subscription_filterset = SubscriptionCheckFilterSet(
2113
            self.request.GET, queryset=subscription_qs, agenda=self.agenda, filters=filters
2114
        )
2115

  
2116
        # build results from mixed booked and subscriptions
2117
        results = []
2118
        booked_without_status = False
2119
        for booking in booked_filterset.qs:
2120
            if booking.user_was_present is None:
2121
                booked_without_status = True
2122
            booking.form = BookingAbsenceReasonForm(
2123
                agenda=self.agenda, initial={'reason': booking.user_absence_reason}
2124
            )
2125
            booking.kind = 'booking'
2126
            results.append(booking)
2127
        for subscription in subscription_filterset.qs:
2128
            subscription.kind = 'subscription'
2129
            results.append(subscription)
2130
        # sort results
2131
        results = sorted(results, key=attrgetter('user_last_name', 'user_first_name'))
2132

  
2133
        # set context
2134
        context['booked_without_status'] = booked_without_status
2135
        if context['booked_without_status']:
2136
            context['absence_form'] = BookingAbsenceReasonForm(agenda=self.agenda)
2137
        context['filterset'] = booked_filterset
2138
        context['results'] = results
2082 2139
        context['waiting'] = waiting_qs
2083 2140

  
2084 2141
        return context
tests/manager/test_event.py
10 10
from django.utils.timezone import localtime, make_aware, now
11 11
from webtest import Upload
12 12

  
13
from chrono.agendas.models import AbsenceReason, AbsenceReasonGroup, Agenda, Booking, Desk, Event
13
from chrono.agendas.models import (
14
    AbsenceReason,
15
    AbsenceReasonGroup,
16
    Agenda,
17
    Booking,
18
    Desk,
19
    Event,
20
    Subscription,
21
)
14 22
from tests.utils import login
15 23

  
16 24
pytestmark = pytest.mark.django_db
......
1244 1252
        waiting_list_places=5,
1245 1253
        agenda=agenda,
1246 1254
    )
1247
    booking1 = Booking.objects.create(event=event, user_first_name='User', user_last_name='42')
1248
    Booking.objects.create(event=event, user_first_name='User', user_last_name='01')
1249
    Booking.objects.create(event=event, user_first_name='User', user_last_name='17')
1250
    Booking.objects.create(event=event, user_first_name='User', user_last_name='35')
1251
    Booking.objects.create(event=event, user_first_name='User', user_last_name='05')
1252
    booking6 = Booking.objects.create(event=event, user_first_name='User', user_last_name='Cancelled')
1255
    booking1 = Booking.objects.create(
1256
        event=event, user_external_id='user:1', user_first_name='User', user_last_name='42'
1257
    )
1258
    Booking.objects.create(
1259
        event=event, user_external_id='user:2', user_first_name='User', user_last_name='01'
1260
    )
1261
    Booking.objects.create(
1262
        event=event, user_external_id='user:3', user_first_name='User', user_last_name='17'
1263
    )
1264
    Booking.objects.create(
1265
        event=event, user_external_id='user:4', user_first_name='User', user_last_name='35'
1266
    )
1267
    Booking.objects.create(
1268
        event=event, user_external_id='user:5', user_first_name='User', user_last_name='05'
1269
    )
1270
    booking6 = Booking.objects.create(
1271
        event=event, user_external_id='user:6', user_first_name='User', user_last_name='Cancelled'
1272
    )
1253 1273
    booking6.cancel()
1254 1274
    booking7 = Booking.objects.create(
1255
        event=event, user_first_name='User', user_last_name='Waiting', in_waiting_list=True
1275
        event=event,
1276
        user_external_id='user:7',
1277
        user_first_name='User',
1278
        user_last_name='Waiting',
1279
        in_waiting_list=True,
1256 1280
    )
1257 1281
    booking8 = Booking.objects.create(
1258
        event=event, user_first_name='User', user_last_name='Secondary', primary_booking=booking1
1282
        event=event,
1283
        user_external_id='user:1',
1284
        user_first_name='User',
1285
        user_last_name='Secondary',
1286
        primary_booking=booking1,
1287
    )
1288
    Subscription.objects.create(
1289
        agenda=agenda,
1290
        user_external_id='user:1',
1291
        user_first_name='Subscription',
1292
        user_last_name='42',
1293
        date_start=now(),
1294
        date_end=now(),
1295
    )
1296
    Subscription.objects.create(
1297
        agenda=agenda,
1298
        user_external_id='user:8',
1299
        user_first_name='Subscription',
1300
        user_last_name='43',
1301
        date_start=now(),
1302
        date_end=now(),
1303
    )
1304
    Subscription.objects.create(
1305
        agenda=agenda,
1306
        user_external_id='user:9',
1307
        user_first_name='Subscription',
1308
        user_last_name='14',
1309
        date_start=now(),
1310
        date_end=now(),
1311
    )
1312
    Subscription.objects.create(
1313
        agenda=agenda,
1314
        user_external_id='user:7',
1315
        user_first_name='Subscription',
1316
        user_last_name='Waiting',
1317
        date_start=now(),
1318
        date_end=now(),
1319
    )
1320
    Subscription.objects.create(
1321
        agenda=agenda,
1322
        user_external_id='user:42',
1323
        user_first_name='Subscription',
1324
        user_last_name='Too soon',
1325
        date_start=now() - datetime.timedelta(days=1),
1326
        date_end=now() - datetime.timedelta(days=1),
1327
    )
1328
    Subscription.objects.create(
1329
        agenda=agenda,
1330
        user_external_id='user:42',
1331
        user_first_name='Subscription',
1332
        user_last_name='Too late',
1333
        date_start=now() + datetime.timedelta(days=1),
1334
        date_end=now() + datetime.timedelta(days=1),
1259 1335
    )
1336

  
1260 1337
    login(app)
1261 1338

  
1262 1339
    # event not in past
......
1275 1352
    app.get('/manage/agendas/%s/events/%s/check' % (agenda2.pk, event.pk), status=404)
1276 1353

  
1277 1354
    resp = resp.click('Check')
1278
    assert 'Bookings (6/10)' in resp
1279
    assert 'Waiting List (1/5)' in resp
1280 1355
    assert (
1281 1356
        resp.text.index('Bookings (6/10)')
1282 1357
        < resp.text.index('User 01')
1283 1358
        < resp.text.index('User 05')
1359
        < resp.text.index('Subscription 14')
1284 1360
        < resp.text.index('User 17')
1285 1361
        < resp.text.index('User 35')
1286 1362
        < resp.text.index('User 42')
1363
        < resp.text.index('Subscription 43')
1287 1364
        < resp.text.index('Waiting List (1/5)')
1288 1365
        < resp.text.index('User Waiting')
1289
    )  # user ordering is not optimal ...
1366
    )
1290 1367
    assert 'User Cancelled' not in resp
1368
    assert 'Subscription Waiting' not in resp
1369
    assert 'Subscription 42' not in resp
1370
    assert 'Subscription too soon' not in resp
1371
    assert 'Subscription too late' not in resp
1291 1372

  
1292 1373
    agenda.booking_user_block_template = '{{ booking.user_name }} Foo Bar'
1293 1374
    agenda.save()
1294 1375
    resp = app.get('/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk))
1295 1376
    assert 'User 01 Foo Bar' in resp
1377
    assert 'Subscription 14 Foo Bar' in resp
1296 1378
    assert 'User Waiting Foo Bar' in resp
1297 1379

  
1298 1380
    # cancelled booking
......
1412 1494
        places=10,
1413 1495
        agenda=agenda,
1414 1496
    )
1415
    Booking.objects.create(event=event, user_first_name='User', user_last_name='none')
1416
    Booking.objects.create(event=event, user_first_name='User', user_last_name='empty', extra_data={})
1417 1497
    Booking.objects.create(
1418
        event=event, user_first_name='User', user_last_name='foo-val1 bar-none', extra_data={'foo': 'val1'}
1498
        event=event, user_external_id='user:none', user_first_name='User', user_last_name='none'
1499
    )
1500
    Booking.objects.create(
1501
        event=event,
1502
        user_external_id='user:empty',
1503
        user_first_name='User',
1504
        user_last_name='empty',
1505
        extra_data={},
1506
    )
1507
    Booking.objects.create(
1508
        event=event,
1509
        user_external_id='user:1',
1510
        user_first_name='User',
1511
        user_last_name='foo-val1 bar-none',
1512
        extra_data={'foo': 'val1'},
1419 1513
    )
1420 1514
    Booking.objects.create(
1421 1515
        event=event,
1516
        user_external_id='user:2',
1422 1517
        user_first_name='User',
1423 1518
        user_last_name='foo-val2 bar-val1',
1424 1519
        extra_data={'foo': 'val2', 'bar': 'val1'},
1425 1520
    )
1426 1521
    Booking.objects.create(
1427 1522
        event=event,
1523
        user_external_id='user:3',
1428 1524
        user_first_name='User',
1429 1525
        user_last_name='foo-val1 bar-val2',
1430 1526
        extra_data={'foo': 'val1', 'bar': 'val2'},
1431 1527
    )
1432 1528
    Booking.objects.create(
1433
        event=event, user_first_name='User', user_last_name='foo-none bar-val2', extra_data={'bar': 'val2'}
1529
        event=event,
1530
        user_external_id='user:4',
1531
        user_first_name='User',
1532
        user_last_name='foo-none bar-val2',
1533
        extra_data={'bar': 'val2'},
1534
    )
1535

  
1536
    Subscription.objects.create(
1537
        agenda=agenda,
1538
        user_external_id='subscription:none',
1539
        user_first_name='Subscription',
1540
        user_last_name='none',
1541
        date_start=event.start_datetime,
1542
        date_end=event.start_datetime,
1543
    )
1544
    Subscription.objects.create(
1545
        agenda=agenda,
1546
        user_external_id='subscription:empty',
1547
        user_first_name='Subscription',
1548
        user_last_name='empty',
1549
        extra_data={},
1550
        date_start=event.start_datetime,
1551
        date_end=event.start_datetime,
1552
    )
1553
    Subscription.objects.create(
1554
        agenda=agenda,
1555
        user_external_id='subscription:1',
1556
        user_first_name='Subscription',
1557
        user_last_name='foo-val1 bar-none',
1558
        extra_data={'foo': 'val1'},
1559
        date_start=event.start_datetime,
1560
        date_end=event.start_datetime,
1561
    )
1562
    Subscription.objects.create(
1563
        agenda=agenda,
1564
        user_external_id='subscription:2',
1565
        user_first_name='Subscription',
1566
        user_last_name='foo-val2 bar-val1',
1567
        extra_data={'foo': 'val2', 'bar': 'val1'},
1568
        date_start=event.start_datetime,
1569
        date_end=event.start_datetime,
1570
    )
1571
    Subscription.objects.create(
1572
        agenda=agenda,
1573
        user_external_id='subscription:3',
1574
        user_first_name='Subscription',
1575
        user_last_name='foo-val1 bar-val2',
1576
        extra_data={'foo': 'val1', 'bar': 'val2'},
1577
        date_start=event.start_datetime,
1578
        date_end=event.start_datetime,
1579
    )
1580
    Subscription.objects.create(
1581
        agenda=agenda,
1582
        user_external_id='subscription:4',
1583
        user_first_name='Subscription',
1584
        user_last_name='foo-none bar-val2',
1585
        extra_data={'bar': 'val2'},
1586
        date_start=event.start_datetime,
1587
        date_end=event.start_datetime,
1434 1588
    )
1435 1589
    login(app)
1436 1590

  
1437 1591
    resp = app.get('/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk))
1438 1592
    assert 'User none' in resp
1439 1593
    assert 'User empty' in resp
1440
    assert 'User foo-val1' in resp
1594
    assert 'User foo-val1 bar-none' in resp
1441 1595
    assert 'User foo-val2 bar-val1' in resp
1442 1596
    assert 'User foo-val1 bar-val2' in resp
1443 1597
    assert 'User foo-none bar-val2' in resp
1598
    assert 'Subscription none' in resp
1599
    assert 'Subscription empty' in resp
1600
    assert 'Subscription foo-val1 bar-none' in resp
1601
    assert 'Subscription foo-val2 bar-val1' in resp
1602
    assert 'Subscription foo-val1 bar-val2' in resp
1603
    assert 'Subscription foo-none bar-val2' in resp
1444 1604

  
1445 1605
    resp = app.get(
1446 1606
        '/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk), params={'unknown': 'unknown'}
......
1451 1611
    assert 'User foo-val2 bar-val1' in resp
1452 1612
    assert 'User foo-val1 bar-val2' in resp
1453 1613
    assert 'User foo-none bar-val2' in resp
1614
    assert 'Subscription none' in resp
1615
    assert 'Subscription empty' in resp
1616
    assert 'Subscription foo-val1 bar-none' in resp
1617
    assert 'Subscription foo-val2 bar-val1' in resp
1618
    assert 'Subscription foo-val1 bar-val2' in resp
1619
    assert 'Subscription foo-none bar-val2' in resp
1454 1620

  
1455 1621
    resp = app.get('/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk), params={'foo': 'unknown'})
1456 1622
    assert 'User none' in resp
......
1459 1625
    assert 'User foo-val2 bar-val1' in resp
1460 1626
    assert 'User foo-val1 bar-val2' in resp
1461 1627
    assert 'User foo-none bar-val2' in resp
1628
    assert 'Subscription none' in resp
1629
    assert 'Subscription empty' in resp
1630
    assert 'Subscription foo-val1 bar-none' in resp
1631
    assert 'Subscription foo-val2 bar-val1' in resp
1632
    assert 'Subscription foo-val1 bar-val2' in resp
1633
    assert 'Subscription foo-none bar-val2' in resp
1462 1634

  
1463 1635
    resp = app.get('/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk), params={'foo': 'val1'})
1464 1636
    assert 'User none' not in resp
......
1467 1639
    assert 'User foo-val2 bar-val1' not in resp
1468 1640
    assert 'User foo-val1 bar-val2' in resp
1469 1641
    assert 'User foo-none bar-val2' not in resp
1642
    assert 'Subscription none' not in resp
1643
    assert 'Subscription empty' not in resp
1644
    assert 'Subscription foo-val1 bar-none' in resp
1645
    assert 'Subscription foo-val2 bar-val1' not in resp
1646
    assert 'Subscription foo-val1 bar-val2' in resp
1647
    assert 'Subscription foo-none bar-val2' not in resp
1470 1648

  
1471 1649
    resp = app.get(
1472 1650
        '/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk), params={'foo': 'val1', 'bar': 'val2'}
......
1477 1655
    assert 'User foo-val2 bar-val1' not in resp
1478 1656
    assert 'User foo-val1 bar-val2' in resp
1479 1657
    assert 'User foo-none bar-val2' not in resp
1658
    assert 'Subscription none' not in resp
1659
    assert 'Subscription empty' not in resp
1660
    assert 'Subscription foo-val1 bar-none' not in resp
1661
    assert 'Subscription foo-val2 bar-val1' not in resp
1662
    assert 'Subscription foo-val1 bar-val2' in resp
1663
    assert 'Subscription foo-none bar-val2' not in resp
1480 1664

  
1481 1665
    resp = app.get(
1482 1666
        '/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk), params={'foo': 'val2', 'bar': 'val2'}
......
1487 1671
    assert 'User foo-val2 bar-val1' not in resp
1488 1672
    assert 'User foo-val1 bar-val2' not in resp
1489 1673
    assert 'User foo-none bar-val2' not in resp
1674
    assert 'Subscription none' not in resp
1675
    assert 'Subscription empty' not in resp
1676
    assert 'Subscription foo-val1 bar-none' not in resp
1677
    assert 'Subscription foo-val2 bar-val1' not in resp
1678
    assert 'Subscription foo-val1 bar-val2' not in resp
1679
    assert 'Subscription foo-none bar-val2' not in resp
1490 1680

  
1491 1681

  
1492 1682
def test_event_check_booking(app, admin_user):
1493
-