manager: configure events type on agenda (#63286)

This commit is contained in:
Lauréline Guérin 2022-04-04 15:55:55 +02:00
parent e21a9560f9
commit a732e05a6f
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
5 changed files with 100 additions and 2 deletions

View File

@ -0,0 +1,27 @@
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agendas', '0115_events_type'),
]
operations = [
migrations.AlterModelOptions(
name='eventstype',
options={'ordering': ['label']},
),
migrations.AddField(
model_name='agenda',
name='events_type',
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name='agendas',
to='agendas.EventsType',
),
),
]

View File

@ -297,6 +297,9 @@ class Agenda(models.Model):
'event.remaining_places (remaining places), event.duration (duration), event.pricing (pricing).'
),
)
events_type = models.ForeignKey(
'agendas.EventsType', on_delete=models.CASCADE, related_name='agendas', null=True, blank=True
)
class Meta:
ordering = ['label']
@ -446,6 +449,7 @@ class Agenda(models.Model):
agenda['booking_check_filters'] = self.booking_check_filters
agenda['event_display_template'] = self.event_display_template
agenda['mark_event_checked_auto'] = self.mark_event_checked_auto
agenda['events_type'] = self.events_type.slug if self.events_type else None
elif self.kind == 'meetings':
agenda['meetingtypes'] = [x.export_json() for x in self.meetingtype_set.filter(deleted=False)]
agenda['desks'] = [desk.export_json() for desk in self.desk_set.all()]
@ -494,6 +498,11 @@ class Agenda(models.Model):
raise AgendaImportError(
_('Missing "%s" absence reasons group') % data['absence_reasons_group']
)
if data.get('events_type'):
try:
data['events_type'] = EventsType.objects.get(slug=data['events_type'])
except EventsType.DoesNotExist:
raise AgendaImportError(_('Missing "%s" events type') % data['events_type'])
agenda, created = cls.objects.update_or_create(slug=data['slug'], defaults=data)
if overwrite:
AgendaReminderSettings.objects.filter(agenda=agenda).delete()

View File

@ -117,6 +117,7 @@ class AgendaEditForm(forms.ModelForm):
'default_view',
'booking_form_url',
'event_display_template',
'events_type',
]
def __init__(self, *args, **kwargs):
@ -124,9 +125,13 @@ class AgendaEditForm(forms.ModelForm):
if kwargs['instance'].kind != 'events':
del self.fields['booking_form_url']
del self.fields['event_display_template']
del self.fields['events_type']
self.fields['default_view'].choices = [
(k, v) for k, v in self.fields['default_view'].choices if k != 'open_events'
]
else:
if not EventsType.objects.exists():
del self.fields['events_type']
class AgendaBookingDelaysForm(forms.ModelForm):

View File

@ -18,6 +18,7 @@ from chrono.agendas.models import (
Booking,
Desk,
Event,
EventsType,
MeetingType,
TimePeriod,
TimePeriodException,
@ -374,7 +375,7 @@ def test_options_agenda(app, admin_user):
agenda_events = Agenda.objects.create(label='Foo bar', kind='events')
Desk.objects.create(agenda=agenda_events, slug='_exceptions_holder')
agenda_meetings = Agenda.objects.create(label='Foo bar', kind='meetings')
Agenda.objects.create(label='Foo bar', kind='virtual')
agenda_virtual = Agenda.objects.create(label='Foo bar', kind='virtual')
app = login(app)
resp = app.get('/manage/agendas/%s/edit' % agenda_events.pk)
@ -408,10 +409,39 @@ def test_options_agenda(app, admin_user):
resp = app.get('/manage/agendas/%s/edit' % agenda_meetings.pk)
assert resp.form['default_view'].value == 'month'
assert 'open_events' not in [k for k, v in resp.context['form'].fields['default_view'].choices]
resp = app.get('/manage/agendas/%s/edit' % agenda_virtual.pk)
assert 'default_view' in resp.context['form'].fields
assert 'open_events' not in [k for k, v in resp.context['form'].fields['default_view'].choices]
assert 'booking_form_url' not in resp.context['form'].fields
assert 'event_display_template' not in resp.context['form'].fields
assert 'open_events' not in [k for k, v in resp.context['form'].fields['default_view'].choices]
def test_options_events_agenda_events_type(app, admin_user):
agenda = Agenda.objects.create(label='Foo bar', kind='events')
app = login(app)
resp = app.get('/manage/agendas/%s/edit' % agenda.pk)
assert 'events_type' not in resp.context['form'].fields
events_type = EventsType.objects.create(label='Foo', slug='foo')
resp = app.get('/manage/agendas/%s/edit' % agenda.pk)
assert 'events_type' in resp.context['form'].fields
resp.form['events_type'] = events_type.pk
resp.form.submit()
agenda.refresh_from_db()
assert agenda.events_type == events_type
# check kind
agenda.kind = 'meetings'
agenda.save()
resp = app.get('/manage/agendas/%s/edit' % agenda.pk)
assert 'events_type' not in resp.context['form'].fields
agenda.kind = 'virtual'
agenda.save()
resp = app.get('/manage/agendas/%s/edit' % agenda.pk)
assert 'events_type' not in resp.context['form'].fields
def test_options_events_agenda_delays(settings, app, admin_user):

View File

@ -458,6 +458,33 @@ def test_import_export_agenda_with_absence_reasons(app):
assert agenda.absence_reasons_group == group
def test_import_export_agenda_with_events_type(app):
events_type = EventsType.objects.create(label='foo')
agenda = Agenda.objects.create(label='Foo Bar', kind='events', events_type=events_type)
Desk.objects.create(agenda=agenda, slug='_exceptions_holder')
output = get_output_of_command('export_site')
import_site(data={}, clean=True)
assert Agenda.objects.count() == 0
assert EventsType.objects.count() == 0
data = json.loads(output)
del data['events_types']
with pytest.raises(AgendaImportError) as excinfo:
import_site(data, overwrite=True)
assert str(excinfo.value) == 'Missing "foo" events type'
EventsType.objects.create(label='foobar')
with pytest.raises(AgendaImportError) as excinfo:
import_site(data, overwrite=True)
assert str(excinfo.value) == 'Missing "foo" events type'
events_type = EventsType.objects.create(label='foo')
import_site(data, overwrite=True)
agenda = Agenda.objects.get(slug=agenda.slug)
assert agenda.events_type == events_type
def test_import_export_virtual_agenda(app):
virtual_agenda = Agenda.objects.create(label='Virtual Agenda', kind='virtual')
output = get_output_of_command('export_site')