def actions_to_roles(actions): # Keep special values if not is_value(actions): return actions actions = ensure_plural(actions) return list(set([role for action in actions for role in ACTIONS[action]]))
def roles_to_actions(roles): # Keep special values if not is_value(roles): return roles roles = ensure_plural(roles) return list(set([action for role in roles for action in ROLES[role]]))
def _validate_actions(self, actions): if not is_value(actions): return actions actions = normalize_value(actions) if [action for action in actions if "." not in action]: raise ValueError("Prefixes are required since target is optional.") return actions
def _prefix_actions(self, actions): """ Prepend this model's name as prefix. This enforces more correct configuration when registering role/action mappings. """ if not is_value(actions): return actions result = [] for action in ensure_plural(actions): if "." in action: raise ValueError( "Prefixes are inferred. Register this with its own " "actions.") result.append("%s.%s" % (get_model_name(self.model), action)) return result
def _query_perms(self, roles, get_related_prefixes, perms_name, force_separate, agent=ANY, target=ANY): """ This is an abstraction used by subclasses to query permissions. Roles will be normalized to a list of roles. force_separate is an optimization. If you know you are going to have multiple left joins, this will speed things up. Either agent or target can be provided. It's assumed that the queryset to be retrieved is the thing not provided. """ # Normalize inputs roles = normalize_value(roles) agent = normalize_value(agent) target = normalize_value(target) # Get all possible related queries we're doing related_prefixes = (get_related_prefixes(self, perms_name, *roles) if is_value(roles) else [perms_name]) # Create a query for each related prefix queries = [ self._get_query(roles, agent, target, prefix=prefix) for prefix in related_prefixes ] # Aggregate the queries. Query together if we don't have any # divergent left joins. query_together = (not force_separate and len(related_prefixes) <= 1 and perms_name in related_prefixes) if query_together: results = self._query_together(queries) else: results = self._query_separate(queries) return results
def test_is_value(self): self.assertEqual(True, is_value('whatever')) self.assertEqual(False, is_value(ANY)) self.assertEqual(False, is_value(NULL))