0003-agendas-add-date-field-to-time-period-70185.patch
chrono/agendas/migrations/0140_add_timeperiod_date_field.py | ||
---|---|---|
1 |
# Generated by Django 2.2.26 on 2022-10-13 13:46 |
|
2 | ||
3 |
from django.db import migrations, models |
|
4 | ||
5 | ||
6 |
class Migration(migrations.Migration): |
|
7 | ||
8 |
dependencies = [ |
|
9 |
('agendas', '0139_auto_20220726_1017'), |
|
10 |
] |
|
11 | ||
12 |
operations = [ |
|
13 |
migrations.AlterModelOptions( |
|
14 |
name='timeperiod', |
|
15 |
options={'ordering': ['weekday', 'date', 'start_time']}, |
|
16 |
), |
|
17 |
migrations.AddField( |
|
18 |
model_name='timeperiod', |
|
19 |
name='date', |
|
20 |
field=models.DateField(null=True, verbose_name='Date'), |
|
21 |
), |
|
22 |
migrations.AlterField( |
|
23 |
model_name='timeperiod', |
|
24 |
name='weekday', |
|
25 |
field=models.IntegerField( |
|
26 |
choices=[ |
|
27 |
(0, 'Monday'), |
|
28 |
(1, 'Tuesday'), |
|
29 |
(2, 'Wednesday'), |
|
30 |
(3, 'Thursday'), |
|
31 |
(4, 'Friday'), |
|
32 |
(5, 'Saturday'), |
|
33 |
(6, 'Sunday'), |
|
34 |
], |
|
35 |
null=True, |
|
36 |
verbose_name='Week day', |
|
37 |
), |
|
38 |
), |
|
39 |
migrations.AddConstraint( |
|
40 |
model_name='timeperiod', |
|
41 |
constraint=models.CheckConstraint( |
|
42 |
check=models.Q( |
|
43 |
models.Q(('date__isnull', True), ('weekday__isnull', False)), |
|
44 |
models.Q(('date__isnull', False), ('weekday__isnull', True)), |
|
45 |
_connector='OR', |
|
46 |
), |
|
47 |
name='date_xor_weekday', |
|
48 |
), |
|
49 |
), |
|
50 |
] |
chrono/agendas/models.py | ||
---|---|---|
1103 | 1103 | |
1104 | 1104 | |
1105 | 1105 |
class TimePeriod(models.Model): |
1106 |
weekday = models.IntegerField(_('Week day'), choices=WEEKDAYS_LIST) |
|
1106 |
weekday = models.IntegerField(_('Week day'), choices=WEEKDAYS_LIST, null=True)
|
|
1107 | 1107 |
weekday_indexes = ArrayField( |
1108 | 1108 |
models.IntegerField(choices=WEEK_CHOICES), |
1109 | 1109 |
verbose_name=_('Repeat'), |
1110 | 1110 |
blank=True, |
1111 | 1111 |
null=True, |
1112 | 1112 |
) |
1113 |
date = models.DateField(_('Date'), null=True) |
|
1113 | 1114 |
start_time = models.TimeField(_('Start')) |
1114 | 1115 |
end_time = models.TimeField(_('End')) |
1115 | 1116 |
desk = models.ForeignKey('Desk', on_delete=models.CASCADE, null=True) |
... | ... | |
1118 | 1119 |
) |
1119 | 1120 | |
1120 | 1121 |
class Meta: |
1121 |
ordering = ['weekday', 'start_time'] |
|
1122 |
ordering = ['weekday', 'date', 'start_time'] |
|
1123 |
constraints = [ |
|
1124 |
models.CheckConstraint( |
|
1125 |
check=Q(date__isnull=True, weekday__isnull=False) |
|
1126 |
| Q(date__isnull=False, weekday__isnull=True), |
|
1127 |
name='date_xor_weekday', |
|
1128 |
) |
|
1129 |
] |
|
1122 | 1130 | |
1123 | 1131 |
def __str__(self): |
1124 | 1132 |
label = force_str(WEEKDAYS[self.weekday]) |
... | ... | |
1153 | 1161 |
return { |
1154 | 1162 |
'weekday': self.weekday, |
1155 | 1163 |
'weekday_indexes': self.weekday_indexes, |
1164 |
'date': self.date.strftime('%Y-%m-%d') if self.date else None, |
|
1156 | 1165 |
'start_time': self.start_time.strftime('%H:%M'), |
1157 | 1166 |
'end_time': self.end_time.strftime('%H:%M'), |
1158 | 1167 |
} |
tests/test_import_export.py | ||
---|---|---|
63 | 63 |
TimePeriod.objects.create( |
64 | 64 |
desk=desk, weekday=2, start_time=tpx_start.time(), end_time=tpx_end.time(), weekday_indexes=[1, 3] |
65 | 65 |
) |
66 |
TimePeriod.objects.create( |
|
67 |
desk=desk, date=datetime.date(2022, 10, 24), start_time=tpx_start.time(), end_time=tpx_end.time() |
|
68 |
) |
|
66 | 69 | |
67 | 70 |
output = get_output_of_command('export_site') |
68 | 71 |
assert len(json.loads(output)['agendas']) == 2 |
... | ... | |
92 | 95 |
assert TimePeriodException.objects.get(desk__agenda__kind='meetings').end_datetime == tpx_end |
93 | 96 |
assert TimePeriodException.objects.get(desk__agenda__kind='events').start_datetime == tpx_start |
94 | 97 |
assert TimePeriodException.objects.get(desk__agenda__kind='events').end_datetime == tpx_end |
95 |
assert TimePeriod.objects.get().weekday_indexes == [1, 3] |
|
98 |
assert TimePeriod.objects.filter(weekday_indexes=[1, 3]).count() == 1 |
|
99 |
assert TimePeriod.objects.filter(date=datetime.date(2022, 10, 24)).count() == 1 |
|
96 | 100 | |
97 | 101 |
agenda1 = Agenda.objects.get(label='Events Agenda') |
98 | 102 |
agenda2 = Agenda.objects.get(label='Meetings Agenda') |
tests/test_time_periods.py | ||
---|---|---|
1 | 1 |
import datetime |
2 | 2 | |
3 | 3 |
import pytest |
4 |
from django.db import IntegrityError, transaction |
|
4 | 5 |
from django.db.models import Q |
5 | 6 |
from django.test import override_settings |
6 | 7 |
from django.utils.encoding import force_str |
... | ... | |
391 | 392 |
events = get_events(datetime.datetime(2022, 5, 1), datetime.datetime(2022, 6, 1)) |
392 | 393 |
assert events[0].timetuple()[:5] == (2022, 5, 30, 22, 0) |
393 | 394 |
assert len(events) == 1 |
395 | ||
396 | ||
397 |
def test_time_period_check_constraint(): |
|
398 |
TimePeriod.objects.create( |
|
399 |
weekday=0, start_time=datetime.time(hour=1, minute=0), end_time=datetime.time(hour=2, minute=0) |
|
400 |
) |
|
401 |
TimePeriod.objects.create( |
|
402 |
date=datetime.date.today(), |
|
403 |
start_time=datetime.time(hour=1, minute=0), |
|
404 |
end_time=datetime.time(hour=2, minute=0), |
|
405 |
) |
|
406 | ||
407 |
# missing weekday or date |
|
408 |
with pytest.raises(IntegrityError): |
|
409 |
with transaction.atomic(): |
|
410 |
TimePeriod.objects.create( |
|
411 |
start_time=datetime.time(hour=1, minute=0), end_time=datetime.time(hour=2, minute=0) |
|
412 |
) |
|
413 | ||
414 |
# both weekday and date |
|
415 |
with pytest.raises(IntegrityError): |
|
416 |
with transaction.atomic(): |
|
417 |
TimePeriod.objects.create( |
|
418 |
weekday=0, |
|
419 |
date=datetime.date.today(), |
|
420 |
start_time=datetime.time(hour=1, minute=0), |
|
421 |
end_time=datetime.time(hour=2, minute=0), |
|
422 |
) |
|
394 |
- |