I need your help debugging this. In dal.py there are these lines:
def _listify(self,fields,update=False):
for ofield in self:
if not ofield.name in new_fields_names and ofield.compute:
try:
new_fields.append((ofield,ofield.compute(Row(fields))))
except KeyError:
pass
The line new_fields.append((ofield,ofield.compute(Row(fields)))) should
always be called (insert and update). Can you try remove the try...
except..
def _listify(self,fields,update=False):
for ofield in self:
if not ofield.name in new_fields_names and ofield.compute:
#try:
print 'computing',ofield.name
new_fields.append((ofield,ofield.compute(Row(fields))))
#except KeyError:
# pass
and see what you get?
On Tuesday, 19 June 2012 08:35:19 UTC-5, LightDot wrote:
>
> I think this is closely connected to an existing Issue 687 (Compute=
> should work always, not once):
>
> http://code.google.com/p/web2py/issues/detail?id=687
>
> Regards
>
> On Monday, June 18, 2012 11:21:57 PM UTC+2, peter wrote:
>>
>> I would try removing the readable and writeable false for the compute
>> fields. It seems that it does automatically not show them. I found that
>> setting readable and writeable to False means the thumbs only get computed
>> on insert, not update. I reported this a while back.
>> Peter
>>
>> On Monday, 18 June 2012 22:14:09 UTC+1, Massimo Di Pierro wrote:
>>>
>>> Will look into this asap. Please open a ticket about it so that it is
>>> tracked.
>>>
>>>
>>> On Monday, 18 June 2012 14:40:30 UTC-5, Brandon Reynolds wrote:
>>>>
>>>> In a new record a thumbnail is correctly generated from photo. But if I
>>>> didn't upload a photo or want to change the photo the thumbnail doesn't
>>>> generate. So basically a new record works properly but when updating
>>>> nothing in the thumbnail changes at all whether or not is currently has a
>>>> photo in it.
>>>>
>>>> ____________________________________________________
>>>> model:
>>>>
>>>> from image import THUMBER
>>>> db.define_table('park',
>>>> Field('photo1', 'upload'),
>>>> Field('photo_thumb1', 'upload', readable=False, writable=False))
>>>>
>>>> db.park.photo_thumb1.compute = lambda row: THUMBER(row.photo1,
>>>> "photo_thumb1", 144, 115)
>>>>
>>>> ____________________________________________________
>>>> image.py:
>>>>
>>>> from gluon import current
>>>>
>>>> def THUMBER(image, db_photo_var, nx=120, ny=120, name='thumb'):
>>>> if image:
>>>> try:
>>>> request = current.request
>>>> from PIL import Image
>>>> import os
>>>> img = Image.open(request.folder + 'uploads/' + image)
>>>> img.db_photo_var((nx, ny), Image.ANTIALIAS)
>>>> root, ext = os.path.splitext(image)
>>>> thumb = '%s_%s%s' % (root, name, ext)
>>>> img.save(request.folder + 'uploads/' + thumb)
>>>> return thumb
>>>> except Exception:
>>>> return image
>>>>
>>>>
>>>>
>>>> On Monday, June 18, 2012 1:17:07 PM UTC-6, Massimo Di Pierro wrote:
>>>>>
>>>>> Let me understand this better.
>>>>>
>>>>> on insert, the thumbnails are created.
>>>>> on update, if you upload a new photo1 is photo_thing1 generated?
>>>>>
>>>>> Can you provide a simpler code to reproduce the problem with a just
>>>>> one upload field and one thumbnail field?
>>>>>
>>>>> massimo
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Monday, 18 June 2012 11:24:05 UTC-5, Brandon Reynolds wrote:
>>>>>>
>>>>>> I have this problem when i try to generate thumbnails. If the field
>>>>>> is empty it inserts the photo thumb into the thumbnail. But when i try
>>>>>> to
>>>>>> update that record the thumbnail doesn't change.
>>>>>>
>>>>>> Here is my model:
>>>>>>
>>>>>> # coding: utf8
>>>>>> from image import THUMBER
>>>>>>
>>>>>> db.define_table('park',
>>>>>> Field('park_name', requires=IS_NOT_EMPTY()),
>>>>>> Field('park_city', requires=IS_NOT_EMPTY()),
>>>>>> Field('park_state', requires=IS_NOT_EMPTY()),
>>>>>> Field('park_address', requires=IS_NOT_EMPTY()),
>>>>>> Field('park_zip', requires=IS_NOT_EMPTY()),
>>>>>> Field('country', default="USA", notnull=True, readable=False,
>>>>>> writable=False),
>>>>>> Field('park_phone', requires=IS_MATCH('[\d\-\(\) ]+')),
>>>>>> Field('park_fax', requires=IS_EMPTY_OR(IS_MATCH('[\d\-\(\) ]+'))),
>>>>>> Field('park_phone_2', 'string',
>>>>>> requires=IS_EMPTY_OR(IS_MATCH('[\d\-\(\) ]+'))),
>>>>>> Field('photo1', 'upload'),
>>>>>> Field('photo_thumb1', 'upload', readable=False, writable=False),
>>>>>> Field('photo2', 'upload'),
>>>>>> Field('photo_thumb2', 'upload', readable=False, writable=False),
>>>>>> Field('photo3', 'upload'),
>>>>>> Field('photo_thumb3', 'upload', readable=False, writable=False),
>>>>>> Field('photo4', 'upload'),
>>>>>> Field('photo_thumb4', 'upload', readable=False, writable=False),
>>>>>> Field('photo5', 'upload'),
>>>>>> Field('photo_thumb5', 'upload', readable=False, writable=False),
>>>>>> Field('manager', requires=IS_NOT_EMPTY()),
>>>>>> Field('manager_email', requires=IS_EMAIL()),
>>>>>> Field('spaces', 'integer', requires=IS_NOT_EMPTY()),
>>>>>> Field('vacant', 'integer'),
>>>>>> Field('lot_rent', 'integer', requires=IS_NOT_EMPTY()),
>>>>>> Field('water', 'boolean'),
>>>>>> Field('sewer', 'boolean'),
>>>>>> Field('trash', 'boolean'),
>>>>>> Field('pool', 'boolean'),
>>>>>> Field('playground', 'boolean'),
>>>>>> Field('clubhouse', 'boolean'),
>>>>>> Field('laundromat', 'boolean'),
>>>>>> Field('rv_spaces', 'boolean'),
>>>>>> Field('storage', 'boolean'),
>>>>>> Field('handicap_accessible', 'boolean'),
>>>>>> Field('community_description', 'text'),
>>>>>> format='%(park_name)s')
>>>>>>
>>>>>> db.define_table('home',
>>>>>> Field('pid', notnull=True, readable=False, writable=False),
>>>>>> Field('lot'),
>>>>>> Field('year', length=4, requires=IS_NOT_EMPTY()),
>>>>>> Field('make'),
>>>>>> Field('model'),
>>>>>> Field('width', requires=IS_NOT_EMPTY()),
>>>>>> Field('length', requires=IS_NOT_EMPTY()),
>>>>>> Field('wide', requires=IS_NOT_EMPTY()),
>>>>>> Field('for_sale', 'boolean', default=True),
>>>>>> Field('beds', requires=IS_NOT_EMPTY()),
>>>>>> Field('baths', requires=IS_NOT_EMPTY()),
>>>>>> Field('fridge', 'boolean'),
>>>>>> Field('stove', 'boolean'),
>>>>>> Field('dishwasher', 'boolean'),
>>>>>> Field('microwave', 'boolean'),
>>>>>> Field('washer', 'boolean'),
>>>>>> Field('dryer', 'boolean'),
>>>>>> Field('photo1', 'upload'),
>>>>>> Field('photo1_text'),
>>>>>> Field('photo_thumb1', 'upload', readable=False, writable=False),
>>>>>> Field('photo2', 'upload'),
>>>>>> Field('photo2_text'),
>>>>>> Field('photo_thumb2', 'upload', readable=False, writable=False),
>>>>>> Field('photo3', 'upload'),
>>>>>> Field('photo3_text'),
>>>>>> Field('photo_thumb3', 'upload', readable=False, writable=False),
>>>>>> Field('photo4', 'upload'),
>>>>>> Field('photo4_text'),
>>>>>> Field('photo_thumb4', 'upload', readable=False, writable=False),
>>>>>> Field('photo5', 'upload'),
>>>>>> Field('photo5_text'),
>>>>>> Field('photo_thumb5', 'upload', readable=False, writable=False),
>>>>>> Field('price',requires=IS_NOT_EMPTY()),
>>>>>> Field('description', 'text', requires=IS_NOT_EMPTY()),
>>>>>> Field('posted_on', 'datetime', readable=False, writable=False))
>>>>>>
>>>>>> db.define_table('state',
>>>>>> Field('name'),
>>>>>> Field('full_name'))
>>>>>>
>>>>>> db.define_table('wide',
>>>>>> Field('type'),
>>>>>> format='%(type)s')
>>>>>>
>>>>>>
>>>>>> db.park.park_state.requires = IS_IN_DB(db, 'state.name',
>>>>>> '%(full_name)s (%(name)s)', zero=T('Select State'))
>>>>>> db.home.wide.requires = IS_IN_DB(db, 'wide.type', '%(type)s',
>>>>>> zero=T('Select Home Type'))
>>>>>>
>>>>>> db.park.photo_thumb1.compute = lambda row: THUMBER(row.photo1,
>>>>>> "photo_thumb1", 144, 115)
>>>>>> db.park.photo_thumb2.compute = lambda row: THUMBER(row.photo2,
>>>>>> "photo_thumb2", 144, 115)
>>>>>> db.park.photo_thumb3.compute = lambda row: THUMBER(row.photo3,
>>>>>> "photo_thumb3", 144, 115)
>>>>>> db.park.photo_thumb4.compute = lambda row: THUMBER(row.photo4,
>>>>>> "photo_thumb4", 144, 115)
>>>>>> db.park.photo_thumb5.compute = lambda row: THUMBER(row.photo5,
>>>>>> "photo_thumb5", 144, 115)
>>>>>> db.home.photo_thumb1.compute = lambda row: THUMBER(row.photo1,
>>>>>> "photo_thumb1", 144, 115)
>>>>>> db.home.photo_thumb2.compute = lambda row: THUMBER(row.photo2,
>>>>>> "photo_thumb2", 144, 115)
>>>>>> db.home.photo_thumb3.compute = lambda row: THUMBER(row.photo3,
>>>>>> "photo_thumb3", 144, 115)
>>>>>> db.home.photo_thumb4.compute = lambda row: THUMBER(row.photo4,
>>>>>> "photo_thumb4", 144, 115)
>>>>>> db.home.photo_thumb5.compute = lambda row: THUMBER(row.photo5,
>>>>>> "photo_thumb5", 144, 115)
>>>>>>
>>>>>>
>>>>>> Here is my controller:
>>>>>>
>>>>>> def index():
>>>>>> return locals()
>>>>>>
>>>>>> def parks():
>>>>>> if request.args(0):
>>>>>> parks =
>>>>>> db(db.park.park_state==request.args(0)).select(orderby=db.park.park_city|db.park.park_name)
>>>>>> else:
>>>>>> parks =
>>>>>> db(db.park).select(orderby=db.park.park_state|db.park.park_city|db.park.park_name)
>>>>>> return locals()
>>>>>>
>>>>>> def park():
>>>>>> park = db.park(request.args(0)) or redirect(URL('parks'))
>>>>>> homes = db(db.home.pid==(request.args(0))).select(orderby=
>>>>>> db.home.id)
>>>>>> return locals()
>>>>>>
>>>>>> def home():
>>>>>> home = db.home(request.args(0)) or redirect(URL('parks'))
>>>>>> park = db.park(home.pid)
>>>>>> return locals()
>>>>>>
>>>>>> def home_feed():
>>>>>> home = db(db.home).select(orderby=db.home.id)
>>>>>> return locals()
>>>>>>
>>>>>> @auth.requires_membership('Admin')
>>>>>> def new_park():
>>>>>> form = crud.create(db.park, next='park/[id]')
>>>>>> return locals()
>>>>>>
>>>>>> @auth.requires_membership('Admin')
>>>>>> def new_home():
>>>>>> db.home.pid.default = request.args(0) or redirect(URL('parks'))
>>>>>> db.home.price.default = "$0000.00"
>>>>>> db.home.posted_on.default = request.now
>>>>>> form = crud.create(db.home, next='home/[id]')
>>>>>> return locals()
>>>>>>
>>>>>> @auth.requires_membership('Admin')
>>>>>> def edit_park():
>>>>>> park = db.park(request.args(0)) or redirect(URL('parks'))
>>>>>> form = crud.update(db.park, park, next='park/[id]')
>>>>>> return locals()
>>>>>>
>>>>>>
>>>>>> @auth.requires_membership('Admin')
>>>>>> def edit_home():
>>>>>> home = db.home(request.args(0)) or redirect(URL('parks'))
>>>>>> form = crud.update(db.home, home, next='home/[id]')
>>>>>> return locals()
>>>>>>
>>>>>> def about_us():
>>>>>> return locals()
>>>>>>
>>>>>> def employment_opportunities():
>>>>>> return locals()
>>>>>>
>>>>>> def park_management():
>>>>>> return locals()
>>>>>>
>>>>>> def make_park_thumbs():
>>>>>> from image import THUMBER
>>>>>> parks=db(db.park).select(orderby=db.park.park_state)
>>>>>> for park in parks:
>>>>>> park.update_record(photo_thumb1 = THUMBER(park.photo1,
>>>>>> "photo_thumb1", 144, 115))
>>>>>> park.update_record(photo_thumb2 = THUMBER(park.photo2,
>>>>>> "photo_thumb2", 144, 115))
>>>>>> park.update_record(photo_thumb3 = THUMBER(park.photo3,
>>>>>> "photo_thumb3", 144, 115))
>>>>>> park.update_record(photo_thumb4 = THUMBER(park.photo4,
>>>>>> "photo_thumb4", 144, 115))
>>>>>> park.update_record(photo_thumb5 = THUMBER(park.photo5,
>>>>>> "photo_thumb5", 144, 115))
>>>>>> db.commit()
>>>>>>
>>>>>>
>>>>>> Here is the THUMBER function
>>>>>> from gluon import current
>>>>>>
>>>>>> def THUMBER(image, db_photo_var, nx=120, ny=120, name='thumb'):
>>>>>> if image:
>>>>>> try:
>>>>>> request = current.request
>>>>>> from PIL import Image
>>>>>> import os
>>>>>> img = Image.open(request.folder + 'uploads/' + image)
>>>>>> img.db_photo_var((nx, ny), Image.ANTIALIAS)
>>>>>> root, ext = os.path.splitext(image)
>>>>>> thumb = '%s_%s%s' % (root, name, ext)
>>>>>> img.save(request.folder + 'uploads/' + thumb)
>>>>>> return thumb
>>>>>> except Exception:
>>>>>> return image
>>>>>>
>>>>>>
>>>>>> What should i do to get these working on update? At the bottom of the
>>>>>> controller you will notice a the make_park_thumbs() function. That was
>>>>>> one
>>>>>> way of try to fix this and having it set to run on updates. However
>>>>>> won't
>>>>>> generate a thumbnail it just returns the original photo. This would work
>>>>>> if
>>>>>> you can tell why that function won't work. Let me know what to do.
>>>>>>
>>>>>> Braandon
>>>>>>
>>>>>