Расширьте 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
Другие вопросы по тегам