0001-agenda-fix-recurring-event-import-if-existing-51693.patch
chrono/agendas/models.py | ||
---|---|---|
27 | 27 |
import requests |
28 | 28 |
import vobject |
29 | 29 |
from dateutil.rrule import rrule, rruleset, DAILY, WEEKLY |
30 |
from dateutil.relativedelta import relativedelta |
|
31 | 30 | |
32 | 31 |
import django |
33 | 32 |
from django.conf import settings |
... | ... | |
1233 | 1232 |
event.save() |
1234 | 1233 |
if event.recurrence_rule and event.recurrence_end_date: |
1235 | 1234 |
event.refresh_from_db() |
1236 |
event.create_all_recurrences() |
|
1235 |
event.recurrences.filter(start_datetime__gt=event.recurrence_end_date).delete() |
|
1236 |
update_fields = { |
|
1237 |
field: getattr(event, field) |
|
1238 |
for field in [ |
|
1239 |
'label', |
|
1240 |
'duration', |
|
1241 |
'publication_date', |
|
1242 |
'places', |
|
1243 |
'waiting_list_places', |
|
1244 |
'description', |
|
1245 |
'pricing', |
|
1246 |
'url', |
|
1247 |
] |
|
1248 |
} |
|
1249 |
event.recurrences.update(**update_fields) |
|
1250 |
excluded_datetimes = [ |
|
1251 |
make_naive(dt) for dt in event.recurrences.values_list('start_datetime', flat=True) |
|
1252 |
] |
|
1253 |
event.create_all_recurrences(excluded_datetimes) |
|
1237 | 1254 | |
1238 | 1255 |
def export_json(self): |
1239 | 1256 |
recurrence_end_date = ( |
chrono/manager/forms.py | ||
---|---|---|
233 | 233 |
} |
234 | 234 |
self.instance.recurrences.update(**update_fields) |
235 | 235 | |
236 |
event = super().save(*args, **kwargs) |
|
237 |
if event.recurrence_end_date: |
|
238 |
self.instance.recurrences.filter(start_datetime__gt=event.recurrence_end_date).delete() |
|
236 |
super().save(*args, **kwargs) |
|
237 |
if self.instance.recurrence_end_date: |
|
238 |
self.instance.recurrences.filter( |
|
239 |
start_datetime__gt=self.instance.recurrence_end_date |
|
240 |
).delete() |
|
239 | 241 |
excluded_datetimes = [ |
240 | 242 |
make_naive(dt) |
241 | 243 |
for dt in self.instance.recurrences.values_list('start_datetime', flat=True) |
242 | 244 |
] |
243 |
event.create_all_recurrences(excluded_datetimes)
|
|
244 |
return event
|
|
245 |
self.instance.create_all_recurrences(excluded_datetimes)
|
|
246 |
return self.instance
|
|
245 | 247 | |
246 | 248 | |
247 | 249 |
class AgendaResourceForm(forms.Form): |
tests/test_import_export.py | ||
---|---|---|
236 | 236 |
event = Event.objects.get(slug='test') |
237 | 237 |
assert Event.objects.filter(primary_event=event).count() == 7 |
238 | 238 | |
239 |
# import again |
|
240 |
with tempfile.NamedTemporaryFile() as f: |
|
241 |
f.write(force_bytes(output)) |
|
242 |
f.flush() |
|
243 |
call_command('import_site', f.name) |
|
244 | ||
245 |
event = Event.objects.get(slug='test') |
|
246 |
assert Event.objects.filter(primary_event=event).count() == 7 |
|
247 | ||
248 |
# import again but change places |
|
249 |
payload = json.loads(output) |
|
250 |
payload['agendas'][0]['events'][0]['places'] = 42 |
|
251 |
with tempfile.NamedTemporaryFile() as f: |
|
252 |
f.write(force_bytes(json.dumps(payload))) |
|
253 |
f.flush() |
|
254 |
call_command('import_site', f.name) |
|
255 | ||
256 |
event = Event.objects.get(slug='test') |
|
257 |
assert event.places == 42 |
|
258 |
assert Event.objects.filter(primary_event=event, places=42).count() == 7 |
|
259 | ||
239 | 260 | |
240 | 261 |
def test_import_export_permissions(app): |
241 | 262 |
meetings_agenda = Agenda.objects.create(label='Foo Bar', kind='meetings') |
242 |
- |