Как передать параметры в миксин для каждого просмотра - PullRequest
0 голосов
/ 22 октября 2019

У меня есть приложение для управления тестовыми примерами, которые организованы в различные проекты. Я пытаюсь установить разрешения для каждого проекта, то есть каждый пользователь имеет разные разрешения для каждого проекта. Вот что я придумала:

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 () из каждого представления. Лучшим решением, вероятно, будет миксин. Что меня озадачило, так это то, как передать требуемую роль в миксин для каждого представления. Для каждого представления есть обязательная роль, которую пользователь должен иметь, чтобы иметь возможность использовать представление для проекта, которому принадлежит тестовый набор. Как мне сказать миксину, какая конкретная роль требуется для какого представления?

1 Ответ

1 голос
/ 22 октября 2019

Вы можете просто установить его как атрибут класса.

Обратите внимание, ваш запрос довольно неэффективен;вам нужно просто запросить необходимую вам перми.

class TestPermMixin:
    def get_perm(self, curr_project, curr_user):
        return TestProjectMember.objects.filter(
             member_name=curr_user, project=curr_project, member_role=self.perm
        ).exists()

и затем установить атрибут в конкретном классе:

class TestCaseEditHeader(View):
    perm = 'TA'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...