def test_nesting_levels():
    urls = list(
        url("home")[
            url("p1", view, "report1"),
            url("p2", view, "report2"),
            url("level1", view, "sub1")[
                url("p1", view, "level1"),
                url("p2", view, "level2"),
                url("level2", view, "sub2")[url("p1", view, "lp1"), url("p2", view, "lp2")],
            ],
            url("p3", view, "report3"),
        ]
    )

    assert str_iter(urls) == [
        "<URLPattern 'home/p1/' [name='report1']>",
        "<URLPattern 'home/p2/' [name='report2']>",
        "<URLPattern 'home/level1/' [name='sub1']>",
        "<URLPattern 'home/level1/p1/' [name='level1']>",
        "<URLPattern 'home/level1/p2/' [name='level2']>",
        "<URLPattern 'home/level1/level2/' [name='sub2']>",
        "<URLPattern 'home/level1/level2/p1/' [name='lp1']>",
        "<URLPattern 'home/level1/level2/p2/' [name='lp2']>",
        "<URLPattern 'home/p3/' [name='report3']>",
    ]
    assert len(urls) == 9
Example #2
0
    def urls(cls, name_prefix: str, **initkwargs) -> url:
        """
            since this class works like a ViewSet, it is a good idea to create a urls method which would add routes for
            create/update of a model object. This add two routes for the given namespace.
        Returns:
            list: url patterns
        Usage:
            # in urls.py
            urls = url("author")[
                CreateUpdateAuthorView.urls(name_prefix='author'), # helper to use with url objects
            ],
            urlpatterns = list(urls)

            # it is equivalent to
            urlpatterns = [
                path("author/add", CreateUpdateAuthorView.as_view(), name="author-add"),
                path("author/<int:pk>/edit", CreateUpdateAuthorView.as_view(), name="author-edit"),
            ]

        See Also
            `tests/test_app/urls.py`
        """
        return (
                url('add', view=cls.as_view(**initkwargs), name=f'{name_prefix}-add') +
                url.pk()[
                    url('edit', view=cls.as_view(**initkwargs), name=f'{name_prefix}-edit', dtype=cls.pk_type)
                ]
        )
def test_same_level_urls():
    g = url("home", view)[
            url.pk(view)
        ] + url("about", view)[
            url.pk(view)[
                url("pdf", view)
            ]
        ] + url("contact", view)[
            url.pk(view)
        ]
    assert str_iter(g) == ["<URLPattern 'home/'>",
                           "<URLPattern 'home/<int:pk>/'>",
                           "<URLPattern 'about/'>",
                           "<URLPattern 'about/<int:pk>/'>",
                           "<URLPattern 'about/<int:pk>/pdf/'>",
                           "<URLPattern 'contact/'>",
                           "<URLPattern 'contact/<int:pk>/'>"]
def test_variable_regex():
    g = url("home")[
        url.pk(view, "pk"),
        url.int("int_var", view, "int"),
        url.var("str_var", view, "str"),
        url.re("reg_x", r"[x]+", view, "regex"),
    ]
    assert str_iter(g) == [
        "<URLPattern 'home/<int:pk>/' [name='pk']>",
        "<URLPattern 'home/<int:int_var>/' [name='int']>",
        "<URLPattern 'home/<str_var>/' [name='str']>",
        "<URLPattern 'home/(?P<reg_x>[x]+)/' [name='regex']>",
    ]
def test_include_patterns():
    # app1 urls
    app2 = url("app2/")[url("post")[url.pk(view)[url("edit", view)]]]
    # app1 urls
    app1 = url("app1/")[url("post")[url.pk(view)[url("edit", view)]]]
    # root url definition
    app = url("app/")[app1, app2]
    assert str_iter(app) == [
        "<URLPattern 'app/app1/post/<int:pk>/'>",
        "<URLPattern 'app/app1/post/<int:pk>/edit/'>",
        "<URLPattern 'app/app2/post/<int:pk>/'>",
        "<URLPattern 'app/app2/post/<int:pk>/edit/'>",
    ]
def test_paths_that_starts_with_a_blank_root():
    g = url("", view)[
        url("home")[url.pk()[url("edit", view)], url.int("integer")[url("edit", view)]],
        url("home2")[url.pk(view, "pk")],
        url("home3", view),
    ]
    assert str_iter(g) == [
        "<URLPattern ''>",
        "<URLPattern 'home/<int:pk>/edit/'>",
        "<URLPattern 'home/<int:integer>/edit/'>",
        "<URLPattern 'home2/<int:pk>/' [name='pk']>",
        "<URLPattern 'home3/'>"
    ]
def test_paths_without_views():
    g = url("home")[
        url.pk()[url("edit", view)],
        url.int("integer")[url("edit", view)],
        url.var("variable")[url("edit", view)],
        url.re("regex", r"\.+")[url("edit", view)],
        url("home2")[url.pk(view, "pk")],
        url("home3", view),
    ]

    assert str_iter(g) == [
        "<URLPattern 'home/<int:pk>/edit/'>",
        "<URLPattern 'home/<int:integer>/edit/'>",
        "<URLPattern 'home/<variable>/edit/'>",
        "<URLPattern 'home/(?P<regex>\\.+)/edit/'>",
        "<URLPattern 'home/home2/<int:pk>/' [name='pk']>",
        "<URLPattern 'home/home3/'>",
    ]
def test_multi_part_single_entry():
    g = url("nest1/nest2", view)[
        url("home/coming")[
            url.pk()[
                url("edit", view)
            ],
            url.int("integer")[
                url("edit", view),
            ],
        ],
        url("first/nest3")[
            url.pk(view, "pk")
        ],
        url("home3", view),
    ]

    assert str_iter(g) == [
        "<URLPattern 'nest1/nest2/'>",
        "<URLPattern 'nest1/nest2/home/coming/<int:pk>/edit/'>",
        "<URLPattern 'nest1/nest2/home/coming/<int:integer>/edit/'>",
        "<URLPattern 'nest1/nest2/first/nest3/<int:pk>/' [name='pk']>",
        "<URLPattern 'nest1/nest2/home3/'>"
    ]
Example #9
0
from utils_plus.router import url
from utils_plus.views import return_path_view
from .views import CreateUpdateAuthorView

urlpatterns = list(
    url('blog')[url.slug(view=return_path_view, name='blog-slug'),
                url("author")[CreateUpdateAuthorView.urls(
                    name_prefix='author')], ])