Django, разрешения на уровне объекта и вычисляемые поля - PullRequest
0 голосов
/ 09 сентября 2018

Я искал в Интернете ответы, но мой Google-фу не совсем работает.

Мне нужно иметь разрешения на уровне объекта и рассчитывать поля на основе полей, к которым у пользователя есть доступ. Я должен использовать Джанго. Мне разрешено импортировать дополнения.

Например, рассмотрим следующий вариант использования:

Компания хотела бы предоставить систему отслеживания запасов для продавцы и менеджеры.

Система отслеживает, сколько инвентаря каждый продавец начинает в месяц с тем, сколько они продали в этом месяце, и сколько инвентаря они есть оставшиеся (вычисляемое поле: (start_inventory - sold_inventory = currentInventory)).

Продавец может видеть только начальные, проданные и текущие запасы за сами по себе.

Менеджер может видеть все начальные, проданные и текущие запасы для продавцы, которыми они управляют.

Теперь в модели записаны начальный и проданный инвентарь - и довольно просто использовать что-то вроде get_objects_for_user() Джанго-стража только для начального и проданного инвентаря ... но для текущего инвентаря?

Моей первой мыслью было определение функции или менеджера с функцией в model.py, которая возвращает модель + вычисленное текущее поле инвентаря.

Однако, поскольку этот метод находится в model.py ... Я не могу использовать get_objects_for_user(), чтобы гарантировать, что я делаю вычисления только для полей, к которым у пользователя есть доступ. Это потому, что модели не имеют доступа к запросам ... без какого-либо взлома и, возможно, введения связи?

Из-за осторожности я оглядываюсь назад к своему view.py. Я использовал общий список, и я переопределяю метод get_queryset(), чтобы я мог вставить свое собственное поведение. Затем я могу использовать get_objects_for_user(), затем добавить вычисляемое поле в представление ... чувак, это тоже не совсем правильно.

Выполнение этого будет означать, что мои расчетные объекты связаны с видом, а не с данными. Если мне нужно отобразить эти данные в нескольких представлениях, мне придется каждый раз перезаписывать их ...

И вот где я застреваю. Я не могу найти или понять, как элегантно реализовать это поведение.

Я имею в виду, что корень моей идеи состоял в том, чтобы изменить контекст представления на основе разрешений пользователя. То есть все разделяют представление, но context_object / queryset меняется в зависимости от прав пользователя.

Не знаю, умно ли это, или этот подход блокирует мою способность находить решение, но утаптывать его и гуглить его не работает.

Что ж, позвольте мне добавить несколько заключительных ограничений к приемлемому решению:

Хранение дополнительных данных / рассчитанных полей в модели может быть считается невозможным (предположим, что система может быть расширена до требуется много вычисляемых полей).

Спасибо за любую помощь!

...