django-simple-menu icon indicating copy to clipboard operation
django-simple-menu copied to clipboard

Manage request-based menu generation

Open frague59 opened this issue 1 year ago • 0 comments

Hi,

I'ld like to bind a sub-menu part to the authenticated user (children).

I use a function to build this sub menu, and use the check trick to show / hide menu items according to the connected user.

def get_subscription_menu_items() -> list[MenuItem]:
    """
    Get the domain subscription menu items.

    :return: A list of MenuItem objects representing subscription items.
    :rtype: list[MenuItem]
    """
    output: list[MenuItem] = []
    for idx, subscription in enumerate(models.DomainSubscription.objects.all(), 2):
        domains = [("domain", domain.pk) for domain in subscription.domains.all()]
        categories = [("category", category.pk) for category in subscription.categories.all()]

        # Combine into a single list

        all_parameters = domains + categories + [("title", subscription.title)]

        # Generate the query string
        query_string = urlencode(all_parameters)
        _url = reverse("publications:notice_list")

        if query_string:
            _url += f"?{query_string}"

        output.append(
            MenuItem(
                title=subscription.title,
                url=_url,
                icon="list",
                weight=idx * 10,
                check=lambda request: request.user == subscription.user,  # noqa: B023
            )
        )
    return output

Menu.add_item(
    "main",
    MenuItem(
        title=_("Publications"),
        url=reverse("publications:manage_subscriptions"),
        icon="book",
        weight=10,
        children=[
            MenuItem(
                title=_("Subscriptions"),
                url=reverse("publications:manage_subscriptions"),
                icon="book",
                weight=10,
                separator=True,
            ),
        ]
        + get_subscription_menu_items(),
    ),
)

The problem with this approach is that I've to query all Foo instances, and filter "on display".

It could be simpler and nicer I could use directly the request object as parameter on a method / function that generates the menus.

Thanks for you great app !

frague59 avatar Dec 14 '23 13:12 frague59