Я новичок в Python и Django, работаю над приложением Django, и у меня есть требование, по которому я должен управлять разрешениями для экземпляра модели Foo в моем Django. Доступны другие экземпляры модели, но разрешения применяются только для foo.
Я переопределил has_add_permission
, has_delete_permission
в своем классе FooAdmin, но, похоже, ничего не работает.
Требования:
- Добавить объект Foo: пользователь должен быть супер-администратором
- Удалить объект Foo: пользователь должен быть супер-администратором
- Редактировать существующий объект Foo: пользователь должен принадлежать к группе ldap 'foo-edit'. Если пользователь принадлежит к этой группе, он может редактировать только одно поле (здание) (еще не реализовано)
- View Foo: если пользователь принадлежит к группе ldap 'foo-access', то у пользователя есть только права на просмотр. (Подлежит расследованию)
- Если будет добавлен, обновлен, удален или изменен какой-либо другой экземпляр модели, то правила с 1 по 4 не применяются.
Моя реализация:
class FooAdmin(ModelAdmin):
...
...
...
def has_add_permission(self, request):
permissions = self.opts.app_label + '.' + self.opts.get_add_permission()
# Other objects are fine.
user = request.user
if (user.has_perm('survey.add_foo') and user.is_authenticated
and user.is_superuser):
return True
return False
def has_delete_permission(self, request, obj=None):
permissions = self.opts.app_label + '.' + self.opts.get_delete_permission()
user = request.user
if (user.has_perm('survey.delete_foo') and user.is_authenticated
and user.is_superuser):
return True
return False
Проблема:
Я могу создать еще один экземпляр типа Bar, но не могу удалить то, что только что создал. Это не проблема с экземплярами типа FooBar. Реализация BarAdmin не имеет кода, управляющего разрешениями, как в случае реализации FooBarAdmin.
Есть ли способ решить эту проблему и снова сделать Bar и FooBar удаляемыми?
Как мне реализовать необходимые # 3 и 4? Я могу переопределить метод has_change_permission, чтобы определить, есть ли у человека права на изменение. Как дать пользователю права на редактирование только для одного поля.
Django, похоже, не поддерживает разрешения только на просмотр. Я могу создать has_view_permission (self, request) и get_model_perms (self, request) и другие места? Но я не уверен, как это реализовать. Я просматривал исходный код Django , но ничего не могу придумать.