agendas: add Agenda.minimal_booking_time field (#56284)
This commit is contained in:
parent
22e8d00e31
commit
ddc52a4116
|
@ -0,0 +1,22 @@
|
|||
# Generated by Django 3.2.18 on 2023-03-08 17:20
|
||||
|
||||
import datetime
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('agendas', '0147_check_future_events'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='agenda',
|
||||
name='minimal_booking_time',
|
||||
field=models.TimeField(
|
||||
blank=True, default=datetime.time(0, 0), null=True, verbose_name='Minimal booking time'
|
||||
),
|
||||
),
|
||||
]
|
|
@ -262,6 +262,15 @@ class Agenda(models.Model):
|
|||
null=True,
|
||||
blank=True,
|
||||
)
|
||||
minimal_booking_time = models.TimeField(
|
||||
verbose_name=_('Minimal booking time'),
|
||||
default=datetime.time(0, 0, 0), # booking is possible starting and finishin at 00:00
|
||||
help_text=_(
|
||||
'Ex.: 08:00:00. If left empty, available events will be those that are later than the current time.'
|
||||
),
|
||||
null=True,
|
||||
blank=True,
|
||||
)
|
||||
|
||||
class Meta:
|
||||
ordering = ['label']
|
||||
|
|
|
@ -521,6 +521,7 @@ class AgendaSerializer(serializers.ModelSerializer):
|
|||
'minimal_booking_delay',
|
||||
'minimal_booking_delay_in_working_days',
|
||||
'maximal_booking_delay',
|
||||
'minimal_booking_time',
|
||||
'anonymize_delay',
|
||||
'edit_role',
|
||||
'view_role',
|
||||
|
|
|
@ -361,6 +361,7 @@ def get_agenda_detail(request, agenda, check_events=False):
|
|||
'kind': agenda.kind,
|
||||
'minimal_booking_delay': agenda.minimal_booking_delay,
|
||||
'maximal_booking_delay': agenda.maximal_booking_delay,
|
||||
'minimal_booking_time': agenda.minimal_booking_time,
|
||||
'edit_role': agenda.edit_role.name if agenda.edit_role else None,
|
||||
'view_role': agenda.view_role.name if agenda.view_role else None,
|
||||
'category': agenda.category.slug if agenda.category else None,
|
||||
|
|
|
@ -129,6 +129,7 @@ class AgendaBookingDelaysForm(forms.ModelForm):
|
|||
'minimal_booking_delay',
|
||||
'minimal_booking_delay_in_working_days',
|
||||
'maximal_booking_delay',
|
||||
'minimal_booking_time',
|
||||
]
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
|
|
|
@ -89,6 +89,10 @@
|
|||
{% if agenda.maximal_booking_delay is not None %}
|
||||
{% blocktrans count count=agenda.maximal_booking_delay %}{{ count }} day{% plural %}{{ count }} days{% endblocktrans %}
|
||||
{% else %}<i>{% trans "undefined" %}</i>{% endif %}</li>
|
||||
{% if agenda.minimal_booking_delay is not None or agenda.maximal_booking_delay is not None %}
|
||||
<li>{% trans "Minimal booking time:" %}
|
||||
{% if agenda.minimal_booking_time is not None %}{{ agenda.minimal_booking_time }}{% else %}{% trans "current time" %}{% endif %}</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
<div class="panel--buttons">
|
||||
<a rel="popup" class="button" href="{% url 'chrono-manager-agenda-booking-delays' pk=object.id %}">{% trans 'Configure' %}</a>
|
||||
|
|
|
@ -66,6 +66,7 @@ def test_agendas_api(app):
|
|||
'minimal_booking_delay': 1,
|
||||
'minimal_booking_delay_in_working_days': False,
|
||||
'maximal_booking_delay': 56,
|
||||
'minimal_booking_time': '00:00:00',
|
||||
'edit_role': 'Edit',
|
||||
'view_role': None,
|
||||
'category': 'category-a',
|
||||
|
@ -85,6 +86,7 @@ def test_agendas_api(app):
|
|||
'minimal_booking_delay': 1,
|
||||
'minimal_booking_delay_in_working_days': False,
|
||||
'maximal_booking_delay': 56,
|
||||
'minimal_booking_time': '00:00:00',
|
||||
'edit_role': None,
|
||||
'view_role': None,
|
||||
'category': 'category-a',
|
||||
|
@ -104,6 +106,7 @@ def test_agendas_api(app):
|
|||
'minimal_booking_delay': 1,
|
||||
'minimal_booking_delay_in_working_days': False,
|
||||
'maximal_booking_delay': 56,
|
||||
'minimal_booking_time': '00:00:00',
|
||||
'edit_role': None,
|
||||
'view_role': None,
|
||||
'category': None,
|
||||
|
@ -121,6 +124,7 @@ def test_agendas_api(app):
|
|||
'slug': 'foo-bar-meeting',
|
||||
'minimal_booking_delay': 1,
|
||||
'maximal_booking_delay': 56,
|
||||
'minimal_booking_time': '00:00:00',
|
||||
'edit_role': None,
|
||||
'view_role': 'View',
|
||||
'category': 'category-b',
|
||||
|
@ -144,6 +148,7 @@ def test_agendas_api(app):
|
|||
'slug': 'foo-bar-meeting-2',
|
||||
'minimal_booking_delay': 1,
|
||||
'maximal_booking_delay': 56,
|
||||
'minimal_booking_time': '00:00:00',
|
||||
'edit_role': None,
|
||||
'view_role': None,
|
||||
'category': None,
|
||||
|
@ -164,6 +169,7 @@ def test_agendas_api(app):
|
|||
'slug': 'virtual-agenda',
|
||||
'minimal_booking_delay': 1,
|
||||
'maximal_booking_delay': 56,
|
||||
'minimal_booking_time': '00:00:00',
|
||||
'edit_role': 'Edit',
|
||||
'view_role': 'View',
|
||||
'category': None,
|
||||
|
@ -411,6 +417,7 @@ def test_virtual_agenda_detail(app, virtual_meetings_agenda):
|
|||
'slug': 'virtual-agenda',
|
||||
'minimal_booking_delay': None,
|
||||
'maximal_booking_delay': None,
|
||||
'minimal_booking_time': '00:00:00',
|
||||
'edit_role': None,
|
||||
'view_role': None,
|
||||
'category': None,
|
||||
|
@ -457,25 +464,25 @@ def test_agenda_api_delete_busy(app, user):
|
|||
assert not Agenda.objects.exists()
|
||||
|
||||
|
||||
@pytest.mark.freeze_time('2021-07-09')
|
||||
@pytest.mark.freeze_time('2021-07-09T08:00:00.0+02:00')
|
||||
def test_add_agenda(app, user, settings):
|
||||
events_type = EventsType.objects.create(label='Type A')
|
||||
category_a = Category.objects.create(label='Category A')
|
||||
api_url = '/api/agenda/'
|
||||
|
||||
# no authentication
|
||||
resp = app.post(api_url, status=401)
|
||||
resp = app.post_json(api_url, status=401)
|
||||
assert resp.json['detail'] == 'Authentication credentials were not provided.'
|
||||
|
||||
# wrong password
|
||||
app.authorization = ('Basic', ('john.doe', 'wrong'))
|
||||
resp = app.post(api_url, status=401)
|
||||
resp = app.post_json(api_url, status=401)
|
||||
assert resp.json['detail'] == 'Invalid username/password.'
|
||||
|
||||
app.authorization = ('Basic', ('john.doe', 'password'))
|
||||
|
||||
# missing fields
|
||||
resp = app.post(api_url, status=400)
|
||||
resp = app.post_json(api_url, status=400)
|
||||
assert resp.json['err']
|
||||
assert resp.json['errors'] == {'label': ['This field is required.'], 'slug': ['This field is required.']}
|
||||
|
||||
|
@ -492,7 +499,7 @@ def test_add_agenda(app, user, settings):
|
|||
'category': 'oups',
|
||||
'events_type': 'oups',
|
||||
}
|
||||
resp = app.post(api_url, params=params, status=400)
|
||||
resp = app.post_json(api_url, params=params, status=400)
|
||||
assert resp.json['err']
|
||||
assert resp.json['errors'] == {
|
||||
'kind': ['"oups" is not a valid choice.'],
|
||||
|
@ -512,7 +519,7 @@ def test_add_agenda(app, user, settings):
|
|||
'label': 'foo',
|
||||
'slug': meeting_agenda.slug,
|
||||
}
|
||||
resp = app.post(api_url, params=params, status=400)
|
||||
resp = app.post_json(api_url, params=params, status=400)
|
||||
assert resp.json['err']
|
||||
assert resp.json['errors'] == {'slug': ['agenda with this Identifier already exists.']}
|
||||
|
||||
|
@ -523,7 +530,7 @@ def test_add_agenda(app, user, settings):
|
|||
'kind': 'meetings',
|
||||
'minimal_booking_delay_in_working_days': True,
|
||||
}
|
||||
resp = app.post(api_url, params=params, status=400)
|
||||
resp = app.post_json(api_url, params=params, status=400)
|
||||
assert resp.json['err']
|
||||
assert resp.json['errors'] == {
|
||||
'minimal_booking_delay_in_working_days': ['Option not available on meetings agenda']
|
||||
|
@ -534,7 +541,7 @@ def test_add_agenda(app, user, settings):
|
|||
'kind': 'meetings',
|
||||
'events_type': 'type-a',
|
||||
}
|
||||
resp = app.post(api_url, params=params, status=400)
|
||||
resp = app.post_json(api_url, params=params, status=400)
|
||||
assert resp.json['err']
|
||||
assert resp.json['errors'] == {'events_type': ['Option not available on meetings agenda']}
|
||||
|
||||
|
@ -543,7 +550,7 @@ def test_add_agenda(app, user, settings):
|
|||
'label': 'My Agenda',
|
||||
'slug': 'my-agenda',
|
||||
}
|
||||
resp = app.post(api_url, params=params)
|
||||
resp = app.post_json(api_url, params=params)
|
||||
assert not resp.json['err']
|
||||
assert len(resp.json['data']) == 1
|
||||
agenda = Agenda.objects.get(slug='my-agenda')
|
||||
|
@ -567,11 +574,14 @@ def test_add_agenda(app, user, settings):
|
|||
'mark_event_checked_auto': True,
|
||||
'disable_check_update': False,
|
||||
}
|
||||
resp = app.post(api_url, params=params)
|
||||
resp = app.post_json(api_url, params=params)
|
||||
assert not resp.json['err']
|
||||
assert len(resp.json['data']) == 1
|
||||
agenda = Agenda.objects.get(slug='foo-meetings')
|
||||
assert agenda.min_booking_datetime.date() == datetime.date(2021, 7, 10)
|
||||
assert agenda.min_booking_datetime == localtime(now()).replace(
|
||||
day=10, hour=0, minute=0, second=0, microsecond=0
|
||||
)
|
||||
assert agenda.minimal_booking_time == datetime.time(0)
|
||||
assert agenda.edit_role == edit_group
|
||||
assert agenda.view_role == view_group
|
||||
assert agenda.category == category_a
|
||||
|
@ -587,6 +597,7 @@ def test_add_agenda(app, user, settings):
|
|||
'minimal_booking_delay': 1,
|
||||
'minimal_booking_delay_in_working_days': True,
|
||||
'maximal_booking_delay': 3,
|
||||
'minimal_booking_time': None,
|
||||
'anonymize_delay': 30,
|
||||
'edit_role': 'Edit',
|
||||
'view_role': 'View',
|
||||
|
@ -596,13 +607,14 @@ def test_add_agenda(app, user, settings):
|
|||
'disable_check_update': True,
|
||||
'booking_check_filters': 'foo,bar,baz',
|
||||
}
|
||||
resp = app.post(api_url, params=params)
|
||||
resp = app.post_json(api_url, params=params)
|
||||
assert not resp.json['err']
|
||||
assert len(resp.json['data']) == 1
|
||||
agenda = Agenda.objects.get(slug='foo-events')
|
||||
assert agenda.edit_role == edit_group
|
||||
assert agenda.view_role == view_group
|
||||
assert agenda.min_booking_datetime.date() == datetime.date(2021, 7, 12)
|
||||
assert agenda.minimal_booking_time is None
|
||||
assert agenda.category == category_a
|
||||
assert agenda.events_type == events_type
|
||||
assert agenda.mark_event_checked_auto is False
|
||||
|
|
Loading…
Reference in New Issue