manager: desk display with desk_simple_management flag (#48924)

This commit is contained in:
Lauréline Guérin 2021-01-26 15:50:34 +01:00
parent 9b28d53a02
commit 791ed47aff
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
4 changed files with 158 additions and 45 deletions

View File

@ -285,12 +285,22 @@ class NewDeskForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['copy_from'].queryset = Desk.objects.filter(agenda=self.instance.agenda)
if self.instance.agenda.desk_simple_management:
del self.fields['copy_from']
else:
self.fields['copy_from'].queryset = Desk.objects.filter(agenda=self.instance.agenda)
def save(self):
if self.cleaned_data['copy_from']:
if self.instance.agenda.desk_simple_management:
desk = self.instance.agenda.desk_set.first()
if desk is not None:
return desk.duplicate(label=self.cleaned_data['label'])
elif self.cleaned_data['copy_from']:
return self.cleaned_data['copy_from'].duplicate(label=self.cleaned_data['label'])
return super().save()
super().save()
self.instance.import_timeperiod_exceptions_from_settings(enable=True)
return self.instance
class DeskForm(forms.ModelForm):

View File

@ -54,16 +54,33 @@
</div>
</div>
{% if object.desk_simple_management %}
<div class="section">
<h3>{% trans 'Desks' %}</h3>
<div>
<ul class="objects-list single-links">
{% for desk in object.prefetched_desks %}
<li>
<a rel="popup" href="{% url 'chrono-manager-desk-edit' pk=desk.pk %}">{{ desk.label }}</a>
<a rel="popup" class="delete" href="{% url 'chrono-manager-desk-delete' pk=desk.pk %}">{% trans "remove" %}</a>
</li>
{% endfor %}
</ul>
</div>
</div>
{% endif %}
<div class="section">
<h3>{% trans 'Time Periods' %}</h3>
<div>
{% if object.prefetched_desks %}
<div class="timeperiods">
{% for desk in object.prefetched_desks %}
{% if not object.desk_simple_management or object.desk_simple_management and forloop.counter == 1 %}
<div class="timeperiod">
{% url 'chrono-manager-agenda-add-time-period' agenda_pk=object.pk pk=desk.pk as add_time_period_url %}
<ul class="objects-list single-links">
{% if forloop.counter != 1 or forloop.revcounter != 1 %}
{% if not object.desk_simple_management and object.prefetched_desks|length > 1 %}
<li><a rel="popup" href="{% url 'chrono-manager-desk-edit' pk=desk.id %}">
<strong>{{ desk.label }}</strong>
</a>
@ -93,6 +110,7 @@
<li><a class="add" rel="popup" href="{{add_time_period_exception_url}}">{% trans 'Add a time period exception' %}</a></li>
</ul>
</div>
{% endif %}
{% endfor %}
</div>
{% else %}

View File

@ -1925,11 +1925,10 @@ class AgendaAddDesk(ManagedAgendaMixin, CreateView):
template_name = 'chrono/manager_desk_form.html'
model = Desk
form_class = NewDeskForm
agenda = None
def form_valid(self, form):
self.object = form.save()
self.object.import_timeperiod_exceptions_from_settings(enable=True)
return HttpResponseRedirect(self.get_success_url())
def set_agenda(self, **kwargs):
self.agenda = get_object_or_404(Agenda, pk=kwargs.get('pk'), kind='meetings')
agenda_add_desk = AgendaAddDesk.as_view()
@ -1940,6 +1939,9 @@ class DeskEditView(ManagedAgendaSubobjectMixin, UpdateView):
model = Desk
form_class = DeskForm
def get_queryset(self):
return super().get_queryset().filter(agenda__kind='meetings')
desk_edit = DeskEditView.as_view()
@ -1948,6 +1950,15 @@ class DeskDeleteView(ManagedAgendaSubobjectMixin, DeleteView):
template_name = 'chrono/manager_confirm_delete.html'
model = Desk
def dispatch(self, request, *args, **kwargs):
agenda = self.get_object().agenda
if agenda.desk_set.count() == 1:
raise Http404
return super().dispatch(request, *args, **kwargs)
def get_queryset(self):
return super().get_queryset().filter(agenda__kind='meetings')
def get_context_data(self, **kwargs):
context = super(DeskDeleteView, self).get_context_data(**kwargs)
context['cannot_delete'] = Booking.objects.filter(

View File

@ -926,7 +926,9 @@ def test_add_agenda_exceptions_from_settings(app, admin_user):
source = default_desk.timeperiodexceptionsource_set.first()
assert source.enabled
resp = resp.click('New Desk')
agenda.desk_simple_management = False
agenda.save()
resp = app.get('/manage/agendas/%s/add-desk' % agenda.pk)
resp.form['label'] = 'Desk A'
resp = resp.form.submit().follow()
@ -2115,7 +2117,8 @@ def test_meetings_agenda_add_desk(app, admin_user):
assert Desk.objects.count() == 1
assert str(Desk.objects.first()) == 'Desk 1'
agenda = Agenda.objects.get(slug='foo-bar')
MeetingType(agenda=agenda, label='Blah').save()
agenda.desk_simple_management = False
agenda.save()
resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
resp = resp.click('New Desk')
@ -2135,11 +2138,83 @@ def test_meetings_agenda_add_desk(app, admin_user):
new_desk = Desk.objects.latest('pk')
assert new_desk.timeperiod_set.count() == 0
resp = resp.click('Desk A', index=1)
# unknown pk
app.get('/manage/agendas/0/add-desk', status=404)
# wrong kind
agenda.kind = 'virtual'
agenda.save()
app.get('/manage/agendas/%s/add-desk' % agenda.pk, status=404)
agenda.kind = 'events'
agenda.save()
app.get('/manage/agendas/%s/add-desk' % agenda.pk, status=404)
@override_settings(
EXCEPTIONS_SOURCES={
'holidays': {'class': 'workalendar.europe.France', 'label': 'Holidays'},
}
)
def test_meetings_agenda_add_desk_from_another(app, admin_user):
agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
desk = Desk.objects.create(agenda=agenda, label='Desk A')
TimePeriod.objects.create(
weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)
)
assert Desk.objects.count() == 1
assert desk.timeperiodexceptionsource_set.count() == 0
app = login(app)
resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
resp = resp.click('New Desk')
resp.form['label'] = 'Desk B'
resp.form['copy_from'] = desk.pk
resp = resp.form.submit().follow()
assert 'Desk A' in resp.text
assert 'Desk B' in resp.text
assert Desk.objects.count() == 2
new_desk = Desk.objects.latest('pk')
assert new_desk.label == 'Desk B'
assert new_desk.timeperiod_set.count() == 1
assert (
new_desk.timeperiodexceptionsource_set.count() == 0
) # holidays not automatically added via duplication
@override_settings(
EXCEPTIONS_SOURCES={
'holidays': {'class': 'workalendar.europe.France', 'label': 'Holidays'},
}
)
def test_meetings_agenda_add_desk_simple_management(app, admin_user):
agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings', desk_simple_management=True)
desk = Desk.objects.create(agenda=agenda, label='Desk A')
TimePeriod.objects.create(
weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)
)
assert Desk.objects.count() == 1
assert desk.timeperiodexceptionsource_set.count() == 0
app = login(app)
resp = app.get('/manage/agendas/%s/add-desk' % agenda.pk)
resp.form['label'] = 'Desk B'
assert 'copy_from' not in resp.context['form'].fields
resp = resp.form.submit().follow()
assert Desk.objects.count() == 2
new_desk = Desk.objects.latest('pk')
assert new_desk.label == 'Desk B'
assert new_desk.timeperiod_set.count() == 1
assert (
new_desk.timeperiodexceptionsource_set.count() == 0
) # holidays not automatically added via duplication
# ok if no desks (should not happen)
Desk.objects.all().delete()
resp = app.get('/manage/agendas/%s/add-desk' % agenda.pk)
resp.form['label'] = 'Desk'
assert 'copy_from' not in resp.context['form'].fields
resp = resp.form.submit().follow()
assert Desk.objects.count() == 1
new_desk = Desk.objects.latest('pk')
assert new_desk.timeperiodexceptionsource_set.count() == 1
def test_meetings_agenda_edit_desk(app, admin_user):
@ -2168,49 +2243,48 @@ def test_meetings_agenda_edit_desk(app, admin_user):
resp = resp.form.submit()
assert resp.context['form'].errors['slug'] == ['Another desk exists with the same identifier.']
# unknown pk
app.get('/manage/desks/0/edit', status=404)
def test_meetings_agenda_add_desk_from_another(app, admin_user):
agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
desk = Desk.objects.create(agenda=agenda, label='Desk A')
TimePeriod.objects.create(
weekday=1, desk=desk, start_time=datetime.time(10, 0), end_time=datetime.time(12, 0)
)
assert Desk.objects.count() == 1
app = login(app)
resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
resp = resp.click('New Desk')
resp.form['label'] = 'Desk B'
resp.form['copy_from'] = desk.pk
resp = resp.form.submit().follow()
assert Desk.objects.count() == 2
new_desk = Desk.objects.latest('pk')
assert new_desk.label == 'Desk B'
assert new_desk.timeperiod_set.count() == 1
# wrong kind
agenda.kind = 'virtual'
agenda.save()
app.get('/manage/desks/%s/edit' % desk.pk, status=404)
agenda.kind = 'events'
agenda.save()
app.get('/manage/desks/%s/edit' % desk.pk, status=404)
def test_meetings_agenda_delete_desk(app, admin_user):
agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')
Desk.objects.create(agenda=agenda, label='Desk A')
desk_b = Desk.objects.create(agenda=agenda, label='Desk B')
app = login(app)
resp = app.get('/manage/', status=200)
resp = resp.click('New')
resp.form['label'] = 'Foo bar'
resp.form['kind'] = 'meetings'
resp = resp.form.submit()
assert Desk.objects.count() == 1
agenda = Agenda.objects.get(slug='foo-bar')
MeetingType(agenda=agenda, label='Blah').save()
resp = app.get('/manage/agendas/%s/settings' % agenda.pk)
resp = resp.click('New Desk')
resp.form['label'] = 'Desk A'
resp = resp.form.submit().follow()
assert Desk.objects.count() == 2
resp = resp.click('Desk A', index=0)
resp = resp.click('Desk A')
resp = resp.click('Delete')
resp = resp.form.submit()
assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.id)
assert resp.location.endswith('/manage/agendas/%s/settings' % agenda.pk)
assert Desk.objects.count() == 1
# only one desk
app.get('/manage/desks/%s/delete' % desk_b.pk, status=404)
desk_a = Desk.objects.create(agenda=agenda, label='Desk A')
# unknown pk
app.get('/manage/desks/0/delete', status=404)
# wrong kind
agenda.kind = 'virtual'
agenda.save()
app.get('/manage/desks/%s/delete' % desk_a.pk, status=404)
agenda.kind = 'events'
agenda.save()
app.get('/manage/desks/%s/delete' % desk_a.pk, status=404)
def test_meetings_agenda_add_time_period_exception(app, admin_user):
agenda = Agenda.objects.create(label=u'Foo bar', kind='meetings')