سؤال

Impping لتطوير مشروع واحد وانا قيد تعيين الأشياء التي يمكنني استخدامها لذلك. هذا المشروع سيحتاج إلى أذونات وإعدادات نموذج وإعدادات للكائنات في المجموعة / المستخدم.

أعرف أنني أستطيع استخدام django-ObsesPermissions (https://github.com/washingtontimes/django-objectpjectmissions) وأذونات نموذج Djangos. ولكن هناك بعض الحالات، عندما لا تحتاج حقا إلى تعيين أذونات الكائن / النموذج، بل الإعداد - هل يمكن لهذا الحساب / المستخدم القيام بشيء ما، وهو غير مرتبط بوجود معين أو طراز. هل قام شخص ما بتطبيق التطبيق لهذا؟ أو أي نوع من النهج يأخذ الناس عندما يكون لديهم مثل هذه الحاجة؟ ربما إنشاء نموذج DUMMY DJANGO واترك أذونات Djangos Permissions تعامل مع الباقي؟

أنا أعرف أيضا، أن هذا يفعل شيئا مشابها - https://github.com/danielroseman/django- dbsettings . ولكن عندما تخافت من خلال التعليمات البرمجية، أحصل على انطباع، أن هذه الإعدادات تستند إليها جميع المستخدمين - أحتاج أيضا إلى إعدادات المجموعة المستندة إلى المجموعة.

تحرير: يستمر الأشخاص الذين يقدمون لي تطبيقات أذونات. ما أبحث عنه ليس تطبيق الأذونات، ولكن إعدادات التطبيقات. هذه الإعدادات / الأذونات لا ترتبط بأي كائنات.

أساسا. في مشروعي، أحتاج إلى الإجابة على الأسئلة - هل يمكن لهذا المستخدم أن يرى / يفعل هذا الشيء؟ هذا "شيء" هو على الأرجح رؤية. لذلك واحدة من الإجابات يعمل تقريبا. لكن الشيك الذي أقوم به في الرأي، ليس إذا كان لدى المستخدم إذنا لبعض النماذج / الكائن. إنه بدلا من ذلك، إذا كان المستخدم يحتوي على هذا الإعداد قيد التشغيل، فما إذا تم تشغيل مجموعة المستخدمين هذا الإعداد.

آلان

هل كانت مفيدة؟

المحلول

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top