Monday, July 20, 2015

Checking log files in Eupen.

ObjectDoesNotExist: Invalid master key X for Y

Here is a traceback which occurs from time to time:

201507-20 13:06:10 ERROR ajax : Invalid master key 23306 for aids.RefundConfirmationsByGranting
Traceback (most recent call last):
  File "env/lib/python2.7/site-packages/django/core/handlers/base.py", line 112, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "env/lib/python2.7/site-packages/django/views/generic/base.py", line 69, in view
    return self.dispatch(request, *args, **kwargs)
  File "env/lib/python2.7/site-packages/django/views/generic/base.py", line 87, in dispatch
    return handler(request, *args, **kwargs)
  File "lino/modlib/extjs/views.py", line 432, in get
    ar = ba.request(request=request)
  File "lino/core/boundaction.py", line 85, in request
    return self.actor.request(*args, **kw)
  File "lino/core/dbtables.py", line 367, in request
    return TableRequest(**kw)
  File "lino/core/requests.py", line 1028, in __init__
    BaseRequest.__init__(self, **kw)
  File "lino/core/requests.py", line 178, in __init__
    kw = self.parse_req(request, rqdata, **kw)
  File "lino/core/tablerequest.py", line 212, in parse_req
    pk, self.actor))
ObjectDoesNotExist: Invalid master key 23306 for aids.RefundConfirmationsByGranting

It doesn’t seem to be a true problem since I have no user complains.

It is obviously a bug in the Javascript code since 23306 is definitively not a possible primary key for a granting. Their database contains currently 1253 grantings:

>>> from lino.api.shell import *
>>> aids.Granting.objects.count()
1253

The access.log shows the GET request issued by the client:

GET /api/aids/RefundConfirmationsByGranting/577?_dc=1437390393633&mt=51&mk=23306&an=detail&rp=ext-comp-1971&fmt=json

The bug lives somewhere in the linoweb.js. Start to look at the get_master_params() method. I guess that the client messes them up after closing some window. Seems harmless. Leave this sleeping as long as we don’t have a reproducible problem report.

AttributeError ‘NoneType’ object has no attribute ‘__dict__’

And another one:

201507-20 10:27:21 INFO model : Deleting 1 Auszüge before deleting SimpleConfirmation #509 (u'Lebensmittelbank/20.07.15/7825/509')
201507-20 10:27:22 ERROR ajax : 'NoneType' object has no attribute '__dict__'
Traceback (most recent call last):
  File "lib/python2.7/site-packages/django/core/handlers/base.py", line 112, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "lib/python2.7/site-packages/django/views/generic/base.py", line 69, in view
    return self.dispatch(request, *args, **kwargs)
  File "lib/python2.7/site-packages/django/views/generic/base.py", line 87, in dispatch
    return handler(request, *args, **kwargs)
  File "lino/modlib/extjs/views.py", line 507, in put
    return settings.SITE.kernel.run_action(ar)
  File "lino/core/kernel.py", line 596, in run_action
    a.run_from_ui(ar)
  File "lino/core/actions.py", line 953, in run_from_ui
    self.save_existing_instance(elem, ar)
  File "lino/core/actions.py", line 884, in save_existing_instance
    watcher = ChangeWatcher(elem)
  File "lino/core/utils.py", line 679, in __init__
    self.original_state = dict(watched.__dict__)
AttributeError: 'NoneType' object has no attribute '__dict__'

The HTTP request was:

PUT /api/aids/SimpleConfirmations/509

Unfortunately we don’t see the data received with PUT or POST requests. (Which is possible e.g. using mod_dumpio, but not recommended on a production site.)

Code changes in lino.utils.ajax:

  • format_request now also reports the POST or PUT data.
  • The middleware now never returns the full traceback and formatted request to the client but always writes it to the logger.

About stories

A story is a sequence of document chunks. These can be HTML elements or Lino-specific things like tables or action requests.

A test case in Lino Welfare failed because story2rst() no longer removed blank lines. I changed this behaviour recently when I wanted to use story2rst() for rendering a report in Ticket management in Lino Noi. I later decided that it is not necessary there. I might simply put that call to strip() back, but that would not be a true solution. It is a fact that the blank lines are needed if we want it to generate valid reStructuredText, but they are disturbing when we just want to show a story in a tested document. There should be an option for saying whether we want them or not.

Furthermore the story2rst() method is currently defined in lino.core.requests, which is not the right place. I started to tidy up that code. After two hours of work, I hope that it is now more consistent.

I started to write documentation about it in Introduction to User Interface Renderers. A side effect is that rendering a table to reStructuredText now adds a blank line at the end.