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 >>>>>> >>>>>> -- >>>>>> >>>>>> >>>>>> >>>>>> >>>>> >>>>> -- >>>> >>>> >>>> >>>> >>> >>> -- >> >> >> >> > > --

