2009-06-16 17 views
9

私は、デフォルトでオブジェクトの所有者だけが編集できるように、djangoモデルを使って単純な 'オブジェクト所有権'システムをどのように実現するのかと思います。Djangoのオブジェクト所有者

私は、オブジェクトの所有者に代わってすべてのオブジェクトを編集するための「管理」グループを許可しようとしていますが、この時点ではカスタム権限を追加しました:

class Meta: 
    permissions  = (
     ("manage_object", "Can manage objects"), 
    ) 

「所有権」を確立するために私がしましたモデルにdefを追加するという考えに夢中になりました。

def owner(self): 
    return self.user 

しかし、どうすればいいですか?私は、ビューの権限を実装し、テンプレートを使用して、関連するUIを表示する、すなわち:

if request.user is object.owner: 
    # ... do stuff 
elseif request.user.has_perm.can_manage: # this line is probably not right 
    # ... do something else 

...そしてテンプレートレベルで異なるUI要素を提示することができます。

ので、質問がされています。どのような障害/利点は、このアプローチである

  • がありますか?
  • 、またはこれまでに実装した方法は他にもありますか?

最高のおかげで!

答えて

16

私のアプローチは、モデルにメソッドを追加することになります。

class YourModelWithOwnership(models.model): 
    ... 

    def user_can_manage_me(self, user): 
     return user == self.user or user.has_perm('your_app.manage_object') 

私はパーミッションチェックが必要とされるたびにそのメソッドを呼び出し、結果に基づいて何らかのアクションを取ると思います。だから、

from django.shortcuts import get_object_or_404 
... 

def view_func(request, item_id): 
    item = get_object_or_404(YourModelWithOwnership, id=item_id) # or whatever is needed to get the object 
    if not item.user_can_manage_me(request.user): 
     # user not allowed to manage 
     ... 
    else: 
     ... 

だろうビューの後、私はおそらくそれはまだそのテストを必要とするすべてのビューに書き込むためにかなりの定型コードだということを理解したいので、私は、ユーザーができるスローだ例外を実装したいです「tは...

class CannotManage(Exception): 
    pass 

のオブジェクトを管理...とモデルに別のメソッドを追加:

from django.db import models 
from django.shortcuts import get_object_or_404 

class YourModelWithOwnership(models.model): 
    ... 

    @classmethod 
    def get_manageable_object_or_404(cls, user, *args, **kwds): 
     item = get_object_or_404(cls, *args, **kwds) 
     if not item.user_can_manage_me(user): 
      raise CannotManage 
     return item 

そして、ビュー機能で、これは使用することができる。

def view_func(request, item_id): 
    item = YourModelWithOwnership.get_manageable_object_or_404(request.user, id=item_id) 
    ... 

これはもちろん、ユーザーが所有者でなく、適切な権限を持っていない場合に例外を発生させます。この例外はcustom middlewareクラスのprocess_exception()メソッドで処理できるので、ユーザーがオブジェクトを混乱させることが許されていないすべてのインスタンスに対して1つのハンドラが存在します。

+0

yaしかし、ビューを更新/削除するアクセスをブロックするビューデコレータが必要な場合はどうすればよいですか? – CpILL

0

RowLevelPermissionsブランチを見ることができます。 1.1ベータ版でさえも含まれていませんが、まだまだ開発が必要です。

+1

その枝は完全に、完全に、100%永遠に死んでいます。それは復活、完成、更新、またはメインラインDjangoに統合されることはありません。残念ながら、SVNには「この支店は閉鎖されており、今後の作業はありません」という言い方がありません。 –

+0

ああまあ、彼らはとにかくドキュメントで何か言及することができます。 – Pyetras

関連する問題