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)