mirror of
https://github.com/OCA/knowledge.git
synced 2025-07-26 10:28:40 -06:00
[ADD] deleting files
This commit is contained in:
parent
7ccb6914b2
commit
88b15da714
@ -37,6 +37,13 @@ class DocumentSFTPSftpServerInterface(SFTPServerInterface):
|
|||||||
return SFTP_PERMISSION_DENIED
|
return SFTP_PERMISSION_DENIED
|
||||||
return handler._open(path, flags, attr)
|
return handler._open(path, flags, attr)
|
||||||
|
|
||||||
|
def remove(self, path):
|
||||||
|
handler = self.env['document.sftp']._get_handler_for(path)
|
||||||
|
if handler is None:
|
||||||
|
return SFTP_PERMISSION_DENIED
|
||||||
|
return handler._remove(path)
|
||||||
|
|
||||||
|
|
||||||
def session_ended(self):
|
def session_ended(self):
|
||||||
self.env.cr.commit()
|
self.env.cr.commit()
|
||||||
self.env.cr.close()
|
self.env.cr.close()
|
||||||
|
@ -62,6 +62,11 @@ class DocumentSFTPRoot(models.AbstractModel):
|
|||||||
"""Return file attributes"""
|
"""Return file attributes"""
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _remove(self, path):
|
||||||
|
"""Return file attributes"""
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _lstat(self, path):
|
def _lstat(self, path):
|
||||||
"""Return attributes about a link"""
|
"""Return attributes about a link"""
|
||||||
|
@ -2,9 +2,9 @@
|
|||||||
# © 2016 Therp BV <http://therp.nl>
|
# © 2016 Therp BV <http://therp.nl>
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||||
import os
|
import os
|
||||||
from openerp import api, models
|
from openerp import api, models, exceptions
|
||||||
try:
|
try:
|
||||||
from paramiko import SFTP_NO_SUCH_FILE, SFTP_PERMISSION_DENIED
|
from paramiko import SFTP_OK, SFTP_NO_SUCH_FILE, SFTP_PERMISSION_DENIED
|
||||||
except ImportError: # pragma: no cover
|
except ImportError: # pragma: no cover
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -19,6 +19,18 @@ class DocumentSFTPRootByModel(models.Model):
|
|||||||
def _get_root_attributes(self):
|
def _get_root_attributes(self):
|
||||||
return self._directory(self._virtual_root)
|
return self._directory(self._virtual_root)
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _get_attachment(self, components):
|
||||||
|
"""return an attachment if we have a full path
|
||||||
|
in the form /By model/res.company/$id/$attachment"""
|
||||||
|
return self.env['ir.attachment'].search([
|
||||||
|
('res_model', '=', components[-3]),
|
||||||
|
('res_id', '=', components[-2]),
|
||||||
|
'|',
|
||||||
|
('datas_fname', '=', components[-1]),
|
||||||
|
('name', '=', components[-1]),
|
||||||
|
], limit=1)
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _stat(self, path):
|
def _stat(self, path):
|
||||||
path = path.strip('/')
|
path = path.strip('/')
|
||||||
@ -30,13 +42,7 @@ class DocumentSFTPRootByModel(models.Model):
|
|||||||
elif len(components) in (2, 3):
|
elif len(components) in (2, 3):
|
||||||
return self._directory(components[-1])
|
return self._directory(components[-1])
|
||||||
elif len(components) == 4:
|
elif len(components) == 4:
|
||||||
return self._file(self.env['ir.attachment'].search([
|
return self._file(self._get_attachment(components))
|
||||||
('res_model', '=', components[-3]),
|
|
||||||
('res_id', '=', components[-2]),
|
|
||||||
'|',
|
|
||||||
('datas_fname', '=', components[-1]),
|
|
||||||
('name', '=', components[-1]),
|
|
||||||
], limit=1))
|
|
||||||
return SFTP_NO_SUCH_FILE
|
return SFTP_NO_SUCH_FILE
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
@ -82,11 +88,7 @@ class DocumentSFTPRootByModel(models.Model):
|
|||||||
components = self._split_path(path)
|
components = self._split_path(path)
|
||||||
if len(components) == 4:
|
if len(components) == 4:
|
||||||
# TODO: locking!
|
# TODO: locking!
|
||||||
existing = self.env['ir.attachment'].search([
|
existing = self._get_attachment(components)
|
||||||
('res_model', '=', components[-3]),
|
|
||||||
('res_id', '=', int(components[-2])),
|
|
||||||
('datas_fname', '=', components[-1]),
|
|
||||||
])
|
|
||||||
return self._file_handle(
|
return self._file_handle(
|
||||||
existing or self.env['ir.attachment'].new({
|
existing or self.env['ir.attachment'].new({
|
||||||
'res_model': components[-3],
|
'res_model': components[-3],
|
||||||
@ -101,11 +103,16 @@ class DocumentSFTPRootByModel(models.Model):
|
|||||||
def _open_read(self, path, flags, attr):
|
def _open_read(self, path, flags, attr):
|
||||||
components = self._split_path(path)
|
components = self._split_path(path)
|
||||||
if len(components) == 4:
|
if len(components) == 4:
|
||||||
return self._file_handle(self.env['ir.attachment'].search([
|
return self._file_handle(self._get_attachment(components))
|
||||||
('res_model', '=', components[-3]),
|
|
||||||
('res_id', '=', components[-2]),
|
|
||||||
'|',
|
|
||||||
('datas_fname', '=', components[-1]),
|
|
||||||
('name', '=', components[-1]),
|
|
||||||
], limit=1))
|
|
||||||
return SFTP_PERMISSION_DENIED
|
return SFTP_PERMISSION_DENIED
|
||||||
|
|
||||||
|
@api.model
|
||||||
|
def _remove(self, path):
|
||||||
|
components = self._split_path(path)
|
||||||
|
if len(components) == 4:
|
||||||
|
try:
|
||||||
|
self._get_attachment(components).unlink()
|
||||||
|
self.env.cr.commit()
|
||||||
|
except exceptions.AccessError:
|
||||||
|
return SFTP_PERMISSION_DENIED
|
||||||
|
return SFTP_OK
|
||||||
|
Loading…
Reference in New Issue
Block a user