Projet

Général

Profil

0005-manager-default-view-for-events-agenda-44457.patch

Lauréline Guérin, 16 juillet 2020 10:56

Télécharger (7,43 ko)

Voir les différences:

Subject: [PATCH 5/5] manager: default view for events agenda (#44457)

 .../agendas/migrations/0051_default_view.py   | 24 +++++++++++++
 chrono/agendas/models.py                      |  6 ++++
 chrono/manager/forms.py                       | 12 ++++++-
 chrono/manager/views.py                       | 35 ++++++++++---------
 tests/test_manager.py                         | 22 +++++++++---
 5 files changed, 77 insertions(+), 22 deletions(-)
 create mode 100644 chrono/agendas/migrations/0051_default_view.py
chrono/agendas/migrations/0051_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='default_view',
17
            field=models.CharField(
18
                choices=[('month', 'Month view'), ('open_events', 'Open events')],
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_VIEWS = (
58
    ('month', _('Month view')),
59
    ('open_events', _('Open events')),
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
    default_view = models.CharField(_('Default view'), max_length=20, choices=AGENDA_VIEWS, default='month')
141 147

  
142 148
    class Meta:
143 149
        ordering = ['label']
chrono/manager/forms.py
61 61
class AgendaEditForm(AgendaAddForm):
62 62
    class Meta:
63 63
        model = Agenda
64
        fields = ['label', 'slug', 'edit_role', 'view_role', 'minimal_booking_delay', 'maximal_booking_delay']
64
        fields = [
65
            'label',
66
            'slug',
67
            'edit_role',
68
            'view_role',
69
            'minimal_booking_delay',
70
            'maximal_booking_delay',
71
            'default_view',
72
        ]
65 73

  
66 74
    def __init__(self, *args, **kwargs):
67 75
        super(AgendaEditForm, self).__init__(*args, **kwargs)
68 76
        if kwargs['instance'].kind != 'virtual':
69 77
            self.fields['minimal_booking_delay'].required = True
70 78
            self.fields['maximal_booking_delay'].required = True
79
        if kwargs['instance'].kind != 'events':
80
            del self.fields['default_view']
71 81

  
72 82

  
73 83
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 open events view
629
            if self.agenda.default_view == 'month':
630
                return redirect('chrono-manager-agenda-month-redirect-view', pk=self.agenda.pk)
631
            return redirect('chrono-manager-agenda-open-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.default_view = 'open_events'
161
    agenda.save()
162
    resp = app.get('/manage/agendas/%s/' % agenda.pk, status=302)
163
    assert resp.location.endswith('/manage/agendas/%s/events/open/' % 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 '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 'default_view' not in resp.context['form'].fields
737
    resp = app.get('/manage/agendas/%s/edit' % agenda_virtual.pk)
738
    assert '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
-