Комплекс Джанго разрешений - PullRequest
0 голосов
/ 25 мая 2018

Я работаю со следующими моделями в проекте Django.Эффективные отношения состоят в том, что в округе может быть несколько школ, в школе может быть несколько учеников, а у ученика может быть несколько дел.

class District(models.Model):
    name = models.CharField(max_length=50)
    ...
    class Meta:
        permissions = (
            ('view_district', 'Can view district')
            ...
        )

class School(models.Model):
    name = models.CharField(max_length=50)
    ...
    district = models.ForeignKey(
        District,
        on_delete=models.PROTECT,
        related_name='schools',
        related_query_name='school',
    )
    class Meta:
        permissions = (
            ('view_school', 'Can view school')
            ...
        )

class Student(models.Model):
    name = models.CharField(max_length=50)
    ...  
    school = models.ForeignKey(
        School,
        on_delete=models.PROTECT,
        related_name='students',
        related_query_name='student',
    )
    class Meta:
        permissions = (
            ('view_student', 'Can view student')
            ...
        )

class Case(models.Model):
    name = models.CharField(max_length=50)
    ...
    student = models.ForeignKey(
        Student,
        on_delete=models.PROTECT
        related_name='cases',
        related_query_name='case',
    )
    class Meta:
        permissions = (
            ('view_case', 'Can view case')
            ...
        )

Пользователю может быть назначено:

  1. конкретный случай
  2. конкретный студент (который будет включать все случаи для этого студента)
  3. конкретная школа (которая будет включать всех учеников этой школы и, следовательно, все случаи для учеников этой школы)
  4. конкретный округ (который будет включать все школы для этого округа, все учащиеся, которые посещают эти школы)школы в этом округе, и все дела для учащихся, которые посещают эти школы в этом округе)

Пользователи (кроме администраторов) смогут только просматривать / редактировать / удалять модели, для которых им предоставленыразрешения.Администраторы будут иметь прежние разрешения для всех моделей, а также добавлять новые модели.В конечном итоге администраторы «назначат», кому и к чему иметь доступ, группы казались естественным способом расширить некоторые из этих функций.

Мне известно, что django не предоставляет встроенной поддержки разрешений на уровне экземпляра, и поэтому я уже исследовал пакет django-guardian.Похоже, что он предлагает функциональность, необходимую для конкретного экземпляра, и хотя я могу создавать разрешения для объектов по отдельности через оболочку, я, очевидно, хочу встроить эту функциональность в модели.

В идеале, когда создается модель,будет доступна группа (или разрешение?), в которую могут быть помещены пользователи, такие как

District | District1 | can view District1 
District | District1 | can edit District1
District | District1 | can delete District1
....
School | School1 | can view School1 
School | School1 | can edit School1
School | School1 | can delete School1

Я думаю, что программное создание групп для каждого разрешения объекта было бы идеальным?Но тогда мне нужно будет удалить эти группы, если модель будет удалена?Я также чувствую, что группы могут слишком усложнять систему и скорее полагаться на программно сгенерированные разрешения и прямо избегать групп?Я действительно ищу какое-то направление, так как мне никогда не нужно было создавать такую ​​ уникальную схему разрешений.Любой совет очень ценится.

...