Projet

Général

Profil

0001-manager-display-cancelled-bookings-on-check-page-610.patch

Lauréline Guérin, 14 février 2022 16:15

Télécharger (10 ko)

Voir les différences:

Subject: [PATCH] manager: display cancelled bookings on check page (#61068)

 .../templates/chrono/manager_event_check.html | 15 +++-
 chrono/manager/views.py                       | 12 +--
 tests/manager/test_event.py                   | 75 ++++++++++++-------
 3 files changed, 69 insertions(+), 33 deletions(-)
chrono/manager/templates/chrono/manager_event_check.html
66 66
      {% for result in results %}
67 67
        <tr class="booking">
68 68
        {% if result.kind == 'booking' %}
69
          {% with result as booking %}{% include "chrono/manager_event_check_booking_fragment.html" %}{% endwith %}
69
          {% if result.cancellation_datetime is None %}
70
            {% with result as booking %}{% include "chrono/manager_event_check_booking_fragment.html" %}{% endwith %}
71
          {% else %}
72
              <td class="booking-username main-list">{{ result.get_user_block }}</td>
73
              <td class="booking-status">({% trans "Cancelled" %})</td>
74
              {% if not event.checked or not agenda.disable_check_update %}
75
              <td class="booking-actions"></td>
76
              {% endif %}
77
          {% endif %}
70 78
        {% elif result.kind == 'subscription' %}
71 79
          <td class="booking-username main-list">{{ result.get_user_block }}</td>
72 80
          <td class="booking-status">({% trans "Not booked" %})</td>
......
90 98
    <table class="main check-bookings">
91 99
      <tbody>
92 100
        {% for booking in waiting %}
93
        <tr><td class="booking-username waiting">{{ booking.get_user_block }}{% if booking.places_count > 1 %} ({{ booking.places_count }} {% trans "places" %}){% endif %}</td></tr>
101
        <tr>
102
          <td class="booking-username waiting">{{ booking.get_user_block }}{% if booking.places_count > 1 %} ({{ booking.places_count }} {% trans "places" %}){% endif %}</td>
103
          <td>{% if booking.cancellation_datetime %}({% trans "Cancelled" %}){% endif %}</td>
104
        </tr>
94 105
        {% endfor %}
95 106
      </tbody>
96 107
    </table>
chrono/manager/views.py
2075 2075
        event = self.object
2076 2076

  
2077 2077
        # booking base queryset
2078
        booking_qs_kwargs = {}
2079
        if not self.agenda.subscriptions.exists():
2080
            booking_qs_kwargs = {'cancellation_datetime__isnull': True}
2078 2081
        booked_qs = event.booking_set.filter(
2079
            cancellation_datetime__isnull=True, in_waiting_list=False, primary_booking__isnull=True
2082
            in_waiting_list=False, primary_booking__isnull=True, **booking_qs_kwargs
2080 2083
        )
2081 2084
        booked_qs = booked_qs.annotate(
2082
            places_count=Value(1)
2083
            + Count('secondary_booking_set', filter=Q(cancellation_datetime__isnull=True))
2085
            places_count=Value(1) + Count('secondary_booking_set', filter=Q(**booking_qs_kwargs))
2084 2086
        )
2085 2087

  
2086 2088
        # waiting list queryset
2087 2089
        waiting_qs = event.booking_set.filter(
2088
            cancellation_datetime__isnull=True, in_waiting_list=True, primary_booking__isnull=True
2090
            in_waiting_list=True, primary_booking__isnull=True, **booking_qs_kwargs
2089 2091
        ).order_by('user_last_name', 'user_first_name')
2090 2092
        waiting_qs = waiting_qs.annotate(
2091 2093
            places_count=Value(1)
......
2117 2119
        results = []
2118 2120
        booked_without_status = False
2119 2121
        for booking in booked_filterset.qs:
2120
            if booking.user_was_present is None:
2122
            if booking.cancellation_datetime is None and booking.user_was_present is None:
2121 2123
                booked_without_status = True
2122 2124
            booking.form = BookingAbsenceReasonForm(
2123 2125
                agenda=self.agenda, initial={'reason': booking.user_absence_reason}
tests/manager/test_event.py
1268 1268
        event=event, user_external_id='user:5', user_first_name='User', user_last_name='05'
1269 1269
    )
1270 1270
    booking6 = Booking.objects.create(
1271
        event=event, user_external_id='user:6', user_first_name='User', user_last_name='Cancelled'
1271
        event=event, user_external_id='user:6', user_first_name='User', user_last_name='12 Cancelled'
1272 1272
    )
1273 1273
    booking6.cancel()
1274 1274
    booking7 = Booking.objects.create(
......
1279 1279
        in_waiting_list=True,
1280 1280
    )
1281 1281
    booking8 = Booking.objects.create(
1282
        event=event,
1283
        user_external_id='user:8',
1284
        user_first_name='User',
1285
        user_last_name='Waiting and Cancelled',
1286
        in_waiting_list=True,
1287
    )
1288
    booking8.cancel()
1289
    booking9 = Booking.objects.create(
1282 1290
        event=event,
1283 1291
        user_external_id='user:1',
1284 1292
        user_first_name='User',
1285 1293
        user_last_name='Secondary',
1286 1294
        primary_booking=booking1,
1287 1295
    )
1296

  
1297
    login(app)
1298

  
1299
    # event not in past
1300
    resp = app.get('/manage/agendas/%s/events/%s/' % (agenda.pk, event.pk))
1301
    assert '/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk) not in resp
1302
    app.get('/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk), status=404)
1303

  
1304
    event.start_datetime = localtime(now()).replace(hour=22, minute=0)  # it's ok all the day
1305
    event.save()
1306
    resp = app.get('/manage/agendas/%s/events/%s/' % (agenda.pk, event.pk))
1307
    assert '/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk) in resp
1308

  
1309
    # unknown agenda
1310
    app.get('/manage/agendas/%s/events/%s/check' % (0, event.pk), status=404)
1311
    # wrong agenda
1312
    app.get('/manage/agendas/%s/events/%s/check' % (agenda2.pk, event.pk), status=404)
1313

  
1314
    resp = resp.click('Check')
1315
    assert (
1316
        resp.text.index('Bookings (6/10)')
1317
        < resp.text.index('User 01')
1318
        < resp.text.index('User 05')
1319
        < resp.text.index('User 17')
1320
        < resp.text.index('User 35')
1321
        < resp.text.index('User 42')
1322
        < resp.text.index('Waiting List (1/5)')
1323
        < resp.text.index('User Waiting')
1324
    )
1325
    assert 'User 12 Cancelled' not in resp
1326
    assert 'User Waiting and Cancelled' not in resp
1327

  
1288 1328
    Subscription.objects.create(
1289 1329
        agenda=agenda,
1290 1330
        user_external_id='user:1',
......
1295 1335
    )
1296 1336
    Subscription.objects.create(
1297 1337
        agenda=agenda,
1298
        user_external_id='user:8',
1338
        user_external_id='user:9',
1299 1339
        user_first_name='Subscription',
1300 1340
        user_last_name='43',
1301 1341
        date_start=now(),
......
1303 1343
    )
1304 1344
    Subscription.objects.create(
1305 1345
        agenda=agenda,
1306
        user_external_id='user:9',
1346
        user_external_id='user:10',
1307 1347
        user_first_name='Subscription',
1308 1348
        user_last_name='14',
1309 1349
        date_start=now(),
......
1333 1373
        date_start=now() + datetime.timedelta(days=1),
1334 1374
        date_end=now() + datetime.timedelta(days=1),
1335 1375
    )
1336

  
1337
    login(app)
1338

  
1339
    # event not in past
1340
    resp = app.get('/manage/agendas/%s/events/%s/' % (agenda.pk, event.pk))
1341
    assert '/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk) not in resp
1342
    app.get('/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk), status=404)
1343

  
1344
    event.start_datetime = localtime(now()).replace(hour=22, minute=0)  # it's ok all the day
1345
    event.save()
1346
    resp = app.get('/manage/agendas/%s/events/%s/' % (agenda.pk, event.pk))
1347
    assert '/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk) in resp
1348

  
1349
    # unknown agenda
1350
    app.get('/manage/agendas/%s/events/%s/check' % (0, event.pk), status=404)
1351
    # wrong agenda
1352
    app.get('/manage/agendas/%s/events/%s/check' % (agenda2.pk, event.pk), status=404)
1353

  
1354
    resp = resp.click('Check')
1376
    resp = app.get('/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk))
1355 1377
    assert (
1356 1378
        resp.text.index('Bookings (6/10)')
1357 1379
        < resp.text.index('User 01')
1358 1380
        < resp.text.index('User 05')
1381
        < resp.text.index('User 12 Cancelled')
1359 1382
        < resp.text.index('Subscription 14')
1383
        < resp.text.index('(Not booked)')
1360 1384
        < resp.text.index('User 17')
1361 1385
        < resp.text.index('User 35')
1362 1386
        < resp.text.index('User 42')
1363 1387
        < resp.text.index('Subscription 43')
1364 1388
        < resp.text.index('Waiting List (1/5)')
1365 1389
        < resp.text.index('User Waiting')
1390
        < resp.text.index('User Waiting and Cancelled')
1366 1391
    )
1367
    assert 'User Cancelled' not in resp
1368 1392
    assert 'Subscription Waiting' not in resp
1369 1393
    assert 'Subscription 42' not in resp
1370 1394
    assert 'Subscription too soon' not in resp
......
1404 1428

  
1405 1429
    # secondary booking
1406 1430
    app.post(
1407
        '/manage/agendas/%s/bookings/%s/presence' % (agenda.pk, booking8.pk),
1431
        '/manage/agendas/%s/bookings/%s/presence' % (agenda.pk, booking9.pk),
1408 1432
        params={'csrfmiddlewaretoken': token},
1409 1433
        status=404,
1410 1434
    )
1411 1435
    app.post(
1412
        '/manage/agendas/%s/bookings/%s/absence' % (agenda.pk, booking8.pk),
1436
        '/manage/agendas/%s/bookings/%s/absence' % (agenda.pk, booking9.pk),
1413 1437
        params={'csrfmiddlewaretoken': token},
1414 1438
        status=404,
1415 1439
    )
......
1442 1466
    resp = app.get('/manage/agendas/%s/events/%s/' % (agenda.pk, event.pk))
1443 1467
    assert '/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk) not in resp
1444 1468
    app.get('/manage/agendas/%s/events/%s/check' % (agenda.pk, event.pk), status=404)
1445
    event.cancellation_datetime = None
1446 1469

  
1447 1470

  
1448 1471
def test_event_checked(app, admin_user):
1449
-