diff options
| author | Mustufa Rangwala <mra@mra-laptop> | 2010-12-23 09:40:57 +0530 |
|---|---|---|
| committer | Mustufa Rangwala <mra@mra-laptop> | 2010-12-23 09:40:57 +0530 |
| commit | 6002cc0ec2d02aeaf51b5bc3ee48ec2c9114bf5d (patch) | |
| tree | 258164131375ad0928afb4644814f928b99ccb89 /addons/document | |
| parent | 7cd83a7e4f23336495108fb6f1dd4eab0ad2ce9f (diff) | |
| parent | 045728783b0a65af1b3cfeeaa74c1cab787ea384 (diff) | |
[MERGE] merge from trunk addons
bzr revid: mra@mra-laptop-20101222112024-yt47p2bd7kwvcqwy
bzr revid: mra@mra-laptop-20101223041057-w5s862hm3fajcqkr
Diffstat (limited to 'addons/document')
| -rw-r--r-- | addons/document/content_index.py | 8 | ||||
| -rw-r--r-- | addons/document/document_view.xml | 4 | ||||
| -rw-r--r-- | addons/document/nodes.py | 64 | ||||
| -rw-r--r-- | addons/document/test_cindex.py | 13 |
4 files changed, 65 insertions, 24 deletions
diff --git a/addons/document/content_index.py b/addons/document/content_index.py index 6d49a29873f..72cb8f6e163 100644 --- a/addons/document/content_index.py +++ b/addons/document/content_index.py @@ -165,11 +165,9 @@ class contentIndex(object): os.write(fd, content) os.close(fd) - fp = Popen(['file','-b','--mime',fname], shell=False, stdout=PIPE).stdout - try: - result = fp.read() - finally: - fp.close() + pop = Popen(['file','-b','--mime',fname], shell=False, stdout=PIPE) + (result, _) = pop.communicate() + mime2 = result.split(';')[0] self.__logger.debug('File gave us: %s', mime2) # Note that the temporary file still exists now. diff --git a/addons/document/document_view.xml b/addons/document/document_view.xml index 536683f6a59..df5e78894fd 100644 --- a/addons/document/document_view.xml +++ b/addons/document/document_view.xml @@ -82,7 +82,6 @@ <group colspan="4" col="4" attrs="{'invisible': [('type','!=','ressource')]}"> <field name="ressource_type_id" on_change="onchange_content_id(ressource_type_id)" attrs="{'required': [('type','=','ressource')] }"/> - <field name="resource_find_all" groups="base.group_extended" /> <newline/> <field name="resource_field" domain="[('model_id','=',ressource_type_id), ('ttype', 'in', ('char', 'selection', 'date', 'datetime'))]"/> <field name="ressource_tree"/> @@ -93,6 +92,9 @@ <field name="ressource_parent_type_id"/> <field name="ressource_id" select="2" readonly="1"/> </group> + <group colspan="4" col="2" attrs="{'invisible': [('type','!=','ressource'),('resource_parent_type_id','=',False)]}"> + <field name="resource_find_all" groups="base.group_extended" /> + </group> </page> <page string="Generated Files" groups="base.group_extended"> diff --git a/addons/document/nodes.py b/addons/document/nodes.py index ee506d5eb2b..1b7aebcd389 100644 --- a/addons/document/nodes.py +++ b/addons/document/nodes.py @@ -837,7 +837,9 @@ class node_res_dir(node_class): where.append(('id','=',self.resm_id)) if name: - where.append((self.namefield,'=',name)) + # The =like character will match underscores against any characters + # including the special ones that couldn't exist in a FTP/DAV request + where.append((self.namefield,'=like',name.replace('\\','\\\\'))) is_allowed = self.check_perms(1) else: is_allowed = self.check_perms(5) @@ -858,12 +860,22 @@ class node_res_dir(node_class): for bo in obj.browse(cr, uid, resids, context=ctx): if not bo: continue - name = getattr(bo, self.namefield) - if not name: + res_name = getattr(bo, self.namefield) + 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 != name): + # we have matched _ to any character, but we only meant to match + # the special ones. + # Eg. 'a_c' will find 'abc', 'a/c', 'a_c', may only + # return 'a/c' and 'a_c' + continue - res.append(self.res_obj_class(name, self.dir_id, self, self.context, self.res_model, bo)) + res.append(self.res_obj_class(res_name, self.dir_id, self, self.context, self.res_model, bo)) return res def _get_ttag(self,cr): @@ -896,7 +908,10 @@ class node_res_obj(node_class): self.domain = parent.domain self.displayname = path self.dctx_dict = parent.dctx_dict - self.res_find_all = parent.res_find_all + if isinstance(parent, node_res_dir): + self.res_find_all = parent.res_find_all + else: + self.res_find_all = False if res_bo: self.res_id = res_bo.id dc2 = self.context.context.copy() @@ -1016,8 +1031,10 @@ class node_res_obj(node_class): # Directory Structure display in tree structure if self.res_id and directory.ressource_tree: where1 = [] + if name: + where1.append(('name','=like',name.replace('\\','\\\\'))) if obj._parent_name in obj.fields_get(cr, uid): - where1 = where + [(obj._parent_name, '=', self.res_id)] + where1.append((obj._parent_name, '=', self.res_id)) namefield = directory.resource_field.name or 'name' resids = obj.search(cr, uid, where1, context=ctx) for bo in obj.browse(cr, uid, resids, context=ctx): @@ -1026,27 +1043,37 @@ class node_res_obj(node_class): res_name = getattr(bo, namefield) if not res_name: continue + res_name = res_name.replace('/', '_') + if name and (res_name != name): + continue # TODO Revise klass = directory.get_node_class(directory, dynamic=True, context=ctx) - res.append(klass(res_name, dir_id=self.dir_id, parent=self, context=self.context, res_model=self.res_model, res_bo=bo)) + rnode = klass(res_name, dir_id=self.dir_id, parent=self, context=self.context, + res_model=self.res_model, res_bo=bo) + rnode.res_find_all = self.res_find_all + res.append(rnode) 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 if dirr.type == 'directory': klass = dirr.get_node_class(dirr, dynamic=True, context=ctx) - res.append(klass(dirr.name, dirr.id, self, self.context, self.res_model, res_bo = None, res_id = self.res_id)) + res.append(klass(dirr.name, dirr.id, self, self.context, self.res_model, res_bo = bo, res_id = self.res_id)) elif dirr.type == 'ressource': # child resources can be controlled by properly set dctx klass = dirr.get_node_class(dirr, context=ctx) - res.append(klass(dirr.name,self,self.context, dirr, {'active_id': self.res_id})) + res.append(klass(dirr.name,self,self.context, dirr, {'active_id': self.res_id})) # bo? fil_obj = dirobj.pool.get('ir.attachment') if self.res_find_all: where2 = where - where3 = where2 + [('res_model', '=', self.res_model), ('res_id','=',self.res_id)] - # print "where clause for dir_obj", where2 + where3 = where2 + [('res_model', '=', self.res_model), ('res_id','=',self.res_id)] + # print "where clause for dir_obj", where3 ids = fil_obj.search(cr, uid, where3, context=ctx) if ids: for fil in fil_obj.browse(cr, uid, ids, context=ctx): @@ -1057,17 +1084,19 @@ class node_res_obj(node_class): # Get Child Ressource Directories if directory.ressource_type_id and directory.ressource_type_id.id: where4 = where + [('ressource_parent_type_id','=',directory.ressource_type_id.id)] - where5 = where4 + [('ressource_id','=',0)] + where5 = where4 + ['|', ('ressource_id','=',0), ('ressource_id','=',self.res_id)] dirids = dirobj.search(cr,uid, where5) - where5 = where4 + [('ressource_id','=',self.res_id)] - dirids = dirids + dirobj.search(cr,uid, where5) for dirr in dirobj.browse(cr, uid, dirids, context=ctx): if dirr.type == 'directory' and not dirr.parent_id: klass = dirr.get_node_class(dirr, dynamic=True, context=ctx) - res.append(klass(dirr.name, dirr.id, self, self.context, self.res_model, res_bo = None, res_id = self.res_id)) + rnode = klass(dirr.name, dirr.id, self, self.context, self.res_model, res_bo = bo, res_id = self.res_id) + rnode.res_find_all = dirr.resource_find_all + res.append(rnode) if dirr.type == 'ressource': klass = dirr.get_node_class(dirr, context=ctx) - res.append(klass(dirr.name, self, self.context, dirr, {'active_id': self.res_id})) + rnode = klass(dirr.name, self, self.context, dirr, {'active_id': self.res_id}) + rnode.res_find_all = dirr.resource_find_all + res.append(rnode) return res def create_child_collection(self, cr, objname): @@ -1092,7 +1121,8 @@ class node_res_obj(node_class): 'name': objname, 'ressource_parent_type_id': obj and obj.ressource_type_id.id or False, 'ressource_id': object2 and object2.id or False, - 'parent_id' : False + 'parent_id' : False, + 'resource_find_all': False, } if (obj and (obj.type in ('directory'))) or not object2: val['parent_id'] = obj and obj.id or False diff --git a/addons/document/test_cindex.py b/addons/document/test_cindex.py index d7ae7c4d160..05101a7a491 100644 --- a/addons/document/test_cindex.py +++ b/addons/document/test_cindex.py @@ -3,9 +3,13 @@ import sys import os import glob +import time +import logging from optparse import OptionParser +logging.basicConfig(level=logging.DEBUG) + parser = OptionParser() parser.add_option("-q", "--quiet", action="store_false", dest="verbose", default=True, @@ -15,6 +19,10 @@ parser.add_option("-C", "--content", action="store_true", dest="docontent", default=False, help="Disect content, rather than the file.") +parser.add_option("--delay", + action="store_true", dest="delay", default=False, + help="delay after the operation, to inspect child processes") + (options, args) = parser.parse_args() import content_index, std_index @@ -34,9 +42,12 @@ for fname in args: if options.verbose: for line in res[:5]: print line + if options.delay: + time.sleep(30) except Exception,e: import traceback tb_s = reduce(lambda x, y: x+y, traceback.format_exception( sys.exc_type, sys.exc_value, sys.exc_traceback)) - + except KeyboardInterrupt: + print "Keyboard interrupt" #eof |
