ユーザー/アカウント設定のためのDjangoアプリ
-
15-11-2019 - |
質問
1つのプロジェクトを開発するための準備、私はそれに使用することができるものをマッピングする過程で行われます。このプロジェクトは、さまざまなグループ/ユーザーベースのモデルとオブジェクトの権限と設定が必要です。
私はDjango-ObjectPermissions(https://github.com/washingtond/django-ObjectperMissions)とDjangos自身のモデル権限を使用できることを知っています。しかし、あなたが本当にオブジェクト/モデルの権限を設定する必要があるが、むしろ設定をすることができる場合があります - このアカウント/ユーザーは何かをしています。誰かがこれのためにアプリを開発しましたか?それともそのような必要性があるときに人々がどのようなアプローチを取るか?おそらくダミーのDjangoモデルを作成し、Djangosモデルのアクセス許可を残りの値を処理させますか?
私はまた、これが似たことがあることを知っています - https://github.com/danielroseman/django- dbsettings 。しかし、私が印象を与えたコードを撮ったとき、それらの設定はすべてユーザーベースであることです - 私はグループベースの設定が必要です。
編集:人々は私に権限アプリを提供し続けます。私が探しているものは許可アプリではありませんが、設定アプリ。これらの設定/アクセス許可は、どのオブジェクトにも関連しません。
基本的に。私のプロジェクトでは、私は質問に答える必要があります - このユーザーはこのことを見ることができますか?その「もの」は最も可能性が高いです。だから答えの1つはほとんど機能します。しかし、私が見ることをするチェックは、ユーザーがいくつかのモデル/オブジェクトに対する許可を持っている場合ではありません。それはむしろ、ユーザーがこの設定を有効にしている場合、ユーザーグループがこの設定をオンにしている場合。
Alan
解決
You're probably going to need to create your own system for this. It shouldn't be very difficult.
class Setting(models.Model):
name = models.CharField(..)
value = models.CharField(..)
users = models.ManyToManyField(User)
groups = models.ManyToManyField(Group)
@classmethod
def has_setting(cls, name, user):
user_settings = cls.objects.filter(name=name, users__in=[user]).count()
group_settings = cls.objects.filter(name=name, groups__in=user.groups.all()).count()
return user_settings or group_settings
@classmethod
def get_settings(cls, name, user, priority=User):
user_settings = list(cls.objects.filter(name=name, users__in=[user]))
group_settings = list(cls.objects.filter(name=name, groups__in=user.groups.all()))
if user_settings and not group_settings:
return user_settings
elif group_settings and not user_settings:
return group_settings
else:
return (group_settings, user_settings)[priority==User]
Then you can do something like this in your views:
def display_frob(request):
if Setting.has_setting('display_frob', request.user):
settings = Setting.get_setting('display_from', request.user, priority=Group)
values = [setting.value for setting in settings]
# if the User was in many groups, we now have a list of values, for the setting
# `display_frob`, that aligns with each of those groups
You can easy build a decorator which will do the check, and provide a list (or a single item) of values to the view.
他のヒント
For permissions for "actions" (where an action is typically implemented by a view) I commonly use decorators.
The user_passes_test decorator is great for this kind of purpose.
You could create user permissions not linked to models.
Maybe this is what you looking for : django-guardian