Skip to content

Conversation

iamcrookedman
Copy link

@iamcrookedman iamcrookedman commented May 15, 2025

Description

Types of Changes

  • Core
  • Bugfix
  • New feature
  • Enhancement/optimization
  • Documentation

Issues Fixed or Closed by This PR

Checklist

  • My code follows the code style of this project.
  • My change requires a change to the documentation.
  • I have updated the documentation accordingly.
  • I have read the CONTRIBUTING document.
  • I have added tests to cover my changes.
  • I have tested the changes and verified that they work and don't break anything (as well as I can manage).

Summary by Sourcery

Add support for composing permissions with boolean operators and enforce multiple permission classes in GraphQL extensions

New Features:

  • Enable combining permission classes using &, |, and ~ operators via OperationHolderMixin and operand holders
  • Introduce AND, OR, and NOT operator classes to evaluate combined permission logic
  • Add BasePermission metaclass to support operator overloading on permission classes
  • Add HasPermissionClasses GraphQL extension to enforce multiple permission classes

Copy link
Contributor

sourcery-ai bot commented May 15, 2025

Reviewer's Guide

Implements a composable permission framework with logical operators (AND, OR, NOT) and adds a GraphQL extension to apply multiple permission classes per field.

File-Level Changes

Change Details Files
Composable permission operators and holder classes
  • Added OperationHolderMixin to overload &,
, and ~ for permission chaining
  • Introduced SingleOperandHolder and OperandHolder to defer permission instantiation
  • Defined AND, OR, and NOT operator classes to evaluate combined has_permission results
  • Created BasePermissionMetaclass mixing in operator support and BasePermission stub
  • GraphQL extension for multi-class permission checks
    • Added HasPermissionClasses to accept and store an iterable of permission classes
    • Validated user authentication and active status before resolving
    • Instantiated and iterated through each permission, raising on first failure
    • Returned resolver result only if all permissions pass
    strawberry_django/permissions.py

    Tips and commands

    Interacting with Sourcery

    • Trigger a new review: Comment @sourcery-ai review on the pull request.
    • Continue discussions: Reply directly to Sourcery's review comments.
    • Generate a GitHub issue from a review comment: Ask Sourcery to create an
      issue from a review comment by replying to it. You can also reply to a
      review comment with @sourcery-ai issue to create an issue from it.
    • Generate a pull request title: Write @sourcery-ai anywhere in the pull
      request title to generate a title at any time. You can also comment
      @sourcery-ai title on the pull request to (re-)generate the title at any time.
    • Generate a pull request summary: Write @sourcery-ai summary anywhere in
      the pull request body to generate a PR summary at any time exactly where you
      want it. You can also comment @sourcery-ai summary on the pull request to
      (re-)generate the summary at any time.
    • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
      request to (re-)generate the reviewer's guide at any time.
    • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
      pull request to resolve all Sourcery comments. Useful if you've already
      addressed all the comments and don't want to see them anymore.
    • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
      request to dismiss all existing Sourcery reviews. Especially useful if you
      want to start fresh with a new review - don't forget to comment
      @sourcery-ai review to trigger a new review!

    Customizing Your Experience

    Access your dashboard to:

    • Enable or disable review features such as the Sourcery-generated pull request
      summary, the reviewer's guide, and others.
    • Change the review language.
    • Add, remove or edit custom review instructions.
    • Adjust other review settings.

    Getting Help

    @iamcrookedman iamcrookedman marked this pull request as draft May 15, 2025 11:02
    Copy link
    Contributor

    @sourcery-ai sourcery-ai bot left a comment

    Choose a reason for hiding this comment

    The reason will be displayed to describe this comment to others. Learn more.

    Hey @iamcrookedman - I've reviewed your changes - here's some feedback:

    • Consider normalizing operand order in OperandHolder for commutative operators like AND/OR so that A & B and B & A produce equivalent holders.
    • Add eq and hash implementations to SingleOperandHolder to match OperandHolder and ensure permission expressions can be reliably compared and used as dict keys.
    • Add type hints or runtime validation in HasPermissionClasses to ensure that permission_classes is an iterable of BasePermission subclasses to catch misconfigurations early.
    Here's what I looked at during the review
    • 🟡 General issues: 2 issues found
    • 🟢 Testing: all looks good
    • 🟢 Documentation: all looks good

    Sourcery is free for open source - if you like our reviews please consider sharing them ✨
    Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    None yet
    Projects
    None yet
    Development

    Successfully merging this pull request may close these issues.

    1 participant