2009-10-20 67 views
3

我有一个多语言的Django项目。每种语言都是不同的子域。 因此,我们决定使用“网站”应用程序并为每种语言创建一个不同的网站。权限只有一个站点

在该项目上,我也有一个“页面”应用程序,它与CMS非常相似。用户可以创建包含内容的页面,并将显示在相应的语言网站中。

现在我期望能够管理高级权限。我需要做的是允许用户在管理应用程序中为一个(或多个)特定语言/站点创建和更新页面。

干什么更干净的方法呢?

编辑:这是由Chris

给我打造了检查,如果用户是适当地可以访问郎集团在装饰我已经适应了解决方案。 有关这方面的例子,请参阅Chris的接受答案。

在一个“正常”的说法,我做到以下几点:

def view(self): 
    # Whatever you wanna do 
    return render_to_response('page.html', {}, RequestContext(request)) 
view = group_required(view) 

如果用户是该组中,它会返回的方法。否则,它会返回“拒绝访问”错误。

在我管理,我执行以下操作:

class PageAdmin(admin.ModelAdmin): 
    list_display = ('title', 'published')  
    fieldsets = [ 
     (None, {'fields': ['title', 'slug', 'whatever_field_you_have']}), 
    ] 

    def has_add_permission(self, request): 
     return in_group_required(request) 
admin.site.register(Page, PageAdmin) 

凡in_group_required是类似的方法来group_required以上mentionned。但是,根据我们是否有权访问,只会返回true或false。

因为我们在前面的例子中使用了它们,所以在上面我会发现我的in_group和group_required方法。

def group_required(func): 
    def _decorator(request, *args, **kwargs): 
     if not in_group(request): 
      return HttpResponse("Access denied") 
     return func(*args, **kwargs) 
    return _decorator 

def in_group(request): 
    language = Language.objects.get(site__domain__exact=request.get_host()) 
    for group in language.group.all(): 
     if request.user in group.user_set.all(): 
      return True 
    return False 

回答

3

您可以创建一个组(http://docs.djangoproject.com/en/dev/topics/auth/) 每个站点/语言和相应的用户添加到组。

然后,您可以检查request.user.groups是否属于该组。 (你可以用一个装饰做到这一点:

def group_required(func): 
    def _decorator(request, *args, **kwargs): 
     hostname = request.META.get('HTTP_HOST') 
     lang = hostname.split(".")[0] 
     if not lang in request.user.groups: 
      return HttpResponse("Access denied") 
     return func(*args, **kwargs) 
    return _decorator 

(更正/修改代码以满足您的要求...)

+0

有趣的想法。在“正常”的视图中很容易实现。但我需要在管理应用程序中过滤权限。我怎样才能在那里实现? – 2009-10-20 11:18:17

1

您可以覆盖你的ModelAdmin类has_add_permission(和相关方法) (具有类似的代码,如上所示)

+0

耶!我不知道has_add_permission :) 谢谢。我用代码编辑我的第一篇文章。 – 2009-10-20 11:40:05

0

如果要过滤页面应用程序的管理索引 上的Page对象,可以覆盖ModelAdmin中的方法queryset() 此QuerySet仅返回那些Page对象,属于一个Si te(因此Group) 其中request.user是其成员。

Pages.objects.filter(site__name__in=request.user.groups) 
+0

克里斯 - 你可以编辑你的三个答案到一个最终的答案?现在有点难以遵循。 – 2009-10-20 12:17:47

+0

这不是真正的一个或最终的解决方案。但我会说: 关键在于每个站点都有一个组,并相应地添加用户。 第一个答案显示了“普通视图”的装饰器。 第二个答案修改了ModelAdmin类的has_add_permission方法,这导致了效果,User(request.user)只能在“当前站点”上添加一个页面,当他在正确的组中时。 第三个答案是关于修改应用程序管理界面的索引页面的QuerySet。仅显示属于某个Site/Group的request.user所在的页面。 – Chris 2009-10-20 12:23:29

+0

@Chris我的问题的最后部分实际上是答案。正如多米尼克罗杰所说的那样,要回复他们的回复是很难的。 我已经找到了我需要has_add_permissions和装饰器。谢谢。 – 2009-10-20 12:55:27