nadineproject / nadine

Open Coworking Software
http://nadineproject.org
GNU Affero General Public License v3.0
163 stars 78 forks source link

State field does not appear to be populated by default and results in error when editing profile #464

Closed proffalken closed 2 years ago

proffalken commented 2 years ago

Running the latest version of Nadine using Python 3.9 and Django 4.0 inside a custom container with a modified version of Django-JSignature to get up and running.

When editing a user profile, Django crashes with an error that profile_form.state is a NoneType:

[04/Jan/2022 07:28:38] ERROR [django.request:225] Internal Server Error: /member/profile/member@example.com/edit/
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/usr/local/lib/python3.9/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/local/lib/python3.9/site-packages/django/contrib/auth/decorators.py", line 21, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "/webapp/nadine/member/views/profile.py", line 244, in edit_profile
    return render(request, 'member/profile/profile_edit.html', context)
  File "/usr/local/lib/python3.9/site-packages/django/shortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/usr/local/lib/python3.9/site-packages/django/template/loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "/usr/local/lib/python3.9/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 176, in render
    return self._render(context)
  File "/usr/local/lib/python3.9/site-packages/django/test/utils.py", line 101, in instrumented_test_render
    return self.nodelist.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 977, in render
    return SafeString(''.join([
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 978, in <listcomp>
    node.render_annotated(context) for node in self
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 938, in render_annotated
    return self.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/loader_tags.py", line 153, in render
    return compiled_parent._render(context)
  File "/usr/local/lib/python3.9/site-packages/django/test/utils.py", line 101, in instrumented_test_render
    return self.nodelist.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 977, in render
    return SafeString(''.join([
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 978, in <listcomp>
    node.render_annotated(context) for node in self
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 938, in render_annotated
    return self.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/loader_tags.py", line 65, in render
    result = block.nodelist.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 977, in render
    return SafeString(''.join([
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 978, in <listcomp>
    node.render_annotated(context) for node in self
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 938, in render_annotated
    return self.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/loader_tags.py", line 65, in render
    result = block.nodelist.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 977, in render
    return SafeString(''.join([
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 978, in <listcomp>
    node.render_annotated(context) for node in self
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 938, in render_annotated
    return self.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/loader_tags.py", line 65, in render
    result = block.nodelist.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 977, in render
    return SafeString(''.join([
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 978, in <listcomp>
    node.render_annotated(context) for node in self
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 938, in render_annotated
    return self.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 1044, in render
    return render_value_in_context(output, context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 1021, in render_value_in_context
    value = str(value)
  File "/usr/local/lib/python3.9/site-packages/django/utils/html.py", line 377, in <lambda>
    klass.__str__ = lambda self: mark_safe(klass_str(self))
  File "/usr/local/lib/python3.9/site-packages/django/forms/boundfield.py", line 33, in __str__
    return self.as_widget()
  File "/usr/local/lib/python3.9/site-packages/django/forms/boundfield.py", line 89, in as_widget
    attrs = self.build_widget_attrs(attrs, widget)
  File "/usr/local/lib/python3.9/site-packages/django/forms/boundfield.py", line 236, in build_widget_attrs
    if widget.use_required_attribute(self.initial) and self.field.required and self.form.use_required_attribute:
  File "/usr/local/lib/python3.9/site-packages/django/forms/widgets.py", line 702, in use_required_attribute
    first_choice = next(iter(self.choices), None)
  File "/usr/local/lib/python3.9/site-packages/django/forms/fields.py", line 772, in __iter__
    yield from self.choices_func()
TypeError: 'NoneType' object is not iterable
[04/Jan/2022 07:28:38] ERROR [django.server:179] "GET /member/profile/member@example.com/edit/ HTTP/1.1" 500 304430

The error is the same even if a pseudo-value for the state is added to the database.

Given that we don't have a concept of "states" here in the UK (we have counties instead which are more like States than the US version of a county AFAICT), it might be good to look at the logic around this and make this field entirely optional? That would also fix parts of #407 and #449 to make the personal information internationalised as well as the languages?

jsayles commented 2 years ago

Yeah ideally the full address is internationalized. Minimally this shouldn't error like this. This is a factor of when I recently removed some dependencies.

jsayles commented 2 years ago

This was due to your country settings. Keep in mind it is still a 2 char field but at least now it allows you to set something. We really need to work on international addresses.