Projet

Général

Profil

0002-manager-import-export-shared-custody-settings-66671.patch

Valentin Deniaud, 29 juin 2022 11:03

Télécharger (6,85 ko)

Voir les différences:

Subject: [PATCH 2/2] manager: import/export shared custody settings (#66671)

 chrono/agendas/models.py            | 10 ++++++++++
 chrono/manager/forms.py             |  7 +++++++
 chrono/manager/utils.py             | 11 +++++++++++
 tests/manager/test_import_export.py | 17 ++++++++++++++++
 tests/test_import_export.py         | 30 +++++++++++++++++++++++++++++
 5 files changed, 75 insertions(+)
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
-