urls.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from django.urls import path
  2. from django.utils.module_loading import import_string
  3. from django.views.generic import View
  4. from netbox.registry import registry
  5. __all__ = (
  6. 'get_model_urls',
  7. )
  8. def get_model_urls(app_label, model_name, detail=True):
  9. """
  10. Return a list of URL paths for detail views registered to the given model.
  11. Args:
  12. app_label: App/plugin name
  13. model_name: Model name
  14. detail: If True (default), return only URL views for an individual object.
  15. Otherwise, return only list views.
  16. """
  17. paths = []
  18. # Retrieve registered views for this model
  19. try:
  20. views = [
  21. view for view in registry['views'][app_label][model_name]
  22. if view['detail'] == detail
  23. ]
  24. except KeyError:
  25. # No views have been registered for this model
  26. return []
  27. for config in views:
  28. # Import the view class or function
  29. if type(config['view']) is str:
  30. view_ = import_string(config['view'])
  31. else:
  32. view_ = config['view']
  33. if issubclass(view_, View):
  34. view_ = view_.as_view()
  35. # Create a path to the view
  36. name = f"{model_name}_{config['name']}" if config['name'] else model_name
  37. url_path = f"{config['path']}/" if config['path'] else ''
  38. paths.append(
  39. path(url_path, view_, name=name, kwargs=config['kwargs'])
  40. )
  41. return paths