Accessing Job Details using the Admin "Jobs" page gives "TypeError vars() argument must have __dict__ attribute" error
bockp opened this issue · comments
After updating our local installation to the new version, we had a few bugs.
Most of them resolved themselves as problems with our server, the wrong user launching crontab add, and other such small but annoying adjustments, and we fixed those after some work.
There are, however, two bugs that I cannot figure out, and that don't seem to come from anything on our end, as far as I've been able to tell.
This issue details one of them.
This bug only affects jobs launched after the update to the new version.
We migrated the old database over to the new version, and the jobs already present in it from before have their details page accessible.
Expected :
When clicking the identifier of a job on the Home >WAVES CORE > Jobs page, we expect to see the job details page, that shows the details of the job in question along with links to it's results, etc.
Bug:
If I attempt to access this page, I receive a TypeError saying vars() argument must have __dict__ attribute
Example:
clicking the identifier of a job launched after the upgrade:
Traceback:
Environment:
Request Method: GET
Request URL: http://xx.xx.xx.xxx/admin/wcore/job/173/change/
Django Version: 1.11.17
Python Version: 2.7.5
Installed Applications:
[u'polymorphic',
u'django.contrib.admin',
u'django.contrib.auth',
u'django.contrib.contenttypes',
u'django.contrib.sessions',
u'django.contrib.messages',
u'django.contrib.staticfiles',
u'waves.wcore',
u'waves.authentication',
u'crispy_forms',
u'rest_framework',
u'corsheaders',
u'adminsortable2',
u'django_crontab']
Installed Middleware:
[u'django.middleware.security.SecurityMiddleware',
u'django.contrib.sessions.middleware.SessionMiddleware',
u'corsheaders.middleware.CorsMiddleware',
u'django.middleware.common.CommonMiddleware',
u'django.middleware.csrf.CsrfViewMiddleware',
u'django.contrib.auth.middleware.AuthenticationMiddleware',
u'django.contrib.messages.middleware.MessageMiddleware',
u'django.middleware.clickjacking.XFrameOptionsMiddleware']
Template error:
In template /usr/lib/python2.7/site-packages/django/contrib/admin/templates/admin/includes/fieldset.html, error at line 17
vars() argument must have __dict__ attribute 7 : <div class="form-row{% if line.fields|length_is:'1' and line.errors %} errors{% endif %}{% if not line.has_visible_field %} hidden{% endif %}{% for field in line %}{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% endfor %}">
8 : {% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %}
9 : {% for field in line %}
10 : <div{% if not line.fields|length_is:'1' %} class="field-box{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}{% if field.field.is_hidden %} hidden{% endif %}"{% elif field.is_checkbox %} class="checkbox-row"{% endif %}>
11 : {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
12 : {% if field.is_checkbox %}
13 : {{ field.field }}{{ field.label_tag }}
14 : {% else %}
15 : {{ field.label_tag }}
16 : {% if field.is_readonly %}
17 : <div class="readonly"> {{ field.contents }} </div>
18 : {% else %}
19 : {{ field.field }}
20 : {% endif %}
21 : {% endif %}
22 : {% if field.field.help_text %}
23 : <div class="help">{{ field.field.help_text|safe }}</div>
24 : {% endif %}
25 : </div>
26 : {% endfor %}
27 : </div>
Traceback:
File "/usr/lib/python2.7/site-packages/django/core/handlers/exception.py" in inner
41. response = get_response(request)
File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
217. response = self.process_exception_by_middleware(e, request)
File "/usr/lib/python2.7/site-packages/django/core/handlers/base.py" in _get_response
215. response = response.render()
File "/usr/lib/python2.7/site-packages/django/template/response.py" in render
107. self.content = self.rendered_content
File "/usr/lib/python2.7/site-packages/django/template/response.py" in rendered_content
84. content = template.render(context, self._request)
File "/usr/lib/python2.7/site-packages/django/template/backends/django.py" in render
66. return self.template.render(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render
207. return self._render(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in _render
199. return self.nodelist.render(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render
990. bit = node.render_annotated(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/usr/lib/python2.7/site-packages/django/template/loader_tags.py" in render
177. return compiled_parent._render(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in _render
199. return self.nodelist.render(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render
990. bit = node.render_annotated(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/usr/lib/python2.7/site-packages/django/template/loader_tags.py" in render
177. return compiled_parent._render(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in _render
199. return self.nodelist.render(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render
990. bit = node.render_annotated(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/usr/lib/python2.7/site-packages/django/template/loader_tags.py" in render
72. result = block.nodelist.render(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render
990. bit = node.render_annotated(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/usr/lib/python2.7/site-packages/django/template/loader_tags.py" in render
72. result = block.nodelist.render(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render
990. bit = node.render_annotated(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/usr/lib/python2.7/site-packages/django/template/defaulttags.py" in render
216. nodelist.append(node.render_annotated(context))
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/usr/lib/python2.7/site-packages/django/template/loader_tags.py" in render
216. return template.render(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render
209. return self._render(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in _render
199. return self.nodelist.render(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render
990. bit = node.render_annotated(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/usr/lib/python2.7/site-packages/django/template/defaulttags.py" in render
216. nodelist.append(node.render_annotated(context))
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/usr/lib/python2.7/site-packages/django/template/defaulttags.py" in render
216. nodelist.append(node.render_annotated(context))
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/usr/lib/python2.7/site-packages/django/template/defaulttags.py" in render
322. return nodelist.render(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render
990. bit = node.render_annotated(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/usr/lib/python2.7/site-packages/django/template/defaulttags.py" in render
322. return nodelist.render(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render
990. bit = node.render_annotated(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render_annotated
957. return self.render(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in render
1040. output = self.filter_expression.resolve(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in resolve
708. obj = self.var.resolve(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in resolve
849. value = self._resolve_lookup(context)
File "/usr/lib/python2.7/site-packages/django/template/base.py" in _resolve_lookup
911. current = current()
File "/usr/lib/python2.7/site-packages/django/contrib/admin/helpers.py" in contents
209. f, attr, value = lookup_field(field, obj, model_admin)
File "/usr/lib/python2.7/site-packages/django/contrib/admin/utils.py" in lookup_field
295. value = attr(obj)
File "/srv/waves-core-1.6.5.1/waves/wcore/admin/jobs.py" in get_run_details
143. ['\n{}: {}'.format(det[0], det[1]) for det in vars(obj.run_details).items()]) + "</pre>")
Exception Type: TypeError at /admin/wcore/job/173/change/
Exception Value: vars() argument must have __dict__ attribute
A second examination of this problem today reveals it has disappeared entirely, all job detail pages now being accessible.
The only changes to the server:
- Complete restart of web server after modifying the code of /waves/wcore/views/files.py ( as per Issue #29 second comment).
Not entirely sure if the restart or the code change fixed it, although I'm pretty sure we already attempted to restart the entire server once before without it affecting the bug.
Feel free to submit another issue if the problem reappears.