def __init__(self, field_name, model_name, treeview, attrs=None):
     super(Binary, self).__init__(field_name, model_name, treeview,
         attrs=attrs)
     self.filename = attrs.get('filename')
     self.renderer = CellRendererBinary(bool(self.filename))
     self.renderer.connect('new', self.new_binary)
     self.renderer.connect('open', self.open_binary)
     self.renderer.connect('save', self.save_binary)
     self.renderer.connect('clear', self.clear_binary)
class Binary(Char):

    def __init__(self, field_name, model_name, treeview, attrs=None):
        super(Binary, self).__init__(field_name, model_name, treeview,
            attrs=attrs)
        self.filename = attrs.get('filename')
        self.renderer = CellRendererBinary(bool(self.filename))
        self.renderer.connect('new', self.new_binary)
        self.renderer.connect('open', self.open_binary)
        self.renderer.connect('save', self.save_binary)
        self.renderer.connect('clear', self.clear_binary)

    def get_textual_value(self, record):
        pass

    def value_from_text(self, record, text, callback=None):
        if callback:
            callback()

    @realized
    def setter(self, column, cell, store, iter):
        record = store.get_value(iter, 0)
        size = record[self.field_name].get_size(record)
        cell.set_property('size', common.humanize(size) if size else '')

    def _get_record_field(self, path):
        store = self.treeview.get_model()
        record = store.get_value(store.get_iter(path), 0)
        field = record.group.fields[self.field_name]
        return record, field

    def new_binary(self, renderer, path):
        filename = file_selection(_('Open...'))
        record, field = self._get_record_field(path)
        if filename:
            field.set_client(record, open(filename, 'rb').read())
            if self.filename:
                filename_field = record.group.fields[self.filename]
                filename_field.set_client(record, os.path.basename(filename))

    def open_binary(self, renderer, path):
        if not self.filename:
            return
        dtemp = tempfile.mkdtemp(prefix='tryton_')
        record, field = self._get_record_field(path)
        filename_field = record.group.fields.get(self.filename)
        filename = filename_field.get(record).replace(
            os.sep, '_').replace(os.altsep or os.sep, '_')
        if not filename:
            return
        file_path = os.path.join(dtemp, filename)
        with open(file_path, 'wb') as fp:
            fp.write(field.get_data(record))
        root, type_ = os.path.splitext(filename)
        if type_:
            type_ = type_[1:]
        file_open(file_path, type_)

    def save_binary(self, renderer, path):
        filename = ''
        record, field = self._get_record_field(path)
        if self.filename:
            filename_field = record.group.fields.get(self.filename)
            filename = filename_field.get(record)
        filename = file_selection(_('Save As...'), filename=filename,
            action=gtk.FILE_CHOOSER_ACTION_SAVE)
        if filename:
            with open(filename, 'wb') as fp:
                fp.write(field.get_data(record))

    def clear_binary(self, renderer, path):
        record, field = self._get_record_field(path)
        field.set_client(record, False)