193 try: |
193 try: |
194 vocab = self.choices(form=form) |
194 vocab = self.choices(form=form) |
195 except TypeError: |
195 except TypeError: |
196 warn('vocabulary method (eg field.choices) should now take ' |
196 warn('vocabulary method (eg field.choices) should now take ' |
197 'the form instance as argument', DeprecationWarning) |
197 'the form instance as argument', DeprecationWarning) |
198 vocab = self.choices(req=form.req) |
198 vocab = self.choices(req=form._cw) |
199 else: |
199 else: |
200 vocab = self.choices |
200 vocab = self.choices |
201 if vocab and not isinstance(vocab[0], (list, tuple)): |
201 if vocab and not isinstance(vocab[0], (list, tuple)): |
202 vocab = [(x, x) for x in vocab] |
202 vocab = [(x, x) for x in vocab] |
203 else: |
203 else: |
204 vocab = form.form_field_vocabulary(self) |
204 vocab = form.form_field_vocabulary(self) |
205 if self.internationalizable: |
205 if self.internationalizable: |
206 vocab = [(form.req._(label), value) for label, value in vocab] |
206 vocab = [(form._cw._(label), value) for label, value in vocab] |
207 if self.sort: |
207 if self.sort: |
208 vocab = vocab_sort(vocab) |
208 vocab = vocab_sort(vocab) |
209 return vocab |
209 return vocab |
210 |
210 |
211 def form_init(self, form): |
211 def form_init(self, form): |
282 def get_format_field(self, form): |
282 def get_format_field(self, form): |
283 if self.format_field: |
283 if self.format_field: |
284 return self.format_field |
284 return self.format_field |
285 # we have to cache generated field since it's use as key in the |
285 # we have to cache generated field since it's use as key in the |
286 # context dictionnary |
286 # context dictionnary |
287 req = form.req |
287 req = form._cw |
288 try: |
288 try: |
289 return req.data[self] |
289 return req.data[self] |
290 except KeyError: |
290 except KeyError: |
291 fkwargs = {'eidparam': self.eidparam} |
291 fkwargs = {'eidparam': self.eidparam} |
292 if self.use_fckeditor(form): |
292 if self.use_fckeditor(form): |
314 |
314 |
315 def use_fckeditor(self, form): |
315 def use_fckeditor(self, form): |
316 """return True if fckeditor should be used to edit entity's attribute named |
316 """return True if fckeditor should be used to edit entity's attribute named |
317 `attr`, according to user preferences |
317 `attr`, according to user preferences |
318 """ |
318 """ |
319 if form.req.use_fckeditor(): |
319 if form._cw.use_fckeditor(): |
320 return form.form_field_format(self) == 'text/html' |
320 return form.form_field_format(self) == 'text/html' |
321 return False |
321 return False |
322 |
322 |
323 def render(self, form, renderer): |
323 def render(self, form, renderer): |
324 format_field = self.get_format_field(form) |
324 format_field = self.get_format_field(form) |
352 wdgs = [self.get_widget(form).render(form, self, renderer)] |
352 wdgs = [self.get_widget(form).render(form, self, renderer)] |
353 if self.format_field or self.encoding_field: |
353 if self.format_field or self.encoding_field: |
354 divid = '%s-advanced' % form.context[self]['name'] |
354 divid = '%s-advanced' % form.context[self]['name'] |
355 wdgs.append(u'<a href="%s" title="%s"><img src="%s" alt="%s"/></a>' % |
355 wdgs.append(u'<a href="%s" title="%s"><img src="%s" alt="%s"/></a>' % |
356 (xml_escape(uilib.toggle_action(divid)), |
356 (xml_escape(uilib.toggle_action(divid)), |
357 form.req._('show advanced fields'), |
357 form._cw._('show advanced fields'), |
358 xml_escape(form.req.build_url('data/puce_down.png')), |
358 xml_escape(form._cw.build_url('data/puce_down.png')), |
359 form.req._('show advanced fields'))) |
359 form._cw._('show advanced fields'))) |
360 wdgs.append(u'<div id="%s" class="hidden">' % divid) |
360 wdgs.append(u'<div id="%s" class="hidden">' % divid) |
361 if self.format_field: |
361 if self.format_field: |
362 wdgs.append(self.render_subfield(form, self.format_field, renderer)) |
362 wdgs.append(self.render_subfield(form, self.format_field, renderer)) |
363 if self.encoding_field: |
363 if self.encoding_field: |
364 wdgs.append(self.render_subfield(form, self.encoding_field, renderer)) |
364 wdgs.append(self.render_subfield(form, self.encoding_field, renderer)) |
366 if not self.required and form.context[self]['value']: |
366 if not self.required and form.context[self]['value']: |
367 # trick to be able to delete an uploaded file |
367 # trick to be able to delete an uploaded file |
368 wdgs.append(u'<br/>') |
368 wdgs.append(u'<br/>') |
369 wdgs.append(tags.input(name=u'%s__detach' % form.context[self]['name'], |
369 wdgs.append(tags.input(name=u'%s__detach' % form.context[self]['name'], |
370 type=u'checkbox')) |
370 type=u'checkbox')) |
371 wdgs.append(form.req._('detach attached file')) |
371 wdgs.append(form._cw._('detach attached file')) |
372 return u'\n'.join(wdgs) |
372 return u'\n'.join(wdgs) |
373 |
373 |
374 def render_subfield(self, form, field, renderer): |
374 def render_subfield(self, form, field, renderer): |
375 return (renderer.render_label(form, field) |
375 return (renderer.render_label(form, field) |
376 + field.render(form, renderer) |
376 + field.render(form, renderer) |
377 + renderer.render_help(form, field) |
377 + renderer.render_help(form, field) |
378 + u'<br/>') |
378 + u'<br/>') |
379 |
379 |
380 def process_form_value(self, form): |
380 def process_form_value(self, form): |
381 posted = form.req.form |
381 posted = form._cw.form |
382 value = posted.get(form.form_field_name(self)) |
382 value = posted.get(form.form_field_name(self)) |
383 formkey = form.form_field_name(self) |
383 formkey = form.form_field_name(self) |
384 if ('%s__detach' % form.context[self]['name']) in posted: |
384 if ('%s__detach' % form.context[self]['name']) in posted: |
385 # drop current file value |
385 # drop current file value |
386 value = None |
386 value = None |
410 form.context[self]['value'] = unicode(data.getvalue(), encoding) |
410 form.context[self]['value'] = unicode(data.getvalue(), encoding) |
411 except UnicodeError: |
411 except UnicodeError: |
412 pass |
412 pass |
413 else: |
413 else: |
414 if not self.required: |
414 if not self.required: |
415 msg = form.req._( |
415 msg = form._cw._( |
416 'You can either submit a new file using the browse button above' |
416 'You can either submit a new file using the browse button above' |
417 ', or choose to remove already uploaded file by checking the ' |
417 ', or choose to remove already uploaded file by checking the ' |
418 '"detach attached file" check-box, or edit file content online ' |
418 '"detach attached file" check-box, or edit file content online ' |
419 'with the widget below.') |
419 'with the widget below.') |
420 else: |
420 else: |
421 msg = form.req._( |
421 msg = form._cw._( |
422 'You can either submit a new file using the browse button above' |
422 'You can either submit a new file using the browse button above' |
423 ', or edit file content online with the widget below.') |
423 ', or edit file content online with the widget below.') |
424 wdgs.append(u'<p><b>%s</b></p>' % msg) |
424 wdgs.append(u'<p><b>%s</b></p>' % msg) |
425 wdgs.append(TextArea(setdomid=False).render(form, self, renderer)) |
425 wdgs.append(TextArea(setdomid=False).render(form, self, renderer)) |
426 # XXX restore form context? |
426 # XXX restore form context? |
427 return '\n'.join(wdgs) |
427 return '\n'.join(wdgs) |
428 |
428 |
429 def process_form_value(self, form): |
429 def process_form_value(self, form): |
430 value = form.req.form.get(form.form_field_name(self)) |
430 value = form._cw.form.get(form.form_field_name(self)) |
431 if isinstance(value, unicode): |
431 if isinstance(value, unicode): |
432 # file modified using a text widget |
432 # file modified using a text widget |
433 encoding = form.form_field_encoding(self) |
433 encoding = form.form_field_encoding(self) |
434 return Binary(value.encode(encoding)) |
434 return Binary(value.encode(encoding)) |
435 return super(EditableFileField, self).process_form_value(form) |
435 return super(EditableFileField, self).process_form_value(form) |
451 widget = Radio |
451 widget = Radio |
452 |
452 |
453 def vocabulary(self, form): |
453 def vocabulary(self, form): |
454 if self.choices: |
454 if self.choices: |
455 return self.choices |
455 return self.choices |
456 return [(form.req._('yes'), '1'), (form.req._('no'), '')] |
456 return [(form._cw._('yes'), '1'), (form._cw._('no'), '')] |
457 |
457 |
458 def process_form_value(self, form): |
458 def process_form_value(self, form): |
459 return bool(Field.process_form_value(self, form)) |
459 return bool(Field.process_form_value(self, form)) |
460 |
460 |
461 class FloatField(IntField): |
461 class FloatField(IntField): |
532 kwargs.setdefault('widget', Select(multiple=card in '*+')) |
532 kwargs.setdefault('widget', Select(multiple=card in '*+')) |
533 return RelationField(**kwargs) |
533 return RelationField(**kwargs) |
534 |
534 |
535 def vocabulary(self, form): |
535 def vocabulary(self, form): |
536 entity = form.edited_entity |
536 entity = form.edited_entity |
537 req = entity.req |
537 req = entity._cw |
538 # first see if its specified by __linkto form parameters |
538 # first see if its specified by __linkto form parameters |
539 linkedto = entity.linked_to(self.name, self.role) |
539 linkedto = entity.linked_to(self.name, self.role) |
540 if linkedto: |
540 if linkedto: |
541 entities = (req.entity_from_eid(eid) for eid in linkedto) |
541 entities = (req.entity_from_eid(eid) for eid in linkedto) |
542 return [(entity.view('combobox'), entity.eid) for entity in entities] |
542 return [(entity.view('combobox'), entity.eid) for entity in entities] |