• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

zopefoundation / z3c.form / 16248976312

02 Jul 2025 05:53AM UTC coverage: 95.275%. Remained the same
16248976312

push

github

icemac
Back to development: 6.1

717 of 800 branches covered (89.63%)

Branch coverage included in aggregate %.

3699 of 3835 relevant lines covered (96.45%)

0.96 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

58.65
/src/z3c/form/contentprovider.py
1
import zope.component
1✔
2
import zope.interface
1✔
3
import zope.location
1✔
4
from zope.contentprovider.interfaces import IContentProvider
1✔
5

6
from z3c.form import interfaces
1✔
7
from z3c.form.error import MultipleErrors
1✔
8
from z3c.form.field import FieldWidgets
1✔
9
from z3c.form.interfaces import IContentProviders
1✔
10

11

12
class BaseProvider:
1✔
13
    __slots__ = ('position')
1✔
14

15

16
lookup_ = BaseProvider()
1✔
17

18

19
@zope.interface.implementer(IContentProviders)
1✔
20
class ContentProviders(dict):
1✔
21

22
    def __init__(self, names=None):
1✔
23
        super().__init__()
1✔
24
        if names is not None:
1✔
25
            for position, name in enumerate(names):
1✔
26
                self[name] = lookup_
1✔
27

28
    def __setitem__(self, key, value):
1✔
29
        factory = ContentProviderFactory(factory=value, name=key)
1✔
30
        super().__setitem__(key, factory)
1✔
31

32

33
class ContentProviderFactory:
1✔
34

35
    def __init__(self, factory, name):
1✔
36
        self.factory = factory
1✔
37
        self.name = name
1✔
38
        self.position = getattr(factory, 'position', None)
1✔
39

40
    def __call__(self, manager):
1✔
41
        if self.factory != lookup_:
1✔
42
            contentProvider = self.factory(
1✔
43
                manager.content, manager.request, manager.form)
44
        else:
45
            contentProvider = zope.component.getMultiAdapter(
1✔
46
                (manager.content, manager.request, manager.form),
47
                IContentProvider, self.name)
48
        return contentProvider
1✔
49

50

51
@zope.interface.implementer_only(interfaces.IWidgets)
1✔
52
class FieldWidgetsAndProviders(FieldWidgets):
1✔
53
    zope.component.adapts(
1✔
54
        interfaces.IFieldsAndContentProvidersForm,
55
        interfaces.IFormLayer,
56
        zope.interface.Interface)
57

58
    def update(self):
1✔
59
        super().update()
1✔
60
        uniqueOrderedKeys = list(self.keys())
1✔
61
        d = {}
1✔
62
        d.update(self)
1✔
63
        for name in self.form.contentProviders:
1✔
64
            factory = self.form.contentProviders[name]
1✔
65
            if factory.position is None:
1✔
66
                raise ValueError(
1✔
67
                    "Position of the following"
68
                    " content provider should be an integer: '%s'." %
69
                    name)
70
            contentProvider = factory(self)
1✔
71
            shortName = name
1✔
72
            contentProvider.update()
1✔
73
            uniqueOrderedKeys.insert(factory.position, shortName)
1✔
74
            d[shortName] = contentProvider
1✔
75
            zope.location.locate(contentProvider, self, shortName)
1✔
76
        self.create_according_to_list(d, uniqueOrderedKeys)
1✔
77

78
    def extract(self):
1✔
79
        """See interfaces.IWidgets"""
80
        data = {}
×
81
        errors = ()
×
82
        for name, widget in self.items():
×
83
            if IContentProvider.providedBy(widget):
×
84
                continue
×
85
            if widget.mode == interfaces.DISPLAY_MODE:
×
86
                continue
×
87
            value = widget.field.missing_value
×
88
            try:
×
89
                widget.setErrors = self.setErrors
×
90
                raw = widget.extract()
×
91
                if raw is not interfaces.NO_VALUE:
×
92
                    value = interfaces.IDataConverter(widget).toFieldValue(raw)
×
93
                zope.component.getMultiAdapter(
×
94
                    (self.content,
95
                     self.request,
96
                     self.form,
97
                     getattr(widget, 'field', None),
98
                     widget),
99
                    interfaces.IValidator).validate(value)
100
            except (zope.interface.Invalid,
×
101
                    ValueError, MultipleErrors) as error:
102
                view = zope.component.getMultiAdapter(
×
103
                    (error, self.request, widget, widget.field,
104
                     self.form, self.content), interfaces.IErrorViewSnippet)
105
                view.update()
×
106
                if self.setErrors:
×
107
                    widget.error = view
×
108
                errors += (view,)
×
109
            else:
110
                name = widget.__name__
×
111
                data[name] = value
×
112
        for error in self.validate(data):
×
113
            view = zope.component.getMultiAdapter(
×
114
                (error, self.request, None, None, self.form, self.content),
115
                interfaces.IErrorViewSnippet)
116
            view.update()
×
117
            errors += (view,)
×
118
        if self.setErrors:
×
119
            self.errors = errors
×
120
        return data, errors
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc