Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
dj-kaos / governance / querysets.py
Size: Mime:
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))