maybe instead of adding on to auth, I should just create two separate
tables and have them reference auth


On Thu, Dec 6, 2012 at 3:05 PM, Daniele Pestilli <[email protected]>wrote:

> this just completely broke my website -_- ....
> Now I can't even sign a user up anymore because it's requesting all those
> additional fields.
>
>
>
> On Thu, Dec 6, 2012 at 2:33 PM, Anthony <[email protected]> wrote:
>
>> You are using SQLFORM.factory to handle the upload, but the table and
>> field names used there do not match the table or field names where the
>> records are actually stored, so response.download() cannot find the
>> appropriate table or field. By default, SQLFORM.factory uses "no_table" as
>> the dummy table name, and your code uses "image" as the field name. So,
>> your image files will end up with names that start with "no_table.image".
>> As a result, response.download(request, db) will look for a db.no_table
>> table with an "image" field, but obviously won't find it. Instead, your
>> image filenames are actually stored in db.auth_user.t_image, so you need to
>> make sure the filenames get generated with names starting with
>> "auth_user.t_image".
>>
>> Also, if you specify a custom uploadfolder, you'll need to make sure that
>> the db.auth_user.t_image field has that uploadfolder specified as well,
>> because response.download() checks the actual db field to determine the
>> uploadfolder. The easiest approach might be to define the field once and
>> reference both in the appended auth_user fields and in SQLFORM.factory.
>>
>> Finally, you can specify the name of the dummy table used by
>> SQLFORM.factory by passing a "table_name" argument.
>>
>> So, maybe something like this:
>>
>> image_field = Field('t_image', 'upload', ..., uploadfolder=[your upload
>> folder])
>> auth.settings.extra_fields['auth_user'] = [..., image_field, ...]
>> ...
>> tform = SQLFORM.factory(..., image_field, ..., table_name='auth.user')
>>
>> Actually, you should probably do that with all the fields in
>> SQLFORM.factory -- define them all once and use them in db.auth_user and to
>> make the form. As it is, the field definitions in db.auth_user don't even
>> have the correct field types defined. You could first add all the fields to
>> db.auth_user, and then do something like this:
>>
>> tform = SQLFORM.factory(*[f for f in db.auth_user if f.name.startswith(
>> 't_')], ...)
>>
>> That will include all the fields from db.auth_user that start with "t_".
>>
>> Finally, note that there will not be any errors in the form until you
>> process it, so your condition that checks for errors will never find any.
>> First call, form.process(), and then check for errors.
>>
>> Anthony
>>
>>
>> On Thursday, December 6, 2012 8:51:02 AM UTC-5, Daniele wrote:
>>
>>> Ok here's my code:
>>>
>>> in db.py
>>>
>>> from gluon.tools import Auth, Crud, Service, PluginManager, prettydate
>>>
>>>
>>>
>>>
>>> auth = Auth(db)
>>> auth.settings.extra_fields['**auth_user']= [
>>>
>>>
>>>
>>>
>>>     # t denote tutor fields, s denote student fields.
>>>     Field <http://127.0.0.1:8000/examples/global/vars/Field>('t_image'),
>>>
>>>
>>>
>>>
>>>     Field <http://127.0.0.1:8000/examples/global/vars/Field>('t_location'),
>>>
>>>
>>>
>>>
>>>     Field <http://127.0.0.1:8000/examples/global/vars/Field>('t_subjects'),
>>>
>>>
>>>
>>>
>>>     Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('t_qualifications'),
>>>
>>>
>>>
>>>
>>>     Field <http://127.0.0.1:8000/examples/global/vars/Field>('t_biography'),
>>>
>>>
>>>
>>>
>>>     Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('t_hourly_rate'),
>>>
>>>
>>>
>>>
>>>     Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('t_modified_on'),
>>>
>>>
>>>
>>>
>>>     Field <http://127.0.0.1:8000/examples/global/vars/Field>('s_location')]
>>>
>>>
>>>
>>>
>>>
>>> in my controller:
>>>
>>>
>>> @auth.requires_login()
>>> def edit_profile():
>>>     response <http://127.0.0.1:8000/examples/global/vars/response>.subtitle 
>>> = T <http://127.0.0.1:8000/examples/global/vars/T>("Edit Profile")
>>>
>>>
>>>
>>>
>>>     # Tutor form
>>>     tform = SQLFORM 
>>> <http://127.0.0.1:8000/examples/global/vars/SQLFORM>.factory(
>>>
>>>
>>>
>>>
>>>         Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('is_tutor', 'boolean'),
>>>
>>>
>>>
>>>
>>>         Field <http://127.0.0.1:8000/examples/global/vars/Field>('image', 
>>> 'upload', requires=IS_EMPTY_OR 
>>> <http://127.0.0.1:8000/examples/global/vars/IS_EMPTY_OR>(IS_IMAGE 
>>> <http://127.0.0.1:8000/examples/global/vars/IS_IMAGE>(**extensions=('jpeg', 
>>> 'jpg', 'png', 'gif')))),
>>>
>>>
>>>
>>>
>>>         Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('location', 
>>> 'list:string', requires=IS_NOT_EMPTY 
>>> <http://127.0.0.1:8000/examples/global/vars/IS_NOT_EMPTY>()),
>>>
>>>
>>>
>>>
>>>         Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('subjects', 
>>> 'list:string', requires=IS_NOT_EMPTY 
>>> <http://127.0.0.1:8000/examples/global/vars/IS_NOT_EMPTY>()),
>>>
>>>
>>>
>>>
>>>         Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('qualifications', 
>>> 'list:string', requires=IS_NOT_EMPTY 
>>> <http://127.0.0.1:8000/examples/global/vars/IS_NOT_EMPTY>()),
>>>
>>>
>>>
>>>
>>>         Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('biography', 'text'),
>>>
>>>
>>>
>>>
>>>         Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('hourly_rate', 
>>> 'decimal(7,2)', requires=IS_NOT_EMPTY 
>>> <http://127.0.0.1:8000/examples/global/vars/IS_NOT_EMPTY>()),
>>>
>>>
>>>
>>>
>>>         Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('modified_on', 
>>> 'datetime', requires=IS_DATETIME 
>>> <http://127.0.0.1:8000/examples/global/vars/IS_DATETIME>(), writable=False, 
>>> readable=False, default=request 
>>> <http://127.0.0.1:8000/examples/global/vars/request>.utcnow),
>>>
>>>
>>>
>>>
>>>         upload=URL 
>>> <http://127.0.0.1:8000/examples/global/vars/URL>('download'),
>>>
>>>
>>>
>>>
>>>         table_name='tutor')
>>>
>>>     # Student form
>>>
>>>
>>>
>>>
>>>     sform = SQLFORM 
>>> <http://127.0.0.1:8000/examples/global/vars/SQLFORM>.factory(
>>>
>>>
>>>
>>>
>>>         Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('is_student', 'boolean'),
>>>
>>>
>>>
>>>
>>>         Field 
>>> <http://127.0.0.1:8000/examples/global/vars/Field>('location', 
>>> 'list:string', requires=IS_NOT_EMPTY 
>>> <http://127.0.0.1:8000/examples/global/vars/IS_NOT_EMPTY>()),
>>>
>>>
>>>
>>>
>>>         table_name='student')
>>>
>>>     tform['_class'] = "form-horizontal"
>>>
>>>
>>>
>>>
>>>     sform['_class'] = "form-horizontal"
>>>
>>>
>>>
>>>
>>>     tform.custom.submit['_class'] = "btn btn-success"
>>>
>>>
>>>
>>>
>>>     sform.custom.submit['_class'] = "btn btn-success"
>>>
>>>
>>>
>>>
>>>     tform.custom.begin = XML 
>>> <http://127.0.0.1:8000/examples/global/vars/XML>("<%s %s>" % (tform.tag, 
>>> tform._xml()[0]))
>>>
>>>
>>>
>>>
>>>     sform.custom.begin = XML 
>>> <http://127.0.0.1:8000/examples/global/vars/XML>("<%s %s>" % (sform.tag, 
>>> sform._xml()[0]))
>>>
>>>
>>>
>>>
>>>
>>>     if tform.errors or sform.errors:
>>>
>>>
>>>
>>>
>>>         response 
>>> <http://127.0.0.1:8000/examples/global/vars/response>.flash = T 
>>> <http://127.0.0.1:8000/examples/global/vars/T>('There was an error with 
>>> your submission')
>>>
>>>
>>>
>>>
>>>     else:
>>>         if tform.process().accepted:
>>>
>>>
>>>
>>>
>>>             if tform.vars.is_tutor:
>>>                 if not auth.has_membership('Tutors'):
>>>
>>>
>>>
>>>
>>>                     auth.add_membership('Tutors')
>>>                 db(db.auth_user.id == auth.user_id).update(
>>>
>>>
>>>
>>>
>>>                     t_image = tform.vars.image,
>>>                     t_location = tform.vars.location,
>>>
>>>
>>>
>>>
>>>                     t_subjects = tform.vars.subjects,
>>>                     t_qualifications = tform.vars.qualifications,
>>>
>>>
>>>
>>>
>>>                     t_biography = tform.vars.biography,
>>>                     t_hourly_rate = tform.vars.hourly_rate,
>>>
>>>
>>>
>>>
>>>                     t_modified_on = tform.vars.modified_on
>>>                 )
>>>
>>>
>>>
>>>
>>>             else:
>>>                 if auth.has_membership('Tutors'):
>>>
>>>
>>>
>>>
>>>                     auth.del_membership('Tutors')
>>>                 #db.auth_user.delete() delete the records
>>>
>>>
>>>
>>>
>>>             response 
>>> <http://127.0.0.1:8000/examples/global/vars/response>.flash = T 
>>> <http://127.0.0.1:8000/examples/global/vars/T>('Profile updated!')
>>>
>>>
>>>
>>>
>>>
>>>         if sform.process().accepted:
>>>
>>>
>>>
>>>
>>>             if sform.vars.is_student:
>>>                 if not auth.has_membership('Students'**):
>>>
>>>
>>>
>>>
>>>                     auth.add_membership('Students'**)
>>>
>>>
>>>
>>>
>>>                 db(db.auth_user.id == auth.user_id).update(
>>>
>>>
>>>
>>>
>>>                     s_location = sform.vars.location
>>>                 )
>>>
>>>
>>>
>>>
>>>             else:
>>>                 if auth.has_membership('Students'**):
>>>
>>>
>>>
>>>
>>>                     auth.del_membership('Students'**)
>>>
>>>
>>>
>>>
>>>             response 
>>> <http://127.0.0.1:8000/examples/global/vars/response>.flash = T 
>>> <http://127.0.0.1:8000/examples/global/vars/T>('Profile updated!')
>>>
>>>
>>>
>>>
>>>     return dict(tform=tform, sform=sform)
>>>
>>>
>>>
>>>
>>> On Thu, Dec 6, 2012 at 1:48 PM, Anthony <[email protected]> wrote:
>>>
>>>> You mention using SQLFORM.factory -- do you actually store the record
>>>> in a db table, does that db table name match the name at the beginning of
>>>> the filename, and is the 'image' field definition in the model for that
>>>> table the same as the field definition you're using in SQLFORM.factory? It
>>>> might help if you show all of the relevant model and controller code.
>>>>
>>>> Anthony
>>>>
>>>>
>>>> On Thursday, December 6, 2012 8:33:10 AM UTC-5, Daniele wrote:
>>>>
>>>>> I noticed that I am missing upload=URL('download') in my
>>>>> SQLFORM.factory, so I added that in there but it's still not working.
>>>>>
>>>>> I double checked the image name and you were right, I don't know how I
>>>>> must have mistakenly deleted that part but it was indeed
>>>>> "[table_name].[field_name].[**ra**nd_string]"
>>>>>
>>>>> I can't think of why else this is not working...I am following the
>>>>> web2py book verbatim...
>>>>>
>>>>>
>>>>> On Thu, Dec 6, 2012 at 3:06 AM, Anthony <[email protected]> wrote:
>>>>>
>>>>>>
>>>>>> Hmm for some reason it's not working for me. I took a look at the
>>>>>>> source code and this is the HTML that is being generated:
>>>>>>>
>>>>>>> <img 
>>>>>>> src="/download/image.**a6e29a6f3****6771685.**e58699e79c9f2e4a5047.**J**PG"
>>>>>>>  />
>>>>>>>
>>>>>>>
>>>>>>> And this is what I have in my view that is generating that code:
>>>>>>>
>>>>>>> {{=IMG(_src=URL('default', 'download', args=row.image))}}
>>>>>>>
>>>>>>> so it seems to be taking the 'download' directory and looking for
>>>>>>> the image there, but as aforementioned, I've set the directory for these
>>>>>>> images to be in:
>>>>>>>
>>>>>>> Field('image', 'upload', uploadfolder=os.path.join(**requ****
>>>>>>> est.folder,'uploads/**profiles/'****)
>>>>>>>
>>>>>>
>>>>>> No, the URL /download/image... does not imply web2py is looking the
>>>>>> the "download" directory. Remember, URLs do not map to directories (with
>>>>>> the exception of static files). In web2py, URLs always map to 
>>>>>> applications,
>>>>>> controllers, and functions. In your URL, it looks like the application 
>>>>>> and
>>>>>> controller are excluded, so "download" will be interpreted by web2py as 
>>>>>> the
>>>>>> function, and then the filename will be interpreted as request.args(0).
>>>>>> This URL will call the download() function in default.py, which will
>>>>>> ultimately call response.download(request, db), and that function will 
>>>>>> pull
>>>>>> the filename from request.args(0).
>>>>>>
>>>>>> There is a problem with the filename, though. It starts with "image",
>>>>>> which appears to be the field name, but it should actually start with
>>>>>> "[table_name].[field_name]". I'm not sure how that could have happened. 
>>>>>> Do
>>>>>> you have the same problem with new images that you upload? Do their
>>>>>> filenames start with the table name, or just with "image"?
>>>>>>
>>>>>> Anthony
>>>>>>
>>>>>> --
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>  --
>>>>
>>>>
>>>>
>>>>
>>>
>>>  --
>>
>>
>>
>>
>
>

-- 



Reply via email to