agendas: resources in agendas fields in import/exports (#38942)

This commit is contained in:
Lauréline Guérin 2020-05-15 15:47:03 +02:00
parent 3f21f3f033
commit c62ebc9b56
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 34 additions and 2 deletions

View File

@ -231,6 +231,7 @@ class Agenda(models.Model):
'view': self.view_role.name if self.view_role else None,
'edit': self.edit_role.name if self.edit_role else None,
},
'resources': [x.slug for x in self.resources.all()],
}
if self.kind == 'events':
agenda['events'] = [x.export_json() for x in self.event_set.all()]
@ -260,6 +261,11 @@ class Agenda(models.Model):
data[permission + '_role'] = Group.objects.get(name=permissions[permission])
except Group.DoesNotExist:
raise AgendaImportError(_('Missing "%s" role') % permissions[permission])
resources_slug = data.pop('resources', [])
resources_by_slug = {r.slug: r for r in Resource.objects.filter(slug__in=resources_slug)}
for resource_slug in resources_slug:
if resource_slug not in resources_by_slug:
raise AgendaImportError(_('Missing "%s" resource') % resource_slug)
data = clean_import_data(cls, data)
agenda, created = cls.objects.get_or_create(slug=data['slug'], defaults=data)
if not created:
@ -281,6 +287,7 @@ class Agenda(models.Model):
for desk in desks:
desk['agenda'] = agenda
Desk.import_json(desk).save()
agenda.resources.set(resources_by_slug.values())
elif data['kind'] == 'virtual':
if overwrite:
TimePeriod.objects.filter(agenda=agenda).delete()

View File

@ -18,9 +18,10 @@ from django.utils.timezone import make_aware
from chrono.agendas.models import (
Agenda,
Event,
TimePeriod,
Desk,
Event,
Resource,
TimePeriod,
TimePeriodException,
AgendaImportError,
MeetingType,
@ -192,6 +193,30 @@ def test_import_export_permissions(app, some_data, meetings_agenda):
assert agenda.edit_role == group2
def test_import_export_resources(app, some_data, meetings_agenda):
resource = Resource.objects.create(label='foo')
meetings_agenda.resources.add(resource)
output = get_output_of_command('export_site')
import_site(data={}, clean=True)
assert Agenda.objects.count() == 0
resource.delete()
with pytest.raises(AgendaImportError) as excinfo:
import_site(json.loads(output), overwrite=True)
assert str(excinfo.value) == 'Missing "foo" resource'
resource = Resource.objects.create(label='foobar')
with pytest.raises(AgendaImportError) as excinfo:
import_site(json.loads(output), overwrite=True)
assert str(excinfo.value) == 'Missing "foo" resource'
resource = Resource.objects.create(label='foo')
import_site(json.loads(output), overwrite=True)
agenda = Agenda.objects.get(slug=meetings_agenda.slug)
assert list(agenda.resources.all()) == [resource]
def test_import_export_virtual_agenda(app):
virtual_agenda = Agenda.objects.create(label='Virtual Agenda', kind='virtual')
output = get_output_of_command('export_site')