296 vocab = [(label and form._cw._(label), value) for label, value in vocab] |
296 vocab = [(label and form._cw._(label), value) for label, value in vocab] |
297 if self.sort: |
297 if self.sort: |
298 vocab = vocab_sort(vocab) |
298 vocab = vocab_sort(vocab) |
299 return vocab |
299 return vocab |
300 |
300 |
|
301 def format(self, form): |
|
302 """return MIME type used for the given (text or bytes) field""" |
|
303 if self.eidparam and self.role == 'subject': |
|
304 entity = form.edited_entity |
|
305 if entity.e_schema.has_metadata(self.name, 'format') and ( |
|
306 entity.has_eid() or '%s_format' % self.name in entity): |
|
307 return form.edited_entity.attr_metadata(self.name, 'format') |
|
308 return form._cw.property_value('ui.default-text-format') |
|
309 |
|
310 def encoding(self, form): |
|
311 """return encoding used for the given (text) field""" |
|
312 if self.eidparam: |
|
313 entity = form.edited_entity |
|
314 if entity.e_schema.has_metadata(self.name, 'encoding') and ( |
|
315 entity.has_eid() or '%s_encoding' % self.name in entity): |
|
316 return form.edited_entity.attr_metadata(self.name, 'encoding') |
|
317 return form._cw.encoding |
|
318 |
301 def form_init(self, form): |
319 def form_init(self, form): |
302 """method called before by build_context to trigger potential field |
320 """method called before by build_context to trigger potential field |
303 initialization requiring the form instance |
321 initialization requiring the form instance |
304 """ |
322 """ |
305 pass |
323 pass |
|
324 |
|
325 def has_been_modified(self, form): |
|
326 if self.is_visible(): |
|
327 # fields not corresponding to an entity attribute / relations |
|
328 # are considered modified |
|
329 if not self.eidparam or not self.role or not form.edited_entity.has_eid(): |
|
330 return True # XXX |
|
331 try: |
|
332 if self.role == 'subject': |
|
333 previous_value = getattr(form.edited_entity, self.name) |
|
334 else: |
|
335 previous_value = getattr(form.edited_entity, |
|
336 'reverse_%s' % self.name) |
|
337 except AttributeError: |
|
338 # fields with eidparam=True but not corresponding to an actual |
|
339 # attribute or relation |
|
340 return True |
|
341 # if it's a non final relation, we need the eids |
|
342 if isinstance(previous_value, list): |
|
343 # widget should return untyped eids |
|
344 previous_value = set(unicode(e.eid) for e in previous_value) |
|
345 if form.edited_entity.has_eid() and (previous_value == self.process_form_value(form)): |
|
346 return False # not modified |
|
347 return True |
|
348 return False |
306 |
349 |
307 def process_form_value(self, form): |
350 def process_form_value(self, form): |
308 """process posted form and return correctly typed value""" |
351 """process posted form and return correctly typed value""" |
309 widget = self.get_widget(form) |
352 widget = self.get_widget(form) |
310 return widget.process_field_data(form, self) |
353 return widget.process_field_data(form, self) |
417 def use_fckeditor(self, form): |
460 def use_fckeditor(self, form): |
418 """return True if fckeditor should be used to edit entity's attribute named |
461 """return True if fckeditor should be used to edit entity's attribute named |
419 `attr`, according to user preferences |
462 `attr`, according to user preferences |
420 """ |
463 """ |
421 if form._cw.use_fckeditor(): |
464 if form._cw.use_fckeditor(): |
422 return form.form_field_format(self) == 'text/html' |
465 return self.format(form) == 'text/html' |
423 return False |
466 return False |
424 |
467 |
425 def render(self, form, renderer): |
468 def render(self, form, renderer): |
426 format_field = self.get_format_field(form) |
469 format_field = self.get_format_field(form) |
427 if format_field: |
470 if format_field: |
524 def render(self, form, renderer): |
567 def render(self, form, renderer): |
525 wdgs = [super(EditableFileField, self).render(form, renderer)] |
568 wdgs = [super(EditableFileField, self).render(form, renderer)] |
526 if self.format(form) in self.editable_formats: |
569 if self.format(form) in self.editable_formats: |
527 data = self.typed_value(form, load_bytes=True) |
570 data = self.typed_value(form, load_bytes=True) |
528 if data: |
571 if data: |
529 encoding = form.form_field_encoding(self) |
572 encoding = self.encoding(form) |
530 try: |
573 try: |
531 form.formvalues[self] = unicode(data.getvalue(), encoding) |
574 form.formvalues[self] = unicode(data.getvalue(), encoding) |
532 except UnicodeError: |
575 except UnicodeError: |
533 pass |
576 pass |
534 else: |
577 else: |
549 |
592 |
550 def process_form_value(self, form): |
593 def process_form_value(self, form): |
551 value = form._cw.form.get(self.input_name(form)) |
594 value = form._cw.form.get(self.input_name(form)) |
552 if isinstance(value, unicode): |
595 if isinstance(value, unicode): |
553 # file modified using a text widget |
596 # file modified using a text widget |
554 encoding = form.form_field_encoding(self) |
597 return Binary(value.encode(self.encoding(form))) |
555 return Binary(value.encode(encoding)) |
|
556 return super(EditableFileField, self).process_form_value(form) |
598 return super(EditableFileField, self).process_form_value(form) |
557 |
599 |
558 |
600 |
559 class IntField(Field): |
601 class IntField(Field): |
560 def __init__(self, min=None, max=None, **kwargs): |
602 def __init__(self, min=None, max=None, **kwargs): |