Came up with a workaround. def store_file(file, filename=None, path=None): try: client_id = int(request.args[2]) client_dir = db(db.client.id == client_id).select(db.client. client_dir_name).first().client_dir_name except: client_dir = 'Default' path = "applications/init/uploads/%s" % (client_dir) if not os.path.exists(path): os.makedirs(path) pathfilename = os.path.join(path, filename) dest_file = open(pathfilename, 'wb') try: shutil.copyfileobj(file, dest_file) finally: dest_file.close()
return filename I'm using a smartgrid so the client id is passed as an argument when I client on the files link. On Tuesday, April 9, 2013 2:34:35 PM UTC+12, James Burke wrote: > > Thanks for your swift response. > > I kind of understand that, but how do you get the value rather than the > field name? > > db.define_table('file', > Field('client', 'reference client'), > Field('type', requires=IS_IN_SET(['Clipper','Workbench', 'Terramatch', > 'Supply']), default='Workbench'), > Field('file', type='upload', > custom_store=lambda file,filename,path: store_file(file, filename, path,db > .file.client._id), > custom_retrieve=lambda filename, path: retrieve_file(filename, path, db. > file.client)), > format='%(file)s') > > I'm trying to retrieve the clients name and use it to generate the folder. > > Cheers, > > -James > > > On Tuesday, April 9, 2013 2:06:54 PM UTC+12, Anthony wrote: >> >> The fourth argument passed to store_file() is db.table.new_filename, >> which is a DAL Field object. Your code is treating it as a string, and >> "table.new_filename" is the string representation of a Field object. If you >> want to include an actual filename string, then that's what you have to >> pass to the function. >> >> Anthony >> >> On Monday, April 8, 2013 9:34:45 PM UTC-4, James Burke wrote: >>> >>> Hi Anthony, >>> >>> I've tried the solution you've posted below: >>> Field('file', 'upload', >>> custom_store=lambda file, filename, path: store_file(file, filename,path >>> , db.table.new_filename), >>> ...) >>> >>> But when my additional parameter gets sent to store_file it sends >>> 'table.new_filename' >>> >>> def store_file(file, filename=None, path=None, new_filename=None): >>> path = "applications/init/uploads/%s" % (new_filename) >>> if not os.path.exists(path): >>> os.makedirs(path) >>> pathfilename = os.path.join(path, filename) >>> dest_file = open(pathfilename, 'wb') >>> try: >>> shutil.copyfileobj(file, dest_file) >>> finally: >>> dest_file.close() >>> >>> >>> return filename >>> >>> Results in a new folder in uploads called 'table.new_filename' >>> >>> Cheers >>> -James >>> >>> On Wednesday, August 8, 2012 11:51:44 PM UTC+12, Anthony wrote: >>>> >>>> On Wednesday, August 8, 2012 7:09:37 AM UTC-4, Jim Gregory wrote: >>>>> >>>>> Can custom_store and custom_retrieve take parameters when they are >>>>> called using Field, e.g.: >>>>> db.define_table('table', >>>>> Field('file', 'upload', custom_store=store_file(file, >>>>> db.table.new_filename), >>>>> custom_retrieve=retrieve_file(db.table.new_filename))? >>>>> Field('new_filename','string') >>>>> ) >>>>> >>>> >>>> These attributes have to be callables, so you can't call them yourself. >>>> To pass additional custom arguments to a callable, just turn it into a >>>> lambda that takes the standard arguments and pass the additional arguments >>>> to your function within the lambda: >>>> >>>> Field('file', 'upload', >>>> custom_store=lambda file, filename, path: store_file(file, filename >>>> , path, db.table.new_filename), >>>> ...) >>>> >>>> When web2py calls the custom_store callable, it will pass three >>>> arguments (file, filename, and path), so your lambda must take three >>>> arguments. Within the lambda, you can then do whatever you want. You can >>>> pass any or all of the standard three arguments to your custom function, >>>> and you can pass additional arguments. In the example above, I passed the >>>> three standard arguments followed by a fourth custom argument, though it >>>> doesn't have to look like that (presumably you will at least want to pass >>>> the file as an argument). >>>> >>>> custom_retrieve takes two standard arguments, "name" and "path". >>>> >>>> Anthony >>>> >>>> -- --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.