def item(title, url, children=None, url_as_pattern=True, hint='', alias='', description='',
         in_menu=True, in_breadcrumbs=True, in_sitetree=True,
         access_loggedin=False, access_guest=False,
         access_by_perms=None, perms_mode_all=True, **kwargs):
    """Dynamically creates and returns a sitetree item object.

    :param str title:
    :param str url:
    :param list, set children: a list of children for tree item. Children should also be created by `item` function.
    :param bool url_as_pattern: consider URL as a name of a named URL
    :param str hint: hints are usually shown to users
    :param str alias: item name to address it from templates
    :param str description: additional information on item (usually is not shown to users)
    :param bool in_menu: show this item in menus
    :param bool in_breadcrumbs: show this item in breadcrumbs
    :param bool in_sitetree: show this item in sitetrees
    :param bool access_loggedin: show item to logged in users only
    :param bool access_guest: show item to guest users only
    :param list, str, int, Permission access_by_perms: restrict access to users with these permissions
    :param bool perms_mode_all: permissions set interpretation rule:
                True - user should have all the permissions;
                False - user should have any of chosen permissions.
    :return:
    """
    item_obj = get_tree_item_model()(title=title, url=url, urlaspattern=url_as_pattern,
                                   hint=hint, alias=alias, description=description, inmenu=in_menu,
                                   insitetree=in_sitetree, inbreadcrumbs=in_breadcrumbs,
                                   access_loggedin=access_loggedin, access_guest=access_guest, **kwargs)

    item_obj.id = generate_id_for(item_obj)
    item_obj.is_dynamic = True
    item_obj.dynamic_children = []

    cleaned_permissions = []
    if access_by_perms:
        # Make permissions a list if currently a single object
        if not isinstance(access_by_perms, list):
            access_by_perms = [access_by_perms]

        for perm in access_by_perms:
            if isinstance(perm, six.string_types):
                # Get permission object from string
                try:
                    app, codename = perm.split('.')
                except __HOLE__:
                    raise ValueError(
                        'Wrong permission string format: supplied - `%s`; '
                        'expected - `<app_name>.<permission_name>`.' % perm)

                try:
                    perm = Permission.objects.get(codename=codename, content_type__app_label=app)
                except Permission.DoesNotExist:
                    raise ValueError('Permission `%s.%s` does not exist.' % (app, codename))

            elif not isinstance(perm, (int, Permission)):
                raise ValueError('Permissions must be given as strings, ints, or `Permission` instances.')

            cleaned_permissions.append(perm)

    item_obj.permissions = cleaned_permissions or []
    item_obj.access_perm_type = item_obj.PERM_TYPE_ALL if perms_mode_all else item_obj.PERM_TYPE_ANY

    if item_obj.permissions:
        item_obj.access_restricted = True

    if children is not None:
        for child in children:
            child.parent = item_obj
            item_obj.dynamic_children.append(child)

    return item_obj
dataset/ETHPy150Open idlesign/django-sitetree/sitetree/utils.py/item