Here where I get as now :
Controler :
def trip_update():
# only SQLFORM.factory tested
form=SQLFORM.factory(db.t_trip, db.t_photos)
for row in db(db.t_trip.id == request.args(0)).select(db.t_trip.ALL):
for f in db.t_trip.fields:
form.vars[f]=row[f]
photos_files = []
for row in db(db.t_photos.f_trip_ref ==
request.args(0)).select(db.t_photos.ALL):
#for f in db.t_photos.fields:
#f_photo_0:CONTENT_OF_f_title
#form.vars['f_photo_'+str(i)+':'+row.f_title]=row
#LI(_title='couleurs (1).png', A('x', _href='javascript:void(0);',
_class='mw_delItem', _title='remove this file'),
I(B(EM(_class='mw_file-ext-png'))), SPAN('test1'))
photos_files.append(XML(LI(A('x', _href='javascript:void(0);',
_class='mw_delItem', _title='remove this file'),
EM(_class='mw_file-ext-png'), SPAN(row.f_title), _title=row.f_photo)).xml())
# response.js="""var photos_files_list = "{{=photos_files}}"
# $(document).ready( function () {
# if(photos_files_list != 'None') {
# $.each(photos_files_list, function(i, val) {
# $('ul.mw_list').append(photos_files_list[i]);
# });
# };
# });"""
#response.js="""var photos_files_list = "{{=photos_files}}"
$(document).ready( function () {if(photos_files_list != 'None')
{$.each(photos_files_list, function(i, val)
{$('ul.mw_list').append(photos_files_list[i]);});};});"""
#A(T('Access'),_href=URL(r=request,f='read',args=(request.args(0),str(id))))
#<li title="couleurs (1).png"><a class="mw_delItem"
href="javascript:void(0);" title="remove this file">x</a><i><b><em
class="mw_file-ext-png"></em></b></i><span>test1</span></li>
if form.accepts(request, session, onvalidation=lambda
form:check(form)): # Is it possible to use onvalidation with form.process()
syntax ?
trip_id = request.args(0)
db(db.t_trip.id ==
trip_id).update(**db.t_trip._filter_fields(form.vars))
nfiles = 0
for var in request.vars:
if var.startswith('f_photo') and request.vars[var] != '':
uploaded = request.vars[var]
if isinstance(uploaded,list):
# files uploaded through input with "multiple"
attribute set on true
counter=0
for element in uploaded:
counter += 1
nfiles += 1
file_title = element.name.split(":")[-1] # TODO:
could this be made better?
# I mean,
the title must be appended to element's name
# or is
there another way?
db.t_photos.insert(
f_trip_ref=trip_id,
f_title=file_title+" ("+str(counter)+")" if
file_title!="" else file_title,
f_photo=db.t_photos.f_photo.store(element.file,element.filename))
else:
# only one file uploaded
element = request.vars[var]
nfiles += 1
db.t_photos.insert(
f_trip_ref=trip_id,
f_title=element.name.split(":")[-1],
f_photo=db.t_photos.f_photo.store(element.file,element.filename))
session.flash = T('%s photo%s uploaded'%(nfiles, 's' if nfiles>1
else ''))
redirect(URL('trip_read'))
if isinstance(form,FORM):
# hide f_title form's row. Is there a better way to accomplish it?
del form[0][3]
return dict(form=form, photos_files=photos_files)
View :
{{response.files.extend([URL('static','css/multiupload.css'),URL('static','js/jquery.multiupload.js')])}}
{{left_sidebar_enabled=right_sidebar_enabled=False}}
{{extend 'layout.html'}}
<div>
{{=form}}
<ul>{{=photos_files[0]}}</ul>
<script type="text/javascript" charset="utf-8">
//<!--
jQuery('input[name="f_photo"]:not(.processed)').multiUpload({
mw_placeholder:"{{=T('insert a title')}}",
mw_text_addBtn:"+",
mw_tooltip_addBtn:"{{=T('add a file')}}",
mw_text_clearBtn:"x",
mw_tooltip_clearBtn:"{{=T('remove all')}}",
mw_tooltip_removeFileBtn:"{{=T('remove this file')}}",
mw_tooltip_removeGroupBtn:"{{=T('remove this file group')}}",
mw_group_title:"{{=T('FILE GROUP')}}",
mw_fileNumber:false,
mw_maxElementAllowed:5
});
//-->
</script>
</div>
<script type="text/javascript" charset="utf-8">
var photos_files_list = {{=photos_files}}
$(document).ready( function () {
if(photos_files_list != 'None') {
$.each(photos_files_list, function(i, val) {
$('ul.mw_list').append(val); //photos_files_list[i]
});
};
});
</script>
{{if request.is_local:}}
{{=response.toolbar()}}
{{pass}}
Problem : the items are not showing up in the UL box, because a conversion
between python and javascript text format I think (I know the get into the
box as plain text), Second thing, the destruction of the items is not
working not sure why. Also there is code refactoring to do since the rest
of the function only manage adding stuff I change a bit for updating stuff,
for the first table (maybe for nothing), but it needs to destruct records
in the referenced table so I need to code that.
Richard
On Thu, May 31, 2012 at 12:25 PM, Richard Vézina <
[email protected]> wrote:
> response.js will not works, it only works on response and for component as
> says the book.
>
> Putting the js code into the view seems to work if I pass the photos_files
> var to the view...
>
> Now I think I just have to find the way to expose the HTML, XML() not
> seems to work.
>
> Richard
>
>
> On Thu, May 31, 2012 at 12:09 PM, Richard Vézina <
> [email protected]> wrote:
>
>> Hello Paolo,
>>
>> Here some fresher code :
>>
>> def trip_update():
>> # only SQLFORM.factory tested
>> form=SQLFORM.factory(db.t_trip, db.t_photos)
>> for row in db(db.t_trip.id == request.args(0)).select(db.t_trip.ALL):
>> for f in db.t_trip.fields:
>> form.vars[f]=row[f]
>> photos_files = []
>> for row in db(db.t_photos.f_trip_ref ==
>> request.args(0)).select(db.t_photos.ALL):
>> #for f in db.t_photos.fields:
>> #f_photo_0:CONTENT_OF_f_title
>> #form.vars['f_photo_'+str(i)+':'+row.f_title]=row
>> #LI(_title='couleurs (1).png', A('x',
>> _href='javascript:void(0);', _class='mw_delItem', _title='remove this
>> file'), I(B(EM(_class='mw_file-ext-png'))), SPAN('test1'))
>> photos_files.append(XML(LI(A('x', _href='javascript:void(0);',
>> _class='mw_delItem', _title='remove this file'),
>> EM(_class='mw_file-ext-png'), SPAN(row.f_title), _title=row.f_photo)))
>> response.js="""var photos_files_list = "{{=photos_files}}"
>> $(document).ready( function () {
>> if(photos_files_list != 'None') {
>> $.each(photos_files_list, function(i, val) {
>> $('ul.mw_list').append(photos_files_list[i]);
>> });
>> };
>> });"""
>>
>> #A(T('Access'),_href=URL(r=request,f='read',args=(request.args(0),str(id))))
>>
>> #<li title="couleurs (1).png"><a class="mw_delItem"
>> href="javascript:void(0);" title="remove this file">x</a><i><b><em
>> class="mw_file-ext-png"></em></b></i><span>test1</span></li>
>> if form.accepts(request, session, onvalidation=lambda
>> form:check(form)): # Is it possible to use onvalidation with form.process()
>> syntax ?
>> trip_id =
>> db.t_trip.update_record(**db.t_trip._filter_fields(form.vars))
>> nfiles = 0
>> for var in request.vars:
>> if var.startswith('f_photo') and request.vars[var] != '':
>> uploaded = request.vars[var]
>> if isinstance(uploaded,list):
>> # files uploaded through input with "multiple"
>> attribute set on true
>> counter=0
>> for element in uploaded:
>> counter += 1
>> nfiles += 1
>> file_title = element.name.split(":")[-1] # TODO:
>> could this be made better?
>> # I
>> mean, the title must be appended to element's name
>> # or is
>> there another way?
>> db.t_photos.insert(
>> f_trip_ref=trip_id,
>> f_title=file_title+" ("+str(counter)+")" if
>> file_title!="" else file_title,
>>
>> f_photo=db.t_photos.f_photo.store(element.file,element.filename))
>> else:
>> # only one file uploaded
>> element = request.vars[var]
>> nfiles += 1
>> db.t_photos.insert(
>> f_trip_ref=trip_id,
>> f_title=element.name.split(":")[-1],
>>
>> f_photo=db.t_photos.f_photo.store(element.file,element.filename))
>>
>> session.flash = T('%s photo%s uploaded'%(nfiles, 's' if nfiles>1
>> else ''))
>> redirect(URL('trip_read'))
>>
>> if isinstance(form,FORM):
>> # hide f_title form's row. Is there a better way to accomplish it?
>> del form[0][3]
>>
>> return dict(form=form)
>>
>> On Wed, May 30, 2012 at 6:23 PM, Paolo Caruccio <
>> [email protected]> wrote:
>>
>>> Richard,
>>>
>>> I saw your email in the discussion regarding bootswatch, but I want to
>>> answer here for competence.
>>>
>>> Multiupload is a my old project. The object of the toy app was
>>> demonstrate the usage of multiupload control. It wasn't a complete
>>> application.
>>>
>>> Your intentions, however, are interesting. I will take a look at your
>>> code and I will try to find a solution.
>>>
>>>
>>> Il giorno mercoledì 30 maggio 2012 16:15:09 UTC+2, Richard ha scritto:
>>>
>>>> Hello Paolo,
>>>>
>>>> Pretty nice!
>>>>
>>>> Did you implement the update of the records also?
>>>>
>>>> Is it a straight and easy task or it becomes trickier to implement than
>>>> the rest of the app??
>>>>
>>>> Richard
>>>>
>>>> On Sat, Oct 29, 2011 at 6:21 PM, Paolo Caruccio <
>>>> [email protected]> wrote:
>>>>
>>>>> Bruno,
>>>>>
>>>>> thanks.
>>>>>
>>>>> What do you think about the upload mechanism? Can it be translate in a
>>>>> web2py widget? or is it better to use a different javascript/jquery
>>>>> library?
>>>>>
>>>>> Regards.
>>>>>
>>>>> Paolo
>>>>>
>>>>
>>>>
>>
>