 
 

class User(AbstractUser, BaseModel):
    groups = models.ManyToManyField(
        'auth.Group',
        verbose_name='groups',
        blank=True,
        help_text='The groups this user belongs to.',
        related_name='custom_user_set',
        related_query_name='custom_user',
    )
    user_permissions = models.ManyToManyField(
        'auth.Permission',
        verbose_name='user permissions',
        blank=True,
        help_text='Specific permissions for this user.',
        related_name='custom_user_set',
        related_query_name='custom_user',
    ) 
 
    # User roles - many-to-many relationship with Role model
    roles = models.ManyToManyField(
        Role,
        blank=True,
        verbose_name=_("User Roles"),
        help_text=_("Roles assigned to this user")
    )
 

    def __str__(self):
        """String representation of the user."""
        return f"{self.get_full_name()} ({self.email})"
 
    def get_user_roles(self):
        """Get list of user's role names."""
        return list(self.roles.filter(is_active=True).values_list('name', flat=True))
    
    def has_role(self, role_name):
        """Check if user has specific role."""
        return self.roles.filter(name=role_name, is_active=True).exists()
    
    def get_all_permissions(self):
        """Get all permissions from user's roles."""
        permissions = set()
        for role in self.roles.filter(is_active=True):
            permissions.update(role.get_permissions_list())
        return list(permissions)
    
    def has_permission(self, permission_codename):
        """Check if user has specific permission through roles."""
        return any(
            role.has_permission(permission_codename) 
            for role in self.roles.filter(is_active=True)
        )




 

    


