Projet

Général

Profil

0008-formdef-factorize-iter_fields-methods-60706.patch

Lauréline Guérin, 20 janvier 2022 09:58

Télécharger (10,9 ko)

Voir les différences:

Subject: [PATCH 8/8] formdef: factorize iter_fields methods (#60706)

 wcs/backoffice/management.py | 70 ++++++++++++++----------------------
 wcs/formdef.py               | 61 +++++++++++++++++--------------
 wcs/forms/backoffice.py      | 28 +++------------
 3 files changed, 66 insertions(+), 93 deletions(-)
wcs/backoffice/management.py
1352 1352
                if field.id in field_ids:
1353 1353
                    r += htmltext(' checked="checked"')
1354 1354
                r += htmltext('/>')
1355
                if getattr(field, 'block_field', None):
1356
                    field.label = '%s / %s' % (field.block_field.label, field.label)
1355 1357
                r += htmltext('%s</label>') % misc.ellipsize(field.label, 70)
1356 1358
                if getattr(field, 'has_relations', False):
1357 1359
                    r += htmltext('<button class="expand-relations"></button>')
......
1545 1547
                field.has_relations = True
1546 1548
                yield UserRelatedField(field)
1547 1549

  
1548
        def iter_fields(fields, block_field=None):
1549
            for field in fields:
1550
                # add contextual_id/contextual_varname attributes
1551
                # they are id/varname for normal fields
1552
                # but in case of blocks they are concatenation of block id/varname + field id/varname
1553
                field.contextual_id = field.id
1554
                field.contextual_varname = None
1555
                if block_field:
1556
                    if field.key == 'items':
1557
                        # not yet
1558
                        continue
1559
                    field.block_field = block_field
1560
                    field.contextual_id = '%s-%s' % (field.block_field.id, field.id)
1561
                    if field.varname and field.block_field.varname:
1562
                        field.contextual_varname = '%s_%s' % (
1563
                            field.block_field.varname,
1564
                            field.varname,
1565
                        )
1566
                else:
1567
                    field.contextual_varname = field.varname
1568
                yield field
1569
                if not get_publisher().is_using_postgresql():
1570
                    continue
1571
                if field.key == 'block':
1572
                    yield from iter_fields(field.block.fields, block_field=field)
1573
                    continue
1574
                if block_field:
1575
                    continue
1576
                if not (
1577
                    field.type == 'item'
1578
                    and field.data_source
1579
                    and field.data_source.get('type', '').startswith('carddef:')
1580
                ):
1550
        for field in self.formdef.iter_fields(include_block_fields=True):
1551
            if getattr(field, 'block_field', None):
1552
                if field.key == 'items':
1553
                    # not yet
1581 1554
                    continue
1582
                try:
1583
                    carddef = CardDef.get_by_urlname(field.data_source['type'][8:])
1584
                except KeyError:
1555
            yield field
1556
            if not get_publisher().is_using_postgresql():
1557
                continue
1558
            if field.key == 'block':
1559
                continue
1560
            if getattr(field, 'block_field', None):
1561
                continue
1562
            if not (
1563
                field.type == 'item'
1564
                and field.data_source
1565
                and field.data_source.get('type', '').startswith('carddef:')
1566
            ):
1567
                continue
1568
            try:
1569
                carddef = CardDef.get_by_urlname(field.data_source['type'][8:])
1570
            except KeyError:
1571
                continue
1572
            for card_field in carddef.get_all_fields():
1573
                if not hasattr(card_field, 'get_view_value'):
1585 1574
                    continue
1586
                for card_field in carddef.get_all_fields():
1587
                    if not hasattr(card_field, 'get_view_value'):
1588
                        continue
1589
                    field.has_relations = True
1590
                    yield RelatedField(carddef, card_field, field)
1591

  
1592
        yield from iter_fields(self.formdef.get_all_fields())
1575
                field.has_relations = True
1576
                yield RelatedField(carddef, card_field, field)
1593 1577

  
1594 1578
        yield FakeField('status', 'status', _('Status'))
1595 1579
        yield FakeField('anonymised', 'anonymised', _('Anonymised'))
wcs/formdef.py
536 536
        self_ref = '%s:%s' % (self.xml_root_node, self.url_name)
537 537
        relations_by_ref = collections.defaultdict(list)
538 538

  
539
        def _check_field(field, in_block_field=False, prefix=''):
539
        def _check_field(field):
540 540
            data_source = getattr(field, 'data_source', None)
541 541
            if not data_source or not data_source.get('type', '').startswith('carddef:'):
542 542
                return
543
            varname = field.varname or ''
544
            if in_block_field:
545
                if prefix and field.varname:
546
                    varname = '%s_%s' % (prefix, field.varname)
547
                else:
548
                    varname = ''
549 543
            # reverse relation of data_source['type'] to this object
550 544
            obj_ref = ':'.join(data_source['type'].split(':')[:2])  # remove possible custom-view
551 545
            relations_by_ref[obj_ref].append(
552 546
                {
553
                    'varname': varname,
547
                    'varname': field.contextual_varname or '',
554 548
                    'type': field.key,
555 549
                    'obj': self_ref,
556 550
                }
557 551
            )
558 552

  
559
        for field in self.get_all_fields():
553
        for field in self.iter_fields(include_block_fields=True):
560 554
            if field.key in ['item', 'items', 'computed']:
561 555
                _check_field(field)
562
            if field.key == 'block':
563
                try:
564
                    field.block  # load block
565
                except KeyError:
566
                    # blockdef not found
567
                    continue
568
                for _field in field.block.fields:
569
                    if _field.key not in ['item', 'items', 'computed']:
570
                        continue
571
                    _check_field(_field, in_block_field=True, prefix=field.varname or '')
572
                field._block = None  # reset cache
573 556

  
574 557
        # remove duplicated items
575 558
        return {
......
584 567
    def get_all_fields(self):
585 568
        return (self.fields or []) + self.workflow.get_backoffice_fields()
586 569

  
570
    def iter_fields(self, include_block_fields=False):
571
        def _iter_fields(fields, block_field=None):
572
            for field in fields:
573
                # add contextual_id/contextual_varname attributes
574
                # they are id/varname for normal fields
575
                # but in case of blocks they are concatenation of block id/varname + field id/varname
576
                field.contextual_id = field.id
577
                field.contextual_varname = None
578
                if block_field:
579
                    field.block_field = block_field
580
                    field.contextual_id = '%s-%s' % (field.block_field.id, field.id)
581
                    if field.varname and field.block_field.varname:
582
                        field.contextual_varname = '%s_%s' % (
583
                            field.block_field.varname,
584
                            field.varname,
585
                        )
586
                else:
587
                    field.contextual_varname = field.varname
588
                yield field
589
                if field.key == 'block' and include_block_fields:
590
                    try:
591
                        field.block  # load block
592
                    except KeyError:
593
                        # blockdef not found
594
                        continue
595
                    yield from _iter_fields(field.block.fields, block_field=field)
596
                    field._block = None  # reset cache
597

  
598
        yield from _iter_fields(self.get_all_fields())
599

  
587 600
    def get_widget_fields(self):
588 601
        return [field for field in self.fields or [] if isinstance(field, fields.WidgetField)]
589 602

  
......
904 917
    def set_live_condition_sources(self, form, fields):
905 918
        live_condition_fields = {}
906 919

  
907
        def get_all_fields():
908
            for field in fields:
909
                yield field
910
                if field.key == 'block':
911
                    yield from field.block.fields
912

  
913
        for field in get_all_fields():
920
        for field in self.iter_fields(include_block_fields=True):
914 921
            if field.condition:
915 922
                field.varnames = field.get_condition_varnames(formdef=self)
916 923
                for varname in field.varnames:
wcs/forms/backoffice.py
217 217
            # get_sorted_ids is only implemented in the SQL backend
218 218
            order_by = None
219 219

  
220
        def iter_fields(fields, block_field=None):
221
            for field in fields:
222
                field.contextual_id = field.id
223
                field.contextual_varname = None
224
                if block_field:
225
                    if field.key == 'items':
226
                        # not yet
227
                        continue
228
                    field.block_field = block_field
229
                    field.contextual_id = '%s-%s' % (field.block_field.id, field.id)
230
                    if field.varname and field.block_field.varname:
231
                        field.contextual_varname = '%s_%s' % (
232
                            field.block_field.varname,
233
                            field.varname,
234
                        )
235
                else:
236
                    field.contextual_varname = field.varname
237
                yield field
238
                if field.key == 'block':
239
                    yield from iter_fields(field.block.fields, block_field=field)
240
                    continue
241

  
242 220
        if order_by and not anonymise:
243 221
            direction = ''
244 222
            if order_by.startswith('-'):
245 223
                order_by = order_by[1:]
246 224
                direction = '-'
247 225
            field_found = False
248
            for field in iter_fields(self.formdef.get_all_fields()):
226
            for field in self.formdef.iter_fields(include_block_fields=True):
227
                if getattr(field, 'block_field', None):
228
                    if field.key == 'items':
229
                        # not yet
230
                        continue
249 231
                if order_by in [field.contextual_varname, 'f%s' % field.contextual_id]:
250 232
                    field_found = True
251 233
                if field.contextual_varname == order_by:
252
-