Repository URL to install this package:
Version:
0.2.0a11 ▾
|
from functools import reduce
from typing import Sequence
from django.db import models
from django.db.models import Q
from rules import Predicate
class UserAwareQuerySet(models.QuerySet):
user_fields: Sequence[str]
all_access_predicates: Sequence[Predicate] = ()
def _get_filter_by_user_q(self, user) -> Q:
def reduce_function(acc: Q, field_name: str):
if field_name == 'self':
q = Q(pk=user.pk)
else:
q = Q(**{field_name: user})
return acc | q
return reduce(reduce_function, self.user_fields, Q())
def _get_all_access_predicates(self):
return self.all_access_predicates
def filter_by_user(self, user):
for predicate in self._get_all_access_predicates():
if predicate.test(user):
return self.filter()
return self.filter(self._get_filter_by_user_q(user))