summaryrefslogtreecommitdiff
path: root/addons/document/nodes.py
diff options
context:
space:
mode:
Diffstat (limited to 'addons/document/nodes.py')
-rw-r--r--addons/document/nodes.py171
1 files changed, 86 insertions, 85 deletions
diff --git a/addons/document/nodes.py b/addons/document/nodes.py
index ee89f3d4c6c..f1c3c71a8e6 100644
--- a/addons/document/nodes.py
+++ b/addons/document/nodes.py
@@ -41,12 +41,11 @@ from StringIO import StringIO
# file: objct = ir.attachement
# root: if we are at the first directory of a ressource
#
-
-logger = logging.getLogger('doc2.nodes')
+_logger = logging.getLogger(__name__)
def _str2time(cre):
""" Convert a string with time representation (from db) into time (float)
-
+
Note: a place to fix if datetime is used in db.
"""
if not cre:
@@ -63,7 +62,7 @@ def get_node_context(cr, uid, context):
class node_context(object):
""" This is the root node, representing access to some particular context
-
+
A context is a set of persistent data, which may influence the structure
of the nodes. All other transient information during a data query should
be passed down with function arguments.
@@ -100,7 +99,7 @@ class node_context(object):
def __ne__(self, other):
return not self.__eq__(other)
-
+
def get(self, name, default=None):
return self.context.get(name, default)
@@ -120,7 +119,7 @@ class node_context(object):
"""Create (or locate) a node for a directory
@param dbro a browse object of document.directory
"""
-
+
fullpath = dbro.get_full_path(context=self.context)
klass = dbro.get_node_class(dbro, context=self.context)
return klass(fullpath, None ,self, dbro)
@@ -184,7 +183,7 @@ class node_descriptor(object):
def __nonzero__(self):
""" Ensure that a node_descriptor will never equal False
-
+
Since we do define __len__ and __iter__ for us, we must avoid
being regarded as non-true objects.
"""
@@ -245,7 +244,7 @@ class node_class(object):
else:
s.append(self.path)
return s #map(lambda x: '/' +x, s)
-
+
def __repr__(self):
return "%s@/%s" % (self.our_type, '/'.join(self.full_path()))
@@ -272,7 +271,7 @@ class node_class(object):
return False
def get_data(self,cr):
- raise TypeError('no data for %s'% self.type)
+ raise TypeError('No data for %s.'% self.type)
def open_data(self, cr, mode):
""" Open a node_descriptor object for this node.
@@ -286,10 +285,10 @@ class node_class(object):
For this class, there is no data, so no implementation. Each
child class that has data should override this.
"""
- raise TypeError('no data for %s' % self.type)
+ raise TypeError('No data for %s.' % self.type)
def _get_storage(self,cr):
- raise RuntimeError("no storage for base class")
+ raise RuntimeError("No storage for base class.")
def get_etag(self,cr):
""" Get a tag, unique per object + modification.
@@ -324,11 +323,11 @@ class node_class(object):
def get_dav_eprop(self, cr, ns, prop):
if not self.DAV_M_NS:
return None
-
+
if self.DAV_M_NS.has_key(ns):
prefix = self.DAV_M_NS[ns]
else:
- logger.debug('No namespace: %s ("%s")',ns, prop)
+ _logger.debug('No namespace: %s ("%s").',ns, prop)
return None
mname = prefix + "_" + prop.replace('-','_')
@@ -341,12 +340,12 @@ class node_class(object):
r = m(cr)
return r
except AttributeError:
- logger.debug('Property %s not supported' % prop, exc_info=True)
+ _logger.debug('The property %s is not supported.' % prop, exc_info=True)
return None
def get_dav_resourcetype(self, cr):
""" Get the DAV resource type.
-
+
Is here because some nodes may exhibit special behaviour, like
CalDAV/GroupDAV collections
"""
@@ -376,7 +375,7 @@ class node_class(object):
could do various things.
Should also consider node<->content, dir<->dir moves etc.
- Move operations, as instructed from APIs (eg. request from DAV) could
+ Move operations, as instructed from APIs (e.g. request from DAV) could
use this function.
"""
raise NotImplementedError(repr(self))
@@ -384,14 +383,14 @@ class node_class(object):
def create_child(self, cr, path, data=None):
""" Create a regular file under this node
"""
- logger.warning("Attempted to create a file under %r, not possible.", self)
- raise IOError(errno.EPERM, "Not allowed to create files here")
-
+ _logger.warning("Attempted to create a file under %r, not possible.", self)
+ raise IOError(errno.EPERM, "Not allowed to create file(s) here.")
+
def create_child_collection(self, cr, objname):
""" Create a child collection (directory) under self
"""
- logger.warning("Attempted to create a collection under %r, not possible.", self)
- raise IOError(errno.EPERM, "Not allowed to create folders here")
+ _logger.warning("Attempted to create a collection under %r, not possible.", self)
+ raise IOError(errno.EPERM, "Not allowed to create folder(s) here.")
def rm(self, cr):
raise NotImplementedError(repr(self))
@@ -405,7 +404,7 @@ class node_class(object):
def check_perms(self, perms):
""" Check the permissions of the current node.
-
+
@param perms either an integers of the bits to check, or
a string with the permission letters
@@ -415,7 +414,7 @@ class node_class(object):
4, r : allow read of file, or listing of dir contents
8, u : allow remove (unlink)
"""
-
+
if isinstance(perms, str):
pe2 = 0
chars = { 'x': 1, 'w': 2, 'r': 4, 'u': 8 }
@@ -424,10 +423,10 @@ class node_class(object):
perms = pe2
elif isinstance(perms, int):
if perms < 0 or perms > 15:
- raise ValueError("Invalid permission bits")
+ raise ValueError("Invalid permission bits.")
else:
- raise ValueError("Invalid permission attribute")
-
+ raise ValueError("Invalid permission attribute.")
+
return ((self.uidperms & perms) == perms)
class node_database(node_class):
@@ -464,9 +463,9 @@ class node_database(node_class):
is_allowed = self.check_perms(1)
else:
is_allowed = self.check_perms(5)
-
+
if not is_allowed:
- raise IOError(errno.EPERM, "Permission into directory denied")
+ raise IOError(errno.EPERM, "Permission into directory denied.")
if domain:
where = where + domain
@@ -494,7 +493,7 @@ def mkdosname(company_name, default='noname'):
for c in company_name[:8]:
n += (c in badchars and '_') or c
return n
-
+
def _uid2unixperms(perms, has_owner):
""" Convert the uidperms and the owner flag to full unix bits
@@ -544,7 +543,7 @@ class node_dir(node_database):
try:
self.dctx['dctx_' + dfld.field] = safe_eval(dfld.expr,dc2)
except Exception,e:
- print "Cannot eval %s" % dfld.expr
+ print "Cannot eval %s." % dfld.expr
print e
pass
@@ -567,10 +566,10 @@ class node_dir(node_database):
def _file_get(self, cr, nodename=False):
res = super(node_dir,self)._file_get(cr, nodename)
-
+
is_allowed = self.check_perms(nodename and 1 or 5)
if not is_allowed:
- raise IOError(errno.EPERM, "Permission into directory denied")
+ raise IOError(errno.EPERM, "Permission into directory denied.")
cntobj = self.context._dirobj.pool.get('document.directory.content')
uid = self.context.uid
@@ -584,7 +583,7 @@ class node_dir(node_database):
res.extend(res3)
return res
-
+
def _child_get(self, cr, name=None, domain=None):
dirobj = self.context._dirobj
uid = self.context.uid
@@ -596,9 +595,9 @@ class node_dir(node_database):
is_allowed = self.check_perms(1)
else:
is_allowed = self.check_perms(5)
-
+
if not is_allowed:
- raise IOError(errno.EPERM, "Permission into directory denied")
+ raise IOError(errno.EPERM, "Permission into directory denied.")
if not domain:
domain = []
@@ -634,20 +633,20 @@ class node_dir(node_database):
if not directory:
raise OSError(2, 'Not such file or directory.')
if not self.check_perms('u'):
- raise IOError(errno.EPERM,"Permission denied")
+ raise IOError(errno.EPERM,"Permission denied.")
if directory._table_name=='document.directory':
if self.children(cr):
raise OSError(39, 'Directory not empty.')
res = self.context._dirobj.unlink(cr, uid, [directory.id])
else:
- raise OSError(1, 'Operation not permited.')
+ raise OSError(1, 'Operation is not permitted.')
return res
def create_child_collection(self, cr, objname):
object2 = False
if not self.check_perms(2):
- raise IOError(errno.EPERM,"Permission denied")
+ raise IOError(errno.EPERM,"Permission denied.")
dirobj = self.context._dirobj
uid = self.context.uid
@@ -655,7 +654,7 @@ class node_dir(node_database):
ctx.update(self.dctx)
obj = dirobj.browse(cr, uid, self.dir_id)
if obj and (obj.type == 'ressource') and not object2:
- raise OSError(1, 'Operation not permited.')
+ raise OSError(1, 'Operation is not permitted.')
#objname = uri2[-1]
val = {
@@ -673,7 +672,7 @@ class node_dir(node_database):
Return the node_* created
"""
if not self.check_perms(2):
- raise IOError(errno.EPERM,"Permission denied")
+ raise IOError(errno.EPERM,"Permission denied.")
dirobj = self.context._dirobj
uid = self.context.uid
@@ -703,10 +702,10 @@ class node_dir(node_database):
Note /may/ be called with ndir_node = None, to rename the document root.
"""
if ndir_node and (ndir_node.context != self.context):
- raise NotImplementedError("Cannot move directories between contexts")
+ raise NotImplementedError("Cannot move directories between contexts.")
if (not self.check_perms('u')) or (not ndir_node.check_perms('w')):
- raise IOError(errno.EPERM,"Permission denied")
+ raise IOError(errno.EPERM,"Permission denied.")
dir_obj = self.context._dirobj
if not fil_obj:
@@ -725,13 +724,13 @@ class node_dir(node_database):
assert self.parent
if self.parent != ndir_node:
- logger.debug('Cannot move dir %r from %r to %r', self, self.parent, ndir_node)
- raise NotImplementedError('Cannot move dir to another dir')
+ _logger.debug('Cannot move dir %r from %r to %r.', self, self.parent, ndir_node)
+ raise NotImplementedError('Cannot move dir to another dir.')
ret = {}
if new_name and (new_name != dbro.name):
if ndir_node.child(cr, new_name):
- raise IOError(errno.EEXIST, "Destination path already exists")
+ raise IOError(errno.EEXIST, "Destination path already exists.")
ret['name'] = new_name
del dbro
@@ -833,7 +832,7 @@ class node_res_dir(node_class):
elif isinstance(app, tuple):
where.append(app)
else:
- raise RuntimeError("incorrect domain expr: %s" % self.domain)
+ raise RuntimeError("Incorrect domain expr: %s." % self.domain)
if self.resm_id:
where.append(('id','=',self.resm_id))
@@ -846,7 +845,7 @@ class node_res_dir(node_class):
is_allowed = self.check_perms(5)
if not is_allowed:
- raise IOError(errno.EPERM,"Permission denied")
+ raise IOError(errno.EPERM,"Permission denied.")
# print "Where clause for %s" % self.res_model, where
if self.ressource_tree:
@@ -865,10 +864,10 @@ class node_res_dir(node_class):
if not res_name:
continue
# Yes! we can't do better but skip nameless records.
-
+
# Escape the name for characters not supported in filenames
res_name = res_name.replace('/','_') # any other weird char?
-
+
if name and (res_name != ustr(name)):
# we have matched _ to any character, but we only meant to match
# the special ones.
@@ -924,7 +923,7 @@ class node_res_obj(node_class):
try:
self.dctx[fld] = safe_eval(expr, dc2)
except Exception,e:
- print "Cannot eval %s for %s" % (expr, fld)
+ print "Cannot eval %s for %s." % (expr, fld)
print e
pass
else:
@@ -963,7 +962,7 @@ class node_res_obj(node_class):
res = []
is_allowed = self.check_perms((nodename and 1) or 5)
if not is_allowed:
- raise IOError(errno.EPERM,"Permission denied")
+ raise IOError(errno.EPERM,"Permission denied.")
cntobj = self.context._dirobj.pool.get('document.directory.content')
uid = self.context.uid
@@ -998,7 +997,7 @@ class node_res_obj(node_class):
def get_dav_eprop_DEPR(self, cr, ns, prop):
# Deprecated!
if ns != 'http://groupdav.org/' or prop != 'resourcetype':
- logger.warning("Who asked for %s:%s?" % (ns, prop))
+ _logger.warning("Who asks for %s:%s?" % (ns, prop))
return None
cntobj = self.context._dirobj.pool.get('document.directory.content')
uid = self.context.uid
@@ -1017,7 +1016,7 @@ class node_res_obj(node_class):
is_allowed = self.check_perms((name and 1) or 5)
if not is_allowed:
- raise IOError(errno.EPERM,"Permission denied")
+ raise IOError(errno.EPERM,"Permission denied.")
uid = self.context.uid
ctx = self.context.context.copy()
@@ -1058,7 +1057,7 @@ class node_res_obj(node_class):
where2 = where + [('parent_id','=',self.dir_id) ]
ids = dirobj.search(cr, uid, where2, context=ctx)
bo = obj.browse(cr, uid, self.res_id, context=ctx)
-
+
for dirr in dirobj.browse(cr, uid, ids, context=ctx):
if name and (name != dirr.name):
continue
@@ -1104,7 +1103,7 @@ class node_res_obj(node_class):
dirobj = self.context._dirobj
is_allowed = self.check_perms(2)
if not is_allowed:
- raise IOError(errno.EPERM,"Permission denied")
+ raise IOError(errno.EPERM,"Permission denied.")
uid = self.context.uid
ctx = self.context.context.copy()
@@ -1115,7 +1114,7 @@ class node_res_obj(node_class):
obj = dirobj.browse(cr, uid, self.dir_id)
if obj and (obj.type == 'ressource') and not object2:
- raise OSError(1, 'Operation not permited.')
+ raise OSError(1, 'Operation is not permitted.')
val = {
@@ -1136,7 +1135,7 @@ class node_res_obj(node_class):
"""
is_allowed = self.check_perms(2)
if not is_allowed:
- raise IOError(errno.EPERM,"Permission denied")
+ raise IOError(errno.EPERM,"Permission denied.")
dirobj = self.context._dirobj
uid = self.context.uid
@@ -1178,14 +1177,14 @@ class node_file(node_class):
self.write_date = fil.write_date or fil.create_date
self.content_length = fil.file_size
self.displayname = fil.name
-
+
self.uidperms = 14
if parent:
if not parent.check_perms('x'):
self.uidperms = 0
elif not parent.check_perms('w'):
self.uidperms = 4
-
+
try:
self.uuser = (fil.user_id and fil.user_id.login) or 'nobody'
except Exception:
@@ -1214,9 +1213,9 @@ class node_file(node_class):
def open_data(self, cr, mode):
stor = self.storage_id
- assert stor, "No storage for file #%s" % self.file_id
+ assert stor, "No storage for file #%s." % self.file_id
if not self.check_perms(4):
- raise IOError(errno.EPERM, "Permission denied")
+ raise IOError(errno.EPERM, "Permission denied.")
# If storage is not set properly, we are just screwed here, don't
# try to get it from default.
@@ -1226,7 +1225,7 @@ class node_file(node_class):
def rm(self, cr):
uid = self.context.uid
if not self.check_perms(8):
- raise IOError(errno.EPERM, "Permission denied")
+ raise IOError(errno.EPERM, "Permission denied.")
document_obj = self.context._dirobj.pool.get('ir.attachment')
if self.type in ('collection','database'):
return False
@@ -1272,7 +1271,7 @@ class node_file(node_class):
stor = self.storage_id
assert stor, "No storage for file #%s" % self.file_id
if not self.check_perms(4):
- raise IOError(errno.EPERM, "Permission denied")
+ raise IOError(errno.EPERM, "Permission denied.")
# If storage is not set properly, we are just screwed here, don't
# try to get it from default.
@@ -1295,7 +1294,7 @@ class node_file(node_class):
stor = self.storage_id
assert stor, "No storage for file #%s" % self.file_id
if not self.check_perms(2):
- raise IOError(errno.EPERM, "Permission denied")
+ raise IOError(errno.EPERM, "Permission denied.")
stobj = self.context._dirobj.pool.get('document.storage')
return stobj.set_data(cr, self.context.uid,stor, self, data, self.context.context, fil_obj)
@@ -1305,31 +1304,31 @@ class node_file(node_class):
def move_to(self, cr, ndir_node, new_name=False, fil_obj=None, ndir_obj=None, in_write=False):
if ndir_node and ndir_node.context != self.context:
- raise NotImplementedError("Cannot move files between contexts")
+ raise NotImplementedError("Cannot move files between contexts.")
if (not self.check_perms(8)) and ndir_node.check_perms(2):
- raise IOError(errno.EPERM, "Permission denied")
+ raise IOError(errno.EPERM, "Permission denied.")
doc_obj = self.context._dirobj.pool.get('ir.attachment')
if not fil_obj:
dbro = doc_obj.browse(cr, self.context.uid, self.file_id, context=self.context.context)
else:
dbro = fil_obj
- assert dbro.id == self.file_id, "%s != %s for %r" % (dbro.id, self.file_id, self)
+ assert dbro.id == self.file_id, "%s != %s for %r." % (dbro.id, self.file_id, self)
if not dbro:
- raise IndexError("Cannot locate doc %d", self.file_id)
+ raise IndexError("Cannot locate doc %d.", self.file_id)
if (not self.parent):
# there *must* be a parent node for this one
self.parent = self.context.get_dir_node(cr, dbro.parent_id)
assert self.parent
-
+
ret = {}
if ndir_node and self.parent != ndir_node:
if not (isinstance(self.parent, node_dir) and isinstance(ndir_node, node_dir)):
- logger.debug('Cannot move file %r from %r to %r', self, self.parent, ndir_node)
- raise NotImplementedError('Cannot move files between dynamic folders')
+ _logger.debug('Cannot move file %r from %r to %r.', self, self.parent, ndir_node)
+ raise NotImplementedError('Cannot move files between dynamic folders.')
if not ndir_obj:
ndir_obj = self.context._dirobj.browse(cr, self.context.uid, \
@@ -1344,7 +1343,7 @@ class node_file(node_class):
if new_name and (new_name != dbro.name):
if len(ret):
- raise NotImplementedError("Cannot rename and move") # TODO
+ raise NotImplementedError("Cannot rename and move.") # TODO
stobj = self.context._dirobj.pool.get('document.storage')
r2 = stobj.simple_rename(cr, self.context.uid, self, new_name, self.context.context)
ret.update(r2)
@@ -1374,7 +1373,7 @@ class node_content(node_class):
self.uidperms = parent.uidperms & 14
self.uuser = parent.uuser
self.ugroup = parent.ugroup
-
+
self.extension = cnt.extension
self.report_id = cnt.report_id and cnt.report_id.id
#self.mimetype = cnt.extension.
@@ -1400,7 +1399,7 @@ class node_content(node_class):
def get_data(self, cr, fil_obj = None):
cntobj = self.context._dirobj.pool.get('document.directory.content')
if not self.check_perms(4):
- raise IOError(errno.EPERM, "Permission denied")
+ raise IOError(errno.EPERM, "Permission denied.")
ctx = self.context.context.copy()
ctx.update(self.dctx)
@@ -1417,14 +1416,14 @@ class node_content(node_class):
elif mode in ('r+', 'w+'):
cperms = 'rw'
else:
- raise IOError(errno.EINVAL, "Cannot open at mode %s" % mode)
-
+ raise IOError(errno.EINVAL, "Cannot open at mode %s." % mode)
+
if not self.check_perms(cperms):
- raise IOError(errno.EPERM, "Permission denied")
+ raise IOError(errno.EPERM, "Permission denied.")
ctx = self.context.context.copy()
ctx.update(self.dctx)
-
+
return nodefd_content(self, cr, mode, ctx)
def get_data_len(self, cr, fil_obj = None):
@@ -1439,7 +1438,7 @@ class node_content(node_class):
def set_data(self, cr, data, fil_obj = None):
cntobj = self.context._dirobj.pool.get('document.directory.content')
if not self.check_perms(2):
- raise IOError(errno.EPERM, "Permission denied")
+ raise IOError(errno.EPERM, "Permission denied.")
ctx = self.context.context.copy()
ctx.update(self.dctx)
@@ -1452,6 +1451,7 @@ class node_content(node_class):
return ''
class nodefd_content(StringIO, node_descriptor):
+
""" A descriptor to content nodes
"""
def __init__(self, parent, cr, mode, ctx):
@@ -1473,8 +1473,8 @@ class nodefd_content(StringIO, node_descriptor):
elif mode == 'a':
StringIO.__init__(self, None)
else:
- logging.getLogger('document.content').error("Incorrect mode %s specified", mode)
- raise IOError(errno.EINVAL, "Invalid file mode")
+ _logger.error("Incorrect mode %s is specified.", mode)
+ raise IOError(errno.EINVAL, "Invalid file mode.")
self.mode = mode
def size(self):
@@ -1499,13 +1499,14 @@ class nodefd_content(StringIO, node_descriptor):
raise NotImplementedError
cr.commit()
except Exception:
- logging.getLogger('document.content').exception('Cannot update db content #%d for close:', par.cnt_id)
+ _logger.exception('Cannot update db content #%d for close.', par.cnt_id)
raise
finally:
cr.close()
StringIO.close(self)
class nodefd_static(StringIO, node_descriptor):
+
""" A descriptor to nodes with static data.
"""
def __init__(self, parent, cr, mode, ctx=None):
@@ -1526,8 +1527,8 @@ class nodefd_static(StringIO, node_descriptor):
elif mode == 'a':
StringIO.__init__(self, None)
else:
- logging.getLogger('document.nodes').error("Incorrect mode %s specified", mode)
- raise IOError(errno.EINVAL, "Invalid file mode")
+ _logger.error("Incorrect mode %s is specified.", mode)
+ raise IOError(errno.EINVAL, "Invalid file mode.")
self.mode = mode
def size(self):
@@ -1551,7 +1552,7 @@ class nodefd_static(StringIO, node_descriptor):
raise NotImplementedError
cr.commit()
except Exception:
- logging.getLogger('document.nodes').exception('Cannot update db content #%d for close:', par.cnt_id)
+ _logger.exception('Cannot update db content #%d for close.', par.cnt_id)
raise
finally:
cr.close()