0002-agendas-resources-in-agendas-fields-in-import-export.patch
chrono/agendas/models.py | ||
---|---|---|
231 | 231 |
'view': self.view_role.name if self.view_role else None, |
232 | 232 |
'edit': self.edit_role.name if self.edit_role else None, |
233 | 233 |
}, |
234 |
'resources': [x.slug for x in self.resources.all()], |
|
234 | 235 |
} |
235 | 236 |
if self.kind == 'events': |
236 | 237 |
agenda['events'] = [x.export_json() for x in self.event_set.all()] |
... | ... | |
260 | 261 |
data[permission + '_role'] = Group.objects.get(name=permissions[permission]) |
261 | 262 |
except Group.DoesNotExist: |
262 | 263 |
raise AgendaImportError(_('Missing "%s" role') % permissions[permission]) |
264 |
resources_slug = data.pop('resources', []) |
|
265 |
resources_by_slug = {r.slug: r for r in Resource.objects.filter(slug__in=resources_slug)} |
|
266 |
for resource_slug in resources_slug: |
|
267 |
if resource_slug not in resources_by_slug: |
|
268 |
raise AgendaImportError(_('Missing "%s" resource') % resource_slug) |
|
263 | 269 |
data = clean_import_data(cls, data) |
264 | 270 |
agenda, created = cls.objects.get_or_create(slug=data['slug'], defaults=data) |
265 | 271 |
if not created: |
... | ... | |
281 | 287 |
for desk in desks: |
282 | 288 |
desk['agenda'] = agenda |
283 | 289 |
Desk.import_json(desk).save() |
290 |
agenda.resources.set(resources_by_slug.values()) |
|
284 | 291 |
elif data['kind'] == 'virtual': |
285 | 292 |
if overwrite: |
286 | 293 |
TimePeriod.objects.filter(agenda=agenda).delete() |
tests/test_import_export.py | ||
---|---|---|
18 | 18 | |
19 | 19 |
from chrono.agendas.models import ( |
20 | 20 |
Agenda, |
21 |
Desk, |
|
21 | 22 |
Event, |
23 |
Resource, |
|
22 | 24 |
TimePeriod, |
23 |
Desk, |
|
24 | 25 |
TimePeriodException, |
25 | 26 |
AgendaImportError, |
26 | 27 |
MeetingType, |
... | ... | |
192 | 193 |
assert agenda.edit_role == group2 |
193 | 194 | |
194 | 195 | |
196 |
def test_import_export_resources(app, some_data, meetings_agenda): |
|
197 |
resource = Resource.objects.create(label='foo') |
|
198 |
meetings_agenda.resources.add(resource) |
|
199 |
output = get_output_of_command('export_site') |
|
200 | ||
201 |
import_site(data={}, clean=True) |
|
202 |
assert Agenda.objects.count() == 0 |
|
203 |
resource.delete() |
|
204 | ||
205 |
with pytest.raises(AgendaImportError) as excinfo: |
|
206 |
import_site(json.loads(output), overwrite=True) |
|
207 |
assert str(excinfo.value) == 'Missing "foo" resource' |
|
208 | ||
209 |
resource = Resource.objects.create(label='foobar') |
|
210 |
with pytest.raises(AgendaImportError) as excinfo: |
|
211 |
import_site(json.loads(output), overwrite=True) |
|
212 |
assert str(excinfo.value) == 'Missing "foo" resource' |
|
213 | ||
214 |
resource = Resource.objects.create(label='foo') |
|
215 |
import_site(json.loads(output), overwrite=True) |
|
216 |
agenda = Agenda.objects.get(slug=meetings_agenda.slug) |
|
217 |
assert list(agenda.resources.all()) == [resource] |
|
218 | ||
219 | ||
195 | 220 |
def test_import_export_virtual_agenda(app): |
196 | 221 |
virtual_agenda = Agenda.objects.create(label='Virtual Agenda', kind='virtual') |
197 | 222 |
output = get_output_of_command('export_site') |
198 |
- |