gpt4 book ai didi

wagtail - 如何在 Wagtail 中检索属于具有收藏权限的组的用户图像?

转载 作者:行者123 更新时间:2023-12-05 06:59:53 27 4
gpt4 key购买 nike

我有一个使用多站点模式的 wagtail 安装,每个站点有一组用户,每个组都是自己的集合。

当用户登录管理界面时,他们会在摘要部分看到所有集合中的图像计数。

enter image description here

但是当他们点击图像菜单时,他们只能看到他们组收藏中的图像。我发现他们可以知道所有收藏品的总数,这让我很困惑。我想从用户有权访问的集合中获取计数。

我发现我可以覆盖 ImagesSummaryItem 并且我最终编写了以下代码片段:

class CorrectedImagesSummaryItem(SummaryItem):
order = 200
template = 'wagtailimages/homepage/site_summary_images.html'

def get_context(self):
site_name = get_site_for_user(self.request.user)['site_name']

permissions = Permission.objects.filter(
content_type=ContentType.objects.get_for_model(get_image_model()),
codename__in=['change_image', 'add_image'])

collections = Collection.objects.filter(
group_permissions__group__in=self.request.user.groups.all(),
group_permissions__permission__in=permissions
).distinct()

if collections:
image_count = get_image_model().objects.filter(collection__in=collections).count()
else:
image_count = 0

return {
'total_images': image_count,
'site_name': site_name,
}

def is_shown(self):
return permission_policy.user_has_any_permission(
self.request.user, ['change', 'add']
)


@hooks.register('construct_homepage_summary_items')
def add_corrected_images_summary_panel(request, items):
"""Replaces the Images summary panel to hide variants."""
for index, item in enumerate(items):
if item.__class__ is ImagesSummaryItem:
items[index] = CorrectedImagesSummaryItem(request)

这实际上工作正常,我现在在摘要部分显示正确的图像计数,但我想知道是否有更好的方法来查询用户的集合?这些查询集正确吗?

permissions = Permission.objects.filter(
content_type=ContentType.objects.get_for_model(get_image_model()),
codename__in=['change_image', 'add_image'])

collections = Collection.objects.filter(
group_permissions__group__in=self.request.user.groups.all(),
group_permissions__permission__in=permissions
).distinct()

更新

我最终自定义了图像选择的查询集,以便仅显示用户有权访问的集合中的图像。

除了第一个函数之外,我还在我的 wagtail_hooks.py 文件中添加了以下代码。

@hooks.register('construct_image_chooser_queryset')
def show_collection_images_only(images, request):
# Show only the images from the collection the User has access.
collections = get_collections_from_group_permissions(request.user, ['change_image', 'add_image'])

images = images.filter(collection__in=collections)

return images

get_collections_from_group_permissions 只是一个简化的函数,它返回用户拥有的 Groups 权限中的 Collection

def get_collections_from_group_permissions(user, permissions):
"""
This function gets the Collections from the user groups permissions.

:param user: the user
:param permissions: the requested permissions on a Collection object

:returns: the Collections the selected User has access rights for.
"""
permissions = Permission.objects.filter(
content_type=ContentType.objects.get_for_model(get_image_model()),
codename__in=permissions)

collections = Collection.objects.filter(
group_permissions__group__in=user.groups.all(),
group_permissions__permission__in=permissions
).distinct()

return collections

有了这个,图像的摘要项就是用户可以访问的集合中的图像数量,当他点击 ImageChooserField 并进入图像选择器时,他只会得到查看他被授予访问权限的集合中的内容。

最佳答案

这个逻辑是 already implemented in Wagtail's permission_policy class ,所以这可以简化为:

image_count = permission_policy.instances_user_has_any_permission_for(
self.request.user, ['change', 'add']
).count()

(顺便说一句,Wagtail 本身在显示此图时不考虑权限的原因是所有用户都可以通过选择器弹出窗口看到完整的图像集 - 目前没有“选择”权限 - 所以显示数量减少会产生误导。请参阅 https://github.com/wagtail/wagtail/issues/5129 上的讨论)

关于wagtail - 如何在 Wagtail 中检索属于具有收藏权限的组的用户图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64284237/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com