Projet

Général

Profil

0002-manager-option-to-apply-exceptions-to-all-desks-5582.patch

Lauréline Guérin, 10 août 2021 14:59

Télécharger (6,69 ko)

Voir les différences:

Subject: [PATCH 2/2] manager: option to apply exceptions to all desks (#55826)

 chrono/manager/forms.py         |  8 ++++
 chrono/manager/views.py         |  3 +-
 tests/manager/test_exception.py | 73 +++++++++++++++++++++++++++++++++
 3 files changed, 83 insertions(+), 1 deletion(-)
chrono/manager/forms.py
762 762
        required=False,
763 763
        help_text=_('URL to remote calendar which will be synchronised hourly.'),
764 764
    )
765
    all_desks = forms.BooleanField(label=_('Apply exceptions on all desks of the agenda'), required=False)
765 766

  
766 767
    class Meta:
767 768
        model = Desk
768 769
        fields = []
769 770

  
771
    def __init__(self, *args, **kwargs):
772
        super().__init__(*args, **kwargs)
773
        if self.instance.agenda.desk_set.count() == 1:
774
            del self.fields['all_desks']
775
        elif self.instance.agenda.desk_simple_management:
776
            del self.fields['all_desks']
777

  
770 778
    def clean(self, *args, **kwargs):
771 779
        cleaned_data = super().clean(*args, **kwargs)
772 780
        if not cleaned_data.get('ics_file') and not cleaned_data.get('ics_url'):
chrono/manager/views.py
2634 2634
    def form_valid(self, form):
2635 2635
        desk = self.get_object()
2636 2636
        sources = []
2637
        all_desks = form.cleaned_data.get('all_desks')
2637 2638
        try:
2638 2639
            with transaction.atomic():
2639
                if desk.agenda.desk_simple_management:
2640
                if all_desks or desk.agenda.desk_simple_management:
2640 2641
                    for _desk in desk.agenda.desk_set.all():
2641 2642
                        sources.append(self.import_file(_desk, form))
2642 2643
                else:
tests/manager/test_exception.py
781 781
    assert 'Failed to retrieve remote calendar (https://example.com/foo.ics, SSL error).' in resp.text
782 782

  
783 783

  
784
@mock.patch('chrono.agendas.models.requests.get')
785
def test_agenda_import_time_period_exception_url_desk_all_desks(mocked_get, app, admin_user):
786
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
787
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
788

  
789
    # only one desk: no option to apply to all desks
790
    app = login(app)
791
    resp = app.get('/manage/agendas/desk/%s/import-exceptions-from-ics/' % desk.pk)
792
    assert 'all_desks' not in resp.form.fields
793
    # more than one desk
794
    Desk.objects.create(agenda=agenda, label='Desk B')
795
    agenda2 = Agenda.objects.create(label='Foo bar', kind='meetings')
796
    Desk.objects.create(agenda=agenda2, label='Other Desk')  # check exceptions are not created for this one
797
    resp = app.get('/manage/agendas/desk/%s/import-exceptions-from-ics/' % desk.pk)
798
    resp.form['all_desks'] = True
799
    resp.form['ics_url'] = 'http://example.com/foo.ics'
800
    mocked_response = mock.Mock()
801
    mocked_response.text = """BEGIN:VCALENDAR
802
VERSION:2.0
803
PRODID:-//foo.bar//EN
804
BEGIN:VEVENT
805
DTSTART:20180101
806
DTEND:20180101
807
SUMMARY:New Year's Eve
808
END:VEVENT
809
END:VCALENDAR"""
810
    mocked_get.return_value = mocked_response
811
    resp = resp.form.submit(status=302)
812
    assert TimePeriodException.objects.count() == 2
813
    assert TimePeriodException.objects.filter(desk__slug='desk-a').exists()
814
    assert TimePeriodException.objects.filter(desk__slug='desk-b').exists()
815
    agenda = Agenda.objects.create(label='New Example', kind='meetings', desk_simple_management=True)
816
    desk = Desk.objects.create(agenda=agenda, label='New Desk')
817
    desk.duplicate()
818
    assert agenda.is_available_for_simple_management() is True
819

  
820

  
821
def test_agenda_import_time_period_exception_file_desk_all_desks(app, admin_user):
822
    agenda = Agenda.objects.create(label='Foo bar', kind='meetings')
823
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
824

  
825
    # only one desk: no option to apply to all desks
826
    app = login(app)
827
    resp = app.get('/manage/agendas/desk/%s/import-exceptions-from-ics/' % desk.pk)
828
    assert 'all_desks' not in resp.form.fields
829
    # more than one desk
830
    Desk.objects.create(agenda=agenda, label='Desk B')
831
    agenda2 = Agenda.objects.create(label='Foo bar', kind='meetings')
832
    Desk.objects.create(agenda=agenda2, label='Other Desk')  # check exceptions are not created for this one
833
    resp = app.get('/manage/agendas/desk/%s/import-exceptions-from-ics/' % desk.pk)
834
    resp.form['all_desks'] = True
835
    ics_exceptions = b"""BEGIN:VCALENDAR
836
VERSION:2.0
837
PRODID:-//foo.bar//EN
838
BEGIN:VEVENT
839
DTSTART:20180101
840
DTEND:20180101
841
SUMMARY:New Year's Eve
842
END:VEVENT
843
END:VCALENDAR"""
844
    resp.form['ics_file'] = Upload('exceptions.ics', ics_exceptions, 'text/calendar')
845
    resp = resp.form.submit(status=302)
846
    assert TimePeriodException.objects.count() == 2
847
    assert TimePeriodException.objects.filter(desk__slug='desk-a').exists()
848
    assert TimePeriodException.objects.filter(desk__slug='desk-b').exists()
849
    agenda = Agenda.objects.create(label='New Example', kind='meetings', desk_simple_management=True)
850
    desk = Desk.objects.create(agenda=agenda, label='New Desk')
851
    desk.duplicate()
852
    assert agenda.is_available_for_simple_management() is True
853

  
854

  
784 855
@mock.patch('chrono.agendas.models.requests.get')
785 856
def test_agenda_import_time_period_exception_url_desk_simple_management(mocked_get, app, admin_user):
786 857
    agenda = Agenda.objects.create(label='New Example', kind='meetings', desk_simple_management=True)
......
790 861

  
791 862
    login(app)
792 863
    resp = app.get('/manage/agendas/desk/%s/import-exceptions-from-ics/' % desk.pk)
864
    assert 'all_desks' not in resp.form.fields
793 865
    resp.form['ics_url'] = 'http://example.com/foo.ics'
794 866
    mocked_response = mock.Mock()
795 867
    mocked_response.text = """BEGIN:VCALENDAR
......
815 887

  
816 888
    login(app)
817 889
    resp = app.get('/manage/agendas/desk/%s/import-exceptions-from-ics/' % desk.pk)
890
    assert 'all_desks' not in resp.form.fields
818 891
    ics_exceptions = b"""BEGIN:VCALENDAR
819 892
VERSION:2.0
820 893
PRODID:-//foo.bar//EN
821
-