manager: import/export shared custody settings (#66671)
This commit is contained in:
parent
f044f276af
commit
7448d6e886
|
@ -3500,6 +3500,16 @@ class SharedCustodySettings(models.Model):
|
|||
on_delete=models.SET_NULL,
|
||||
)
|
||||
|
||||
def export_json(self):
|
||||
return {'management_role': self.management_role.name if self.management_role else None}
|
||||
|
||||
@classmethod
|
||||
def import_json(cls, data):
|
||||
if data.get('management_role'):
|
||||
data['management_role'] = Group.objects.get(name=data['management_role'])
|
||||
|
||||
cls.objects.update_or_create(defaults=data)
|
||||
|
||||
@classmethod
|
||||
def get_singleton(cls):
|
||||
try:
|
||||
|
|
|
@ -1444,6 +1444,13 @@ class AgendasExportForm(forms.Form):
|
|||
categories = forms.BooleanField(label=_('Categories'), required=False, initial=True)
|
||||
check_type_groups = forms.BooleanField(label=_('Check type groups'), required=False, initial=True)
|
||||
events_types = forms.BooleanField(label=_('Events types'), required=False, initial=True)
|
||||
shared_custody = forms.BooleanField(label=_('Shared custody'), required=False, initial=True)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
if not SharedCustodySettings.objects.exists():
|
||||
self.fields['shared_custody'].initial = False
|
||||
self.fields['shared_custody'].widget = forms.HiddenInput()
|
||||
|
||||
|
||||
class SharedCustodyRuleForm(forms.ModelForm):
|
||||
|
|
|
@ -28,6 +28,7 @@ from chrono.agendas.models import (
|
|||
CheckTypeGroup,
|
||||
EventsType,
|
||||
Resource,
|
||||
SharedCustodySettings,
|
||||
UnavailabilityCalendar,
|
||||
)
|
||||
|
||||
|
@ -39,6 +40,7 @@ def export_site(
|
|||
events_types=True,
|
||||
resources=True,
|
||||
categories=True,
|
||||
shared_custody=True,
|
||||
):
|
||||
'''Dump site objects to JSON-dumpable dictionnary'''
|
||||
data = collections.OrderedDict()
|
||||
|
@ -56,6 +58,8 @@ def export_site(
|
|||
qs1 = Agenda.objects.filter(~Q(kind='virtual'))
|
||||
qs2 = Agenda.objects.filter(kind='virtual')
|
||||
data['agendas'] = [x.export_json() for x in itertools.chain(qs1, qs2)]
|
||||
if shared_custody:
|
||||
data['shared_custody_settings'] = SharedCustodySettings.get_singleton().export_json()
|
||||
return data
|
||||
|
||||
|
||||
|
@ -78,6 +82,7 @@ def import_site(data, if_empty=False, clean=False, overwrite=False):
|
|||
EventsType.objects.all().delete()
|
||||
Resource.objects.all().delete()
|
||||
Category.objects.all().delete()
|
||||
SharedCustodySettings.objects.all().delete()
|
||||
|
||||
results = {
|
||||
key: collections.defaultdict(list)
|
||||
|
@ -97,6 +102,11 @@ def import_site(data, if_empty=False, clean=False, overwrite=False):
|
|||
role_names = role_names.union(
|
||||
{name for data in objs for _, name in data.get('permissions', {}).items() if name}
|
||||
)
|
||||
|
||||
shared_custody_settings = data.get('shared_custody_settings')
|
||||
if shared_custody_settings and shared_custody_settings['management_role']:
|
||||
role_names.add(shared_custody_settings['management_role'])
|
||||
|
||||
existing_roles = Group.objects.filter(name__in=role_names)
|
||||
|
||||
if existing_roles.count() != len(role_names):
|
||||
|
@ -120,4 +130,5 @@ def import_site(data, if_empty=False, clean=False, overwrite=False):
|
|||
results[key]['created'].append(obj)
|
||||
else:
|
||||
results[key]['updated'].append(obj)
|
||||
SharedCustodySettings.import_json(data.get('shared_custody_settings', {}))
|
||||
return results
|
||||
|
|
|
@ -15,6 +15,7 @@ from chrono.agendas.models import (
|
|||
Desk,
|
||||
Event,
|
||||
MeetingType,
|
||||
SharedCustodySettings,
|
||||
UnavailabilityCalendar,
|
||||
)
|
||||
from tests.utils import login
|
||||
|
@ -358,3 +359,19 @@ def test_import_check_type_group(app, admin_user):
|
|||
assert '3 check type groups have been created. No check type group updated.' in resp.text
|
||||
assert CheckTypeGroup.objects.count() == 3
|
||||
assert CheckType.objects.count() == 6
|
||||
|
||||
|
||||
def test_export_site_shared_custody_settings(app, admin_user):
|
||||
login(app)
|
||||
resp = app.get('/manage/agendas/export/')
|
||||
|
||||
assert resp.form['shared_custody'].value == 'False'
|
||||
assert resp.form['shared_custody'].attrs == {'type': 'hidden'}
|
||||
|
||||
SharedCustodySettings.objects.create()
|
||||
resp = app.get('/manage/agendas/export/')
|
||||
assert 'shared_custody' in resp.form.fields
|
||||
resp = resp.form.submit()
|
||||
|
||||
site_json = json.loads(resp.text)
|
||||
assert 'management_role' in site_json['shared_custody_settings']
|
||||
|
|
|
@ -28,6 +28,7 @@ from chrono.agendas.models import (
|
|||
EventsType,
|
||||
MeetingType,
|
||||
Resource,
|
||||
SharedCustodySettings,
|
||||
TimePeriod,
|
||||
TimePeriodException,
|
||||
TimePeriodExceptionSource,
|
||||
|
@ -1230,3 +1231,32 @@ def test_import_export_agenda_update(app):
|
|||
|
||||
agenda = Agenda.objects.get()
|
||||
assert agenda.label == 'Bar Foo'
|
||||
|
||||
|
||||
def test_import_export_shared_custody_settings(app):
|
||||
group = Group.objects.create(name='test')
|
||||
SharedCustodySettings.objects.create(management_role=group)
|
||||
|
||||
output = get_output_of_command('export_site')
|
||||
import_site(data={}, clean=True)
|
||||
assert SharedCustodySettings.get_singleton().management_role is None
|
||||
Group.objects.all().delete()
|
||||
|
||||
with pytest.raises(AgendaImportError) as excinfo:
|
||||
import_site(json.loads(output))
|
||||
assert '%s' % excinfo.value == 'Missing roles: "test"'
|
||||
|
||||
group = Group.objects.create(name='test')
|
||||
import_site(json.loads(output))
|
||||
|
||||
settings = SharedCustodySettings.get_singleton()
|
||||
assert settings.management_role == group
|
||||
|
||||
group2 = Group.objects.create(name='test2')
|
||||
settings.management_role = group2
|
||||
settings.save()
|
||||
|
||||
import_site(json.loads(output))
|
||||
|
||||
settings = SharedCustodySettings.get_singleton()
|
||||
assert settings.management_role == group
|
||||
|
|
Loading…
Reference in New Issue