0001-agendas-add-event-recurrence-end-date-51218.patch
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 |
- |