168 |
168 |
169 def get_widget(self, form): |
169 def get_widget(self, form): |
170 """return the widget instance associated to this field""" |
170 """return the widget instance associated to this field""" |
171 return self.widget |
171 return self.widget |
172 |
172 |
|
173 # cached is necessary else we get some pb on entity creation : entity.eid is |
|
174 # modified from creation mark (eg 'X') to its actual eid (eg 123), and then |
|
175 # `field.input_name()` won't return the right key anymore if not cached |
|
176 # (first call to input_name done *before* eventual eid affectation). |
|
177 @cached |
|
178 def input_name(self, form, suffix=None): |
|
179 """return 'qualified name' for this field""" |
|
180 if self.eidparam: |
|
181 if suffix is None: |
|
182 return eid_param(self.role_name(), form.edited_entity.eid) |
|
183 return eid_param(self.role_name() + suffix, form.edited_entity.eid) |
|
184 if suffix is None: |
|
185 return self.name |
|
186 return self.name + suffix |
|
187 |
|
188 def role_name(self): |
|
189 """return <field.name>-<field.role> if role is specified, else field.name""" |
|
190 if self.role is not None: |
|
191 return '%s-%s' % (self.name, self.role) |
|
192 return self.name |
|
193 |
|
194 def dom_id(self, form): |
|
195 """return an html dom identifier for this field""" |
|
196 id = self.id or self.role_name() |
|
197 if self.eidparam: |
|
198 return eid_param(id, form.edited_entity.eid) |
|
199 return id |
|
200 |
173 def example_format(self, req): |
201 def example_format(self, req): |
174 """return a sample string describing what can be given as input for this |
202 """return a sample string describing what can be given as input for this |
175 field |
203 field |
176 """ |
204 """ |
177 return u'' |
205 return u'' |
354 yield self.name_field |
382 yield self.name_field |
355 |
383 |
356 def render(self, form, renderer): |
384 def render(self, form, renderer): |
357 wdgs = [self.get_widget(form).render(form, self, renderer)] |
385 wdgs = [self.get_widget(form).render(form, self, renderer)] |
358 if self.format_field or self.encoding_field: |
386 if self.format_field or self.encoding_field: |
359 divid = '%s-advanced' % form.context[self]['name'] |
387 divid = '%s-advanced' % self.input_name(form) |
360 wdgs.append(u'<a href="%s" title="%s"><img src="%s" alt="%s"/></a>' % |
388 wdgs.append(u'<a href="%s" title="%s"><img src="%s" alt="%s"/></a>' % |
361 (xml_escape(uilib.toggle_action(divid)), |
389 (xml_escape(uilib.toggle_action(divid)), |
362 form._cw._('show advanced fields'), |
390 form._cw._('show advanced fields'), |
363 xml_escape(form._cw.build_url('data/puce_down.png')), |
391 xml_escape(form._cw.build_url('data/puce_down.png')), |
364 form._cw._('show advanced fields'))) |
392 form._cw._('show advanced fields'))) |
371 wdgs.append(self.render_subfield(form, self.encoding_field, renderer)) |
399 wdgs.append(self.render_subfield(form, self.encoding_field, renderer)) |
372 wdgs.append(u'</div>') |
400 wdgs.append(u'</div>') |
373 if not self.required and form.context[self]['value']: |
401 if not self.required and form.context[self]['value']: |
374 # trick to be able to delete an uploaded file |
402 # trick to be able to delete an uploaded file |
375 wdgs.append(u'<br/>') |
403 wdgs.append(u'<br/>') |
376 wdgs.append(tags.input(name=u'%s__detach' % form.context[self]['name'], |
404 wdgs.append(tags.input(name=self.input_name(form, u'__detach'), |
377 type=u'checkbox')) |
405 type=u'checkbox')) |
378 wdgs.append(form._cw._('detach attached file')) |
406 wdgs.append(form._cw._('detach attached file')) |
379 return u'\n'.join(wdgs) |
407 return u'\n'.join(wdgs) |
380 |
408 |
381 def render_subfield(self, form, field, renderer): |
409 def render_subfield(self, form, field, renderer): |
384 + renderer.render_help(form, field) |
412 + renderer.render_help(form, field) |
385 + u'<br/>') |
413 + u'<br/>') |
386 |
414 |
387 def process_form_value(self, form): |
415 def process_form_value(self, form): |
388 posted = form._cw.form |
416 posted = form._cw.form |
389 value = posted.get(form.form_field_name(self)) |
417 if self.input_name(form, u'__detach') in posted: |
390 formkey = form.form_field_name(self) |
|
391 if ('%s__detach' % form.context[self]['name']) in posted: |
|
392 # drop current file value |
418 # drop current file value |
393 value = None |
419 value = None |
|
420 else: |
|
421 value = posted.get(self.input_name(form)) |
394 # no need to check value when nor explicit detach nor new file |
422 # no need to check value when nor explicit detach nor new file |
395 # submitted, since it will think the attribute is not modified |
423 # submitted, since it will think the attribute is not modified |
396 elif value: |
424 elif value: |
397 filename, _, stream = value |
425 filename, _, stream = value |
398 # value is a 3-uple (filename, mimetype, stream) |
426 # value is a 3-uple (filename, mimetype, stream) |
432 wdgs.append(TextArea(setdomid=False).render(form, self, renderer)) |
460 wdgs.append(TextArea(setdomid=False).render(form, self, renderer)) |
433 # XXX restore form context? |
461 # XXX restore form context? |
434 return '\n'.join(wdgs) |
462 return '\n'.join(wdgs) |
435 |
463 |
436 def process_form_value(self, form): |
464 def process_form_value(self, form): |
437 value = form._cw.form.get(form.form_field_name(self)) |
465 value = form._cw.form.get(self.input_name(form)) |
438 if isinstance(value, unicode): |
466 if isinstance(value, unicode): |
439 # file modified using a text widget |
467 # file modified using a text widget |
440 encoding = form.form_field_encoding(self) |
468 encoding = form.form_field_encoding(self) |
441 return Binary(value.encode(encoding)) |
469 return Binary(value.encode(encoding)) |
442 return super(EditableFileField, self).process_form_value(form) |
470 return super(EditableFileField, self).process_form_value(form) |