2012-10-26 54 views
3

我正在啓動具有複雜權限結構的應用程序,該結構將不可避免地由用戶自己管理。我在模型以下權限:Django-guardian - 在對象創建時分配默認權限的位置

class Meta: 
    permissions = (
    ('can_view', 'View project'), 
    ('manage_view', 'Can assign View project'), 
    ('can_edit', 'Edit project'), 
    ('manage_edit', 'Can assign Edit project'), 
    ('can_delete', 'Delete project'), 
    ('manage_delete', 'Can assign Delete project'), 
    ('creator', 'Full access to model features.'), 
    ) 

這些將在與Django的監護人對象級別進行管理,我使用自定義的混入應對所有各種組合和功能。

「創建者」權限被分配給對象的最初創建者,他們可以通過基於電子郵件的邀請系統爲用戶分配其他權限。

我的問題圍繞的選項是分配創建者的權限創建對象。

我已經想到了迄今爲​​止一些方法:

分配鑑於後保存

newObject.save() 
assign('creator', User, newObject) 

一般情況下,我寧願讓這些類型的事件了自己的看法,雖然。

覆蓋保存()

這種方法的問題是,我必須給保存訪問用戶對象,這意味着還重寫INIT設置self.request獲取=請求。

post_save信號

我知道我可以把這個信號的優勢,但相比前兩次我還沒有嘗試這樣的實現呢。

希望這可以提供足夠的見解,瞭解我在哪裏與事情。

我很想知道這些方法中最好的方法是什麼,或者如果它們都是壞主意,那麼可能的實現方式是什麼。

感謝,

JD

回答

2

AD覆蓋保存():您可以添加用戶參數save方法(所以你不必重寫init太)。如果您嘗試調用save方法而不通過用戶實例(並且只要您測試代碼,那麼您應該可以使用該方法)就可以在運行時斷開代碼。

AD post_save signal:如果您沒有嘗試過......試試吧!文檔在信號主題上非常好,而且它們相當容易學習。可能很棘手的是,你應該在哪裏連接信號(我傾向於在模塊模塊的末尾這樣做)。

不幸的是,你的答案沒有最好的方法。此外,請記住,如果你即具有原始SQL插入實例或做bulk_create既不save方法也不post_save信號不會被觸發(https://docs.djangoproject.com/en/1.4/ref/models/querysets/#bulk-create) 。因此,確定您希望發生自動許可分配的地方(無論如何應該可能是一個地方)。

或者,您可以添加FK字段指向創建者到您的模型。你就可以使用,而不是檢查與監護人的許可信息(和你注意到了有關使用實際上應該適合你的問題也很好混入)。前段時間我對這個項目管理應用程序使用了這種方法。

希望有幫助!

https://docs.djangoproject.com/en/1.4/ref/models/querysets/#bulk-create