Projet

Général

Profil

0007-manager-desk-display-with-desk_simple_management-fla.patch

Lauréline Guérin, 02 février 2021 14:32

Télécharger (12,6 ko)

Voir les différences:

Subject: [PATCH 07/11] manager: desk display with desk_simple_management flag
 (#48924)

 chrono/manager/forms.py                       |  16 +-
 .../manager_meetings_agenda_settings.html     |  21 ++-
 chrono/manager/views.py                       |  19 ++-
 tests/test_manager.py                         | 148 +++++++++++++-----
 4 files changed, 159 insertions(+), 45 deletions(-)
chrono/manager/forms.py
285 285

  
286 286
    def __init__(self, *args, **kwargs):
287 287
        super().__init__(*args, **kwargs)
288
        self.fields['copy_from'].queryset = Desk.objects.filter(agenda=self.instance.agenda)
288
        if self.instance.agenda.desk_simple_management:
289
            del self.fields['copy_from']
290
        else:
291
            self.fields['copy_from'].queryset = Desk.objects.filter(agenda=self.instance.agenda)
289 292

  
290 293
    def save(self):
291
        if self.cleaned_data['copy_from']:
294
        if self.instance.agenda.desk_simple_management:
295
            desk = self.instance.agenda.desk_set.first()
296
            if desk is not None:
297
                return desk.duplicate(label=self.cleaned_data['label'])
298
        elif self.cleaned_data['copy_from']:
292 299
            return self.cleaned_data['copy_from'].duplicate(label=self.cleaned_data['label'])
293
        return super().save()
300

  
301
        super().save()
302
        self.instance.import_timeperiod_exceptions_from_settings(enable=True)
303
        return self.instance
294 304

  
295 305

  
296 306
class DeskForm(forms.ModelForm):
chrono/manager/templates/chrono/manager_meetings_agenda_settings.html
52 52
</div>
53 53
</div>
54 54

  
55
{% if object.desk_simple_management %}
56
<div class="section">
57
<h3>{% trans 'Desks' %}</h3>
58
<div>
59
    <ul class="objects-list single-links">
60
        {% for desk in object.prefetched_desks %}
61
            <li><a rel="popup" href="{% url 'chrono-manager-desk-edit' pk=desk.pk %}">
62
                <strong>{{ desk.label }}</strong>
63
                </a>
64
               <a rel="popup" class="delete" href="{% url 'chrono-manager-desk-delete' pk=desk.pk %}">{% trans "remove" %}</a>
65
            </li>
66
        {% endfor %}
67
    </ul>
68
</div>
69
</div>
70
{% endif %}
71

  
55 72
<div class="section">
56 73
<h3>{% trans 'Time Periods' %}</h3>
57 74
<div>
58 75
    {% if object.prefetched_desks %}
59 76
    <div class="timeperiods">
60 77
        {% for desk in object.prefetched_desks %}
78
        {% if not object.desk_simple_management or object.desk_simple_management and forloop.counter == 1 %}
61 79
        <div class="timeperiod">
62 80
            {% url 'chrono-manager-agenda-add-time-period' agenda_pk=object.pk pk=desk.pk as add_time_period_url %}
63 81
            <ul class="objects-list single-links">
64
                {% if forloop.counter != 1 or forloop.revcounter != 1 %}
82
                {% if not object.desk_simple_management and object.prefetched_desks|length > 1 %}
65 83
                <li><a rel="popup" href="{% url 'chrono-manager-desk-edit' pk=desk.id %}">
66 84
                    <strong>{{ desk.label }}</strong>
67 85
                    </a>
......
91 109
                <li><a class="add" rel="popup" href="{{add_time_period_exception_url}}">{% trans 'Add a time period exception' %}</a></li>
92 110
            </ul>
93 111
        </div>
112
        {% endif %}
94 113
        {% endfor %}
95 114
    </div>
96 115
    {% else %}
chrono/manager/views.py
1925 1925
    template_name = 'chrono/manager_desk_form.html'
1926 1926
    model = Desk
1927 1927
    form_class = NewDeskForm
1928
    agenda = None
1928 1929

  
1929
    def form_valid(self, form):
1930
        self.object = form.save()
1931
        self.object.import_timeperiod_exceptions_from_settings(enable=True)
1932
        return HttpResponseRedirect(self.get_success_url())
1930
    def set_agenda(self, **kwargs):
1931
        self.agenda = get_object_or_404(Agenda, pk=kwargs.get('pk'), kind='meetings')
1933 1932

  
1934 1933

  
1935 1934
agenda_add_desk = AgendaAddDesk.as_view()
......
1940 1939
    model = Desk
1941 1940
    form_class = DeskForm
1942 1941

  
1942
    def get_queryset(self):
1943
        return super().get_queryset().filter(agenda__kind='meetings')
1944

  
1943 1945

  
1944 1946
desk_edit = DeskEditView.as_view()
1945 1947

  
......
1948 1950
    template_name = 'chrono/manager_confirm_delete.html'
1949 1951
    model = Desk
1950 1952

  
1953
    def dispatch(self, request, *args, **kwargs):
1954
        agenda = self.get_object().agenda
1955
        if agenda.desk_set.count() == 1:
1956
            raise Http404
1957
        return super().dispatch(request, *args, **kwargs)
1958

  
1959
    def get_queryset(self):
1960
        return super().get_queryset().filter(agenda__kind='meetings')
1961

  
1951 1962
    def get_context_data(self, **kwargs):
1952 1963
        context = super(DeskDeleteView, self).get_context_data(**kwargs)
1953 1964
        context['cannot_delete'] = Booking.objects.filter(
tests/test_manager.py
926 926
    source = default_desk.timeperiodexceptionsource_set.first()
927 927
    assert source.enabled
928 928

  
929
    resp = resp.click('New Desk')
929
    agenda.desk_simple_management = False
930
    agenda.save()
931
    resp = app.get('/manage/agendas/%s/add-desk' % agenda.pk)
930 932
    resp.form['label'] = 'Desk A'
931 933
    resp = resp.form.submit().follow()
932 934

  
......
2115 2117
    assert Desk.objects.count() == 1
2116 2118
    assert str(Desk.objects.first()) == 'Desk 1'
2117 2119
    agenda = Agenda.objects.get(slug='foo-bar')
2118
    MeetingType(agenda=agenda, label='Blah').save()
2120
    agenda.desk_simple_management = False
2121
    agenda.save()
2119 2122

  
2120 2123
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2121 2124
    resp = resp.click('New Desk')
......
2135 2138
    new_desk = Desk.objects.latest('pk')
2136 2139
    assert new_desk.timeperiod_set.count() == 0
2137 2140

  
2138
    resp = resp.click('Desk A', index=1)
2141
    # unknown pk
2142
    app.get('/manage/agendas/0/add-desk', status=404)
2143

  
2144
    # wrong kind
2145
    agenda.kind = 'virtual'
2146
    agenda.save()
2147
    app.get('/manage/agendas/%s/add-desk' % agenda.pk, status=404)
2148
    agenda.kind = 'events'
2149
    agenda.save()
2150
    app.get('/manage/agendas/%s/add-desk' % agenda.pk, status=404)
2151

  
2152

  
2153
@override_settings(
2154
    EXCEPTIONS_SOURCES={
2155
        'holidays': {'class': 'workalendar.europe.France', 'label': 'Holidays'},
2156
    }
2157
)
2158
def test_meetings_agenda_add_desk_from_another(app, admin_user):
2159
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
2160
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
2161
    TimePeriod.objects.create(
2162
        weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)
2163
    )
2164
    assert Desk.objects.count() == 1
2165
    assert desk.timeperiodexceptionsource_set.count() == 0
2166

  
2167
    app = login(app)
2168
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2169
    resp = resp.click('New Desk')
2139 2170
    resp.form['label'] = 'Desk B'
2171
    resp.form['copy_from'] = desk.pk
2140 2172
    resp = resp.form.submit().follow()
2141
    assert 'Desk A' in resp.text
2142
    assert 'Desk B' in resp.text
2173
    assert Desk.objects.count() == 2
2174
    new_desk = Desk.objects.latest('pk')
2175
    assert new_desk.label == 'Desk B'
2176
    assert new_desk.timeperiod_set.count() == 1
2177
    assert (
2178
        new_desk.timeperiodexceptionsource_set.count() == 0
2179
    )  # holidays not automatically added via duplication
2180

  
2181

  
2182
@override_settings(
2183
    EXCEPTIONS_SOURCES={
2184
        'holidays': {'class': 'workalendar.europe.France', 'label': 'Holidays'},
2185
    }
2186
)
2187
def test_meetings_agenda_add_desk_simple_management(app, admin_user):
2188
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings', desk_simple_management=True)
2189
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
2190
    TimePeriod.objects.create(
2191
        weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)
2192
    )
2193
    assert Desk.objects.count() == 1
2194
    assert desk.timeperiodexceptionsource_set.count() == 0
2195

  
2196
    app = login(app)
2197
    resp = app.get('/manage/agendas/%s/add-desk' % agenda.pk)
2198
    resp.form['label'] = 'Desk B'
2199
    assert 'copy_from' not in resp.context['form'].fields
2200
    resp = resp.form.submit().follow()
2201
    assert Desk.objects.count() == 2
2202
    new_desk = Desk.objects.latest('pk')
2203
    assert new_desk.label == 'Desk B'
2204
    assert new_desk.timeperiod_set.count() == 1
2205
    assert (
2206
        new_desk.timeperiodexceptionsource_set.count() == 0
2207
    )  # holidays not automatically added via duplication
2208

  
2209
    # ok if no desks (should not happen)
2210
    Desk.objects.all().delete()
2211
    resp = app.get('/manage/agendas/%s/add-desk' % agenda.pk)
2212
    resp.form['label'] = 'Desk'
2213
    assert 'copy_from' not in resp.context['form'].fields
2214
    resp = resp.form.submit().follow()
2215
    assert Desk.objects.count() == 1
2216
    new_desk = Desk.objects.latest('pk')
2217
    assert new_desk.timeperiodexceptionsource_set.count() == 1
2143 2218

  
2144 2219

  
2145 2220
def test_meetings_agenda_edit_desk(app, admin_user):
......
2168 2243
    resp = resp.form.submit()
2169 2244
    assert resp.context['form'].errors['slug'] == ['Another desk exists with the same identifier.']
2170 2245

  
2246
    # unknown pk
2247
    app.get('/manage/desks/0/edit', status=404)
2171 2248

  
2172
def test_meetings_agenda_add_desk_from_another(app, admin_user):
2173
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
2174
    desk = Desk.objects.create(agenda=agenda, label='Desk A')
2175
    TimePeriod.objects.create(
2176
        weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)
2177
    )
2178
    assert Desk.objects.count() == 1
2179

  
2180
    app = login(app)
2181
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2182
    resp = resp.click('New Desk')
2183
    resp.form['label'] = 'Desk B'
2184
    resp.form['copy_from'] = desk.pk
2185
    resp = resp.form.submit().follow()
2186
    assert Desk.objects.count() == 2
2187
    new_desk = Desk.objects.latest('pk')
2188
    assert new_desk.label == 'Desk B'
2189
    assert new_desk.timeperiod_set.count() == 1
2249
    # wrong kind
2250
    agenda.kind = 'virtual'
2251
    agenda.save()
2252
    app.get('/manage/desks/%s/edit' % desk.pk, status=404)
2253
    agenda.kind = 'events'
2254
    agenda.save()
2255
    app.get('/manage/desks/%s/edit' % desk.pk, status=404)
2190 2256

  
2191 2257

  
2192 2258
def test_meetings_agenda_delete_desk(app, admin_user):
2259
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
2260
    Desk.objects.create(agenda=agenda, label='Desk A')
2261
    desk_b = Desk.objects.create(agenda=agenda, label='Desk B')
2262

  
2193 2263
    app = login(app)
2194
    resp = app.get('/manage/', status=200)
2195
    resp = resp.click('New')
2196
    resp.form['label'] = 'Foo bar'
2197
    resp.form['kind'] = 'meetings'
2198
    resp = resp.form.submit()
2199
    assert Desk.objects.count() == 1
2200
    agenda = Agenda.objects.get(slug='foo-bar')
2201
    MeetingType(agenda=agenda, label='Blah').save()
2202 2264

  
2203 2265
    resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
2204
    resp = resp.click('New Desk')
2205
    resp.form['label'] = 'Desk A'
2206
    resp = resp.form.submit().follow()
2207
    assert Desk.objects.count() == 2
2208
    resp = resp.click('Desk A', index=0)
2266
    resp = resp.click('Desk A')
2209 2267
    resp = resp.click('Delete')
2210 2268
    resp = resp.form.submit()
2211
    assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.id)
2269
    assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.pk)
2212 2270
    assert Desk.objects.count() == 1
2213 2271

  
2272
    # only one desk
2273
    app.get('/manage/desks/%s/delete' % desk_b.pk, status=404)
2274

  
2275
    desk_a = Desk.objects.create(agenda=agenda, label='Desk A')
2276

  
2277
    # unknown pk
2278
    app.get('/manage/desks/0/delete', status=404)
2279

  
2280
    # wrong kind
2281
    agenda.kind = 'virtual'
2282
    agenda.save()
2283
    app.get('/manage/desks/%s/delete' % desk_a.pk, status=404)
2284
    agenda.kind = 'events'
2285
    agenda.save()
2286
    app.get('/manage/desks/%s/delete' % desk_a.pk, status=404)
2287

  
2214 2288

  
2215 2289
def test_meetings_agenda_add_time_period_exception(app, admin_user):
2216 2290
    agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
2217
-