Projet

Général

Profil

0001-carddefs-check-on-form-import-if-carddef-exists-4257.patch

Lauréline Guérin, 04 juin 2020 11:10

Télécharger (4,74 ko)

Voir les différences:

Subject: [PATCH] carddefs: check on form import if carddef exists (#42579)

 tests/test_admin_pages.py    |  4 ++++
 tests/test_formdef_import.py | 28 +++++++++++++++++++++++++---
 wcs/formdef.py               |  7 +++++++
 3 files changed, 36 insertions(+), 3 deletions(-)
tests/test_admin_pages.py
4630 4630
    formdef.roles = [role.id]
4631 4631
    formdef.backoffice_submission_roles = [role.id]
4632 4632
    formdef.workflow_roles = {'_receiver': role.id}
4633
    formdef.fields = [fields.StringField(
4634
        id='1', type='string',
4635
        data_source={'type': 'carddef:unknown'})]
4633 4636
    formdef.store()
4634 4637

  
4635 4638
    resp = app.get('/backoffice/settings/export')
......
4666 4669
    assert FormDef.select()[0].roles == ['012345']
4667 4670
    assert FormDef.select()[0].backoffice_submission_roles == ['012345']
4668 4671
    assert FormDef.select()[0].workflow_roles == {'_receiver': '012345'}
4672
    assert len(FormDef.select()[0].fields) == 1
4669 4673
    assert Workflow.select()[0].possible_status[0].items[0].by == ['012345']
4670 4674

  
4671 4675
    # do not export roles when managed by idp
tests/test_formdef_import.py
1 1
# -*- coding: utf-8 -*-
2 2

  
3 3
import pytest
4
import sys
5 4
import shutil
6 5
import time
7 6
import xml.etree.ElementTree as ET
......
10 9
from quixote import cleanup
11 10

  
12 11
from wcs.categories import Category
12
from wcs.carddef import CardDef
13 13
from wcs.formdef import FormDef, fields, FormdefImportError
14 14
from wcs.workflows import Workflow
15 15
from wcs.roles import Role
......
346 346
def test_unknown_data_source():
347 347
    formdef = FormDef()
348 348
    formdef.name = 'foo'
349
    formdef.fields = [fields.StringField(id='1', type='string',
349
    formdef.fields = [fields.StringField(
350
        id='1', type='string',
350 351
        data_source={'type': 'json', 'value': 'http://example.net'})]
351 352
    export = ET.tostring(export_to_indented_xml(formdef))
352 353

  
353 354
    FormDef.import_from_xml(BytesIO(export))
354 355

  
355
    formdef.fields = [fields.StringField(id='1', type='string',
356
    formdef.fields = [fields.StringField(
357
        id='1', type='string',
356 358
        data_source={'type': 'foobar'})]
357 359
    export = ET.tostring(export_to_indented_xml(formdef))
360
    with pytest.raises(FormdefImportError, match='Unknown datasources'):
361
        FormDef.import_from_xml(BytesIO(export))
362

  
363
    carddef = CardDef()
364
    carddef.name = 'foo'
365
    carddef.fields = [
366
        fields.StringField(id='1', label='Test', type='string', varname='foo'),
367
    ]
368
    carddef.store()
369

  
370
    formdef.fields = [fields.StringField(
371
        id='1', type='string',
372
        data_source={'type': 'carddef:foo'})]
373
    export = ET.tostring(export_to_indented_xml(formdef))
374
    FormDef.import_from_xml(BytesIO(export))
375

  
376
    formdef.fields = [fields.StringField(
377
        id='1', type='string',
378
        data_source={'type': 'carddef:unknown'})]
379
    export = ET.tostring(export_to_indented_xml(formdef))
358 380
    with pytest.raises(FormdefImportError):
359 381
        FormDef.import_from_xml(BytesIO(export))
360 382

  
wcs/formdef.py
1009 1009
    @classmethod
1010 1010
    def import_from_xml(cls, fd, charset=None, include_id=False,
1011 1011
            fix_on_error=False, check_datasources=True):
1012
        from wcs.carddef import CardDef
1012 1013
        try:
1013 1014
            tree = ET.parse(fd)
1014 1015
        except:
......
1039 1040
                    if isinstance(data_sources.get_object(data_source),
1040 1041
                                  data_sources.StubNamedDataSource):
1041 1042
                        unknown_datasources.add(data_source.get('type'))
1043
                    elif data_source.get('type') and data_source.get('type').startswith('carddef:'):
1044
                        # check if carddef exists
1045
                        try:
1046
                            CardDef.get_by_urlname(data_source['type'][8:])
1047
                        except KeyError:
1048
                            unknown_datasources.add(data_source.get('type'))
1042 1049
            if unknown_datasources:
1043 1050
                raise FormdefImportError(N_('Unknown datasources'),
1044 1051
                        details=', '.join(sorted(unknown_datasources)))
1045
-