manager: add widget to define time periods for multiple days at once (#25970)
This commit is contained in:
parent
d0d7c3de1e
commit
29b9bea43d
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in New Issue