Projet

Général

Profil

0003-agendas-add-date-field-to-time-period-70185.patch

Valentin Deniaud, 25 octobre 2022 10:53

Télécharger (5,21 ko)

Voir les différences:

Subject: [PATCH 3/7] agendas: add date field to time period (#70185)

 .../0140_add_timeperiod_date_field.py         | 50 +++++++++++++++++++
 chrono/agendas/models.py                      | 12 ++++-
 tests/test_time_periods.py                    | 29 +++++++++++
 3 files changed, 89 insertions(+), 2 deletions(-)
 create mode 100644 chrono/agendas/migrations/0140_add_timeperiod_date_field.py
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])
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
-