У меня есть приложение для управления тестовыми примерами, которые организованы в различные проекты. Я пытаюсь установить разрешения для каждого проекта, то есть каждый пользователь имеет разные разрешения для каждого проекта. Вот что я придумала:
class TestProjectMember(models.Model):
"""Per project permissions - a role can be set for each user for each project"""
member_name = models.ForeignKey(User, on_delete=models.SET_NULL)
project = models.ForeignKey(TestProject, on_delete=models.CASCADE)
member_role = models.CharField(choices=Choices.roles)
class TestCase(models.Model):
"""Test cases"""
tc_title = models.CharField(max_length=500, unique=True)
tc_project = models.ForeignKey(TestProject, on_delete=models.CASCADE)
class TestProject(models.Model):
"""Projects"""
project_name = models.CharField(max_length=200)
project_desc = models.CharField(max_length=500)
class TestCaseEditHeader(View):
def get(self, request, pk):
case = get_object_or_404(TestCase, id=pk)
if self.get_perm(case.tc_project, request.user, 'TA'):
form = TestCaseHeaderForm(instance=case)
context = {'case': case, 'form': form}
return render(request, 'test_case/tc_header_edit.html', context)
else:
return redirect('case_list')
def get_perm(self, curr_project, curr_user, perm):
model_perm = TestProjectMember.objects.filter(member_name=curr_user,
project=curr_project).values_list('member_role', flat=True)
if perm in model_perm:
return True
return False
Это работает, но немного неуклюже. Мне пришлось бы вызывать метод get_perm () из каждого метода get () или post () из каждого представления. Лучшим решением, вероятно, будет миксин. Что меня озадачило, так это то, как передать требуемую роль в миксин для каждого представления. Для каждого представления есть обязательная роль, которую пользователь должен иметь, чтобы иметь возможность использовать представление для проекта, которому принадлежит тестовый набор. Как мне сказать миксину, какая конкретная роль требуется для какого представления?