Skip to content

Comments

feat: native federation integration#858

Open
bellini666 wants to merge 1 commit intomainfrom
feat/federation-integration
Open

feat: native federation integration#858
bellini666 wants to merge 1 commit intomainfrom
feat/federation-integration

Conversation

@bellini666
Copy link
Member

@bellini666 bellini666 commented Feb 1, 2026

Fix #774
Fix #732
Fix #59

Summary by Sourcery

Add native Apollo Federation integration for strawberry-django via a new federation module and update federation documentation.

New Features:

  • Introduce strawberry_django.federation module with Django-aware federation type, interface, and field decorators that integrate with Apollo Federation, including auto-generated resolve_reference support.
  • Expose the new federation module at the package root for easier import and usage.

Enhancements:

  • Expand federation integration documentation to recommend and describe the new strawberry_django.federation APIs, including configuration of types, fields, interfaces, and federation schema usage.

Documentation:

  • Document the new strawberry_django.federation API and update federation integration guide with examples, parameter tables, and best practices for using native federation with Django models.

Tests:

  • Add comprehensive test suite for federation types, fields, schema generation, and auto-generated resolve_reference behavior, including optimizer integration and entity resolution scenarios.

Chores:

  • Record a minor release note describing the new native federation support and its usage via the strawberry_django.federation module.

@sourcery-ai
Copy link
Contributor

sourcery-ai bot commented Feb 1, 2026

Reviewer's Guide

Introduce a new strawberry_django.federation module that provides Django-aware Apollo Federation decorators for types, interfaces, and fields, auto-generating resolve_reference methods and integrating with the query optimizer, along with updated federation documentation, tests, and release notes.

File-Level Changes

Change Details Files
Add Django-aware federation type and interface decorators that wrap strawberry_django.type/interface, translate federation-specific options into directives, and auto-generate resolve_reference for entity types.
  • Implement strawberry_django.federation.type decorator that accepts standard strawberry_django.type options plus federation parameters (keys, extend, shareable, access control, tags) and converts them into Strawberry federation directives.
  • Implement strawberry_django.federation.interface decorator that wraps interface creation, supports federation options (keys, auth, accessibility, policy, tags), and auto-generates resolve_reference where appropriate.
  • Add internal helpers to compute directives from federation parameters, detect key fields, and inject a generated resolve_reference only when keys are present and no custom resolve_reference exists.
strawberry_django/federation/type.py
Provide federation-aware field decorator that augments strawberry_django.field with federation directives for per-field behavior.
  • Implement strawberry_django.federation.field wrapper that accepts federation parameters such as external/requires/provides/override/shareable/authenticated/inaccessible/policy/requires_scopes/tags and converts them into Strawberry federation field directives.
  • Preserve all existing strawberry_django.field behavior and arguments while layering federation directive handling on top.
  • Emit a deprecation warning when the legacy order parameter is used, consistent with existing field behavior.
strawberry_django/federation/field.py
Add utilities to generate and use auto-generated resolve_reference methods that resolve Django models using federation key fields and integrate with the query optimizer.
  • Introduce resolve_model_reference helper that builds a queryset from the Django type definition, filters by key fields, runs the type get_queryset hook, and applies the optimizer extension when available before .get().
  • Implement generate_resolve_reference to create a classmethod resolve_reference that filters kwargs by key fields and delegates to resolve_model_reference, supporting extra representation fields and optional Info.
  • Export federation utilities (type, interface, field, resolve_model_reference, generate_resolve_reference) from the new strawberry_django.federation package and wire the package into strawberry_django.init.
strawberry_django/federation/resolve.py
strawberry_django/federation/__init__.py
strawberry_django/__init__.py
Extend documentation to describe the new strawberry_django.federation module, its decorators, and example usage alongside native Strawberry federation.
  • Rewrite docs/integrations/federation.md to recommend using strawberry_django.federation, show examples for types, interfaces, and fields, and explain federation-specific parameters and directives tables.
  • Clarify how to create a federated schema using strawberry.federation.Schema, and how auto-generated resolve_reference integrates with the Django optimizer extension.
  • Keep guidance for using Strawberry’s federation decorators directly as an alternative path.
docs/integrations/federation.md
Add comprehensive tests covering federation types, interfaces, federation fields, schema SDL generation, entities/service queries, and resolve_reference behavior including optimizer integration.
  • Add tests for federation type decorator covering key handling (single, multiple, composite, Key objects), federation directives (shareable/authenticated/inaccessible/policy/requires_scopes/tags/extend), interaction with filters/pagination/ordering/optimization hints, and resolve_reference auto-generation and preservation of custom implementations.
  • Add schema-level tests validating emitted SDL for keys/shareable, correct application of per-field directives (external/requires/provides/shareable/authenticated/inaccessible/override/policy/requires_scopes/tags), and end-to-end _entities and _service.sdl queries against a FederationSchema.
  • Add targeted tests for auto-generated resolve_reference and resolve_model_reference, including various key shapes (scalar, string, composite, multiple keys), not-found behavior, optimizer extension usage, and ignoring non-key representation fields.
  • Create a tests/federation package marker file for the new test suite.
tests/federation/test_type.py
tests/federation/test_schema.py
tests/federation/test_resolve_reference.py
tests/federation/__init__.py
Document the feature in release notes as a minor release that introduces native federation support.
  • Add RELEASE.md entry describing the new strawberry_django.federation module, its decorators, and an example of federation type usage with auto-generated resolve_reference and optimizer integration.
RELEASE.md

Assessment against linked issues

Issue Objective Addressed Explanation
#59 Provide a way to use strawberry_django model types together with Strawberry's Apollo Federation support without decorator/method conflicts (i.e., a compatible API for federated Django model types).
#59 Document how to use Django model types with federation, including the new integration approach.
#732 Add native federation support to strawberry-django types and fields, including Django-aware federation decorators and automatic resolve_reference handling for entity types.
#732 Provide documentation explaining how to use federation with strawberry-django, including the new federation helpers and schema setup.
#774 Mark the OperationInfo and OperationMessage GraphQL objects as @Shareable (or otherwise provide a way to make them shareable) so that they can be used safely across multiple subgraphs in Apollo Federation. The PR introduces a new strawberry_django.federation module, decorators, resolve_reference helpers, and extensive federation tests and docs. However, there are no changes involving types named OperationInfo or OperationMessage, nor any code that specifically marks these objects as @Shareable or configures them for sharing across subgraphs. The issue’s concrete request is therefore not implemented.

Possibly linked issues


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

@bellini666 bellini666 marked this pull request as draft February 1, 2026 13:09
@botberry
Copy link
Member

botberry commented Feb 1, 2026

Thanks for adding the RELEASE.md file!

Below is the changelog that will be used for the release.


Add native federation support via strawberry_django.federation module.

New decorators that combine strawberry_django functionality with Apollo Federation:

  • strawberry_django.federation.type - Federation-aware Django type with auto-generated resolve_reference
  • strawberry_django.federation.interface - Federation-aware Django interface
  • strawberry_django.federation.field - Federation-aware Django field with directives like @external, @requires, @provides

Example usage:

import strawberry
import strawberry_django
from strawberry.federation import Schema

@strawberry_django.federation.type(models.Product, keys=["upc"])
class Product:
    upc: strawberry.auto
    name: strawberry.auto
    price: strawberry.auto
    # resolve_reference is automatically generated!

schema = Schema(query=Query)

The auto-generated resolve_reference methods support composite keys and multiple keys, and integrate with the query optimizer.

This release was contributed by @bellini666 in #858

@codecov
Copy link

codecov bot commented Feb 1, 2026

Codecov Report

❌ Patch coverage is 98.97959% with 1 line in your changes missing coverage. Please review.
✅ Project coverage is 91.60%. Comparing base (477bd10) to head (a9a5f62).
⚠️ Report is 1 commits behind head on main.

Files with missing lines Patch % Lines
strawberry_django/federation/field.py 95.00% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #858      +/-   ##
==========================================
+ Coverage   91.38%   91.60%   +0.22%     
==========================================
  Files          45       49       +4     
  Lines        4421     4514      +93     
==========================================
+ Hits         4040     4135      +95     
+ Misses        381      379       -2     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

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 - I've found 5 issues, and left some high level feedback:

  • In generate_resolve_reference you wrap resolve_reference with both types.MethodType and classmethod, which causes the cls argument to be effectively passed twice (and info to receive the class when called positionally); you can simplify and avoid this subtle bug by returning classmethod(resolve_reference) directly instead of classmethod(types.MethodType(...)).
  • The _get_keys_from_directives helper claims to return a list of unique key field names but currently just concatenates all fields from all @key directives; consider either deduplicating the list or updating the docstring to match the actual behavior.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- In `generate_resolve_reference` you wrap `resolve_reference` with both `types.MethodType` and `classmethod`, which causes the `cls` argument to be effectively passed twice (and `info` to receive the class when called positionally); you can simplify and avoid this subtle bug by returning `classmethod(resolve_reference)` directly instead of `classmethod(types.MethodType(...))`.
- The `_get_keys_from_directives` helper claims to return a list of unique key field names but currently just concatenates all fields from all `@key` directives; consider either deduplicating the list or updating the docstring to match the actual behavior.

## Individual Comments

### Comment 1
<location> `strawberry_django/federation/type.py:209-128` </location>
<code_context>
+    keys: Iterable[Key | str] = (),
+    extend: bool = False,
+    shareable: bool = False,
+    inaccessible: bool | object = UNSET,
+    authenticated: bool = False,
+    policy: list[list[str]] | None = None,
</code_context>

<issue_to_address>
**issue (bug_risk):** Passing `inaccessible=False` still adds the `@inaccessible` directive, which likely contradicts the API intent.

Given the `bool | object = UNSET` type, this parameter appears to support three states: UNSET (no directive), True (add `@inaccessible`), and False (explicitly do not add it). With the current `if inaccessible is not UNSET:` check, both True and False add the directive. Please either (a) change the type to `bool = False` to match the current behavior, or (b) update the condition to check specifically for `True` so that `False` acts as an explicit opt‑out.
</issue_to_address>

### Comment 2
<location> `strawberry_django/federation/type.py:164-167` </location>
<code_context>
+        return
+
+    # Don't override existing resolve_reference
+    if hasattr(cls, "resolve_reference"):
+        # Check if it's actually defined on this class, not inherited
+        for klass in cls.__mro__:
+            if "resolve_reference" in klass.__dict__:
+                return
+
</code_context>

<issue_to_address>
**issue (bug_risk):** The `resolve_reference` override check prevents auto-generation even when the method is only inherited, which contradicts the comment.

The docstring and inline comment promise auto-generation unless this class defines `resolve_reference`, yet looping over the full MRO returns as soon as any ancestor defines it, so inherited implementations also block auto-generation. To match the intent, inspect only `cls.__dict__` (or otherwise ignore base classes) instead of walking the entire MRO.
</issue_to_address>

### Comment 3
<location> `strawberry_django/federation/resolve.py:67-68` </location>
<code_context>
+            # If optimizer extension is enabled, optimize this queryset
+            qs = ext.optimize(qs, info=info)
+
+    def _get_result() -> _M:
+        return qs.get()
+
+    return django_resolver(_get_result)()
</code_context>

<issue_to_address>
**issue (bug_risk):** `resolve_model_reference` promises `Model | None` but `qs.get()` will raise on missing records.

Because the function advertises `Model | None`, callers will expect graceful failure. Please either catch `DoesNotExist` (and decide on `MultipleObjectsReturned`) to return `None`, or update the type hint and docstring to document the propagated exceptions so the contract is accurate.
</issue_to_address>

### Comment 4
<location> `strawberry_django/federation/resolve.py:105` </location>
<code_context>
+        return resolve_model_reference(cls_, info=info, **filtered_kwargs)
+
+    # Make it a classmethod bound to the class
+    return classmethod(types.MethodType(resolve_reference, cls))  # type: ignore[arg-type]
</code_context>

<issue_to_address>
**issue:** Using `types.MethodType` inside `classmethod` is unnecessary and likely changes how `cls_` is bound.

Double-binding via MethodType before classmethod can yield unexpected call signatures and interfere with subclass overrides; simply return classmethod(resolve_reference) so Python handles binding once.
</issue_to_address>

### Comment 5
<location> `tests/federation/test_resolve_reference.py:134-153` </location>
<code_context>
+        assert result is not None
+        assert result.name == "testuser"
+
+    def test_resolve_reference_with_multiple_keys(self):
+        """Test type with multiple @key directives uses first key's fields."""
+
+        @strawberry_django.federation.type(
+            models.Fruit,
+            keys=["id", "name"],
+        )
+        class FruitType:
+            id: strawberry.auto
+            name: strawberry.auto
+
+        fruit = models.Fruit.objects.create(name="multi-key-fruit")
+
+        # Should work with id
+        result1 = FruitType.resolve_reference(id=fruit.id)
+        assert result1.name == "multi-key-fruit"
+
+        # Should also work with name
+        result2 = FruitType.resolve_reference(name="multi-key-fruit")
+        assert result2.id == fruit.id
+
+
</code_context>

<issue_to_address>
**suggestion (testing):** Add a test ensuring `resolve_reference` ignores non-key kwargs instead of failing

Because federation gateways often send extra representation fields, add a test that calls `FruitType.resolve_reference` with a valid key plus a non-key kwarg (e.g., `extra="ignored"`) and asserts resolution still succeeds, locking in this tolerant behavior.

```suggestion
    def test_resolve_reference_with_multiple_keys(self):
        """Test type with multiple @key directives uses first key's fields."""

        @strawberry_django.federation.type(
            models.Fruit,
            keys=["id", "name"],
        )
        class FruitType:
            id: strawberry.auto
            name: strawberry.auto

        fruit = models.Fruit.objects.create(name="multi-key-fruit")

        # Should work with id
        result1 = FruitType.resolve_reference(id=fruit.id)
        assert result1.name == "multi-key-fruit"

        # Should also work with name
        result2 = FruitType.resolve_reference(name="multi-key-fruit")
        assert result2.id == fruit.id

    def test_resolve_reference_ignores_non_key_kwargs(self):
        """Ensure non-key kwargs in representations are ignored, not cause failure."""

        @strawberry_django.federation.type(
            models.Fruit,
            keys=["id", "name"],
        )
        class FruitType:
            id: strawberry.auto
            name: strawberry.auto

        fruit = models.Fruit.objects.create(name="extra-field-fruit")

        # Use a valid key plus an extra non-key field; resolution should still succeed
        result = FruitType.resolve_reference(id=fruit.id, extra="ignored")
        assert result is not None
        assert result.id == fruit.id
        assert result.name == "extra-field-fruit"
```
</issue_to_address>

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.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This pull request adds comprehensive native federation support to strawberry-django, enabling seamless integration with Apollo Federation. The implementation provides Django-aware federation decorators that automatically generate resolve_reference methods for entity types, similar to how strawberry_django.type auto-generates Relay resolve_node methods.

Changes:

  • Adds strawberry_django.federation module with type, interface, and field decorators that support federation directives
  • Implements auto-generation of resolve_reference methods for entity resolution in federated graphs
  • Provides comprehensive test coverage with 30+ test cases covering various federation scenarios
  • Includes detailed documentation with examples for using federation with Django models

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
strawberry_django/federation/__init__.py Module initialization with exports for type, interface, field decorators and utility functions
strawberry_django/federation/type.py Federation-aware type and interface decorators with automatic resolve_reference generation
strawberry_django/federation/resolve.py Utility functions for resolving federation entity references using Django ORM
strawberry_django/federation/field.py Federation-aware field decorator supporting @external, @requires, @provides directives
strawberry_django/__init__.py Updated to export the new federation module
docs/integrations/federation.md Comprehensive documentation with examples for federation integration
tests/federation/__init__.py Test module initialization
tests/federation/test_type.py Tests for federation type decorators, directives, and resolve_reference generation
tests/federation/test_schema.py Integration tests for federation schema generation and _entities resolver
tests/federation/test_resolve_reference.py Tests for auto-generated and custom resolve_reference implementations

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@bellini666 bellini666 force-pushed the feat/federation-integration branch 2 times, most recently from f671ca8 to 7aa9ef1 Compare February 2, 2026 23:55
@bellini666 bellini666 requested a review from Copilot February 2, 2026 23:55
@bellini666
Copy link
Member Author

@sourcery-ai review

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 - I've left some high level feedback:

  • In federation.field, the graphql_type argument is always passed through StrawberryAnnotation.from_annotation(graphql_type) (with a default of None), which may bypass Strawberry’s usual type inference from annotations; consider mirroring the existing strawberry_django.field implementation so that when graphql_type is not explicitly provided, the field’s type is inferred from the annotated attribute/resolver instead of being forced to None.
  • The auto-generated resolve_reference uses a flat union of all @key directive fields and filters by whatever subset is present in kwargs; if you intend to support composite keys or multiple alternative keys, it may be worth explicitly documenting this behavior and/or grouping fields per key so you can validate that all fields for a chosen key are present in a representation.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- In `federation.field`, the `graphql_type` argument is always passed through `StrawberryAnnotation.from_annotation(graphql_type)` (with a default of `None`), which may bypass Strawberry’s usual type inference from annotations; consider mirroring the existing `strawberry_django.field` implementation so that when `graphql_type` is not explicitly provided, the field’s type is inferred from the annotated attribute/resolver instead of being forced to `None`.
- The auto-generated `resolve_reference` uses a flat union of all `@key` directive fields and filters by whatever subset is present in `kwargs`; if you intend to support composite keys or multiple alternative keys, it may be worth explicitly documenting this behavior and/or grouping fields per key so you can validate that all fields for a chosen key are present in a representation.

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.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 10 out of 11 changed files in this pull request and generated 4 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@bellini666 bellini666 force-pushed the feat/federation-integration branch from 7aa9ef1 to d95dc32 Compare February 6, 2026 15:55
@bellini666
Copy link
Member Author

@sourcery-ai review

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 - I've found 1 issue, and left some high level feedback:

  • The _get_keys_from_directives helper currently splits Key.fields on whitespace, which will misbehave for nested or more complex FieldSet values (e.g. introduce {/} as key names); consider either restricting support to flat keys explicitly or using Strawberry’s FieldSet parsing APIs to extract only valid top-level field names.
  • In generate_resolve_reference, the generated resolver treats the union of all key fields across multiple @key directives as valid filters; if the intent is to respect the semantics of multiple distinct keys, you may want to pick a single key set (or detect which is satisfied from kwargs) instead of merging them into one field list.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The `_get_keys_from_directives` helper currently splits `Key.fields` on whitespace, which will misbehave for nested or more complex `FieldSet` values (e.g. introduce `{`/`}` as key names); consider either restricting support to flat keys explicitly or using Strawberry’s `FieldSet` parsing APIs to extract only valid top-level field names.
- In `generate_resolve_reference`, the generated resolver treats the union of all key fields across multiple `@key` directives as valid filters; if the intent is to respect the semantics of multiple distinct keys, you may want to pick a single key set (or detect which is satisfied from kwargs) instead of merging them into one field list.

## Individual Comments

### Comment 1
<location> `RELEASE.md:30` </location>
<code_context>
+schema = Schema(query=Query, enable_federation_2=True)
+```
+
+The auto-generated `resolve_reference` methods support composite keys, multiple keys, and integrate with the query optimizer.
</code_context>

<issue_to_address>
**suggestion (typo):** Consider adjusting the sentence for parallel structure and grammatical clarity.

The phrase "support composite keys, multiple keys, and integrate with the query optimizer" mixes verb forms. Consider rewording to "support composite keys, multiple keys, and integration with the query optimizer" or "support composite keys and multiple keys, and they integrate with the query optimizer" to keep the structure consistent.
</issue_to_address>

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.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 11 out of 12 changed files in this pull request and generated 2 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@bellini666 bellini666 force-pushed the feat/federation-integration branch 2 times, most recently from 2a2307c to 4915cc8 Compare February 6, 2026 16:20
@bellini666 bellini666 marked this pull request as ready for review February 6, 2026 16:21
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 - I've reviewed your changes and they look great!


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.

@bellini666 bellini666 force-pushed the feat/federation-integration branch 4 times, most recently from d5cf822 to 568827c Compare February 7, 2026 10:38
@bellini666 bellini666 force-pushed the feat/federation-integration branch 2 times, most recently from 33a4dac to fb354e2 Compare February 22, 2026 11:55
@bellini666 bellini666 requested a review from Copilot February 22, 2026 11:55
@bellini666 bellini666 force-pushed the feat/federation-integration branch from 565c07f to 93a8621 Compare February 22, 2026 11:56
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 12 out of 14 changed files in this pull request and generated no new comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@bellini666 bellini666 force-pushed the feat/federation-integration branch from 93a8621 to a9a5f62 Compare February 22, 2026 12:58
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.

Make OperationInfo and OperationMessage @shareable for Federation Federation Support How to use django model types with federation?

2 participants