2384 |
2384 |
def test_meetings_agenda_add_time_period_exception(app, admin_user):
|
2385 |
2385 |
agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
|
2386 |
2386 |
desk = Desk.objects.create(agenda=agenda, label='Desk A')
|
2387 |
|
meeting_type = MeetingType.objects.create(agenda=agenda, label='Blah')
|
|
2387 |
desk2 = Desk.objects.create(agenda=agenda, label='Desk B')
|
|
2388 |
|
2388 |
2389 |
app = login(app)
|
2389 |
2390 |
resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
|
2390 |
|
resp = resp.click('Add a time period exception')
|
|
2391 |
resp = resp.click('Add a time period exception', index=0)
|
2391 |
2392 |
today = datetime.datetime.today().replace(hour=0, minute=0, second=0, microsecond=0)
|
2392 |
2393 |
tomorrow = make_aware(today + datetime.timedelta(days=1))
|
2393 |
2394 |
dt_format = '%Y-%m-%d %H:%M'
|
... | ... | |
2398 |
2399 |
resp.form['end_datetime_1'] = '16:00'
|
2399 |
2400 |
resp = resp.form.submit().follow()
|
2400 |
2401 |
assert TimePeriodException.objects.count() == 1
|
|
2402 |
assert desk2.timeperiodexception_set.exists() is False
|
2401 |
2403 |
time_period_exception = TimePeriodException.objects.first()
|
2402 |
2404 |
assert localtime(time_period_exception.start_datetime).strftime(dt_format) == tomorrow.replace(
|
2403 |
2405 |
hour=8
|
... | ... | |
2421 |
2423 |
assert 'Exception 1' in resp.text
|
2422 |
2424 |
assert 'Exception 2' in resp.text
|
2423 |
2425 |
|
|
2426 |
|
|
2427 |
def test_meetings_agenda_add_time_period_exception_booking_overlaps(app, admin_user):
|
|
2428 |
agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
|
|
2429 |
desk = Desk.objects.create(agenda=agenda, label='Desk A')
|
|
2430 |
meeting_type = MeetingType.objects.create(agenda=agenda, label='Blah')
|
|
2431 |
|
|
2432 |
# different type of overlap
|
|
2433 |
# event.start_datetime <= exception.start_datetime < event.start_datetime + meeting_type.duration
|
|
2434 |
event = Event.objects.create(
|
|
2435 |
agenda=agenda,
|
|
2436 |
places=1,
|
|
2437 |
desk=desk,
|
|
2438 |
meeting_type=meeting_type,
|
|
2439 |
start_datetime=make_aware(datetime.datetime(2017, 5, 22, 10, 30)),
|
|
2440 |
)
|
|
2441 |
Booking.objects.create(event=event)
|
|
2442 |
app = login(app)
|
|
2443 |
resp = app.get('/manage/agendas/%s/desk/%s/add-time-period-exception' % (agenda.pk, desk.pk))
|
|
2444 |
resp.form['label'] = 'Exception'
|
|
2445 |
resp.form['start_datetime_0'] = '2017-05-22'
|
|
2446 |
resp.form['start_datetime_1'] = '10:45'
|
|
2447 |
resp.form['end_datetime_0'] = '2017-05-22'
|
|
2448 |
resp.form['end_datetime_1'] = '17:30'
|
|
2449 |
resp = resp.form.submit().follow()
|
|
2450 |
assert TimePeriodException.objects.count() == 1
|
|
2451 |
assert 'Exception added.' in resp.text
|
|
2452 |
assert 'One or several bookings exists within this time slot.' in resp.text
|
|
2453 |
|
|
2454 |
|
|
2455 |
def test_meetings_agenda_add_time_period_exception_all_desks(app, admin_user):
|
|
2456 |
agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
|
|
2457 |
desk = Desk.objects.create(agenda=agenda, label='Desk A')
|
|
2458 |
|
2424 |
2459 |
# add global time exception
|
2425 |
2460 |
# only one desk: no option to apply to all desks
|
|
2461 |
app = login(app)
|
2426 |
2462 |
resp = app.get('/manage/agendas/%s/desk/%s/add-time-period-exception' % (agenda.pk, desk.pk))
|
2427 |
2463 |
assert 'all_desks' not in resp.context['form'].fields
|
2428 |
2464 |
# more than one desk
|
|
2465 |
Desk.objects.create(agenda=agenda, label='Desk B')
|
2429 |
2466 |
agenda2 = Agenda.objects.create(label='Foo bar', kind='meetings')
|
2430 |
2467 |
Desk.objects.create(agenda=agenda2, label='Other Desk') # check exception is not created for this one
|
2431 |
|
desk2 = Desk.objects.create(agenda=agenda, label='Desk B')
|
2432 |
2468 |
event = Event.objects.create(
|
2433 |
|
agenda=agenda, places=1, desk=desk2, start_datetime=make_aware(datetime.datetime(2017, 5, 22, 10, 30))
|
|
2469 |
agenda=agenda, places=1, desk=desk, start_datetime=make_aware(datetime.datetime(2017, 5, 22, 10, 30))
|
2434 |
2470 |
)
|
2435 |
2471 |
Booking.objects.create(event=event)
|
2436 |
2472 |
resp = app.get('/manage/agendas/%s/desk/%s/add-time-period-exception' % (agenda.pk, desk.pk))
|
2437 |
|
future = tomorrow + datetime.timedelta(days=35)
|
2438 |
|
resp.form['label'] = 'Exception 3'
|
|
2473 |
resp.form['label'] = 'Exception'
|
2439 |
2474 |
resp.form['start_datetime_0'] = '2017-05-22'
|
2440 |
2475 |
resp.form['start_datetime_1'] = '08:00'
|
2441 |
2476 |
resp.form['end_datetime_0'] = '2017-05-26'
|
2442 |
2477 |
resp.form['end_datetime_1'] = '17:30'
|
2443 |
2478 |
resp.form['all_desks'] = True
|
2444 |
2479 |
resp = resp.form.submit().follow()
|
2445 |
|
assert TimePeriodException.objects.count() == 4
|
|
2480 |
assert TimePeriodException.objects.count() == 2
|
2446 |
2481 |
assert 'Exceptions added.' in resp.text
|
2447 |
2482 |
assert 'One or several bookings exists within this time slot.' in resp.text
|
2448 |
2483 |
|
... | ... | |
2450 |
2485 |
resp = app.get('/manage/time-period-exceptions/%s/edit' % exception.pk)
|
2451 |
2486 |
assert 'all_desks' not in resp.context['form'].fields
|
2452 |
2487 |
|
2453 |
|
# different type of overlap
|
2454 |
|
# event.start_datetime <= exception.start_datetime < event.start_datetime + meeting_type.duration
|
2455 |
|
event = Event.objects.create(
|
2456 |
|
agenda=agenda,
|
2457 |
|
places=1,
|
2458 |
|
desk=desk2,
|
2459 |
|
meeting_type=meeting_type,
|
2460 |
|
start_datetime=make_aware(datetime.datetime(2017, 5, 22, 10, 30)),
|
2461 |
|
)
|
2462 |
|
Booking.objects.create(event=event)
|
2463 |
|
resp = app.get('/manage/agendas/%s/desk/%s/add-time-period-exception' % (agenda.pk, desk2.pk))
|
2464 |
|
resp.form['label'] = 'Exception 4'
|
2465 |
|
resp.form['start_datetime_0'] = '2017-05-22'
|
2466 |
|
resp.form['start_datetime_1'] = '10:45'
|
2467 |
|
resp.form['end_datetime_0'] = '2017-05-22'
|
2468 |
|
resp.form['end_datetime_1'] = '17:30'
|
2469 |
|
resp.form['all_desks'] = False
|
2470 |
|
resp = resp.form.submit().follow()
|
2471 |
|
assert TimePeriodException.objects.count() == 5
|
2472 |
|
assert 'Exception added.' in resp.text
|
2473 |
|
assert 'One or several bookings exists within this time slot.' in resp.text
|
2474 |
|
|
2475 |
2488 |
|
2476 |
2489 |
def test_meetings_agenda_add_time_period_exception_when_booking_exists(app, admin_user):
|
2477 |
2490 |
agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
|
... | ... | |
2522 |
2535 |
resp.form['end_datetime_0'] = '2017-05-26'
|
2523 |
2536 |
resp.form['end_datetime_1'] = '17:30'
|
2524 |
2537 |
resp = resp.form.submit().follow()
|
2525 |
|
assert 'Exception added. Note: one or several bookings exists within this time slot.' not in resp.text
|
|
2538 |
assert 'Exception added' in resp.text
|
|
2539 |
assert 'One or several bookings exists within this time slot.' not in resp.text
|
2526 |
2540 |
assert TimePeriodException.objects.count() == 1
|
2527 |
2541 |
|
2528 |
2542 |
|
|
2543 |
def test_meetings_agenda_add_time_period_exception_desk_simple_management(app, admin_user):
|
|
2544 |
agenda = Agenda.objects.create(label='Foo bar', kind='meetings', desk_simple_management=True)
|
|
2545 |
desk = Desk.objects.create(agenda=agenda, label='Desk A')
|
|
2546 |
desk2 = Desk.objects.create(agenda=agenda, label='Desk B')
|
|
2547 |
event = Event.objects.create(
|
|
2548 |
agenda=agenda, places=1, desk=desk2, start_datetime=make_aware(datetime.datetime(2017, 5, 22, 10, 30))
|
|
2549 |
)
|
|
2550 |
Booking.objects.create(event=event)
|
|
2551 |
assert agenda.is_available_for_simple_management() is True
|
|
2552 |
|
|
2553 |
login(app)
|
|
2554 |
resp = app.get('/manage/agendas/%s/desk/%s/add-time-period-exception' % (agenda.pk, desk.pk))
|
|
2555 |
assert 'all_desks' not in resp.form.fields
|
|
2556 |
resp.form['label'] = 'Exception'
|
|
2557 |
resp.form['start_datetime_0'] = '2017-05-22'
|
|
2558 |
resp.form['start_datetime_1'] = '8:00'
|
|
2559 |
resp.form['end_datetime_0'] = '2017-05-22'
|
|
2560 |
resp.form['end_datetime_1'] = '17:30'
|
|
2561 |
resp = resp.form.submit().follow()
|
|
2562 |
assert 'Exception added' in resp.text
|
|
2563 |
assert 'One or several bookings exists within this time slot.' in resp.text
|
|
2564 |
assert TimePeriodException.objects.count() == 2
|
|
2565 |
assert agenda.is_available_for_simple_management() is True
|
|
2566 |
|
|
2567 |
|
2529 |
2568 |
def test_meetings_agenda_edit_time_period_exception(app, admin_user):
|
|
2569 |
agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
|
|
2570 |
desk = Desk.objects.create(agenda=agenda, label='Desk A')
|
|
2571 |
exception = TimePeriodException.objects.create(
|
|
2572 |
label='Exception',
|
|
2573 |
desk=desk,
|
|
2574 |
start_datetime=make_aware(datetime.datetime(2018, 12, 16, 5, 0)),
|
|
2575 |
end_datetime=make_aware(datetime.datetime(2018, 12, 16, 23, 0)),
|
|
2576 |
)
|
|
2577 |
desk2 = desk.duplicate()
|
|
2578 |
exception2 = desk2.timeperiodexception_set.get()
|
|
2579 |
|
|
2580 |
login(app)
|
|
2581 |
resp = app.get('/manage/time-period-exceptions/%s/edit' % exception.pk)
|
|
2582 |
resp.form['start_datetime_1'] = '8:00'
|
|
2583 |
resp.form.submit()
|
|
2584 |
exception.refresh_from_db()
|
|
2585 |
assert exception.start_datetime == make_aware(datetime.datetime(2018, 12, 16, 8, 0))
|
|
2586 |
exception2.refresh_from_db()
|
|
2587 |
assert exception2.start_datetime == make_aware(datetime.datetime(2018, 12, 16, 5, 0))
|
|
2588 |
|
|
2589 |
|
|
2590 |
def test_meetings_agenda_edit_time_period_exception_overlaps(app, admin_user):
|
2530 |
2591 |
agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
|
2531 |
2592 |
desk = Desk.objects.create(agenda=agenda, label='Desk A')
|
2532 |
2593 |
calendar = UnavailabilityCalendar.objects.create(label='foo')
|
... | ... | |
2543 |
2604 |
start_datetime=make_aware(datetime.datetime(2018, 12, 16, 5, 0)),
|
2544 |
2605 |
end_datetime=make_aware(datetime.datetime(2018, 12, 16, 23, 0)),
|
2545 |
2606 |
)
|
|
2607 |
login(app)
|
2546 |
2608 |
for time_period_exception in (time_period_exception_desk, time_period_exception_calendar):
|
2547 |
2609 |
event = Event.objects.create(
|
2548 |
2610 |
agenda=agenda,
|
... | ... | |
2551 |
2613 |
start_datetime=make_aware(datetime.datetime(2018, 12, 16, 10, 30)),
|
2552 |
2614 |
)
|
2553 |
2615 |
|
2554 |
|
login(app)
|
2555 |
2616 |
resp = app.get('/manage/time-period-exceptions/%s/edit' % time_period_exception.pk)
|
2556 |
2617 |
resp = resp.form.submit().follow()
|
2557 |
|
assert 'Exception updated.' not in resp.text
|
2558 |
2618 |
assert 'One or several bookings exists within this time slot.' not in resp.text
|
2559 |
2619 |
|
2560 |
2620 |
booking = Booking.objects.create(event=event)
|
2561 |
2621 |
resp = app.get('/manage/time-period-exceptions/%s/edit' % time_period_exception.pk)
|
2562 |
2622 |
resp = resp.form.submit().follow()
|
2563 |
|
assert 'Exception updated.' in resp.text
|
2564 |
2623 |
assert 'One or several bookings exists within this time slot.' in resp.text
|
2565 |
2624 |
|
2566 |
2625 |
booking.cancel()
|
2567 |
2626 |
resp = app.get('/manage/time-period-exceptions/%s/edit' % time_period_exception.pk)
|
2568 |
2627 |
resp = resp.form.submit().follow()
|
2569 |
|
assert 'Exception updated.' not in resp.text
|
2570 |
2628 |
assert 'One or several bookings exists within this time slot.' not in resp.text
|
2571 |
2629 |
|
2572 |
2630 |
booking.delete()
|
2573 |
2631 |
event.delete()
|
2574 |
2632 |
|
2575 |
2633 |
|
|
2634 |
def test_meetings_agenda_edit_time_period_exception_desk_simple_management(app, admin_user):
|
|
2635 |
agenda = Agenda.objects.create(label='Foo bar', kind='meetings', desk_simple_management=True)
|
|
2636 |
desk = Desk.objects.create(agenda=agenda, label='Desk A')
|
|
2637 |
exception = TimePeriodException.objects.create(
|
|
2638 |
label='Exception',
|
|
2639 |
desk=desk,
|
|
2640 |
start_datetime=make_aware(datetime.datetime(2017, 5, 21, 5, 0)),
|
|
2641 |
end_datetime=make_aware(datetime.datetime(2017, 5, 21, 23, 0)),
|
|
2642 |
)
|
|
2643 |
desk2 = desk.duplicate()
|
|
2644 |
event = Event.objects.create(
|
|
2645 |
agenda=agenda, places=1, desk=desk2, start_datetime=make_aware(datetime.datetime(2017, 5, 22, 10, 30))
|
|
2646 |
)
|
|
2647 |
Booking.objects.create(event=event)
|
|
2648 |
exception2 = desk2.timeperiodexception_set.get()
|
|
2649 |
assert agenda.is_available_for_simple_management() is True
|
|
2650 |
|
|
2651 |
login(app)
|
|
2652 |
resp = app.get('/manage/time-period-exceptions/%s/edit' % exception.pk)
|
|
2653 |
resp.form['label'] = 'Exception foo bar'
|
|
2654 |
resp.form['start_datetime_0'] = '2017-05-22'
|
|
2655 |
resp.form['start_datetime_1'] = '8:00'
|
|
2656 |
resp.form['end_datetime_0'] = '2017-05-22'
|
|
2657 |
resp.form['end_datetime_1'] = '17:30'
|
|
2658 |
resp = resp.form.submit().follow()
|
|
2659 |
assert 'One or several bookings exists within this time slot.' in resp.text
|
|
2660 |
exception.refresh_from_db()
|
|
2661 |
exception2.refresh_from_db()
|
|
2662 |
assert exception.label == 'Exception foo bar'
|
|
2663 |
assert exception.start_datetime == make_aware(datetime.datetime(2017, 5, 22, 8, 0))
|
|
2664 |
assert exception.end_datetime == make_aware(datetime.datetime(2017, 5, 22, 17, 30))
|
|
2665 |
assert exception2.label == 'Exception foo bar'
|
|
2666 |
assert exception2.start_datetime == make_aware(datetime.datetime(2017, 5, 22, 8, 0))
|
|
2667 |
assert exception2.end_datetime == make_aware(datetime.datetime(2017, 5, 22, 17, 30))
|
|
2668 |
assert agenda.is_available_for_simple_management() is True
|
|
2669 |
|
|
2670 |
# should not happen: corresponding exception does not exist
|
|
2671 |
exception2.delete()
|
|
2672 |
resp = app.get('/manage/time-period-exceptions/%s/edit' % exception.pk)
|
|
2673 |
resp.form['label'] = 'Exception'
|
|
2674 |
resp.form['start_datetime_0'] = '2017-05-21'
|
|
2675 |
resp.form['start_datetime_1'] = '9:00'
|
|
2676 |
resp.form['end_datetime_0'] = '2017-05-21'
|
|
2677 |
resp.form['end_datetime_1'] = '18:30'
|
|
2678 |
# no error
|
|
2679 |
resp.form.submit()
|
|
2680 |
exception.refresh_from_db()
|
|
2681 |
assert exception.label == 'Exception'
|
|
2682 |
assert exception.start_datetime == make_aware(datetime.datetime(2017, 5, 21, 9, 0))
|
|
2683 |
assert exception.end_datetime == make_aware(datetime.datetime(2017, 5, 21, 18, 30))
|
|
2684 |
|
|
2685 |
|
2576 |
2686 |
def test_meetings_agenda_add_invalid_time_period_exception():
|
2577 |
2687 |
form = TimePeriodExceptionForm(
|
2578 |
2688 |
data={
|
... | ... | |
2611 |
2721 |
def test_meetings_agenda_delete_time_period_exception(app, admin_user):
|
2612 |
2722 |
agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
|
2613 |
2723 |
desk = Desk.objects.create(agenda=agenda, label='Desk A')
|
2614 |
|
MeetingType(agenda=agenda, label='Blah').save()
|
2615 |
|
TimePeriod.objects.create(
|
2616 |
|
weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)
|
|
2724 |
TimePeriodException.objects.create(
|
|
2725 |
label='Exception Foo',
|
|
2726 |
desk=desk,
|
|
2727 |
start_datetime=now() + datetime.timedelta(days=1),
|
|
2728 |
end_datetime=now() + datetime.timedelta(days=2),
|
2617 |
2729 |
)
|
|
2730 |
desk.duplicate()
|
|
2731 |
assert TimePeriodException.objects.count() == 2
|
|
2732 |
|
2618 |
2733 |
login(app)
|
2619 |
2734 |
resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
|
2620 |
|
resp = resp.click('Add a time period exception')
|
2621 |
|
today = datetime.datetime.today().replace(hour=0, minute=0, second=0, microsecond=0)
|
2622 |
|
tomorrow = make_aware(today + datetime.timedelta(days=15))
|
2623 |
|
dt_format = '%Y-%m-%d %H:%M'
|
2624 |
|
resp.form['label'] = 'Exception 1'
|
2625 |
|
resp.form['start_datetime_0'] = tomorrow.strftime('%Y-%m-%d')
|
2626 |
|
resp.form['start_datetime_1'] = '08:00'
|
2627 |
|
resp.form['end_datetime_0'] = tomorrow.strftime('%Y-%m-%d')
|
2628 |
|
resp.form['end_datetime_1'] = '16:00'
|
2629 |
|
resp = resp.form.submit().follow()
|
2630 |
|
assert TimePeriodException.objects.count() == 1
|
2631 |
|
time_period_exception = TimePeriodException.objects.first()
|
2632 |
|
assert localtime(time_period_exception.start_datetime).strftime(dt_format) == tomorrow.replace(
|
2633 |
|
hour=8
|
2634 |
|
).strftime(dt_format)
|
2635 |
|
assert localtime(time_period_exception.end_datetime).strftime(dt_format) == tomorrow.replace(
|
2636 |
|
hour=16
|
2637 |
|
).strftime(dt_format)
|
2638 |
|
resp = resp.click(href='/manage/time-period-exceptions/%d/edit' % time_period_exception.id)
|
|
2735 |
resp = resp.click('Exception Foo', index=0)
|
2639 |
2736 |
resp = resp.click('Delete')
|
2640 |
2737 |
resp = resp.form.submit().follow()
|
2641 |
|
assert TimePeriodException.objects.count() == 0
|
|
2738 |
assert TimePeriodException.objects.count() == 1
|
2642 |
2739 |
assert resp.request.url.endswith('/manage/agendas/%d/settings' % agenda.pk)
|
2643 |
2740 |
|
2644 |
2741 |
# stay on exception list
|
... | ... | |
2656 |
2753 |
assert resp.request.url.endswith('/manage/time-period-exceptions/%d/exception-list' % desk.pk)
|
2657 |
2754 |
|
2658 |
2755 |
|
|
2756 |
def test_meetings_agenda_delete_time_period_exception_desk_simple_management(app, admin_user):
|
|
2757 |
agenda = Agenda.objects.create(label='Foo bar', kind='meetings', desk_simple_management=True)
|
|
2758 |
desk = Desk.objects.create(agenda=agenda, label='Desk A')
|
|
2759 |
exception = TimePeriodException.objects.create(
|
|
2760 |
label='Exception',
|
|
2761 |
desk=desk,
|
|
2762 |
start_datetime=make_aware(datetime.datetime(2017, 5, 21, 5, 0)),
|
|
2763 |
end_datetime=make_aware(datetime.datetime(2017, 5, 21, 23, 0)),
|
|
2764 |
)
|
|
2765 |
desk.duplicate()
|
|
2766 |
assert TimePeriodException.objects.count() == 2
|
|
2767 |
assert agenda.is_available_for_simple_management() is True
|
|
2768 |
|
|
2769 |
login(app)
|
|
2770 |
resp = app.get('/manage/time-period-exceptions/%d/delete' % exception.pk)
|
|
2771 |
resp.form.submit()
|
|
2772 |
assert TimePeriodException.objects.count() == 0
|
|
2773 |
assert agenda.is_available_for_simple_management() is True
|
|
2774 |
|
|
2775 |
# should not happen: corresponding exception does not exist
|
|
2776 |
exception = TimePeriodException.objects.create(
|
|
2777 |
label='Exception',
|
|
2778 |
desk=desk,
|
|
2779 |
start_datetime=make_aware(datetime.datetime(2017, 5, 21, 5, 0)),
|
|
2780 |
end_datetime=make_aware(datetime.datetime(2017, 5, 21, 23, 0)),
|
|
2781 |
)
|
|
2782 |
assert TimePeriodException.objects.count() == 1
|
|
2783 |
resp = app.get('/manage/time-period-exceptions/%d/delete' % exception.pk)
|
|
2784 |
resp.form.submit()
|
|
2785 |
assert TimePeriodException.objects.count() == 0
|
|
2786 |
|
|
2787 |
|
2659 |
2788 |
@override_settings(
|
2660 |
2789 |
EXCEPTIONS_SOURCES={
|
2661 |
2790 |
'holidays': {'class': 'workalendar.europe.France', 'label': 'Holidays'},
|
2662 |
|
-
|