iiuni / projektzapisy

System Zapisów na zajęcia w Instytucie Informatyki Uniwersytetu Wrocławskiego
https://zapisy.ii.uni.wroc.pl
31 stars 10 forks source link

NoReverseMatch: Reverse for 'proposal-edit' with arguments '('',)' not found. 1 pattern(s) tried: ['offer/(?P<slug>[-a-zA-Z0-9_]+)/edit$'] #1142

Open rollbar[bot] opened 2 years ago

rollbar[bot] commented 2 years ago

View details in Rollbar: https://rollbar.com/iiuni/projektzapisy/items/422/


Traceback (most recent call last):
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/newrelic/hooks/framework_django.py", line 554, in wrapper
    return wrapped(*args, **kwargs)
  File "/home/zapisy/deploy/releases/20211026180651/zapisy/apps/enrollment/courses/views.py", line 110, in course_view
    return render(request, 'courses/courses.html', data)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/shortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 170, in render
    return self._render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/newrelic/api/function_trace.py", line 143, in dynamic_wrapper
    return wrapped(*args, **kwargs)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/newrelic/api/function_trace.py", line 143, in dynamic_wrapper
    return wrapped(*args, **kwargs)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/newrelic/api/function_trace.py", line 143, in dynamic_wrapper
    return wrapped(*args, **kwargs)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/newrelic/api/function_trace.py", line 143, in dynamic_wrapper
    return wrapped(*args, **kwargs)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/newrelic/hooks/framework_django.py", line 778, in wrapper
    return wrapped(*args, **kwargs)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/newrelic/hooks/framework_django.py", line 778, in wrapper
    return wrapped(*args, **kwargs)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/defaulttags.py", line 312, in render
    return nodelist.render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib/python3.8/site-packages/django/template/loader_tags.py", line 192, in render
    return template.render(context)
  File "/home/zapisy/deploy/releases/20211026180651/venv/lib
TWolczanski commented 1 year ago

Wszystko wskazuje na to, że źródłem błędu jest linijka 12 z template'u course_head.html:

<a class="btn btn-sm btn-outline-info float-right align-bottom" href="{% url 'proposal-edit' course.offer.slug %}">Edytuj</a>

Robimy tutaj reverse z argumentem course.offer.slug, ale pole offer modelu CourseInstance może być nullem. W moim obrazie bazy danych ostatnie przedmioty nieprzypisane do żadnej oferty pochodzą z semestru 2016/17, ale najwidoczniej w semestrze zimowym 2021/22 przez chwilę w systemie zapisów znajdował się co najmniej jeden taki przedmiot. Błąd można zreprodukować wybierając pierwszą wartość z dropdown'u w polu Oferta na stronie instancji przedmiotu w admin panelu:

Screenshot from 2023-04-28 19:05:47

i wchodząc na stronę przedmiotu. Otrzymany traceback pokrywa się z tym z opisu issue (a przynajmniej do momentu, w którym ten drugi się urywa):


Traceback (most recent call last):
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/vagrant/zapisy/apps/enrollment/courses/views.py", line 117, in course_view
    return render(request, 'courses/courses.html', data)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/shortcuts.py", line 19, in render
    content = loader.render_to_string(template_name, context, request, using=using)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/loader.py", line 62, in render_to_string
    return template.render(context, request)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 170, in render
    return self._render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/defaulttags.py", line 312, in render
    return nodelist.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/loader_tags.py", line 192, in render
    return template.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 172, in render
    return self._render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/loader_tags.py", line 192, in render
    return template.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 172, in render
    return self._render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/defaulttags.py", line 312, in render
    return nodelist.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/defaulttags.py", line 312, in render
    return nodelist.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/template/defaulttags.py", line 446, in render
    url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/urls/base.py", line 87, in reverse
    return iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs))
  File "/home/vagrant/env3/lib/python3.8/site-packages/django/urls/resolvers.py", line 689, in _reverse_with_prefix
    raise NoReverseMatch(msg)

Exception Type: NoReverseMatch at /courses/sieci-komputerowe-202223-letni
Exception Value: Reverse for 'proposal-edit' with arguments '('',)' not found. 1 pattern(s) tried: ['offer/(?P<slug>[-a-zA-Z0-9_]+)/edit\\Z']
lgpawel commented 1 year ago

W wąskim sensie naprawimy to więc po cichu nie generując odpowiedniego przycisku, jeśli odniesienia do pozycji oferty nie ma – zapewne wystarczy wprowadzenie instrukcji warunkowej na poziomie template'a. Do ustalenia jest, czy nie możnaby wprowadzić tego więzu w bazie, ale tu najpierw trzebaby dowiedzieć się (a raczej pospekulować), jaki scenariusz mógł doprowadzić bazę do takiego stanu, że nie był on spełniony.