manager: default view for events agenda (#44457)

This commit is contained in:
Lauréline Guérin 2020-07-09 14:50:36 +02:00
parent e9fca76b10
commit 054f5c669e
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
5 changed files with 77 additions and 22 deletions

View File

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agendas', '0050_event_slug'),
]
operations = [
migrations.AddField(
model_name='agenda',
name='default_view',
field=models.CharField(
choices=[('month', 'Month view'), ('open_events', 'Open events')],
default='month',
max_length=20,
verbose_name='Default view',
),
),
]

View File

@ -54,6 +54,11 @@ AGENDA_KINDS = (
('virtual', _('Virtual')),
)
AGENDA_VIEWS = (
('month', _('Month view')),
('open_events', _('Open events')),
)
def is_midnight(dtime):
dtime = localtime(dtime)
@ -138,6 +143,7 @@ class Agenda(models.Model):
on_delete=models.SET_NULL,
)
resources = models.ManyToManyField('Resource')
default_view = models.CharField(_('Default view'), max_length=20, choices=AGENDA_VIEWS, default='month')
class Meta:
ordering = ['label']

View File

@ -61,13 +61,23 @@ class AgendaAddForm(forms.ModelForm):
class AgendaEditForm(AgendaAddForm):
class Meta:
model = Agenda
fields = ['label', 'slug', 'edit_role', 'view_role', 'minimal_booking_delay', 'maximal_booking_delay']
fields = [
'label',
'slug',
'edit_role',
'view_role',
'minimal_booking_delay',
'maximal_booking_delay',
'default_view',
]
def __init__(self, *args, **kwargs):
super(AgendaEditForm, self).__init__(*args, **kwargs)
if kwargs['instance'].kind != 'virtual':
self.fields['minimal_booking_delay'].required = True
self.fields['maximal_booking_delay'].required = True
if kwargs['instance'].kind != 'events':
del self.fields['default_view']
class ResourceAddForm(forms.ModelForm):

View File

@ -613,21 +613,6 @@ agenda_delete = AgendaDeleteView.as_view()
class AgendaView(ViewableAgendaMixin, View):
def get(self, request, *args, **kwargs):
if self.agenda.kind == 'virtual':
real_agendas = [
(agenda, agenda.can_be_viewed(request.user)) for agenda in self.agenda.real_agendas.all()
]
return TemplateResponse(
request=request,
template='chrono/manager_virtual_agenda_view.html',
context={
'real_agendas': real_agendas,
'agenda': self.agenda,
'object': self.agenda,
'user_can_manage': self.agenda.can_be_managed(self.request.user),
},
)
if self.agenda.kind == 'meetings':
# redirect to today view
today = datetime.date.today()
@ -640,7 +625,25 @@ class AgendaView(ViewableAgendaMixin, View):
)
if self.agenda.kind == 'events':
return redirect('chrono-manager-agenda-month-redirect-view', pk=self.agenda.pk)
# redirect to month or open events view
if self.agenda.default_view == 'month':
return redirect('chrono-manager-agenda-month-redirect-view', pk=self.agenda.pk)
return redirect('chrono-manager-agenda-open-events-view', pk=self.agenda.pk)
# virtual agenda
real_agendas = [
(agenda, agenda.can_be_viewed(request.user)) for agenda in self.agenda.real_agendas.all()
]
return TemplateResponse(
request=request,
template='chrono/manager_virtual_agenda_view.html',
context={
'real_agendas': real_agendas,
'agenda': self.agenda,
'object': self.agenda,
'user_can_manage': self.agenda.can_be_managed(self.request.user),
},
)
agenda_view = AgendaView.as_view()

View File

@ -157,6 +157,11 @@ def test_events_agenda_redirect(app, admin_user):
resp = app.get('/manage/agendas/%s/' % agenda.pk, status=302)
assert resp.location.endswith('/manage/agendas/%s/month/' % agenda.pk)
agenda.default_view = 'open_events'
agenda.save()
resp = app.get('/manage/agendas/%s/' % agenda.pk, status=302)
assert resp.location.endswith('/manage/agendas/%s/events/open/' % agenda.pk)
@freezegun.freeze_time('2020-07-12')
def test_events_agenda_month_redirect(app, admin_user):
@ -711,20 +716,27 @@ def test_add_agenda_as_manager(app, manager_user):
def test_options_agenda(app, admin_user):
agenda = Agenda(label=u'Foo bar')
agenda.save()
agenda_events = Agenda.objects.create(label=u'Foo bar', kind='events')
agenda_meetings = Agenda.objects.create(label=u'Foo bar', kind='meetings')
agenda_virtual = Agenda.objects.create(label=u'Foo bar', kind='virtual')
app = login(app)
resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
resp = resp.click('Options')
resp = app.get('/manage/agendas/%s/edit' % agenda_events.pk)
assert resp.form['label'].value == 'Foo bar'
resp.form['label'] = 'Foo baz'
assert 'default_view' in resp.context['form'].fields
resp = resp.form.submit()
assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.id)
assert resp.location.endswith('/manage/agendas/%s/settings' % agenda_events.pk)
resp = resp.follow()
assert 'has_resources' not in resp.context
assert 'Foo baz' in resp.text
assert '<h2>Settings' in resp.text
resp = app.get('/manage/agendas/%s/edit' % agenda_meetings.pk)
assert 'default_view' not in resp.context['form'].fields
resp = app.get('/manage/agendas/%s/edit' % agenda_virtual.pk)
assert 'default_view' not in resp.context['form'].fields
def test_options_agenda_cant_unset_delays(app, admin_user):
agenda = Agenda.objects.create(label=u'Foo bar')