Skip to content

'AsyncOperation' object has no attribute 'is_coroutine' with django-ninja 1.6.0 #352

Description

@ResleyR

As part of this commit released in django-ninja 1.6.0 the router operations use a clone of the original operations. This means custom attributes added to the overridden Operation class do not get copied into the cloned instance, as the base clone() avoids calling init to avoid expensive processing.

This leads to thr following error:

  File "/code/manage.py", line 23, in <module>
    main()
    ~~~~^^
  File "/code/manage.py", line 19, in main
    execute_from_command_line(sys.argv)
    ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
    utility.execute()
    ~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.14/site-packages/django/core/management/__init__.py", line 437, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/django/core/management/commands/test.py", line 24, in run_from_argv
    super().run_from_argv(argv)
    ~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "/usr/local/lib/python3.14/site-packages/django/core/management/base.py", line 420, in run_from_argv
    self.execute(*args, **cmd_options)
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/django/core/management/base.py", line 464, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python3.14/site-packages/django/core/management/commands/test.py", line 63, in handle
    failures = test_runner.run_tests(test_labels)
  File "/usr/local/lib/python3.14/site-packages/django/test/runner.py", line 1133, in run_tests
    self.run_checks(databases)
    ~~~~~~~~~~~~~~~^^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/django/test/runner.py", line 1055, in run_checks
    call_command("check", verbosity=self.verbosity, databases=databases)
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/django/core/management/__init__.py", line 195, in call_command
    return command.execute(*args, **defaults)
           ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/django/core/management/base.py", line 464, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python3.14/site-packages/django/core/management/commands/check.py", line 81, in handle
    self.check(
    ~~~~~~~~~~^
        app_configs=app_configs,
        ^^^^^^^^^^^^^^^^^^^^^^^^
    ...<4 lines>...
        databases=options["databases"],
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/usr/local/lib/python3.14/site-packages/django/core/management/base.py", line 496, in check
    all_issues = checks.run_checks(
        app_configs=app_configs,
    ...<2 lines>...
        databases=databases,
    )
  File "/usr/local/lib/python3.14/site-packages/django/core/checks/registry.py", line 89, in run_checks
    new_errors = check(app_configs=app_configs, databases=databases)
  File "/usr/local/lib/python3.14/site-packages/django/core/checks/urls.py", line 16, in check_url_config
    return check_resolver(resolver)
  File "/usr/local/lib/python3.14/site-packages/django/core/checks/urls.py", line 26, in check_resolver
    return check_method()
  File "/usr/local/lib/python3.14/site-packages/django/urls/resolvers.py", line 541, in check
    for pattern in self.url_patterns:
                   ^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/django/utils/functional.py", line 47, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
                                         ~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/django/urls/resolvers.py", line 729, in url_patterns
    patterns = getattr(self.urlconf_module, "urlpatterns", self.urlconf_module)
                       ^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/django/utils/functional.py", line 47, in __get__
    res = instance.__dict__[self.name] = self.func(instance)
                                         ~~~~~~~~~^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/django/urls/resolvers.py", line 722, in urlconf_module
    return import_module(self.urlconf_name)
  File "/usr/local/lib/python3.14/importlib/__init__.py", line 88, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1398, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1371, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1342, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 938, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 759, in exec_module
  File "<frozen importlib._bootstrap>", line 491, in _call_with_frames_removed
  File "/code/cure_cabinet/urls.py", line 26, in <module>
    path("api/", api.urls),
                 ^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/ninja_extra/main.py", line 112, in urls
    _url_tuple = super().urls
                 ^^^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/ninja/main.py", line 462, in urls
    self._get_urls(),
    ~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.14/site-packages/ninja/main.py", line 533, in _get_urls
    for bound_router in self._get_bound_routers():
                        ~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.14/site-packages/ninja_extra/main.py", line 120, in _get_bound_routers
    bound_routers = super()._get_bound_routers()
  File "/usr/local/lib/python3.14/site-packages/ninja/main.py", line 518, in _get_bound_routers
    BoundRouter(mount, self) for mount in all_mounts
    ~~~~~~~~~~~^^^^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/ninja/router.py", line 114, in __init__
    self._bind_operations()
    ~~~~~~~~~~~~~~~~~~~~~^^
  File "/usr/local/lib/python3.14/site-packages/ninja/router.py", line 132, in _bind_operations
    operation._set_auth(self.auth)
    ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
  File "/usr/local/lib/python3.14/site-packages/ninja_extra/operation.py", line 84, in _set_auth
    if is_async(_call_back) and not self.is_coroutine:
                                    ^^^^^^^^^^^^^^^^^
AttributeError: 'AsyncOperation' object has no attribute 'is_coroutine'```

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions