Add mk/rm/copy/move commands to webdav and some fixes
- Fix Document import in pywebdav - Add close cursor - Use hostname if not ip address
This commit is contained in:
1 parent
b8c554b05e
commit
0b7d529752
2 files changed
+215
-17
No files matched your search
@@ -12,12 +12,13 @@ class Directory(OSV):
|
||||
_description = __doc__
|
||||
_columns = {
|
||||
'name': fields.Char('Name', size=128, required=True, select=1),
|
||||
'parent': fields.Many2One('webdav.directory', 'Parent'),
|
||||
'parent': fields.Many2One('webdav.directory', 'Parent',
|
||||
ondelete='restrict'),
|
||||
'childs': fields.One2Many('webdav.directory', 'parent', 'Childs'),
|
||||
'model': fields.Many2One('ir.model', 'Model'),
|
||||
'domain': fields.Char('Domain', size=250),
|
||||
}
|
||||
_default = {
|
||||
_defaults = {
|
||||
'domain': lambda *a: '[]',
|
||||
}
|
||||
_sql_constraints = [
|
||||
@@ -30,6 +31,8 @@ class Directory(OSV):
|
||||
|
||||
def _uri2object(self, cursor, user, uri, object_name=_name, object_id=False,
|
||||
context=None):
|
||||
if not uri:
|
||||
return self._name, False
|
||||
name, uri = (uri.split('/', 1) + [None])[0:2]
|
||||
if object_name == self._name:
|
||||
object_id = self.search(cursor, user, [
|
||||
@@ -45,9 +48,13 @@ class Directory(OSV):
|
||||
else:
|
||||
if uri:
|
||||
return None, 0
|
||||
object_name = 'ir.attachment'
|
||||
object_id = int(os.path.splitext(name)[0].rsplit('-',
|
||||
1)[1].strip())
|
||||
try:
|
||||
object_id = int(os.path.splitext(name)[0].rsplit('-',
|
||||
1)[1].strip())
|
||||
object_name = 'ir.attachment'
|
||||
except:
|
||||
object_id = False
|
||||
object_name = None
|
||||
else:
|
||||
if uri:
|
||||
if '/' in uri:
|
||||
@@ -76,7 +83,7 @@ class Directory(OSV):
|
||||
return res
|
||||
object_name, object_id = self._uri2object(cursor, user, uri,
|
||||
context=context)
|
||||
if object_name == self._name:
|
||||
if object_name == self._name and object_id:
|
||||
directory = self.browse(cursor, user, object_id, context=context)
|
||||
if directory.model:
|
||||
model_obj = self.pool.get(directory.model.model)
|
||||
@@ -147,7 +154,7 @@ class Directory(OSV):
|
||||
object_name, object_id = self._uri2object(cursor, user, uri,
|
||||
context=context)
|
||||
model_obj = self.pool.get(object_name)
|
||||
if model_obj._log_access:
|
||||
if model_obj._log_access and object_id:
|
||||
cursor.execute('SELECT EXTRACT(epoch FROM write_date) ' \
|
||||
'FROM "' + model_obj._table +'" ' \
|
||||
'WHERE id = %d', (object_id,))
|
||||
@@ -166,10 +173,78 @@ class Directory(OSV):
|
||||
return base64.decodestring(attachment.datas)
|
||||
return DAV_NotFound
|
||||
|
||||
def put(self, cursor, user, uri, data, content_type, context=None):
|
||||
from DAV.errors import DAV_Forbidden
|
||||
from DAV.utils import get_uriparentpath, get_urifilename
|
||||
object_name, object_id = self._uri2object(cursor, user,
|
||||
get_uriparentpath(uri), context=context)
|
||||
if object_name in ('ir.attachment') \
|
||||
or not object_id:
|
||||
raise DAV_Forbidden
|
||||
attachment_obj = self.pool.get('ir.attachment')
|
||||
name = get_urifilename(uri)
|
||||
try:
|
||||
attachment_obj.create(cursor, user, {
|
||||
'name': name,
|
||||
'datas': base64.encodestring(data),
|
||||
'datas_fname': name,
|
||||
'res_model': object_name,
|
||||
'res_id': object_id,
|
||||
}, context=context)
|
||||
except:
|
||||
raise DAV_Forbidden
|
||||
return 201
|
||||
|
||||
def mkcol(self, cursor, user, uri, context=None):
|
||||
from DAV.errors import DAV_Forbidden
|
||||
from DAV.utils import get_uriparentpath, get_urifilename
|
||||
if uri[-1:] == '/':
|
||||
uri = uri[:-1]
|
||||
object_name, object_id = self._uri2object(cursor, user,
|
||||
get_uriparentpath(uri), context=context)
|
||||
if object_name != 'webdav.directory':
|
||||
raise DAV_Forbidden
|
||||
name = get_urifilename(uri)
|
||||
try:
|
||||
self.create(cursor, user, {
|
||||
'name': name,
|
||||
'parent': object_id,
|
||||
}, context=context)
|
||||
except:
|
||||
raise DAV_Forbidden
|
||||
return 201
|
||||
|
||||
def rmcol(self, cursor, user, uri, context=None):
|
||||
from DAV.errors import DAV_Forbidden
|
||||
object_name, object_id = self._uri2object(cursor, user, uri,
|
||||
context=context)
|
||||
if object_name != 'webdav.directory' \
|
||||
or not object_id:
|
||||
raise DAV_Forbidden
|
||||
try:
|
||||
self.unlink(cursor, user, object_id, context=context)
|
||||
except:
|
||||
raise DAV_Forbidden
|
||||
return 200
|
||||
|
||||
def rm(self, cursor, user, uri, context=None):
|
||||
from DAV.errors import DAV_Forbidden
|
||||
object_name, object_id = self._uri2object(cursor, user, uri,
|
||||
context=context)
|
||||
if object_name != 'ir.attachment' \
|
||||
or not object_id:
|
||||
raise DAV_Forbidden
|
||||
model_obj = self.pool.get(object_name)
|
||||
try:
|
||||
model_obj.unlink(cursor, user, object_id, context=context)
|
||||
except:
|
||||
raise DAV_Forbidden
|
||||
return 200
|
||||
|
||||
def exists(self, cursor, user, uri, context=None):
|
||||
object_name, object_id = self._uri2object(cursor, user, uri,
|
||||
context=context)
|
||||
if object_name:
|
||||
if object_name and object_id:
|
||||
return 1
|
||||
return None
|
||||
|
||||
|
||||
+132
-9
@@ -6,6 +6,7 @@ from DAV import AuthServer, WebDAVServer, iface
|
||||
from DAV.errors import *
|
||||
from DAV.constants import COLLECTION, OBJECT
|
||||
from DAV.utils import get_uriparentpath, get_urifilename
|
||||
from DAV.davcmd import copyone, copytree, moveone, movetree, delone, deltree
|
||||
from netsvc import LocalService
|
||||
import security
|
||||
import pooler
|
||||
@@ -14,14 +15,21 @@ from version import PACKAGE, VERSION, WEBSITE
|
||||
# This work because there is only one thread
|
||||
USER_ID = 0
|
||||
|
||||
# Fix for bad use of Document in DAV.utils make_xmlresponse
|
||||
from DAV.utils import VERSION as DAV_VERSION
|
||||
if DAV_VERSION == '0.6':
|
||||
from xml.dom.Document import Document
|
||||
Document.Document = Document
|
||||
|
||||
class TrytonDAVInterface(iface.dav_interface):
|
||||
|
||||
def __init__(self, interface, port):
|
||||
self.baseuri = 'http://%s:%s/' % (interface or socket.getfqdn(), port)
|
||||
self.baseuri = 'http://%s:%s/' % (interface or socket.gethostname(), port)
|
||||
|
||||
def _get_dburi(self, uri):
|
||||
uri = uri[len(self.baseuri):]
|
||||
uri = urlparse.urlsplit(uri)[2]
|
||||
if uri[0] == '/':
|
||||
uri = uri[1:]
|
||||
dbname, uri = (uri.split('/', 1) + [None])[0:2]
|
||||
return dbname, uri
|
||||
|
||||
@@ -40,6 +48,7 @@ class TrytonDAVInterface(iface.dav_interface):
|
||||
uri += '/'
|
||||
for child in directory_obj.get_childs(cursor, USER_ID, dburi):
|
||||
res.append(urlparse.urljoin(self.baseuri, uri + child))
|
||||
cursor.close()
|
||||
return res
|
||||
|
||||
def get_data(self, uri):
|
||||
@@ -71,7 +80,46 @@ class TrytonDAVInterface(iface.dav_interface):
|
||||
pool = pooler.get_pool(dbname)
|
||||
cursor = pooler.get_db(dbname).cursor()
|
||||
directory_obj = pool.get('webdav.directory')
|
||||
return directory_obj.get_data(cursor, USER_ID, dburi)
|
||||
res = directory_obj.get_data(cursor, USER_ID, dburi)
|
||||
cursor.close()
|
||||
return res
|
||||
|
||||
def put(self, uri, data, content_type=''):
|
||||
dbname, dburi = self._get_dburi(uri)
|
||||
if not dbname or not dburi:
|
||||
raise DAV_Forbidden
|
||||
pool = pooler.get_pool(dbname)
|
||||
cursor = pooler.get_db(dbname).cursor()
|
||||
directory_obj = pool.get('webdav.directory')
|
||||
try:
|
||||
try:
|
||||
res = directory_obj.put(cursor, USER_ID, dburi, data,
|
||||
content_type)
|
||||
cursor.commit()
|
||||
except:
|
||||
cursor.rollback()
|
||||
raise
|
||||
finally:
|
||||
cursor.close()
|
||||
return res
|
||||
|
||||
def mkcol(self, uri):
|
||||
dbname, dburi = self._get_dburi(uri)
|
||||
if not dbname or not dburi:
|
||||
raise DAV_Forbidden
|
||||
pool = pooler.get_pool(dbname)
|
||||
cursor = pooler.get_db(dbname).cursor()
|
||||
directory_obj = pool.get('webdav.directory')
|
||||
try:
|
||||
try:
|
||||
res = directory_obj.mkcol(cursor, USER_ID, dburi)
|
||||
cursor.commit()
|
||||
except:
|
||||
cursor.rollback()
|
||||
raise
|
||||
finally:
|
||||
cursor.close()
|
||||
return res
|
||||
|
||||
def _get_dav_resourcetype(self, uri):
|
||||
dbname, dburi = self._get_dburi(uri)
|
||||
@@ -80,7 +128,9 @@ class TrytonDAVInterface(iface.dav_interface):
|
||||
pool = pooler.get_pool(dbname)
|
||||
cursor = pooler.get_db(dbname).cursor()
|
||||
directory_obj = pool.get('webdav.directory')
|
||||
return directory_obj.get_resourcetype(cursor, USER_ID, dburi)
|
||||
res = directory_obj.get_resourcetype(cursor, USER_ID, dburi)
|
||||
cursor.close()
|
||||
return res
|
||||
|
||||
def _get_dav_displayname(self, uri):
|
||||
raise DAV_Secret
|
||||
@@ -92,7 +142,9 @@ class TrytonDAVInterface(iface.dav_interface):
|
||||
pool = pooler.get_pool(dbname)
|
||||
cursor = pooler.get_db(dbname).cursor()
|
||||
directory_obj = pool.get('webdav.directory')
|
||||
return directory_obj.get_contentlength(cursor, USER_ID, dburi)
|
||||
res = directory_obj.get_contentlength(cursor, USER_ID, dburi)
|
||||
cursor.close()
|
||||
return res
|
||||
|
||||
def _get_dav_getcontenttype(self, uri):
|
||||
dbname, dburi = self._get_dburi(uri)
|
||||
@@ -101,7 +153,9 @@ class TrytonDAVInterface(iface.dav_interface):
|
||||
pool = pooler.get_pool(dbname)
|
||||
cursor = pooler.get_db(dbname).cursor()
|
||||
directory_obj = pool.get('webdav.directory')
|
||||
return directory_obj.get_contenttype(cursor, USER_ID, dburi)
|
||||
res = directory_obj.get_contenttype(cursor, USER_ID, dburi)
|
||||
cursor.close()
|
||||
return res
|
||||
|
||||
def get_creationdate(self, uri):
|
||||
dbname, dburi = self._get_dburi(uri)
|
||||
@@ -110,7 +164,9 @@ class TrytonDAVInterface(iface.dav_interface):
|
||||
pool = pooler.get_pool(dbname)
|
||||
cursor = pooler.get_db(dbname).cursor()
|
||||
directory_obj = pool.get('webdav.directory')
|
||||
return directory_obj.get_creationdate(cursor, USER_ID, dburi)
|
||||
res = directory_obj.get_creationdate(cursor, USER_ID, dburi)
|
||||
cursor.close()
|
||||
return res
|
||||
|
||||
def get_lastmodified(self, uri):
|
||||
dbname, dburi = self._get_dburi(uri)
|
||||
@@ -119,7 +175,45 @@ class TrytonDAVInterface(iface.dav_interface):
|
||||
pool = pooler.get_pool(dbname)
|
||||
cursor = pooler.get_db(dbname).cursor()
|
||||
directory_obj = pool.get('webdav.directory')
|
||||
return directory_obj.get_lastmodified(cursor, USER_ID, dburi)
|
||||
res = directory_obj.get_lastmodified(cursor, USER_ID, dburi)
|
||||
cursor.close()
|
||||
return res
|
||||
|
||||
def rmcol(self, uri):
|
||||
dbname, dburi = self._get_dburi(uri)
|
||||
if not dbname or not dburi:
|
||||
raise DAV_Forbidden
|
||||
pool = pooler.get_pool(dbname)
|
||||
cursor = pooler.get_db(dbname).cursor()
|
||||
directory_obj = pool.get('webdav.directory')
|
||||
try:
|
||||
try:
|
||||
res = directory_obj.rmcol(cursor, USER_ID, dburi)
|
||||
cursor.commit()
|
||||
except:
|
||||
cursor.rollback()
|
||||
raise
|
||||
finally:
|
||||
cursor.close()
|
||||
return res
|
||||
|
||||
def rm(self, uri):
|
||||
dbname, dburi = self._get_dburi(uri)
|
||||
if not dbname or not dburi:
|
||||
raise DAV_Forbidden
|
||||
pool = pooler.get_pool(dbname)
|
||||
cursor = pooler.get_db(dbname).cursor()
|
||||
directory_obj = pool.get('webdav.directory')
|
||||
try:
|
||||
try:
|
||||
res = directory_obj.rm(cursor, USER_ID, dburi)
|
||||
cursor.commit()
|
||||
except:
|
||||
cursor.rollback()
|
||||
raise
|
||||
finally:
|
||||
cursor.close()
|
||||
return res
|
||||
|
||||
def exists(self, uri):
|
||||
dbname, dburi = self._get_dburi(uri)
|
||||
@@ -128,13 +222,42 @@ class TrytonDAVInterface(iface.dav_interface):
|
||||
pool = pooler.get_pool(dbname)
|
||||
cursor = pooler.get_db(dbname).cursor()
|
||||
directory_obj = pool.get('webdav.directory')
|
||||
return directory_obj.exists(cursor, USER_ID, dburi)
|
||||
res = directory_obj.exists(cursor, USER_ID, dburi)
|
||||
cursor.close()
|
||||
return res
|
||||
|
||||
def is_collection(self, uri):
|
||||
if self._get_dav_resourcetype(uri) == COLLECTION:
|
||||
return 1
|
||||
return 0
|
||||
|
||||
def copyone(self, src, dst, overwrite):
|
||||
return copyone(self, src, dst, overwrite)
|
||||
|
||||
def copytree(self, src, dst, overwrite):
|
||||
return copytree(self, src, dst, overwrite)
|
||||
|
||||
def moveone(self, uri):
|
||||
return moveone(self, uri)
|
||||
|
||||
def movetree(self, src, dst, overwrite):
|
||||
return movetree(self, src, dst, overwrite)
|
||||
|
||||
def delone(self, uri):
|
||||
return delone(self, uri)
|
||||
|
||||
def deltree(self, uri):
|
||||
return deltree(self, uri)
|
||||
|
||||
def copy(self, src, dst):
|
||||
content = self._get_dav_getcontenttype(src)
|
||||
data = self.get_data(src)
|
||||
self.put(dst, data, content)
|
||||
return 201
|
||||
|
||||
def copycol(self, src, dst):
|
||||
return self.mkcol(dst)
|
||||
|
||||
|
||||
class WebDAVAuthRequestHandler(AuthServer.BufferedAuthRequestHandler,
|
||||
WebDAVServer.DAVRequestHandler):
|
||||
|
||||
Reference in new issue
Block a user