0002-manager-import-export-shared-custody-settings-66671.patch
chrono/agendas/models.py | ||
---|---|---|
3500 | 3500 |
on_delete=models.SET_NULL, |
3501 | 3501 |
) |
3502 | 3502 | |
3503 |
def export_json(self): |
|
3504 |
return {'management_role': self.management_role.name if self.management_role else None} |
|
3505 | ||
3506 |
@classmethod |
|
3507 |
def import_json(cls, data): |
|
3508 |
if data.get('management_role'): |
|
3509 |
data['management_role'] = Group.objects.get(name=data['management_role']) |
|
3510 | ||
3511 |
cls.objects.update_or_create(defaults=data) |
|
3512 | ||
3503 | 3513 |
@classmethod |
3504 | 3514 |
def get_singleton(cls): |
3505 | 3515 |
try: |
chrono/manager/forms.py | ||
---|---|---|
1444 | 1444 |
categories = forms.BooleanField(label=_('Categories'), required=False, initial=True) |
1445 | 1445 |
check_type_groups = forms.BooleanField(label=_('Check type groups'), required=False, initial=True) |
1446 | 1446 |
events_types = forms.BooleanField(label=_('Events types'), required=False, initial=True) |
1447 |
shared_custody = forms.BooleanField(label=_('Shared custody'), required=False, initial=True) |
|
1448 | ||
1449 |
def __init__(self, *args, **kwargs): |
|
1450 |
super().__init__(*args, **kwargs) |
|
1451 |
if not SharedCustodySettings.objects.exists(): |
|
1452 |
self.fields['shared_custody'].initial = False |
|
1453 |
self.fields['shared_custody'].widget = forms.HiddenInput() |
|
1447 | 1454 | |
1448 | 1455 | |
1449 | 1456 |
class SharedCustodyRuleForm(forms.ModelForm): |
chrono/manager/utils.py | ||
---|---|---|
28 | 28 |
CheckTypeGroup, |
29 | 29 |
EventsType, |
30 | 30 |
Resource, |
31 |
SharedCustodySettings, |
|
31 | 32 |
UnavailabilityCalendar, |
32 | 33 |
) |
33 | 34 | |
... | ... | |
39 | 40 |
events_types=True, |
40 | 41 |
resources=True, |
41 | 42 |
categories=True, |
43 |
shared_custody=True, |
|
42 | 44 |
): |
43 | 45 |
'''Dump site objects to JSON-dumpable dictionnary''' |
44 | 46 |
data = collections.OrderedDict() |
... | ... | |
56 | 58 |
qs1 = Agenda.objects.filter(~Q(kind='virtual')) |
57 | 59 |
qs2 = Agenda.objects.filter(kind='virtual') |
58 | 60 |
data['agendas'] = [x.export_json() for x in itertools.chain(qs1, qs2)] |
61 |
if shared_custody: |
|
62 |
data['shared_custody_settings'] = SharedCustodySettings.get_singleton().export_json() |
|
59 | 63 |
return data |
60 | 64 | |
61 | 65 | |
... | ... | |
78 | 82 |
EventsType.objects.all().delete() |
79 | 83 |
Resource.objects.all().delete() |
80 | 84 |
Category.objects.all().delete() |
85 |
SharedCustodySettings.objects.all().delete() |
|
81 | 86 | |
82 | 87 |
results = { |
83 | 88 |
key: collections.defaultdict(list) |
... | ... | |
97 | 102 |
role_names = role_names.union( |
98 | 103 |
{name for data in objs for _, name in data.get('permissions', {}).items() if name} |
99 | 104 |
) |
105 | ||
106 |
shared_custody_settings = data.get('shared_custody_settings') |
|
107 |
if shared_custody_settings and shared_custody_settings['management_role']: |
|
108 |
role_names.add(shared_custody_settings['management_role']) |
|
109 | ||
100 | 110 |
existing_roles = Group.objects.filter(name__in=role_names) |
101 | 111 | |
102 | 112 |
if existing_roles.count() != len(role_names): |
... | ... | |
120 | 130 |
results[key]['created'].append(obj) |
121 | 131 |
else: |
122 | 132 |
results[key]['updated'].append(obj) |
133 |
SharedCustodySettings.import_json(data.get('shared_custody_settings', {})) |
|
123 | 134 |
return results |
tests/manager/test_import_export.py | ||
---|---|---|
15 | 15 |
Desk, |
16 | 16 |
Event, |
17 | 17 |
MeetingType, |
18 |
SharedCustodySettings, |
|
18 | 19 |
UnavailabilityCalendar, |
19 | 20 |
) |
20 | 21 |
from tests.utils import login |
... | ... | |
358 | 359 |
assert '3 check type groups have been created. No check type group updated.' in resp.text |
359 | 360 |
assert CheckTypeGroup.objects.count() == 3 |
360 | 361 |
assert CheckType.objects.count() == 6 |
362 | ||
363 | ||
364 |
def test_export_site_shared_custody_settings(app, admin_user): |
|
365 |
login(app) |
|
366 |
resp = app.get('/manage/agendas/export/') |
|
367 | ||
368 |
assert resp.form['shared_custody'].value == 'False' |
|
369 |
assert resp.form['shared_custody'].attrs == {'type': 'hidden'} |
|
370 | ||
371 |
SharedCustodySettings.objects.create() |
|
372 |
resp = app.get('/manage/agendas/export/') |
|
373 |
assert 'shared_custody' in resp.form.fields |
|
374 |
resp = resp.form.submit() |
|
375 | ||
376 |
site_json = json.loads(resp.text) |
|
377 |
assert 'management_role' in site_json['shared_custody_settings'] |
tests/test_import_export.py | ||
---|---|---|
28 | 28 |
EventsType, |
29 | 29 |
MeetingType, |
30 | 30 |
Resource, |
31 |
SharedCustodySettings, |
|
31 | 32 |
TimePeriod, |
32 | 33 |
TimePeriodException, |
33 | 34 |
TimePeriodExceptionSource, |
... | ... | |
1230 | 1231 | |
1231 | 1232 |
agenda = Agenda.objects.get() |
1232 | 1233 |
assert agenda.label == 'Bar Foo' |
1234 | ||
1235 | ||
1236 |
def test_import_export_shared_custody_settings(app): |
|
1237 |
group = Group.objects.create(name='test') |
|
1238 |
SharedCustodySettings.objects.create(management_role=group) |
|
1239 | ||
1240 |
output = get_output_of_command('export_site') |
|
1241 |
import_site(data={}, clean=True) |
|
1242 |
assert SharedCustodySettings.get_singleton().management_role is None |
|
1243 |
Group.objects.all().delete() |
|
1244 | ||
1245 |
with pytest.raises(AgendaImportError) as excinfo: |
|
1246 |
import_site(json.loads(output)) |
|
1247 |
assert '%s' % excinfo.value == 'Missing roles: "test"' |
|
1248 | ||
1249 |
group = Group.objects.create(name='test') |
|
1250 |
import_site(json.loads(output)) |
|
1251 | ||
1252 |
settings = SharedCustodySettings.get_singleton() |
|
1253 |
assert settings.management_role == group |
|
1254 | ||
1255 |
group2 = Group.objects.create(name='test2') |
|
1256 |
settings.management_role = group2 |
|
1257 |
settings.save() |
|
1258 | ||
1259 |
import_site(json.loads(output)) |
|
1260 | ||
1261 |
settings = SharedCustodySettings.get_singleton() |
|
1262 |
assert settings.management_role == group |
|
1233 |
- |