Расширьте django группы и разрешения
Я искал в Google и Stackru последние 3 дня и не смог найти ничего похожего. Я хотел бы расширить или использовать django группы и разрешения.
Допустим, у нас есть несколько проектов с разными командами и пользователями.
class Project(models.Model):
owner = models.ForeignKey(User)
name = models.CharField(max_length=100)
class Team(models.Model):
project = models.ForeignKey(Project)
members = models.ManyToManyField(User)
name = models.CharField(max_length=100)
permission = models.ManyToManyField(Permission)
Сейчас - все хорошо. Теперь я хочу расширить существующую Auth.Group, поставляемую django, чтобы я мог использовать request.user.has_perm...
прямой путь.
Итак, давайте изменим Team-Model на
class Team(Group):
project = models.ForeignKey(Project)
members = models.ManyToManyField(User)
Это расширяет существующую группу. name
а также permissions
поле приходит прямо из Group-Model. Если я создам новую команду, будет добавлена и группа. Замечательно.
С кастомом save
Метод, который я мог бы также добавить, что user
перечислены в members
, будет добавлен в созданную группу и получит разрешения, предоставленные команде / группе.
Теперь моя проблема в том, name
Поле группы уникально - поэтому я не смог добавить команду Admins-Team для каждого проекта.
Я подумал о добавлении другого поля имени для внешнего интерфейса и генерации уникальной строки для поля имени модели группы. Но хммм.... есть ли лучшее решение для нескольких пользовательских групп? Может быть, у кого-то есть идея? Заранее спасибо!
1 ответ
Вы должны сделать имена групп уникальными. Итак, один способ, который вы обнаружили, - это иметь другое поле имени, делая его уникальным для всех подгрупп.
Другим способом было бы использовать существующее поле имени и добавить ваши специальные символы. Например имя группы с admin#project1
, members#project1
и т. д. (Примечание: я не уверен, что "#" разрешено в названии группы, вы можете выбрать любой допустимый специальный символ).
Поэтому всякий раз, когда вы создаете Team
вы обновляете поле имени суффиксом #<project_name>
в Team
модели save()
метод.
Чтобы отобразить это более разумно, вы можете добавить __unicode__()
метод для возврата только первой части имени группы. Пример:
class Team(Group):
...
def __unicode__(self):
try:
return self.name.split('#')[0]
except:
#something wrong!
return self.name