Projet

Général

Profil

0001-agendas-add-event-recurrence-end-date-51218.patch

Valentin Deniaud, 17 février 2021 14:30

Télécharger (5,22 ko)

Voir les différences:

Subject: [PATCH 1/2] agendas: add event recurrence end date (#51218)

 .../0076_event_recurrence_end_date.py         | 20 +++++++++++++++++++
 chrono/agendas/models.py                      |  9 +++++++++
 chrono/manager/forms.py                       |  2 ++
 tests/test_agendas.py                         | 20 +++++++++++++++++++
 4 files changed, 51 insertions(+)
 create mode 100644 chrono/agendas/migrations/0076_event_recurrence_end_date.py
chrono/agendas/migrations/0076_event_recurrence_end_date.py
1
# -*- coding: utf-8 -*-
2
# Generated by Django 1.11.18 on 2021-02-16 15:10
3
from __future__ import unicode_literals
4

  
5
from django.db import migrations, models
6

  
7

  
8
class Migration(migrations.Migration):
9

  
10
    dependencies = [
11
        ('agendas', '0075_auto_20210216_1553'),
12
    ]
13

  
14
    operations = [
15
        migrations.AddField(
16
            model_name='event',
17
            name='recurrence_end_date',
18
            field=models.DateField(blank=True, null=True, verbose_name='Recurrence end date'),
19
        ),
20
    ]
chrono/agendas/models.py
1025 1025
    start_datetime = models.DateTimeField(_('Date/time'))
1026 1026
    repeat = models.CharField(_('Repeat'), max_length=16, blank=True, choices=REPEAT_CHOICES)
1027 1027
    recurrence_rule = JSONField(_('Recurrence rule'), null=True)
1028
    recurrence_end_date = models.DateField(_('Recurrence end date'), null=True, blank=True)
1028 1029
    primary_event = models.ForeignKey('self', null=True, on_delete=models.CASCADE, related_name='recurrences')
1029 1030
    duration = models.PositiveIntegerField(_('Duration (in minutes)'), default=None, null=True, blank=True)
1030 1031
    publication_date = models.DateField(_('Publication date'), blank=True, null=True)
......
1201 1202
        event.save()
1202 1203

  
1203 1204
    def export_json(self):
1205
        recurrence_end_date = (
1206
            self.recurrence_end_date.strftime('%Y-%m-%d') if self.recurrence_end_date else None
1207
        )
1204 1208
        return {
1205 1209
            'start_datetime': make_naive(self.start_datetime).strftime('%Y-%m-%d %H:%M:%S'),
1206 1210
            'publication_date': self.publication_date.strftime('%Y-%m-%d') if self.publication_date else None,
1207 1211
            'repeat': self.repeat,
1208 1212
            'recurrence_rule': self.recurrence_rule,
1213
            'recurrence_end_date': recurrence_end_date,
1209 1214
            'places': self.places,
1210 1215
            'waiting_list_places': self.waiting_list_places,
1211 1216
            'label': self.label,
......
1279 1284

  
1280 1285
        if self.publication_date and self.publication_date > min_datetime.date():
1281 1286
            min_datetime = make_aware(datetime.datetime.combine(self.publication_date, datetime.time(0, 0)))
1287
        if self.recurrence_end_date:
1288
            self.recurrence_rule['until'] = datetime.datetime.combine(
1289
                self.recurrence_end_date, datetime.time(0, 0)
1290
            )
1282 1291

  
1283 1292
        # remove pytz info because dateutil doesn't support DST changes
1284 1293
        min_datetime = make_naive(min_datetime)
chrono/manager/forms.py
184 184
        model = Event
185 185
        widgets = {
186 186
            'publication_date': forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d'),
187
            'recurrence_end_date': forms.DateInput(attrs={'type': 'date'}, format='%Y-%m-%d'),
187 188
        }
188 189
        fields = [
189 190
            'label',
190 191
            'slug',
191 192
            'start_datetime',
192 193
            'repeat',
194
            'recurrence_end_date',
193 195
            'duration',
194 196
            'publication_date',
195 197
            'places',
tests/test_agendas.py
1957 1957
        assert (
1958 1958
            recurrences[i].start_datetime + datetime.timedelta(days=14) == recurrences[i + 1].start_datetime
1959 1959
        )
1960

  
1961

  
1962
def test_recurring_events_with_end_date():
1963
    agenda = Agenda.objects.create(label='Agenda', kind='events')
1964
    event = Event.objects.create(
1965
        agenda=agenda,
1966
        start_datetime=now(),
1967
        repeat='daily',
1968
        places=5,
1969
        recurrence_end_date=(now() + datetime.timedelta(days=5)).date(),
1970
    )
1971
    event.refresh_from_db()
1972
    start_datetime = localtime(event.start_datetime)
1973

  
1974
    recurrences = event.get_recurrences(
1975
        localtime(event.start_datetime), localtime(event.start_datetime) + datetime.timedelta(days=10)
1976
    )
1977
    assert len(recurrences) == 5
1978
    assert recurrences[0].start_datetime == start_datetime
1979
    assert recurrences[-1].start_datetime == start_datetime + datetime.timedelta(days=4)
1960
-