Source code for caps.urls

from typing import Any

from django.urls import path

from . import models, views


[docs] def get_object_paths( obj_class: type[models.Owned], url_paccessix: str | None = None, kwargs: dict[str, Any] | None = None, basename: str = "", accesses: bool = False, access_kwargs: dict[str, Any] | None = None, ) -> list[path]: """ Return Django paths for the provided object class, including to edit access (:py:func:`get_access_path`). .. code-block:: python from caps.urls import get_object_paths from . import models urlpatterns = ( get_object_paths(models.Post, 'post') ) :param obj_class: the object model class; :param url_paccessix: url base path (default to model name); :param kwargs: ``as_view`` kwargs, by view kind (list, detail, etc.) :param basename: use this as url's basename (default to model name) :param accesses: if True, generate path for Owned's Access using default view (see :py:mod:`caps.views.common`) :param access_kwargs: ``kwargs`` argument passed down to :py:func:`get_access_class`. :return: a list of path """ if not basename: basename = obj_class._meta.model_name if url_paccessix is None: url_paccessix = basename kwargs = kwargs or {} return _get_paths( obj_class, basename, [ ("list", views.OwnedListView, url_paccessix), ("detail", views.OwnedDetailView, f"{url_paccessix}/<uuid:uuid>"), ("create", views.OwnedCreateView, f"{url_paccessix}/create"), ("update", views.OwnedUpdateView, f"{url_paccessix}/<uuid:uuid>/update"), ("delete", views.OwnedDeleteView, f"{url_paccessix}/<uuid:uuid>/delete"), ], kwargs, ) + get_access_paths(obj_class.Access, f"{url_paccessix}/access", kwargs=access_kwargs)
[docs] def get_access_paths( access_class: type[models.Access], url_paccessix: str = "access", kwargs: dict[str, Any] | None = None, basename: str = "", ) -> list[path]: """ Return Django paths for the provided access class. Created path for views: ``list``, ``detail``, ``delete``. The path will have names such as (for a model named ``contact``): ``contact-access-list``. :param access_class: Access class :param kwargs: ``as_view`` extra arguments by view type :param basename: use this a base name for url, instead of ``{object_model_name}-access``. :returns: list of path """ if not basename: obj_class = access_class.get_object_class() basename = f"{obj_class._meta.model_name}-access" return _get_paths( access_class, basename, [ ("list", views.AccessListView, url_paccessix), ("detail", views.AccessDetailView, f"{url_paccessix}/<uuid:uuid>"), ("delete", views.AccessDeleteView, f"{url_paccessix}/<uuid:uuid>/delete"), ], kwargs, )
def _get_paths(model: type, basename: str, infos: list[tuple[str, type, str]], kwargs: dict[str, Any] | None = None): kwargs = kwargs or {} return [ path(url, view.as_view(**{"model": model, **kwargs.get(kind, {})}), name=f"{basename}-{kind}") for kind, view, url in infos ]