Projet

Général

Profil

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

Lauréline Guérin, 09 juillet 2020 14:51

Télécharger (7,58 ko)

Voir les différences:

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

 .../migrations/0051_events_default_view.py    | 24 +++++++++++++
 chrono/agendas/models.py                      |  8 +++++
 chrono/manager/forms.py                       | 12 ++++++-
 chrono/manager/views.py                       | 35 ++++++++++---------
 tests/test_manager.py                         | 22 +++++++++---
 5 files changed, 79 insertions(+), 22 deletions(-)
 create mode 100644 chrono/agendas/migrations/0051_events_default_view.py
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
-