permissions backend based on team membership
This commit is contained in:
		
							parent
							
								
									86a346f628
								
							
						
					
					
						commit
						5dfd74c360
					
				
					 2 changed files with 37 additions and 0 deletions
				
			
		
							
								
								
									
										33
									
								
								symposion/teams/backends.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								symposion/teams/backends.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,33 @@
 | 
				
			||||||
 | 
					from django.db.models import Q
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from .models import Team
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class TeamPermissionsBackend(object):
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def authenticate(self, username=None, password=None):
 | 
				
			||||||
 | 
					        return None
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def get_team_permissions(self, user_obj, obj=None):
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        Returns a set of permission strings that this user has through his/her
 | 
				
			||||||
 | 
					        team memberships.
 | 
				
			||||||
 | 
					        """
 | 
				
			||||||
 | 
					        if user_obj.is_anonymous() or obj is not None:
 | 
				
			||||||
 | 
					            return set()
 | 
				
			||||||
 | 
					        if not hasattr(user_obj, "_team_perm_cache"):
 | 
				
			||||||
 | 
					            memberships = Team.objects.filter(
 | 
				
			||||||
 | 
					                Q(memberships__user=user_obj),
 | 
				
			||||||
 | 
					                Q(memberships__state="manager") | Q(memberships__state="member"),
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
 | 
					            perms = memberships.values_list(
 | 
				
			||||||
 | 
					                "permissions__content_type__app_label",
 | 
				
			||||||
 | 
					                "permissions__codename"
 | 
				
			||||||
 | 
					            ).order_by()
 | 
				
			||||||
 | 
					            user_obj._team_perm_cache = set(["%s.%s" % (ct, name) for ct, name in perms])
 | 
				
			||||||
 | 
					        return user_obj._team_perm_cache
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def has_perm(self, user_obj, perm, obj=None):
 | 
				
			||||||
 | 
					        if not user_obj.is_active:
 | 
				
			||||||
 | 
					            return False
 | 
				
			||||||
 | 
					        return perm in self.get_team_permissions(user_obj, obj)
 | 
				
			||||||
| 
						 | 
					@ -194,6 +194,10 @@ ACCOUNT_LOGOUT_REDIRECT_URL = "home"
 | 
				
			||||||
ACCOUNT_USER_DISPLAY = lambda user: user.email
 | 
					ACCOUNT_USER_DISPLAY = lambda user: user.email
 | 
				
			||||||
 | 
					
 | 
				
			||||||
AUTHENTICATION_BACKENDS = [
 | 
					AUTHENTICATION_BACKENDS = [
 | 
				
			||||||
 | 
					    # Permissions Backends
 | 
				
			||||||
 | 
					    "symposion.teams.backends.TeamPermissionsBackend",
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    # Auth backends
 | 
				
			||||||
    "account.auth_backends.EmailAuthenticationBackend",
 | 
					    "account.auth_backends.EmailAuthenticationBackend",
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue