manager: add widget to define time periods for multiple days at once (#25970)

This commit is contained in:
Frédéric Péters 2018-09-22 18:12:22 +02:00
parent d0d7c3de1e
commit 29b9bea43d
5 changed files with 71 additions and 9 deletions

View File

@ -28,7 +28,7 @@ from django.utils.timezone import make_aware
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from chrono.agendas.models import (Agenda, Event, MeetingType, TimePeriod, Desk, from chrono.agendas.models import (Agenda, Event, MeetingType, TimePeriod, Desk,
TimePeriodException) TimePeriodException, WEEKDAYS_LIST)
from . import widgets from . import widgets
@ -91,6 +91,15 @@ class MeetingTypeForm(forms.ModelForm):
exclude = [] exclude = []
class TimePeriodAddForm(forms.Form):
weekdays = forms.MultipleChoiceField(
label=_('Days'),
widget=widgets.WeekdaysWidget(),
choices=WEEKDAYS_LIST)
start_time = forms.TimeField(label=_('Start Time'), widget=widgets.TimeWidget())
end_time = forms.TimeField(label=_('End Time'), widget=widgets.TimeWidget())
class TimePeriodForm(forms.ModelForm): class TimePeriodForm(forms.ModelForm):
class Meta: class Meta:
model = TimePeriod model = TimePeriod

View File

@ -246,3 +246,16 @@ span.start-time {
top: 3ex; top: 3ex;
z-index: 100; z-index: 100;
} }
ul#id_weekdays {
margin: 0;
padding: 0;
list-style: none;
max-width: 42em;
li {
margin: 0;
padding: 0;
display: inline-block;
width: 10em;
}
}

View File

@ -37,7 +37,7 @@ from chrono.agendas.models import (Agenda, Event, MeetingType, TimePeriod,
from .forms import (AgendaAddForm, AgendaEditForm, EventForm, NewMeetingTypeForm, MeetingTypeForm, from .forms import (AgendaAddForm, AgendaEditForm, EventForm, NewMeetingTypeForm, MeetingTypeForm,
TimePeriodForm, ImportEventsForm, NewDeskForm, DeskForm, TimePeriodExceptionForm, TimePeriodForm, ImportEventsForm, NewDeskForm, DeskForm, TimePeriodExceptionForm,
ExceptionsImportForm, AgendasImportForm) ExceptionsImportForm, AgendasImportForm, TimePeriodAddForm)
from .utils import import_site from .utils import import_site
@ -621,10 +621,19 @@ class MeetingTypeDeleteView(ManagedAgendaSubobjectMixin, DeleteView):
meeting_type_delete = MeetingTypeDeleteView.as_view() meeting_type_delete = MeetingTypeDeleteView.as_view()
class AgendaAddTimePeriodView(ManagedDeskMixin, CreateView): class AgendaAddTimePeriodView(ManagedDeskMixin, FormView):
template_name = 'chrono/manager_time_period_form.html' template_name = 'chrono/manager_time_period_form.html'
model = TimePeriod form_class = TimePeriodAddForm
form_class = TimePeriodForm
def form_valid(self, form):
for weekday in form.cleaned_data.get('weekdays'):
period = TimePeriod(
weekday=weekday,
start_time=form.cleaned_data['start_time'],
end_time=form.cleaned_data['end_time'],
desk=self.desk)
period.save()
return super(AgendaAddTimePeriodView, self).form_valid(form)
agenda_add_time_period = AgendaAddTimePeriodView.as_view() agenda_add_time_period = AgendaAddTimePeriodView.as_view()

View File

@ -11,7 +11,7 @@ import json
import re import re
import uuid import uuid
from django.forms.widgets import DateTimeInput, DateInput, TimeInput from django.forms.widgets import DateTimeInput, DateInput, TimeInput, SelectMultiple
from django.utils.formats import get_language from django.utils.formats import get_language
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
@ -173,3 +173,25 @@ class TimeWidget(PickerWidgetMixin, TimeInput):
options['format'] = options.get('format', 'hh:ii') options['format'] = options.get('format', 'hh:ii')
super(TimeWidget, self).__init__(attrs, options, usel10n) super(TimeWidget, self).__init__(attrs, options, usel10n)
class WeekdaysWidget(SelectMultiple):
def render(self, name, value, attrs=None, choices=()):
s = []
value = value or []
for choice_id, choice_label in self.choices:
s.append('<li><label><input type="checkbox" '
' name="%(name)s-%(choice_id)s" %(checked)s>'
'<span>%(choice_label)s</span></label></li>' % {
'name': name,
'checked': 'checked' if choice_id in value else '',
'choice_id': choice_id,
'choice_label': choice_label})
return mark_safe('<ul id="%(id)s">' % attrs + '\n'.join(s) + '</ul>')
def value_from_datadict(self, data, files, name):
choices = []
for choice_id, choice_label in self.choices:
if data.get('%s-%s' % (name, choice_id)):
choices.append(choice_id)
return choices

View File

@ -650,7 +650,7 @@ def test_meetings_agenda_add_time_period(app, admin_user):
resp = app.get('/manage/agendas/%s/' % agenda.id, status=302).follow() resp = app.get('/manage/agendas/%s/' % agenda.id, status=302).follow()
resp = resp.click('Settings') resp = resp.click('Settings')
resp = resp.click('Add a time period') resp = resp.click('Add a time period')
resp.form['weekday'].select(text='Wednesday') resp.form['weekdays-2'].checked = True
resp.form['start_time'] = '10:00' resp.form['start_time'] = '10:00'
resp.form['end_time'] = '17:00' resp.form['end_time'] = '17:00'
resp = resp.form.submit() resp = resp.form.submit()
@ -663,7 +663,7 @@ def test_meetings_agenda_add_time_period(app, admin_user):
# add a second time period # add a second time period
resp = resp.click('Add a time period', index=0) resp = resp.click('Add a time period', index=0)
resp.form['weekday'].select(text='Monday') resp.form['weekdays-0'].checked = True
resp.form['start_time'] = '10:00' resp.form['start_time'] = '10:00'
resp.form['end_time'] = '13:00' resp.form['end_time'] = '13:00'
resp = resp.form.submit() resp = resp.form.submit()
@ -677,8 +677,17 @@ def test_meetings_agenda_add_time_period(app, admin_user):
assert 'Edit Time Period' in resp.text assert 'Edit Time Period' in resp.text
resp.form['start_time'] = '9:00' resp.form['start_time'] = '9:00'
resp = resp.form.submit() resp = resp.form.submit()
resp = resp.follow()
assert TimePeriod.objects.get(desk=desk, weekday=2).start_time.hour == 9 assert TimePeriod.objects.get(desk=desk, weekday=2).start_time.hour == 9
# and add same time periods on multiple days
resp = resp.click('Add a time period', index=0)
resp.form['weekdays-4'].checked = True
resp.form['weekdays-5'].checked = True
resp.form['start_time'] = '10:00'
resp.form['end_time'] = '13:00'
resp = resp.form.submit()
assert TimePeriod.objects.filter(desk=desk).count() == 4
def test_meetings_agenda_delete_time_period(app, admin_user): def test_meetings_agenda_delete_time_period(app, admin_user):
agenda = Agenda(label=u'Foo bar', kind='meetings') agenda = Agenda(label=u'Foo bar', kind='meetings')
@ -810,7 +819,7 @@ def test_meetings_agenda_add_time_period_exception(app, admin_user):
resp = resp.form.submit().follow() resp = resp.form.submit().follow()
# adding a new time period # adding a new time period
resp = resp.click('Add a time period') resp = resp.click('Add a time period')
resp.form['weekday'].select(text='Wednesday') resp.form['weekdays-2'].checked = True
resp.form['start_time'] = '10:00' resp.form['start_time'] = '10:00'
resp.form['end_time'] = '17:00' resp.form['end_time'] = '17:00'
resp = resp.form.submit().follow() resp = resp.form.submit().follow()