appadmin database administration fails when trying to edit record

35 views
Skip to first unread message

David Manns

unread,
Jun 6, 2019, 11:25:35 AM6/6/19
to web2py-users
running Python 2.7, web2py 2.18.5

table:
   
db.define_table('AccTrans',
    Field('Timestamp', 'datetime', default=request.now, writable=False),
    Field('Bank', 'reference Bank_Accounts', writable=False),    #e.g. PayPal, Cambridge Trust, ...
    Field('Account', 'reference CoA',
            requires=IS_IN_DB(db, 'CoA.id', '%(Name)s', orderby=db.CoA.Name)),
    Field('Event', 'reference Events',
                requires=IS_EMPTY_OR(IS_IN_DB(db, 'Events.id', '%(Event)s', orderby=~db.Events.Date)),
                comment='leave blank if not applicable'),
    Field('Amount', 'decimal(8,2)',
                comment='enter full amount of check (negative) or deposit (positive); split using Edit if multiple accounts',
                requires=IS_DECIMAL_IN_RANGE(-10000, 10000)),    # >=0 for asset/revenue, <0 for liability/expense
    Field('Fee', 'decimal(6,2)', requires=IS_EMPTY_OR(IS_DECIMAL_IN_RANGE(-1000,100))),    # e.g. PayPal transaction fee, <0 (unless refunded)
    Field('CheckNumber', 'integer', default=None, requires=IS_EMPTY_OR(IS_INT_IN_RANGE(1,99999)),
                comment='enter check number if recording a check written'),
    Field('Accrual', 'boolean', default=True, readable=True, writable=False),
    Field('FullAmt', 'decimal(8,2)', writable=False, readable=False),    # for an accrual, the original unsplit amount
    Field('Reference', 'string', writable=False),
    Field('Notes', 'text'),
    singular='Transaction', plural='Check_Register')

first referenced table:
   
db.define_table('CoA',
    Field('Name', 'string'),
    Field('Notes', 'string'),
    singular='Bank', plural='Banks', format='%(Name)s')
db.CoA.Name.requires = [IS_NOT_EMPTY(), IS_NOT_IN_DB(db, 'CoA.Name')]

appadmin displays table rows just fine.

clicking a record link in the id column to edit the record fails:

Ticket ID

127.0.0.1.2019-06-06.11-23-25.64b3e296-56e8-4c9f-a875-5a0ae496f620

<type 'exceptions.KeyError'> 'Account.Name'

Version

web2py™ Version 2.18.5-stable+timestamp.2019.04.08.04.22.03
Python Python 2.7.14: C:\Python27\python.exe (prefix: C:\Python27)

Traceback

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Traceback (most recent call last):
File "C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\gluon\restricted.py", line 219, in restricted
exec(ccode, environment)
File "C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\applications\init\controllers/appadmin.py", line 695, in <module>
File "C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\gluon\globals.py", line 421, in <lambda>
self._caller = lambda f: f()
File "C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\applications\init\controllers/appadmin.py", line 337, in update
f='download', args=request.args[:1]))
File "C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\gluon\sqlhtml.py", line 1550, in __init__
inp = self.widgets.options.widget(field, default)
File "C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\gluon\sqlhtml.py", line 353, in widget
options = requires[0].options()
File "C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\gluon\packages\dal\pydal\validators.py", line 2742, in _options
options = self.other.options(*args, **kwargs)
File "C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\gluon\packages\dal\pydal\validators.py", line 609, in options
self.build_set()
File "C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\gluon\packages\dal\pydal\validators.py", line 604, in build_set
self.labels = [self.label % r for r in records]
File "C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\gluon\packages\dal\pydal\objects.py", line 103, in __getitem__
raise KeyError(key)
KeyError: 'Account.Name'

Error snapshot help

<type 'exceptions.KeyError'>('Account.Name')

inspect attributes

Frames

  • File C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\gluon\restricted.py in restricted at line 219 code arguments variables

  • File C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\applications\init\controllers\appadmin.py in <module> at line 695 code arguments variables

  • File C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\gluon\globals.py in <lambda> at line 421 code arguments variables

  • File C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\applications\init\controllers\appadmin.py in update at line 337 code arguments variables

  • File C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\gluon\sqlhtml.py in __init__ at line 1550 code arguments variables

  • File C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\gluon\sqlhtml.py in widget at line 353 code arguments variables

  • File C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\gluon\packages\dal\pydal\validators.py in _options at line 2742 code arguments variables

  • File C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\gluon\packages\dal\pydal\validators.py in options at line 609 code arguments variables

  • File C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\gluon\packages\dal\pydal\validators.py in build_set at line 604 code arguments variables

  • File C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\gluon\packages\dal\pydal\objects.py in __getitem__ at line 103 code arguments variables

    Function argument list

    (self=<Row {'Accrued': -946.32, 'id': 1L}>, k='Account.Name')

    Code listing
    98.
    99.
    100.
    101.
    102.
    103.
    104.
    105.
    106.
    107.
            lg = BasicStorage.get(self, '__get_lazy_reference__', None)
    if callable(lg):
    v = self[key] = lg(key)
    return v

    raise KeyError(key)

    __str__ = __repr__ = lambda self: '<Row %s>' % \
    self.as_dict(custom_types=[LazySet])
    Variables
    key 'Account.Name'
    builtinKeyError <type 'exceptions.KeyError'>

In file: C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\applications\init\controllers/appadmin.py

1.
<code object <module> at 000000000BC220B0, file "C:\Users\David\Google Drive\My Documents\OxCamNE.3.1\applications\init\controllers/appadmin.py", line 7>

Ben Duncan

unread,
Jun 6, 2019, 12:17:53 PM6/6/19
to Web2py
Field('Account', 'reference CoA',
            requires=IS_IN_DB(db, 'CoA.id', '%(Name)s', orderby=db.CoA.Name)),

To me, it looks like you are using "name" to reference the COA, instead of the ID.


Ben Duncan
DBA / Chief Software Architect
Mississippi State Supreme Court
Electronic Filing Division


--
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.
To view this discussion on the web visit https://groups.google.com/d/msgid/web2py/bfd3002d-300b-49a5-9078-e229cafb9e3f%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

David Manns

unread,
Jun 7, 2019, 11:43:43 AM6/7/19
to web2py-users
It turns out the orderby is redundant.

    Field('Account', 'reference CoA', requires=IS_IN_DB(db, 'CoA.id', '%(Name)s')),

works the same. In the application smartgrid edit form the Account field is a dropdown displaying the Name's of the accounts in alphabetic order, no need for the orderby, so yes, the user is selecting by Name but of course what's stored in Account is the corresponding id.

The orderby in Event is not redundant, as the event names need to be in reverse chronological order in the dropdown, rather than alphabetic.

But appadmin still fails exactly the same way. Looks like a bug in appadmin to me.
To unsubscribe from this group and stop receiving emails from it, send an email to web...@googlegroups.com.

Dave S

unread,
Jun 7, 2019, 5:42:12 PM6/7/19
to web2py-users


On Friday, June 7, 2019 at 8:43:43 AM UTC-7, David Manns wrote:
It turns out the orderby is redundant.

    Field('Account', 'reference CoA', requires=IS_IN_DB(db, 'CoA.id', '%(Name)s')),

works the same. In the application smartgrid edit form the Account field is a dropdown displaying the Name's of the accounts in alphabetic order, no need for the orderby, so yes, the user is selecting by Name but of course what's stored in Account is the corresponding id.

The orderby in Event is not redundant, as the event names need to be in reverse chronological order in the dropdown, rather than alphabetic.

But appadmin still fails exactly the same way. Looks like a bug in appadmin to me.

The place where I use Appadmin and a reference field is at home, and last night I was paying for the night before, and didn't even wake my computer.  But in my experience (admittedly with 2.14.6) Appadmin shows the child table just fine, with a column for the ids from the parent table.

/dps

David Manns

unread,
Jun 7, 2019, 5:49:51 PM6/7/19
to web2py-users
Yes, I'm pretty sure it worked fine with 2.14.6!
Reply all
Reply to author
Forward
0 new messages