| 113 | |
| 114 | |
| 115 | class SplitArrayWidget(forms.Widget): |
| 116 | template_name = "postgres/widgets/split_array.html" |
| 117 | |
| 118 | def __init__(self, widget, size, **kwargs): |
| 119 | self.widget = widget() if isinstance(widget, type) else widget |
| 120 | self.size = size |
| 121 | super().__init__(**kwargs) |
| 122 | |
| 123 | @property |
| 124 | def is_hidden(self): |
| 125 | return self.widget.is_hidden |
| 126 | |
| 127 | def value_from_datadict(self, data, files, name): |
| 128 | return [ |
| 129 | self.widget.value_from_datadict(data, files, "%s_%s" % (name, index)) |
| 130 | for index in range(self.size) |
| 131 | ] |
| 132 | |
| 133 | def value_omitted_from_data(self, data, files, name): |
| 134 | return all( |
| 135 | self.widget.value_omitted_from_data(data, files, "%s_%s" % (name, index)) |
| 136 | for index in range(self.size) |
| 137 | ) |
| 138 | |
| 139 | def id_for_label(self, id_): |
| 140 | # See the comment for RadioSelect.id_for_label() |
| 141 | if id_: |
| 142 | id_ += "_0" |
| 143 | return id_ |
| 144 | |
| 145 | def get_context(self, name, value, attrs=None): |
| 146 | attrs = {} if attrs is None else attrs |
| 147 | context = super().get_context(name, value, attrs) |
| 148 | if self.is_localized: |
| 149 | self.widget.is_localized = self.is_localized |
| 150 | value = value or [] |
| 151 | context["widget"]["subwidgets"] = [] |
| 152 | final_attrs = self.build_attrs(attrs) |
| 153 | id_ = final_attrs.get("id") |
| 154 | for i in range(max(len(value), self.size)): |
| 155 | try: |
| 156 | widget_value = value[i] |
| 157 | except IndexError: |
| 158 | widget_value = None |
| 159 | if id_: |
| 160 | final_attrs = {**final_attrs, "id": "%s_%s" % (id_, i)} |
| 161 | context["widget"]["subwidgets"].append( |
| 162 | self.widget.get_context(name + "_%s" % i, widget_value, final_attrs)[ |
| 163 | "widget" |
| 164 | ] |
| 165 | ) |
| 166 | return context |
| 167 | |
| 168 | @property |
| 169 | def media(self): |
| 170 | return self.widget.media |
| 171 | |
| 172 | def __deepcopy__(self, memo): |
no outgoing calls