manager: mark event as checked for partial bookings (#80983)
This commit is contained in:
parent
42cc548a33
commit
e231d27751
|
@ -22,5 +22,6 @@
|
|||
<button>{% trans 'Set Date' %}</button>
|
||||
</div>
|
||||
{% endwith %}
|
||||
{% block extra_date_title %}{% endblock %}
|
||||
</h2>
|
||||
{% endblock %}
|
||||
|
|
|
@ -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 %}">
|
||||
|
|
|
@ -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 %}
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue