This seems uncompleted field model definition, no type, no reference auth.settings.extra_fields['auth_user']= [ Field('company'), ]
I would define company referenced table before the auth_user extra field definition... For the other 2 errors, I think controller defaut about ~200+ lines would be informative of what going on... Richard On Thu, Jun 16, 2016 at 11:31 AM, Marty Jones <murtin.jo...@gmail.com> wrote: > See version info below: > > 2.14.5-stable+timestamp.2016.04.13.22.22.13 > (Running on Unknown, Python 2.7.6) > > > > On Thursday, June 16, 2016 at 9:59:58 AM UTC-4, Richard wrote: >> >> How did you upgrade ? Which version of web2py (2.14.6)? >> >> Richard >> >> On Thu, Jun 16, 2016 at 9:36 AM, Marty Jones <murtin...@gmail.com> wrote: >> >>> I uploaded a local application to my DigitalOcean droplet and have been >>> having a nightmare of a time with the databases. I get this variety of >>> errors on various pages: >>> >>> *Error 1:* >>> >>> Traceback (most recent call last): >>> File "/home/murtyjones/app/gluon/restricted.py", line 227, in restricted >>> exec ccode in environment >>> File "/home/murtyjones/app/applications/nolabills/controllers/default.py" >>> <https://nolabills.com/admin/default/edit/nolabills/controllers/default.py>, >>> line 230, in <module> >>> File "/home/murtyjones/app/gluon/globals.py", line 417, in <lambda> >>> self._caller = lambda f: f() >>> File "/home/murtyjones/app/gluon/tools.py", line 4241, in f >>> return action(*a, **b) >>> File "/home/murtyjones/app/applications/nolabills/controllers/default.py" >>> <https://nolabills.com/admin/default/edit/nolabills/controllers/default.py>, >>> line 73, in dashboard >>> data_requests = >>> SQLFORM.grid(db(db.data_requests.company==auth.user.company), >>> File "/home/murtyjones/app/gluon/packages/dal/pydal/objects.py", line 91, >>> in __getattr__ >>> raise AttributeError >>> AttributeError >>> >>> >>> *Error 2 (trying to apply changes as a user to own profile):* >>> >>> Traceback (most recent call last): >>> File "/home/murtyjones/app/gluon/restricted.py", line 227, in restricted >>> exec ccode in environment >>> File "/home/murtyjones/app/applications/nolabills/controllers/default.py" >>> <https://nolabills.com/admin/default/edit/nolabills/controllers/default.py>, >>> line 230, in <module> >>> File "/home/murtyjones/app/gluon/globals.py", line 417, in <lambda> >>> self._caller = lambda f: f() >>> File "/home/murtyjones/app/applications/nolabills/controllers/default.py" >>> <https://nolabills.com/admin/default/edit/nolabills/controllers/default.py>, >>> line 211, in user >>> return dict(form=auth()) >>> File "/home/murtyjones/app/gluon/tools.py", line 1941, in __call__ >>> return getattr(self, args[0])() >>> File "/home/murtyjones/app/gluon/tools.py", line 4026, in profile >>> hideerror=self.settings.hideerror): >>> File "/home/murtyjones/app/gluon/sqlhtml.py", line 1744, in accepts >>> self.id_field_name]).update(**fields) >>> File "/home/murtyjones/app/gluon/packages/dal/pydal/objects.py", line >>> 2041, in update >>> ret = db._adapter.update("%s" % table._tablename, self.query, fields) >>> File "/home/murtyjones/app/gluon/packages/dal/pydal/adapters/base.py", >>> line 519, in update >>> raise e >>> OperationalError: attempt to write a readonly database >>> >>> >>> *Error 3 (trying to logout as a user):* >>> >>> Traceback (most recent call last): >>> File "/home/murtyjones/app/gluon/restricted.py", line 227, in restricted >>> exec ccode in environment >>> File "/home/murtyjones/app/applications/nolabills/controllers/default.py" >>> <https://nolabills.com/admin/default/edit/nolabills/controllers/default.py>, >>> line 230, in <module> >>> File "/home/murtyjones/app/gluon/globals.py", line 417, in <lambda> >>> self._caller = lambda f: f() >>> File "/home/murtyjones/app/applications/nolabills/controllers/default.py" >>> <https://nolabills.com/admin/default/edit/nolabills/controllers/default.py>, >>> line 211, in user >>> return dict(form=auth()) >>> File "/home/murtyjones/app/gluon/tools.py", line 1941, in __call__ >>> return getattr(self, args[0])() >>> File "/home/murtyjones/app/gluon/tools.py", line 3235, in logout >>> self.log_event(log, self.user) >>> File "/home/murtyjones/app/gluon/tools.py", line 2530, in log_event >>> self.table_event().insert(description=str(description % vars), >>> origin=origin, user_id=user_id) >>> File "/home/murtyjones/app/gluon/packages/dal/pydal/objects.py", line >>> 740, in insert >>> ret = self._db._adapter.insert(self, self._listify(fields)) >>> File "/home/murtyjones/app/gluon/packages/dal/pydal/adapters/base.py", >>> line 482, in insert >>> raise e >>> IntegrityError: FOREIGN KEY constraint failed >>> >>> >>> *db.py* >>> ## app configuration made easy. Look inside private/appconfig.ini >>> from gluon.contrib.appconfig import AppConfig >>> ## import current for current.db = db line >>> from gluon import current >>> >>> ## once in production, remove reload=True to gain full speed >>> myconf = AppConfig(reload=True) >>> >>> ## if NOT running on Google App Engine use SQLite or other DB >>> db = DAL(myconf.take('db.uri'), pool_size=myconf.take('db.pool_size', >>> cast=int), migrate_enabled = myconf.get('db.migrate'), >>> check_reserved=['all']) >>> >>> ## define current.db for module usage >>> current.db = db >>> >>> ## by default give a view/generic.extension to all actions from localhost >>> ## none otherwise. a pattern can be 'controller/function.extension' >>> response.generic_patterns = ['*'] if request.is_local else [] >>> ## choose a style for forms >>> response.formstyle = myconf.take('forms.formstyle') # or >>> 'bootstrap3_stacked' or 'bootstrap2' or other >>> response.form_label_separator = myconf.take('forms.separator') >>> >>> from gluon.tools import Auth, Service, PluginManager >>> >>> auth = Auth(db) >>> service = Service() >>> plugins = PluginManager() >>> >>> auth.settings.extra_fields['auth_user']= [ >>> Field('company'), >>> ] >>> >>> ## create all tables needed by auth if not custom tables >>> auth.define_tables(username=False, signature=False, migrate=True, >>> fake_migrate=True) >>> >>> ## configure email >>> mail = auth.settings.mailer >>> mail.settings.server = 'smtp.gmail.com' >>> mail.settings.sender = 'em...@gmail.com' >>> mail.settings.login = 'em...@gmail.com:password' >>> >>> ## configure auth policy >>> auth.settings.registration_requires_verification = True >>> auth.settings.registration_requires_approval = True >>> auth.settings.reset_password_requires_verification = True >>> >>> ## after defining tables, uncomment below to enable auditing >>> # auth.enable_record_versioning(db) >>> >>> >>> ## create list of companies for which this is available >>> db.define_table('company_info', >>> Field('name'), >>> Field('street_address'), >>> ) >>> >>> ## create a table for the queue of not yet fulfilled data requests >>> db.define_table('data_requests', >>> Field('first_name'), >>> Field('last_name'), >>> Field('entergy_username'), >>> Field('entergy_password'), >>> Field('email'), >>> Field('company'), >>> Field('status', default='QUEUED'), >>> Field('runs', 'integer', default=0), >>> Field('bill_1', 'upload', uploadfield='bill_1_file'), >>> Field('bill_1_file', 'blob'), >>> ) >>> >>> >>> ## create a table for generating tokens >>> db.define_table('tokens', >>> Field('first_name'), >>> Field('last_name'), >>> Field('email'), >>> Field('company'), >>> Field('token'), >>> Field('submitted', default=False), >>> ) >>> >>> >>> >>> *sql.log* >>> timestamp: 2016-06-15T14:20:52.811948 >>> CREATE TABLE auth_user( >>> id INTEGER PRIMARY KEY AUTOINCREMENT, >>> first_name CHAR(128), >>> last_name CHAR(128), >>> email CHAR(512), >>> password CHAR(512), >>> registration_key CHAR(512), >>> reset_password_key CHAR(512), >>> registration_id CHAR(512) >>> ); >>> success! >>> timestamp: 2016-06-15T14:20:52.856816 >>> CREATE TABLE auth_group( >>> id INTEGER PRIMARY KEY AUTOINCREMENT, >>> role CHAR(512), >>> description TEXT >>> ); >>> success! >>> timestamp: 2016-06-15T14:20:52.899975 >>> CREATE TABLE auth_membership( >>> id INTEGER PRIMARY KEY AUTOINCREMENT, >>> user_id INTEGER REFERENCES auth_user (id) ON DELETE CASCADE , >>> group_id INTEGER REFERENCES auth_group (id) ON DELETE CASCADE >>> ); >>> success! >>> timestamp: 2016-06-15T14:20:53.040386 >>> CREATE TABLE auth_permission( >>> id INTEGER PRIMARY KEY AUTOINCREMENT, >>> group_id INTEGER REFERENCES auth_group (id) ON DELETE CASCADE , >>> name CHAR(512), >>> table_name CHAR(512), >>> record_id INTEGER >>> ); >>> success! >>> timestamp: 2016-06-15T14:20:53.092848 >>> CREATE TABLE auth_event( >>> id INTEGER PRIMARY KEY AUTOINCREMENT, >>> time_stamp TIMESTAMP, >>> client_ip CHAR(512), >>> user_id INTEGER REFERENCES auth_user (id) ON DELETE CASCADE , >>> origin CHAR(512), >>> description TEXT >>> ); >>> success! >>> timestamp: 2016-06-15T14:20:53.223004 >>> CREATE TABLE auth_cas( >>> id INTEGER PRIMARY KEY AUTOINCREMENT, >>> user_id INTEGER REFERENCES auth_user (id) ON DELETE CASCADE , >>> created_on TIMESTAMP, >>> service CHAR(512), >>> ticket CHAR(512), >>> renew CHAR(1) >>> ); >>> success! >>> timestamp: 2016-06-15T14:22:53.166163 >>> ALTER TABLE auth_user ADD company CHAR(512); >>> success! >>> timestamp: 2016-06-15T14:22:53.554653 >>> CREATE TABLE company_info( >>> id INTEGER PRIMARY KEY AUTOINCREMENT, >>> name CHAR(512), >>> street_address CHAR(512) >>> ); >>> success! >>> timestamp: 2016-06-15T14:22:53.604055 >>> CREATE TABLE data_requests( >>> id INTEGER PRIMARY KEY AUTOINCREMENT, >>> first_name CHAR(512), >>> last_name CHAR(512), >>> entergy_username CHAR(512), >>> entergy_password CHAR(512), >>> email CHAR(512), >>> company CHAR(512), >>> status CHAR(512), >>> runs INTEGER, >>> bill_1 CHAR(512), >>> bill_1_file BLOB >>> ); >>> success! >>> timestamp: 2016-06-15T14:22:53.645905 >>> CREATE TABLE tokens( >>> id INTEGER PRIMARY KEY AUTOINCREMENT, >>> first_name CHAR(512), >>> last_name CHAR(512), >>> email CHAR(512), >>> company CHAR(512), >>> token CHAR(512), >>> submitted CHAR(512) >>> ); >>> success! >>> timestamp: 2016-06-15T14:22:56.435830 >>> CREATE TABLE scheduler_task( >>> id INTEGER PRIMARY KEY AUTOINCREMENT, >>> application_name CHAR(512), >>> task_name CHAR(512), >>> group_name CHAR(512), >>> status CHAR(512), >>> function_name CHAR(512), >>> uuid CHAR(255) UNIQUE, >>> args TEXT, >>> vars TEXT, >>> enabled CHAR(1), >>> start_time TIMESTAMP, >>> next_run_time TIMESTAMP, >>> stop_time TIMESTAMP, >>> repeats INTEGER, >>> retry_failed INTEGER, >>> period INTEGER, >>> prevent_drift CHAR(1), >>> timeout INTEGER, >>> sync_output INTEGER, >>> times_run INTEGER, >>> times_failed INTEGER, >>> last_run_time TIMESTAMP, >>> assigned_worker_name CHAR(512) >>> ); >>> success! >>> timestamp: 2016-06-15T14:22:56.501649 >>> CREATE TABLE scheduler_run( >>> id INTEGER PRIMARY KEY AUTOINCREMENT, >>> task_id INTEGER REFERENCES scheduler_task (id) ON DELETE CASCADE , >>> status CHAR(512), >>> start_time TIMESTAMP, >>> stop_time TIMESTAMP, >>> run_output TEXT, >>> run_result TEXT, >>> traceback TEXT, >>> worker_name CHAR(512) >>> ); >>> success! >>> timestamp: 2016-06-15T14:22:56.546304 >>> CREATE TABLE scheduler_worker( >>> id INTEGER PRIMARY KEY AUTOINCREMENT, >>> worker_name CHAR(255) UNIQUE, >>> first_heartbeat TIMESTAMP, >>> last_heartbeat TIMESTAMP, >>> status CHAR(512), >>> is_ticker CHAR(1), >>> group_names TEXT, >>> worker_stats TEXT >>> ); >>> success! >>> timestamp: 2016-06-15T14:22:56.589493 >>> CREATE TABLE scheduler_task_deps( >>> id INTEGER PRIMARY KEY AUTOINCREMENT, >>> job_name CHAR(512), >>> task_parent INTEGER, >>> task_child INTEGER REFERENCES scheduler_task (id) ON DELETE CASCADE >>> , >>> can_visit CHAR(1) >>> ); >>> success! >>> >>> No idea where to even start with this and would appreciate help. >>> >>> -- >>> Resources: >>> - http://web2py.com >>> - http://web2py.com/book (Documentation) >>> - http://github.com/web2py/web2py (Source code) >>> - https://code.google.com/p/web2py/issues/list (Report Issues) >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "web2py-users" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to web2py+un...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- > Resources: > - http://web2py.com > - http://web2py.com/book (Documentation) > - http://github.com/web2py/web2py (Source code) > - https://code.google.com/p/web2py/issues/list (Report Issues) > --- > You received this message because you are subscribed to the Google Groups > "web2py-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to web2py+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.