diff --git a/attachment_s3/models/ir_attachment.py b/attachment_s3/models/ir_attachment.py index 1c8a060..b03b511 100644 --- a/attachment_s3/models/ir_attachment.py +++ b/attachment_s3/models/ir_attachment.py @@ -178,10 +178,35 @@ class IrAttachment(models.Model): else: return super(IrAttachment, self)._store_file_read(fname, bin_size) + + def _inverse_datas(self): + location = self._storage() + for attach in self: + # compute the fields that depend on datas + value = attach.datas + bin_data = base64.b64decode(value) if value else b'' + vals = { + 'file_size': len(bin_data), + 'checksum': self._compute_checksum(bin_data), + 'index_content': self._index(bin_data, attach.datas_fname, attach.mimetype), + 'store_fname': False, + 'db_datas': value, + } + if value and location != 'db': + # save it to the filestore + vals['store_fname'] = self._file_write(value, vals['checksum'], mimetype=attach.mimetype) + vals['db_datas'] = False + + # take current location in filestore to possibly garbage-collect it + fname = attach.store_fname + # write as superuser, as user probably does not have write access + super(IrAttachment, attach.sudo()).write(vals) + if fname: + self._file_delete(fname) + @api.model - def _store_file_write(self, key, bin_data): + def _store_file_write(self, key, bin_data, mimetype=False): location = self.env.context.get('storage_location') or self._storage() - mimetype = self.env.context.get('mimetype') or self.mimetype if location == 's3': bucket = self._get_s3_bucket() obj = bucket.Object(key=key) diff --git a/base_attachment_object_storage/models/ir_attachment.py b/base_attachment_object_storage/models/ir_attachment.py index 1ef2a8a..0a3ecfa 100644 --- a/base_attachment_object_storage/models/ir_attachment.py +++ b/base_attachment_object_storage/models/ir_attachment.py @@ -164,10 +164,6 @@ class IrAttachment(models.Model): return len(bin_data) <= limit return False - def _get_datas_related_values(self, data, mimetype): - self=self.with_context(mimetype=mimetype) - return super(IrAttachment, self)._get_datas_related_values(data, mimetype) - def _inverse_datas(self): # override in order to store files that need fast access, # we keep them in the database instead of the object storage