manager: mark event as checked for partial bookings (#80983)

This commit is contained in:
Lauréline Guérin 2023-09-07 16:18:40 +02:00 committed by Lauréline Guérin
parent 42cc548a33
commit e231d27751
5 changed files with 133 additions and 2 deletions

View File

@ -22,5 +22,6 @@
<button>{% trans 'Set Date' %}</button>
</div>
{% endwith %}
{% block extra_date_title %}{% endblock %}
</h2>
{% endblock %}

View File

@ -27,7 +27,7 @@
</form>
<table class="main check-bookings">
<tbody>
{% if results and not event.checked %}
{% if results and not event.checked and not event.check_locked %}
<tr class="booking">
<td class="booking-actions">
<form method="post" action="{% url 'chrono-manager-event-checked' pk=agenda.pk event_pk=object.pk %}">

View File

@ -1,6 +1,15 @@
{% extends "chrono/manager_agenda_day_view.html" %}
{% load i18n %}
{% block extra_date_title %}
{% if event.invoiced %}
<span class="invoiced tag">{% trans "Invoiced" %}</span>
{% elif event.check_locked %}
<span class="check-locked tag">{% trans "Check locked" %}</span>
{% endif %}
{% if event.checked %}<span class="checked tag">{% trans "Checked" %}</span>{% endif %}
{% endblock %}
{% block content %}
{% if not hours %}
@ -20,6 +29,13 @@
</script>
</form>
{% if results and not event.checked and not event.check_locked %}
<form method="post" action="{% url 'chrono-manager-event-checked' pk=agenda.pk event_pk=event.pk %}">
{% csrf_token %}
<button class="submit-button">{% trans "Mark the event as checked" %}</button>
</form>
{% endif %}
<div class="partial-booking" style="--nb-hours: {{ hours|length }}">
<div class="partial-booking--hours-list" aria-hidden="true">
{% for hour in hours %}

View File

@ -1623,6 +1623,7 @@ class AgendaDayView(EventChecksMixin, AgendaDateView, DayArchiveView):
except Event.DoesNotExist:
return
context['event'] = event
context['allow_check'] = bool(
self.agenda.enable_check_for_future_events
or localtime(event.start_datetime).date() <= localtime().date()
@ -2880,6 +2881,19 @@ class EventCheckMixin:
return ct
def response(self, request):
if self.agenda.partial_bookings:
day = localtime(self.event.start_datetime)
return HttpResponseRedirect(
reverse(
'chrono-manager-agenda-day-view',
kwargs={
'pk': self.agenda.pk,
'year': day.year,
'month': day.strftime('%m'),
'day': day.strftime('%d'),
},
)
)
return HttpResponseRedirect(
reverse(
'chrono-manager-event-check',

View File

@ -5,7 +5,7 @@ import pytest
from chrono.agendas.models import Agenda, Booking, Event, Subscription
from chrono.utils.lingo import CheckType
from chrono.utils.timezone import make_aware
from chrono.utils.timezone import localtime, make_aware, now
from tests.utils import login
pytestmark = pytest.mark.django_db
@ -481,6 +481,106 @@ def test_manager_partial_bookings_check_filters(check_types, app, admin_user):
assert [x.text_content() for x in resp.pyquery('.registrant--name')] == ['User Absent Meat Foo Reason']
def test_manager_partial_bookings_event_checked(app, admin_user):
agenda = Agenda.objects.create(
label='Foo bar',
kind='events',
partial_bookings=True,
)
start_datetime = make_aware(datetime.datetime(2023, 5, 2, 8, 0))
event = Event.objects.create(
label='Event', start_datetime=start_datetime, end_time=datetime.time(18, 00), places=10, agenda=agenda
)
login(app)
today = start_datetime.date()
url = '/manage/agendas/%s/day/%d/%d/%d/' % (agenda.pk, today.year, today.month, today.day)
resp = app.get(url)
assert 'Mark the event as checked' not in resp
for i in range(8):
user_was_present = None
if i < 3:
user_was_present = True
elif i < 7:
user_was_present = False
Booking.objects.create(
event=event,
user_was_present=user_was_present,
start_time=datetime.time(8, 00),
end_time=datetime.time(10, 00),
user_check_start_time=datetime.time(8, 00),
user_check_end_time=datetime.time(10, 00),
)
resp = app.get(url)
assert 'Mark the event as checked' in resp
assert event.checked is False
resp = app.get('/manage/agendas/%s/settings' % agenda.id)
assert 'checked tag' not in resp
resp = app.get('/manage/agendas/%s/day/%d/%d/%d/' % (agenda.pk, today.year, today.month, today.day))
assert '<span class="checked tag">Checked</span>' not in resp
assert 'check-locked' not in resp
assert 'invoiced' not in resp
token = resp.context['csrf_token']
resp = app.post(
'/manage/agendas/%s/events/%s/checked' % (agenda.pk, event.pk),
params={'csrfmiddlewaretoken': token},
)
event.refresh_from_db()
assert event.checked is True
resp = resp.follow()
assert 'Mark the event as checked' not in resp
resp = app.get('/manage/agendas/%s/settings' % agenda.id)
assert 'checked tag' in resp
Booking.objects.filter(user_was_present__isnull=True).update(user_was_present=True)
resp = app.get('/manage/agendas/%s/day/%d/%d/%d/' % (agenda.pk, today.year, today.month, today.day))
assert '<span class="checked tag">Checked</span>' in resp
assert 'check-locked' not in resp
assert 'invoiced' not in resp
# event not in past
agenda.disable_check_update = False
agenda.save()
assert agenda.enable_check_for_future_events is False
event.start_datetime = localtime(now()) + datetime.timedelta(days=1)
event.save()
app.post(
'/manage/agendas/%s/events/%s/checked' % (agenda.pk, event.pk),
params={'csrfmiddlewaretoken': token},
status=404,
)
# not in past, but check for future events is enabled
agenda.enable_check_for_future_events = True
agenda.save()
app.post(
'/manage/agendas/%s/events/%s/checked' % (agenda.pk, event.pk),
params={'csrfmiddlewaretoken': token},
status=302,
)
# event check is locked
event.checked = False
event.check_locked = True
event.save()
today = event.start_datetime.date()
resp = app.get('/manage/agendas/%s/day/%d/%d/%d/' % (agenda.pk, today.year, today.month, today.day))
assert '<span class="check-locked tag">Check locked</span>' in resp
assert 'invoiced' not in resp
app.post(
'/manage/agendas/%s/events/%s/checked' % (agenda.pk, event.pk),
params={'csrfmiddlewaretoken': token},
status=404,
)
# event check is locked and envent is invoiced
event.invoiced = True
event.save()
resp = app.get('/manage/agendas/%s/day/%d/%d/%d/' % (agenda.pk, today.year, today.month, today.day))
assert 'check-locked' not in resp
assert '<span class="invoiced tag">Invoiced</span>' in resp
def test_manager_partial_bookings_month_view(app, admin_user, freezer):
agenda = Agenda.objects.create(label='Foo bar', kind='events', partial_bookings=True)
start_datetime = make_aware(datetime.datetime(2023, 5, 2, 8, 0))