3956: review requests with file attachments get 500 errors after upgrade to 2.0.19

christop*********@delph****** (Google Code) (Is this you? Claim this profile.)
Sept. 3, 2015
3954
What version are you running?

2.0.19 recently upgraded from 2.0.16

What's the URL of the page containing the problem?

http://<internal-site>/r/12359/

What steps will reproduce the problem?
1. Try to load the review request.

What is the expected output? What do you see instead?

Instead of loading the page displays a 500 error. The error log shows:

2015-09-03 02:03:51,984 - ERROR -  - Exception thrown for user chris at http://<internal-site>/r/12359/

<generator object serialize_comments at 0x9fe202c> is not JSON serializable
Traceback (most recent call last):
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/core/handlers/base.py", line 112, in get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/ReviewBoard-2.0.19-py2.7.egg/reviewboard/accounts/decorators.py", line 23, in _check
    return view_func(*args, **kwargs)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/ReviewBoard-2.0.19-py2.7.egg/reviewboard/site/decorators.py", line 35, in _check
    return view_func(request, local_site=local_site, *args, **kwargs)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/ReviewBoard-2.0.19-py2.7.egg/reviewboard/reviews/views.py", line 721, in review_detail
    RequestContext(request, context_data))
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/shortcuts/__init__.py", line 29, in render_to_response
    return HttpResponse(loader.render_to_string(*args, **kwargs), **httpresponse_kwargs)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/loader.py", line 164, in render_to_string
    return t.render(Context(dictionary))
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/base.py", line 140, in render
    return self._render(context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/base.py", line 134, in _render
    return self.nodelist.render(context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/base.py", line 840, in render
    bit = self.render_node(node, context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/base.py", line 854, in render_node
    return node.render(context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/loader_tags.py", line 123, in render
    return compiled_parent._render(context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/base.py", line 134, in _render
    return self.nodelist.render(context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/base.py", line 840, in render
    bit = self.render_node(node, context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/base.py", line 854, in render_node
    return node.render(context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/loader_tags.py", line 123, in render
    return compiled_parent._render(context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/base.py", line 134, in _render
    return self.nodelist.render(context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/base.py", line 840, in render
    bit = self.render_node(node, context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/base.py", line 854, in render_node
    return node.render(context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/base.py", line 840, in render
    bit = self.render_node(node, context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/base.py", line 854, in render_node
    return node.render(context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/loader_tags.py", line 155, in render
    return self.render_template(self.template, context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/loader_tags.py", line 137, in render_template
    output = template.render(context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/base.py", line 140, in render
    return self._render(context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/base.py", line 134, in _render
    return self.nodelist.render(context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/base.py", line 840, in render
    bit = self.render_node(node, context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/base.py", line 854, in render_node
    return node.render(context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/defaulttags.py", line 305, in render
    return nodelist.render(context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/base.py", line 840, in render
    bit = self.render_node(node, context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/base.py", line 854, in render_node
    return node.render(context)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Django-1.6.11-py2.7.egg/django/template/defaulttags.py", line 203, in render
    nodelist.append(node.render(context))
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/Djblets-0.8.20-py2.7.egg/djblets/util/decorators.py", line 122, in render
    return self.tag_func(context, *args)
  File "/home/delphix/reviewboard/rb-1.7.22/lib/python2.7/site-packages/ReviewBoard-2.0.19-py2.7.egg/reviewboard/reviews/templatetags/reviewtags.py", line 92, in file_attachment_comments
    file_attachment.get_comments()))
  File "/home/delphix/reviewboard/python2.7/lib/python2.7/json/__init__.py", line 243, in dumps
    return _default_encoder.encode(obj)
  File "/home/delphix/reviewboard/python2.7/lib/python2.7/json/encoder.py", line 207, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/home/delphix/reviewboard/python2.7/lib/python2.7/json/encoder.py", line 270, in iterencode
    return _iterencode(o, 0)
  File "/home/delphix/reviewboard/python2.7/lib/python2.7/json/encoder.py", line 184, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <generator object serialize_comments at 0x9fe202c> is not JSON serializable

The error started after upgrading to 2.0.19, immediately prior to the upgrade that page was accessible. Other pages with file attachments also had that problem. We where able to work around the problem by modifying line 92 of reviewtags.py where the error occured to put the serialize_comments() generator into a list:

    return json.dumps(list(review_ui.serialize_comments(
        file_attachment.get_comments())))

I was able to confirm with the following log statement just before line 92:

    logging.critical("XXX " + type(review_ui).__name__)
    return json.dumps(list(review_ui.serialize_comments(
        file_attachment.get_comments())))

That the review_ui object's type is FileAttachmentReviewUI:

2015-09-03 02:03:51,984 - CRITICAL -  - XXX FileAttachmentReviewUI
2015-09-03 02:03:51,984 - ERROR -  - Exception thrown for user chris at http://<internal-url>/r/12359/

<generator object serialize_comments at 0x9fe202c> is not JSON serializable
Traceback (most recent call last):

What operating system are you using? What browser?

Chrome on Linux. Linux server.

Please provide any additional information below.
#1 christop*********@delph****** (Google Code) (Is this you? Claim this profile.)
I forgot to mention that I am unable to reproduce the issue after the upgrade (i.e. creating a new review request after the upgrade with a file attachment does not have the same problem).
chipx86
#2 chipx86
We're planning to release 2.0.20 this weekend, which will fix this.
chipx86
#3 chipx86