misc: improve string representation of time period exceptions (#18996)

This commit is contained in:
Frédéric Péters 2018-01-18 13:37:38 +01:00
parent 8eb2f3d5b6
commit 6b2d77ef88
2 changed files with 52 additions and 7 deletions

View File

@ -26,7 +26,6 @@ from django.core.exceptions import ValidationError
from django.core.urlresolvers import reverse
from django.db import models, transaction
from django.db.models import Q
from django.utils.dateformat import DateFormat
from django.utils.dates import WEEKDAYS
from django.utils.encoding import force_text
from django.utils.formats import date_format, get_format
@ -527,13 +526,29 @@ class TimePeriodException(models.Model):
ordering = ['start_datetime']
def __unicode__(self):
date_format = get_format('SHORT_DATETIME_FORMAT')
if is_midnight(self.start_datetime) or is_midnight(self.end_datetime):
date_format = get_format('SHORT_DATE_FORMAT')
exc_repr = u'%s%s' % (DateFormat(localtime(self.start_datetime)).format(date_format),
DateFormat(localtime(self.end_datetime)).format(date_format))
if is_midnight(self.start_datetime) and is_midnight(self.end_datetime):
# if both dates are at midnight don't include the time part
if self.end_datetime == self.start_datetime + datetime.timedelta(days=1):
# a single day
exc_repr = u'%s' % date_format(localtime(self.start_datetime), 'SHORT_DATE_FORMAT')
else:
exc_repr = u'%s%s' % (
date_format(localtime(self.start_datetime), 'SHORT_DATE_FORMAT'),
date_format(localtime(self.end_datetime), 'SHORT_DATE_FORMAT'))
else:
if localtime(self.start_datetime).date() == localtime(self.end_datetime).date():
# same day
exc_repr = u'%s%s' % (
date_format(localtime(self.start_datetime), 'SHORT_DATETIME_FORMAT'),
date_format(localtime(self.end_datetime), 'TIME_FORMAT'))
else:
exc_repr = u'%s%s' % (
date_format(localtime(self.start_datetime), 'SHORT_DATETIME_FORMAT'),
date_format(localtime(self.end_datetime), 'SHORT_DATETIME_FORMAT'))
if self.label:
exc_repr = u'%s (%s)' % (self.label, exc_repr)
return exc_repr
def clean(self):

View File

@ -1,9 +1,12 @@
# -*- coding: utf-8 -*-
import datetime
import pytest
from django.test import override_settings
from django.utils.timezone import make_aware
from chrono.agendas.models import Agenda, TimePeriod, MeetingType, Desk
from chrono.agendas.models import Agenda, TimePeriod, TimePeriodException, MeetingType, Desk
pytestmark = pytest.mark.django_db
@ -96,3 +99,30 @@ def test_timeperiod_time_slots():
assert events[0].start_datetime.timetuple()[:5] == (2016, 9, 3, 9, 0)
assert events[-1].start_datetime.timetuple()[:5] == (2016, 9, 24, 11, 30)
assert len(events) == 24
@override_settings(LANGUAGE_CODE='fr-fr')
def test_time_period_exception_as_string():
# single day
assert unicode(TimePeriodException(
start_datetime=make_aware(datetime.datetime(2018, 1, 18)),
end_datetime=make_aware(datetime.datetime(2018, 1, 19)))
) == u'18 jan. 2018'
# multiple full days
assert unicode(TimePeriodException(
start_datetime=make_aware(datetime.datetime(2018, 1, 18)),
end_datetime=make_aware(datetime.datetime(2018, 1, 20)))
) == u'18 jan. 2018 → 20 jan. 2018'
# a few hours in a day
assert unicode(TimePeriodException(
start_datetime=make_aware(datetime.datetime(2018, 1, 18, 10, 0)),
end_datetime=make_aware(datetime.datetime(2018, 1, 18, 12, 0)))
) == u'18 jan. 2018 10:00 → 12:00'
# multiple days and different times
assert unicode(TimePeriodException(
start_datetime=make_aware(datetime.datetime(2018, 1, 18, 10, 0)),
end_datetime=make_aware(datetime.datetime(2018, 1, 20, 12, 0)))
) == u'18 jan. 2018 10:00 → 20 jan. 2018 12:00'