Ok so I've already figured out what you meant.

I should set 'writable' attribute of this field in db_wizard.py to False in 
order to prevent this field from being overwritten in forms. Then change 
type from 'string' to 'upload'  and apply URL('mydownload') to 'represent' 
attribute of this field and then specify 'mydownload' function in 
controllers. Complete solution looks like this now:

db_wizard.py
db.define_table('t_invoice',
    Field('f_invoice_file_path', type='upload', writable=False,
          label=T('Invoice File')),

db.t_invoice.f_invoice_file_path.represent = lambda value, row: A('Download'
, _class='download_btn', _href=URL('mydownload', args=value))

controllers/management.py
def mydownload():
    fullname = request.raw_args
    response.stream(fullname)

Thanks for help!

W dniu niedziela, 3 sierpnia 2014 00:22:57 UTC+2 użytkownik Massimo Di 
Pierro napisał:
>
> Than it is easy. make it writable=false if forms.
> Store your filename in the the upload field. But instead of
>
> URL('download',....)
>
> use
>
> URL('mydownload',....)
>
>
> Where:
>
> def mydownload():
>      fullname = os.path.join(os.path.join, 'private', request.args(0))
>      response.stream(fullname)
>
>
> On Wednesday, 30 July 2014 03:00:48 UTC-5, Kuba Kozłowicz wrote:
>>
>> f_invoice_file_path is location where the file is stored by myself, 
>> because I generate these files myself and I save them myself as well. It 
>> contains whole path to the file ( with the filename and its extension ). 
>> They are stored under "private" directory with the structure I described 
>> above. I don't need web2py to handle writing of these files ( because I am 
>> doing it myself ), I just need to be able to browse and download these file 
>> in SMART GRID as well as on VIEW page. And since I don't use default web2py 
>> storing mechanism ( which does some name changing ) I can't simply do that 
>> or I don't know how to do it.
>>
>> W dniu wtorek, 29 lipca 2014 17:35:02 UTC+2 użytkownik Massimo Di Pierro 
>> napisał:
>>>
>>> Let me understand this better f_invoice_file_path is the location where 
>>> the file is supposed to be stored or is it the full path including the 
>>> desired filename? Do you handle the file writing or should web2py do it 
>>> automatically?
>>>
>>>
>>> On Tuesday, 29 July 2014 05:59:10 UTC-5, Kuba Kozłowicz wrote:
>>>>
>>>> I have three tables:
>>>>
>>>> - invoices
>>>> - invoice summaries
>>>> - invoice bundles
>>>>
>>>> The website I am working on provides such a functionality, that user 
>>>> uploads a file, from which invoices and invoice summaries are generated 
>>>> and 
>>>> after being generated they are zipped and put into a bundle.
>>>>
>>>> For each upload I create following structure for storing these files:
>>>>
>>>> invoices/
>>>>      /<bundle_id>/<list of invoices of bundle <bundle_id>>/
>>>> summaries/
>>>>      /<bundle_id>/<list of invoices of bundle <bundle_id>>/
>>>> bundles/
>>>>      /<bundle_id>/<list of invoices of bundle <bundle_id>>/
>>>>
>>>>
>>>>
>>>> So I end up having something that looks like this
>>>>
>>>> invoices/
>>>>      /1/<list of invoices of bundle_1>/
>>>>             /invoice1.pdf
>>>>             /invoice2.pdf
>>>>      /2/<list of invoices of bundle_2>/
>>>>             /invoice1.pdf
>>>>             /invoice2.pdf
>>>>      /3/<list of invoices of bundle_3>/
>>>>             /invoice1.pdf
>>>>             /invoice2.pdf
>>>> summaries/
>>>>      /1/<list of summaries of bundle_1>/
>>>>             /summary1.pdf
>>>>      /2/<list of summaries of bundle_2>/
>>>>             /summary1.pdf
>>>>      /3/<list of summaries of bundle_3>/
>>>>             /summary1.pdf
>>>> bundles/
>>>>      /1/<bundle_1>/
>>>>             /bundle.zip
>>>>      /2/<bundle_2>/
>>>>             /bundle.zip
>>>>      /3/<bundle_3>/
>>>>             /bundle.zip
>>>>
>>>>
>>>>
>>>>
>>>> where inner folder name is ID of recently created bundle.
>>>>
>>>> Now to provide CRUD functionality I am using SMART GRID and I want to 
>>>> be able to display the file of invoice, summary, bundle entries ( by 
>>>> displaying I mean I want to display file's name and allow downloading it 
>>>> ), 
>>>> when a user either chooses VIEW in the SMART GRID or when he looks at the 
>>>> list of entries. Since I've chosen my own folder structure for storing 
>>>> these invoices, summaries and bundles I can't do it in a simple way, 
>>>> because Web2py uses its own mechanism to store and retrieve files and 
>>>> changse file's name. So in each of these tables I store the following 
>>>> fields:
>>>> Field('f_invoice_file_path', type='string')
>>>> Field('f_invoice_file', 'upload')
>>>>
>>>>
>>>>
>>>> what I wanted to do is something like this:
>>>>
>>>> def on_before_insert_invoice(fields, id):
>>>>     db(db.t_invoice.id == id).update(
>>>>         f_invoice_file=fields['f_invoice_file_path']
>>>>     )
>>>> db.t_invoice._before_insert.append(
>>>>     on_before_insert_invoice
>>>> )
>>>>
>>>> , here actually *fields* contains a list of tuples in following format 
>>>> (field, value) so I had to iterate over it to find fields[
>>>> 'f_invoice_file_path'], I just omitted this part for brevity.
>>>>
>>>> , but I get following error and most likely it is not the proper way to 
>>>> do that:
>>>>
>>>> *** RuntimeError: Unable to handle upload
>>>>
>>>> Note that the field:
>>>>
>>>> Field('f_invoice_file_path', type='string')
>>>>
>>>> is saved correctly, I just need somehow to make upload field point to 
>>>> that location. The next weird thing is that variable *fields* doesn't 
>>>> contain field Field('f_invoice_file', 'upload')
>>>> , even though I added it to the model, settings.migrate is set to True, 
>>>> and server has been restarted.
>>>>
>>>> How can I do it?
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
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/d/optout.

Reply via email to