2013-04-26 1 views
2

Я использую приложение django-userena для обработки регистрации пользователя, профиля пользователя и входа в систему. Теперь я пишу заявку, где:Как создать группы django и обработать разрешение динамически

  1. Пользователь может создать курс (курс похож на профиль, в котором мы храним информацию о курсе).
  2. Другие пользователи могут зарегистрироваться на этот курс. Для регистрации требуется разрешение создателя курса.
  3. Только создатель курса может редактировать страницу курса, и он может создать задание для курса.
  4. Все пользователи, которые зарегистрировались для курса, могут видеть страницу курса и задание курса (только для чтения).
  5. Создатель курса может предоставить разрешение другим пользователям редактировать все задания курса.

Один выход - создание двух групп создателей и модификаторов. Теперь группа разработчиков может редактировать страницу курса, а член модификатора может изменять назначения этого конкретного курса. Проблема с этим решением заключается в том, что после добавления пользователя в группу создателей он автоматически получает разрешение на редактирование всех курсов. Аналогично, член группы модификаторов может редактировать все задания всех курсов. Это не требуется.

Как я должен архивировать это приложение?

ответ

0

Вы можете иметь две разные группы, присоединенные к каждому курсу и создавать их при создании курса:

class Course(models.Model): 
    creators = models.ForeignKey(Group) 
    modifiers = models.ForeignKey(Group) 

Так что, как вы можете установить permssion в эту группу. И вы можете использовать django-guardian, чтобы назначить и проверить это разрешение. Что-то вроде этого:

assign_perm('edit_course', group, course) 

, а затем проверить пользователя, если он может изменить этот курс (он будет проверять разрешение группы из группы пользователей автоматически)

user.has_perm("edit_course",course) 
0

Что вы в основном хотите, это разрешение на уровне строк.

Вы можете получить некоторое представление от row level permissions in django

Другого пути вы можете сохранить два поля на вашей модели Course ..

class Course(models.Model): 
    creator = models.ForeignKey(User) 
    modifiers = models.ManyToManyField(User) 

Таким образом, проверить, если пользователь является создателем и только позволяют отредактируйте курс.

Проверить, находится ли пользователь в course.modifiers.all(), а затем разрешить ему изменять.

У создателя будет доступ к другой странице, где могут быть добавлены модификаторы для курса.

1

Альтернативой является django-authority, который может проверить разрешения динамически по методам, а не для их сохранения в БД.

Разница В вашем примере разница в Django-опекуне, когда пользователь переходит на другой курс, вам придется отменить назначение на старой группе и назначить новое явно.

С полномочиями функция can_edit_course(user, course) (псевдокод) и доступ решаются во время выполнения.

 Смежные вопросы

  • Нет связанных вопросов^_^