0005-manager-default-view-for-events-agenda-44457.patch
chrono/agendas/migrations/0051_events_default_view.py | ||
---|---|---|
1 |
# -*- coding: utf-8 -*- |
|
2 |
from __future__ import unicode_literals |
|
3 | ||
4 |
from django.db import migrations, models |
|
5 | ||
6 | ||
7 |
class Migration(migrations.Migration): |
|
8 | ||
9 |
dependencies = [ |
|
10 |
('agendas', '0050_event_slug'), |
|
11 |
] |
|
12 | ||
13 |
operations = [ |
|
14 |
migrations.AddField( |
|
15 |
model_name='agenda', |
|
16 |
name='events_default_view', |
|
17 |
field=models.CharField( |
|
18 |
choices=[('month', 'Month view'), ('opened_events', 'Opened events view')], |
|
19 |
default='month', |
|
20 |
max_length=20, |
|
21 |
verbose_name='Default view', |
|
22 |
), |
|
23 |
), |
|
24 |
] |
chrono/agendas/models.py | ||
---|---|---|
54 | 54 |
('virtual', _('Virtual')), |
55 | 55 |
) |
56 | 56 | |
57 |
AGENDA_EVENTS_VIEWS = ( |
|
58 |
('month', _('Month view')), |
|
59 |
('opened_events', _('Opened events view')), |
|
60 |
) |
|
61 | ||
57 | 62 | |
58 | 63 |
def is_midnight(dtime): |
59 | 64 |
dtime = localtime(dtime) |
... | ... | |
138 | 143 |
on_delete=models.SET_NULL, |
139 | 144 |
) |
140 | 145 |
resources = models.ManyToManyField('Resource') |
146 |
events_default_view = models.CharField( |
|
147 |
_('Default view'), max_length=20, choices=AGENDA_EVENTS_VIEWS, default='month' |
|
148 |
) |
|
141 | 149 | |
142 | 150 |
class Meta: |
143 | 151 |
ordering = ['label'] |
chrono/manager/forms.py | ||
---|---|---|
60 | 60 |
class AgendaEditForm(AgendaAddForm): |
61 | 61 |
class Meta: |
62 | 62 |
model = Agenda |
63 |
fields = ['label', 'slug', 'edit_role', 'view_role', 'minimal_booking_delay', 'maximal_booking_delay'] |
|
63 |
fields = [ |
|
64 |
'label', |
|
65 |
'slug', |
|
66 |
'edit_role', |
|
67 |
'view_role', |
|
68 |
'minimal_booking_delay', |
|
69 |
'maximal_booking_delay', |
|
70 |
'events_default_view', |
|
71 |
] |
|
64 | 72 | |
65 | 73 |
def __init__(self, *args, **kwargs): |
66 | 74 |
super(AgendaEditForm, self).__init__(*args, **kwargs) |
67 | 75 |
if kwargs['instance'].kind != 'virtual': |
68 | 76 |
self.fields['minimal_booking_delay'].required = True |
69 | 77 |
self.fields['maximal_booking_delay'].required = True |
78 |
if kwargs['instance'].kind != 'events': |
|
79 |
del self.fields['events_default_view'] |
|
70 | 80 | |
71 | 81 | |
72 | 82 |
class ResourceAddForm(forms.ModelForm): |
chrono/manager/views.py | ||
---|---|---|
613 | 613 | |
614 | 614 |
class AgendaView(ViewableAgendaMixin, View): |
615 | 615 |
def get(self, request, *args, **kwargs): |
616 |
if self.agenda.kind == 'virtual': |
|
617 |
real_agendas = [ |
|
618 |
(agenda, agenda.can_be_viewed(request.user)) for agenda in self.agenda.real_agendas.all() |
|
619 |
] |
|
620 |
return TemplateResponse( |
|
621 |
request=request, |
|
622 |
template='chrono/manager_virtual_agenda_view.html', |
|
623 |
context={ |
|
624 |
'real_agendas': real_agendas, |
|
625 |
'agenda': self.agenda, |
|
626 |
'object': self.agenda, |
|
627 |
'user_can_manage': self.agenda.can_be_managed(self.request.user), |
|
628 |
}, |
|
629 |
) |
|
630 | ||
631 | 616 |
if self.agenda.kind == 'meetings': |
632 | 617 |
# redirect to today view |
633 | 618 |
today = datetime.date.today() |
... | ... | |
640 | 625 |
) |
641 | 626 | |
642 | 627 |
if self.agenda.kind == 'events': |
643 |
return redirect('chrono-manager-agenda-month-redirect-view', pk=self.agenda.pk) |
|
628 |
# redirect to month or opened events view |
|
629 |
if self.agenda.events_default_view == 'month': |
|
630 |
return redirect('chrono-manager-agenda-month-redirect-view', pk=self.agenda.pk) |
|
631 |
return redirect('chrono-manager-agenda-opened-events-view', pk=self.agenda.pk) |
|
632 | ||
633 |
# virtual agenda |
|
634 |
real_agendas = [ |
|
635 |
(agenda, agenda.can_be_viewed(request.user)) for agenda in self.agenda.real_agendas.all() |
|
636 |
] |
|
637 |
return TemplateResponse( |
|
638 |
request=request, |
|
639 |
template='chrono/manager_virtual_agenda_view.html', |
|
640 |
context={ |
|
641 |
'real_agendas': real_agendas, |
|
642 |
'agenda': self.agenda, |
|
643 |
'object': self.agenda, |
|
644 |
'user_can_manage': self.agenda.can_be_managed(self.request.user), |
|
645 |
}, |
|
646 |
) |
|
644 | 647 | |
645 | 648 | |
646 | 649 |
agenda_view = AgendaView.as_view() |
tests/test_manager.py | ||
---|---|---|
157 | 157 |
resp = app.get('/manage/agendas/%s/' % agenda.pk, status=302) |
158 | 158 |
assert resp.location.endswith('/manage/agendas/%s/month/' % agenda.pk) |
159 | 159 | |
160 |
agenda.events_default_view = 'opened_events' |
|
161 |
agenda.save() |
|
162 |
resp = app.get('/manage/agendas/%s/' % agenda.pk, status=302) |
|
163 |
assert resp.location.endswith('/manage/agendas/%s/events/opened/' % agenda.pk) |
|
164 | ||
160 | 165 | |
161 | 166 |
@freezegun.freeze_time('2020-07-12') |
162 | 167 |
def test_events_agenda_month_redirect(app, admin_user): |
... | ... | |
711 | 716 | |
712 | 717 | |
713 | 718 |
def test_options_agenda(app, admin_user): |
714 |
agenda = Agenda(label=u'Foo bar') |
|
715 |
agenda.save() |
|
719 |
agenda_events = Agenda.objects.create(label=u'Foo bar', kind='events') |
|
720 |
agenda_meetings = Agenda.objects.create(label=u'Foo bar', kind='meetings') |
|
721 |
agenda_virtual = Agenda.objects.create(label=u'Foo bar', kind='virtual') |
|
722 | ||
716 | 723 |
app = login(app) |
717 |
resp = app.get('/manage/agendas/%s/settings' % agenda.pk) |
|
718 |
resp = resp.click('Options') |
|
724 |
resp = app.get('/manage/agendas/%s/edit' % agenda_events.pk) |
|
719 | 725 |
assert resp.form['label'].value == 'Foo bar' |
720 | 726 |
resp.form['label'] = 'Foo baz' |
727 |
assert 'events_default_view' in resp.context['form'].fields |
|
721 | 728 |
resp = resp.form.submit() |
722 |
assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.id)
|
|
729 |
assert resp.location.endswith('/manage/agendas/%s/settings' % agenda_events.pk)
|
|
723 | 730 |
resp = resp.follow() |
724 | 731 |
assert 'has_resources' not in resp.context |
725 | 732 |
assert 'Foo baz' in resp.text |
726 | 733 |
assert '<h2>Settings' in resp.text |
727 | 734 | |
735 |
resp = app.get('/manage/agendas/%s/edit' % agenda_meetings.pk) |
|
736 |
assert 'events_default_view' not in resp.context['form'].fields |
|
737 |
resp = app.get('/manage/agendas/%s/edit' % agenda_virtual.pk) |
|
738 |
assert 'events_default_view' not in resp.context['form'].fields |
|
739 | ||
728 | 740 | |
729 | 741 |
def test_options_agenda_cant_unset_delays(app, admin_user): |
730 | 742 |
agenda = Agenda.objects.create(label=u'Foo bar') |
731 |
- |