I am trying to use versioning in an authenticated section of a website. Instead of this:
db.define_table('my_table', Field('saved_by',auth.user, default=auth.user_id,update=auth.user_id,writable=False) I was trying this: db.define_table('my_table', Field('saved_by','string', default=auth.user.username,update=auth.user.username, writable=False) Whenever I try to visit the website's home page (as an unauthenticated user) web2py chokes on the table definition in models/ db.py. See below for the traceback. Any idea how to solve this? Maybe I should use a decorator with the define_table statement? Regards, Andreas balo...@gmail.com ------------------------------------------------------------------------------ Error traceback 1. 2. 3. 4. 5. 6. 7. Traceback (most recent call last): File "D:\Home\web\web2py\gluon\restricted.py", line 188, in restricted exec ccode in environment File "D:/Home/web/web2py/applications/invest/models/db.py", line 159, in <module> Field('change_user', 'string', default=auth.user.username, update=auth.user.username, writable=False), AttributeError: 'NoneType' object has no attribute 'username' Error snapshot Detailed traceback description * Exception: <type 'exceptions.AttributeError'>('NoneType' object has no attribute 'username') Exception instance attributes o args: ("'NoneType' object has no attribute 'username'",) o __setattr__: <method-wrapper '__setattr__' of exceptions.AttributeError object> o __reduce_ex__: <built-in method __reduce_ex__ of exceptions.AttributeError object> o __getslice__: <method-wrapper '__getslice__' of exceptions.AttributeError object> o __getitem__: <method-wrapper '__getitem__' of exceptions.AttributeError object> o __setstate__: <built-in method __setstate__ of exceptions.AttributeError object> o __getattribute__: <method-wrapper '__getattribute__' of exceptions.AttributeError object> o __str__: <method-wrapper '__str__' of exceptions.AttributeError object> o __format__: <built-in method __format__ of exceptions.AttributeError object> o __reduce__: <built-in method __reduce__ of exceptions.AttributeError object> o __class__: <type 'exceptions.AttributeError'> o __dict__: {} o __delattr__: <method-wrapper '__delattr__' of exceptions.AttributeError object> o __subclasshook__: <built-in method __subclasshook__ of type object> o __repr__: <method-wrapper '__repr__' of exceptions.AttributeError object> o __init__: <method-wrapper '__init__' of exceptions.AttributeError object> o __hash__: <method-wrapper '__hash__' of exceptions.AttributeError object> o __sizeof__: <built-in method __sizeof__ of exceptions.AttributeError object> o __doc__: 'Attribute not found.' o __unicode__: <built-in method __unicode__ of exceptions.AttributeError object> o __new__: <built-in method __new__ of type object> * Python 2.6.5: C:\Program Files\Apache2.2\bin\httpd.exe File D:\Home\web\web2py\gluon\restricted.py in restricted at line 188 [ code | arguments | variables ] Function argument list: (code='# coding: utf8\n\nimport datetime as dt \n\n#########...ail),\n db.email)\n \n', environment={'A': <class 'gluon.html.A'>, 'Auth': <class 'gluon.tools.Auth'>, 'B': <class 'gluon.html.B'>, 'BEAUTIFY': <class 'gluon.html.BEAUTIFY'>, 'BODY': <class 'gluon.html.BODY'>, 'BR': <class 'gluon.html.BR'>, 'CENTER': <class 'gluon.html.CENTER'>, 'CLEANUP': <class 'gluon.validators.CLEANUP'>, 'CODE': <class 'gluon.html.CODE'>, 'CRYPT': <class 'gluon.validators.CRYPT'>, ...}, layer=r'D:\Home\web \web2py\applications\invest/models/db.py') 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. if type(code) == types.CodeType: ccode = code else: ccode = compile2(code,layer) exec ccode in environment except HTTP: raise except Exception: # XXX Show exception in Wing IDE if running in debugger * environment: {'A': <class 'gluon.html.A'>, 'Auth': <class 'gluon.tools.Auth'>, 'B': <class 'gluon.html.B'>, 'BEAUTIFY': <class 'gluon.html.BEAUTIFY'>, 'BODY': <class 'gluon.html.BODY'>, 'BR': <class 'gluon.html.BR'>, 'CENTER': <class 'gluon.html.CENTER'>, 'CLEANUP': <class 'gluon.validators.CLEANUP'>, 'CODE': <class 'gluon.html.CODE'>, 'CRYPT': <class 'gluon.validators.CRYPT'>, ...} * ccode: <code object <module> at 03DB9BA8, file "D:\Home...web2py \applications\invest/models/db.py", line 3> File D:\Home\web\web2py\applications\invest\models\db.py in <module> at line 159 [ code | arguments | variables ] Function argument list: () 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. db.define_table('email', Field('email', 'string', length=40, notnull=False, unique=True, represent=lambda s: s), Field('active', 'boolean', default=True), Field('expires', 'date', default=None, represent=lambda s: s or 'Never'), Field('change_user', 'string', default=auth.user.username, update=auth.user.username, writable=False), Field('change_date', 'datetime', default=request.now, update=request.now, writable=False), ) db.define_table('email_archive', * default: undefined * Field: <class 'gluon.sql.Field'> * auth.username: undefined * auth: <gluon.tools.Auth object>