#33426: ResolverMatch repr is incorrect for Class Based Views
----------------------------------------+------------------------
               Reporter:  Keryn Knight  |          Owner:  nobody
                   Type:  Bug           |         Status:  new
              Component:  Core (URLs)   |        Version:  4.0
               Severity:  Normal        |       Keywords:
           Triage Stage:  Unreviewed    |      Has patch:  0
    Needs documentation:  0             |    Needs tests:  0
Patch needs improvement:  0             |  Easy pickings:  0
                  UI/UX:  0             |
----------------------------------------+------------------------
 The following test applies cleanly to 3.2.9, and AFAIK would apply roughly
 correctly all the way back to when CBVs were introduced (I can't easily
 test without going back to a super old Python and finding the test cases,
 which have moved around):
 {{{
 """
 add to class: tests.urlpatterns_reverse.tests.ResolverMatchTests
 """
 @override_settings(ROOT_URLCONF='urlpatterns_reverse.reverse_lazy_urls')
     def test_classbased_repr(self):
         self.assertEqual(
             repr(resolve('/redirect/')),
 "ResolverMatch(func=urlpatterns_reverse.views.LazyRedirectView, "
             "args=(), kwargs={}, url_name=None, app_names=[], "
             "namespaces=[], route=redirect/)",
         )
 }}}

 The `_func_path` as AFAIK always been a representation to the fully
 qualified dotted callable where possible, that is for a CBV it's the CBV
 module + the class name.

 As of 4.0, the `_func_path` has become `urlpatterns_reverse.views.view`, I
 believe because of #32260 removing the use of `update_wrapper` and
 intentionally not setting the `__name__` and `__qualname__` in favour
 using the `view_class` attribute, as per the comment ''view_class should
 be used to robustly determine the name of the view'' (see
 [https://github.com/django/django/pull/14124 Pull Request])

 Unfortunately I think that means the detection of class based views in
 `ResolverMatch` no longer works correctly, and this can probably only be
 resolved by making `ResolverMatch` CBV aware again by embedding detection
 of `view_class` therein.

 Noted it as a question in [https://github.com/django/django/pull/15286
 this PR] for ticket #33396, but hoisting it here properly to be considered
 separately.

 The fix appears to ostensibly the same as for #33425 (see
 [https://github.com/django/django/pull/15292 PR])
 {{{
 class ResolverMatch:
     def __init__(...):
         # ...
         if hasattr(func, 'view_class'):
             func = func.view_class
         if not hasattr(func, '__name__'):
         # ...
 }}}

 I have a branch which I shall push shortly to confirm it works generally.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/33426>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/052.3cda7b24c814030959c921daf741394b%40djangoproject.com.

Reply via email to