2009-10-20 50 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