agendas: resources in agendas fields in import/exports (#38942)
This commit is contained in:
parent
3f21f3f033
commit
c62ebc9b56
|
@ -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()
|
||||
|
|
|
@ -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')
|
||||
|
|
Loading…
Reference in New Issue