internlm/SWE-Fixer-Train-110K huggingface dataset:
Repository: saleor/saleor

Issue:
Bug: Conflicting Migrations Detected
### What are you trying to achieve?

Hi guys!
I was just pulling the project into my local environment and running the following steps:
```
git pull
saleor-venv\Scripts\activate.bat
python -m pip install -r requirements.txt
python manage.py migrate -> DO NOT RUN UNLESS IT IS NECESSARY
python manage.py runserver
```
And when I get the migrate step I get a Conflicting Migrations message:
CommandError: Conflicting migrations detected; multiple leaf nodes in the migration graph: (0160_merge_20221215_1253, 0160_order_external_reference in order).
To fix them run 'python manage.py makemigrations --merge'

![Merge](https://user-images.githubusercontent.com/4459373/208492599-f90847f3-aa9b-4789-a764-89f90a5fd4a5.png)



### Steps to reproduce the problem

1. Pull the main branch as of today 19/Dec/2022
2. Run the migrate command provided above

### What did you expect to happen?

Normally, I don't get issues with migrations, I was expecting to not have to run the `makemigrations` with the `--merge` option but it looks like it is better for you guys to check it out and provide instructions on how to solve it.

### Logs

_No response_

### Environment

Saleor version: I don't have the version but it is the main branch.
OS and version: Windows 10



Discussion:

Resolving patch:
diff --git a/saleor/order/migrations/0161_merge_20221219_1838.py b/saleor/order/migrations/0161_merge_20221219_1838.py
new file mode 100644
--- /dev/null
+++ b/saleor/order/migrations/0161_merge_20221219_1838.py
@@ -0,0 +1,13 @@
+# Generated by Django 3.2.16 on 2022-12-19 18:38
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ("order", "0160_merge_20221215_1253"),
+        ("order", "0160_order_external_reference"),
+    ]
+
+    operations = []


Test patch:
Repository: saleor/saleor

Issue:
Bug: Unable to update Warehouse address
### What are you trying to achieve?

I'm trying to update the warehouse update, with the country set to "UK", according to addressValidationRules query, the required fields are 
```
streetAddress1",
"city",
"postalCode"
```

### Steps to reproduce the problem

1. In shipping zone update/creating a new on select country UK
2. Fill all fields with the necessary information
3. Try to save changes

### What did you expect to happen?

Being able to update the warehouse address properly.

### Logs

Api responds with error -> Error code REQUIRED on field countryAreaAPI

### Environment

Saleor version: 3.10



Discussion:

Resolving patch:
diff --git a/saleor/account/forms.py b/saleor/account/forms.py
--- a/saleor/account/forms.py
+++ b/saleor/account/forms.py
@@ -14,11 +14,9 @@ def get_address_form(
         initial = {}
     if country_code:
         initial["phone"] = "+{}".format(country_code_for_region(country_code))
-
     address_form_class = get_address_form_class(country_code)
 
     if instance is not None:
-        address_form_class = get_address_form_class(instance.country.code)
         address_form = address_form_class(
             data, instance=instance, enable_normalization=enable_normalization, **kwargs
         )


Test patch:
diff --git a/saleor/graphql/warehouse/tests/test_warehouse.py b/saleor/graphql/warehouse/tests/test_warehouse.py
--- a/saleor/graphql/warehouse/tests/test_warehouse.py
+++ b/saleor/graphql/warehouse/tests/test_warehouse.py
@@ -1063,6 +1063,42 @@ def test_mutation_update_warehouse_can_update_address(
     assert address.street_address_2 == "Ground floor"
 
 
+def test_mutation_update_warehouse_to_country_with_different_validation_rules(
+    staff_api_client, warehouse, permission_manage_products, address_usa
+):
+    # given
+    warehouse_id = graphene.Node.to_global_id("Warehouse", warehouse.pk)
+    warehouse.address = address_usa
+    warehouse.save(update_fields=["address"])
+    address_id = graphene.Node.to_global_id("Address", warehouse.address.pk)
+    variables = {
+        "id": warehouse_id,
+        "input": {
+            "name": warehouse.name,
+            "address": {
+                "streetAddress1": "Fake street",
+                "city": "London",
+                "country": "GB",
+                "postalCode": "B52 1AA",
+            },
+        },
+    }
+
+    # when
+    response = staff_api_client.post_graphql(
+        MUTATION_UPDATE_WAREHOUSE,
+        variables=variables,
+        permissions=[permission_manage_products],
+    )
+    content = get_graphql_content(response)
+    content_address = content["data"]["updateWarehouse"]["warehouse"]["address"]
+
+    # then
+    assert len(content["data"]["updateWarehouse"]["errors"]) == 0
+    assert content_address["streetAddress1"] == "Fake street"
+    assert content_address["id"] == address_id
+
+
 @pytest.mark.parametrize(
     "input_slug, expected_slug, error_message",
     [
Repository: saleor/saleor

Issue:
Bug: Order filter not working with payment status 
### What are you trying to achieve?

I'm trying to filter orders with `Fully refunded` payment status. 

### Steps to reproduce the problem

1. Create an order and fully refund it

### What did you expect to happen?

I should get orders all orders with fully refund payment status

### Logs

_No response_

### Environment

Saleor version: 3.9+




Discussion:

Resolving patch:
diff --git a/saleor/graphql/order/filters.py b/saleor/graphql/order/filters.py
--- a/saleor/graphql/order/filters.py
+++ b/saleor/graphql/order/filters.py
@@ -10,6 +10,7 @@
 from ...giftcard.models import GiftCardEvent
 from ...order.models import Order, OrderLine
 from ...order.search import search_orders
+from ...payment import ChargeStatus
 from ...product.models import ProductVariant
 from ..core.filters import (
     GlobalIDMultipleChoiceFilter,
@@ -27,7 +28,10 @@
 
 def filter_payment_status(qs, _, value):
     if value:
-        qs = qs.filter(payments__is_active=True, payments__charge_status__in=value)
+        lookup = Q(payments__is_active=True, payments__charge_status__in=value)
+        if ChargeStatus.FULLY_REFUNDED in value:
+            lookup |= Q(payments__charge_status=ChargeStatus.FULLY_REFUNDED)
+        qs = qs.filter(lookup)
     return qs
 
 


Test patch:
diff --git a/saleor/graphql/order/tests/queries/test_order_with_filter.py b/saleor/graphql/order/tests/queries/test_order_with_filter.py
--- a/saleor/graphql/order/tests/queries/test_order_with_filter.py
+++ b/saleor/graphql/order/tests/queries/test_order_with_filter.py
@@ -378,6 +378,30 @@ def test_order_query_with_filter_payment_status(
     assert len(orders) == count
 
 
+def test_order_query_with_filter_payment_fully_refunded_not_active(
+    orders_query_with_filter,
+    staff_api_client,
+    payment_dummy,
+    permission_manage_orders,
+    channel_PLN,
+):
+    # given
+    payment_dummy.charge_status = ChargeStatus.FULLY_REFUNDED
+    payment_dummy.is_active = False
+    payment_dummy.order = Order.objects.create(channel=channel_PLN)
+    payment_dummy.save()
+    variables = {"filter": {"paymentStatus": "FULLY_REFUNDED"}}
+    staff_api_client.user.user_permissions.add(permission_manage_orders)
+
+    # when
+    response = staff_api_client.post_graphql(orders_query_with_filter, variables)
+    content = get_graphql_content(response)
+    orders = content["data"]["orders"]["edges"]
+
+    # then
+    assert len(orders) == 1
+
+
 @pytest.mark.parametrize(
     "orders_filter, count, status",
     [
Repository: saleor/saleor

Issue:
Move orderCreateFromCheckout to Orders domain
`orderCreateFromCheckout` should appear in Orders.Mutations

![image](https://github.com/saleor/saleor/assets/4006792/1b299de5-2a66-498a-aaa9-09962ec3cb10)



Discussion:

Resolving patch:
diff --git a/saleor/graphql/checkout/mutations/order_create_from_checkout.py b/saleor/graphql/checkout/mutations/order_create_from_checkout.py
--- a/saleor/graphql/checkout/mutations/order_create_from_checkout.py
+++ b/saleor/graphql/checkout/mutations/order_create_from_checkout.py
@@ -11,7 +11,7 @@
 from ...app.dataloaders import get_app_promise
 from ...core import ResolveInfo
 from ...core.descriptions import ADDED_IN_32, ADDED_IN_38
-from ...core.doc_category import DOC_CATEGORY_CHECKOUT
+from ...core.doc_category import DOC_CATEGORY_ORDERS
 from ...core.mutations import BaseMutation
 from ...core.types import Error, NonNullList
 from ...meta.mutations import MetadataInput
@@ -38,7 +38,7 @@ class OrderCreateFromCheckoutError(Error):
     )
 
     class Meta:
-        doc_category = DOC_CATEGORY_CHECKOUT
+        doc_category = DOC_CATEGORY_ORDERS
 
 
 class OrderCreateFromCheckout(BaseMutation):
@@ -78,7 +78,7 @@ class Meta:
             "following permissions: AUTHENTICATED_APP and HANDLE_CHECKOUTS."
             + ADDED_IN_32
         )
-        doc_category = DOC_CATEGORY_CHECKOUT
+        doc_category = DOC_CATEGORY_ORDERS
         object_type = Order
         permissions = (CheckoutPermissions.HANDLE_CHECKOUTS,)
         error_type_class = OrderCreateFromCheckoutError


Test patch:
Repository: saleor/saleor

Issue:
Gift card filter by `createdByEmail`
## Problem

Customer support needs to find customers giftcards to be able to resend code, correct balance or inquiry about balance



Discussion:
Hey i would like to claim this issue

Resolving patch:
diff --git a/saleor/graphql/giftcard/filters.py b/saleor/graphql/giftcard/filters.py
--- a/saleor/graphql/giftcard/filters.py
+++ b/saleor/graphql/giftcard/filters.py
@@ -85,6 +85,12 @@ def filter_code(qs, _, value):
     return qs.filter(code=value)
 
 
+def filter_created_by_email(qs, _, value):
+    if not value:
+        return qs
+    return qs.filter(created_by_email=value)
+
+
 class GiftCardFilter(MetadataFilterBase):
     tags = ListObjectTypeFilter(input_class=graphene.String, method=filter_tags_list)
     products = GlobalIDMultipleChoiceFilter(method=filter_products)
@@ -99,6 +105,7 @@ class GiftCardFilter(MetadataFilterBase):
     )
     is_active = django_filters.BooleanFilter()
     code = django_filters.CharFilter(method=filter_code)
+    created_by_email = django_filters.CharFilter(method=filter_created_by_email)
 
     class Meta:
         model = models.GiftCard


Test patch:
diff --git a/saleor/graphql/giftcard/tests/queries/test_gift_card_filtering.py b/saleor/graphql/giftcard/tests/queries/test_gift_card_filtering.py
--- a/saleor/graphql/giftcard/tests/queries/test_gift_card_filtering.py
+++ b/saleor/graphql/giftcard/tests/queries/test_gift_card_filtering.py
@@ -10,6 +10,7 @@
             edges {
                 node {
                     id
+                    createdByEmail
                     last4CodeChars
                     product {
                         name
@@ -495,3 +496,25 @@ def test_query_filter_gift_cards_by_metadata(
     content = get_graphql_content(response)
     data = content["data"]["giftCards"]["edges"]
     assert len(data) == 1
+
+
+def test_query_filter_gift_cards_by_created_by_email(
+    staff_api_client,
+    gift_card,
+    permission_manage_gift_card,
+):
+    # given
+    query = QUERY_GIFT_CARDS
+
+    variables = {"filter": {"createdByEmail": gift_card.created_by_email}}
+
+    # when
+    response = staff_api_client.post_graphql(
+        query, variables, permissions=[permission_manage_gift_card]
+    )
+
+    # then
+    content = get_graphql_content(response)
+    data = content["data"]["giftCards"]["edges"]
+    assert len(data) == 1
+    assert data[0]["node"]["createdByEmail"] == "test@example.com"
Repository: saleor/saleor

Issue:
Bug: wrong usage in a dataloader
### What are you trying to achieve?

Please take a look at this code:
https://github.com/saleor/saleor/blob/e3078c188b1ff270f533a71d49ce7d178cda79e4/saleor/graphql/shipping/dataloaders.py#L99

The keys parameter of batch_load method has type of:

```python
List[Tuple[str, str]]
```

So we must extract shipping method ids from the `keys` before using them to filter `ShippingMethod`
I think it's wrong to filter by the whole `keys` param here.

If I was wrong, please kindly let me know and I will close this issue.

Thank you for reaching out. Mr. @patrys 


### Steps to reproduce the problem

Just look at the code and you will understand right away.

### What did you expect to happen?

I think we must extract the `keys` param properly first

### Logs

_No response_

### Environment

Saleor version: Main branch
OS and version: anything



Discussion:
The team confirmed it was a bug, so I removed the triage label.
@patrys Mr. I am going to close this. I hope you filed the bug somewhere and take actions on it soon.
@iamleson98 Why did you close the issue? That _is_ the issue report we're tracking.
Mr @patrys , Oh ok, I did not know your team haven't finish it.

Resolving patch:
diff --git a/saleor/graphql/shipping/dataloaders.py b/saleor/graphql/shipping/dataloaders.py
--- a/saleor/graphql/shipping/dataloaders.py
+++ b/saleor/graphql/shipping/dataloaders.py
@@ -100,9 +100,10 @@ class ShippingMethodsByShippingZoneIdAndChannelSlugLoader(DataLoader):
     context_key = "shippingmethod_by_shippingzone_and_channel"
 
     def batch_load(self, keys):
+        shipping_zone_ids = [zone_id for (zone_id, _) in keys]
         shipping_methods = (
             ShippingMethod.objects.using(self.database_connection_name)
-            .filter(shipping_zone_id__in=keys)
+            .filter(shipping_zone_id__in=shipping_zone_ids)
             .annotate(channel_slug=F("channel_listings__channel__slug"))
         )
 


Test patch:
Repository: saleor/saleor

Issue:
Drop Product.charge_taxes from DB
Drop `Product.charge_taxes` from the database. It was removed from the state in 3.14 [in this PR](https://github.com/saleor/saleor/pull/12709).


Discussion:

Resolving patch:
diff --git a/saleor/product/migrations/0186_remove_product_charge_taxes.py b/saleor/product/migrations/0186_remove_product_charge_taxes.py
new file mode 100644
--- /dev/null
+++ b/saleor/product/migrations/0186_remove_product_charge_taxes.py
@@ -0,0 +1,24 @@
+# Generated by Django 3.2.19 on 2023-07-12 10:16
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+    dependencies = [
+        ("product", "0185_unmount_product_charge_taxes"),
+    ]
+
+    database_operations = [
+        migrations.RunSQL(
+            sql="ALTER TABLE product_product DROP COLUMN charge_taxes;",
+            reverse_sql="""
+            ALTER TABLE product_product
+            ADD COLUMN charge_taxes
+            BOOLEAN;
+            """,
+        )
+    ]
+
+    operations = [
+        migrations.SeparateDatabaseAndState(database_operations=database_operations),
+    ]


Test patch:
Repository: saleor/saleor

Issue:
Bug: argument of type 'NoneType' is not iterable
### What are you trying to achieve?

Create a category with `null` passed as `seo` value in the input.

### Steps to reproduce the problem

1. Run the following mutation:
```graphql
mutation CreateCategory($input: CategoryInput!, $parentId: ID) {
  categoryCreate(input: $input, parent: $parentId) {
    errors {
      code
    }
    category {
      id
    }
  }
}
```

Variables:

```json
{
  "input": {
    "backgroundImage": null,
    "backgroundImageAlt": "Root",
    "description": "{\"blocks\":[{\"type\":\"paragraph\", \"data\":\"\"}]}",
    "metadata": null,
    "name": "Root",
    "privateMetadata": null,
    "seo": null,
    "slug": "root"
  },
  "parentId": null
}
```

2. It crashes with the following error:

```json
{
  "errors": [
    {
      "message": "argument of type 'NoneType' is not iterable",
      "locations": [
        {
          "line": 2,
          "column": 3
        }
      ],
      "path": [
        "categoryCreate"
      ],
    }
  ],
  "data": {
    "categoryCreate": null
  },
}
```

API crashes in the `clean_seo_fields` function when `null` is passed as `seo` value. 



### What did you expect to happen?

In this case, the API shouldn't crash; it should ignore the SEO value and create the category without it.

### Logs

_No response_

### Environment

Saleor version: 3.14



Discussion:

Resolving patch:
diff --git a/saleor/graphql/core/validators/__init__.py b/saleor/graphql/core/validators/__init__.py
--- a/saleor/graphql/core/validators/__init__.py
+++ b/saleor/graphql/core/validators/__init__.py
@@ -178,11 +178,12 @@ def clean_seo_fields(data):
     """Extract and assign seo fields to given dictionary."""
     seo_fields = data.pop("seo", {})
 
-    if "title" in seo_fields:
-        data["seo_title"] = seo_fields["title"]
+    if seo_fields:
+        if "title" in seo_fields:
+            data["seo_title"] = seo_fields["title"]
 
-    if "description" in seo_fields:
-        data["seo_description"] = seo_fields["description"]
+        if "description" in seo_fields:
+            data["seo_description"] = seo_fields["description"]
 
 
 def validate_required_string_field(cleaned_input, field_name: str):


Test patch:
diff --git a/saleor/graphql/core/tests/test_validators.py b/saleor/graphql/core/tests/test_validators.py
--- a/saleor/graphql/core/tests/test_validators.py
+++ b/saleor/graphql/core/tests/test_validators.py
@@ -101,6 +101,12 @@ def test_clean_seo_fields():
     assert data["seo_description"] == description
 
 
+def test_clean_seo_fields_accepts_null():
+    data = {"seo": None}
+    clean_seo_fields(data)
+    assert not data
+
+
 @pytest.mark.parametrize(
     "cleaned_input",
     [
Repository: saleor/saleor

Issue:
Filter warehouses by metadata
There are stores that have hundreds of warehouses, for performing updates metadata can be useful as a lookup mechanism instead of using externalReference


Discussion:
 Can you please assign me this ?

Resolving patch:
diff --git a/saleor/graphql/warehouse/filters.py b/saleor/graphql/warehouse/filters.py
--- a/saleor/graphql/warehouse/filters.py
+++ b/saleor/graphql/warehouse/filters.py
@@ -12,6 +12,7 @@
     EnumFilter,
     GlobalIDMultipleChoiceFilter,
     ListObjectTypeFilter,
+    MetadataFilterBase,
     filter_slug_list,
 )
 from ..core.types import FilterInputObjectType
@@ -84,7 +85,7 @@ def filter_search_stock(qs, _, value):
     return qs
 
 
-class WarehouseFilter(django_filters.FilterSet):
+class WarehouseFilter(MetadataFilterBase):
     search = django_filters.CharFilter(method=filter_search_warehouse)
     ids = GlobalIDMultipleChoiceFilter(field_name="id")
     is_private = django_filters.BooleanFilter(field_name="is_private")


Test patch:
diff --git a/saleor/graphql/warehouse/tests/queries/test_warehouses_filtering.py b/saleor/graphql/warehouse/tests/queries/test_warehouses_filtering.py
--- a/saleor/graphql/warehouse/tests/queries/test_warehouses_filtering.py
+++ b/saleor/graphql/warehouse/tests/queries/test_warehouses_filtering.py
@@ -15,6 +15,10 @@
                 name
                 companyName
                 email
+                metadata {
+                    key
+                    value
+                }
             }
         }
     }
@@ -306,3 +310,27 @@ def test_query_warehouses_with_filtering(
     content = get_graphql_content(response)
     pages_nodes = content["data"]["warehouses"]["edges"]
     assert len(pages_nodes) == pages_count
+
+
+def test_query_warehouses_with_filters_metadata(
+    staff_api_client, permission_manage_products, warehouse
+):
+    # given
+    warehouse.metadata = {"foo": "bar"}
+    warehouse.save(update_fields=["metadata"])
+    metadata_filter = {"filters": {"metadata": [{"key": "foo"}]}}
+
+    # when
+    response = staff_api_client.post_graphql(
+        QUERY_WAREHOUSES_WITH_FILTERS,
+        variables=metadata_filter,
+        permissions=[permission_manage_products],
+    )
+
+    # then
+    content = get_graphql_content(response)
+    data = content["data"]["warehouses"]
+    total_count = data["totalCount"]
+    assert not total_count == 0
+    assert data["edges"][0]["node"]["metadata"][0]["key"] == "foo"
+    assert data["edges"][0]["node"]["metadata"][0]["value"] == "bar"
Repository: saleor/saleor

Issue:
Bug: misleading `Domain` description
### What are you trying to achieve?

As pointed out in this discussion in the docs https://github.com/saleor/saleor-docs/discussions/761 the `Domain` description is misleading.

### Steps to reproduce the problem

https://docs.saleor.io/docs/3.x/api-reference/miscellaneous/objects/domain

### What did you expect to happen?

Update the description - state it's the API domain

### Logs

_No response_

### Environment

Saleor version: …
OS and version: …



Discussion:
@2can @timuric Hi, can I work on it?

Resolving patch:
diff --git a/saleor/graphql/shop/types.py b/saleor/graphql/shop/types.py
--- a/saleor/graphql/shop/types.py
+++ b/saleor/graphql/shop/types.py
@@ -65,10 +65,10 @@ class Domain(graphene.ObjectType):
     ssl_enabled = graphene.Boolean(
         description="Inform if SSL is enabled.", required=True
     )
-    url = graphene.String(description="Shop's absolute URL.", required=True)
+    url = graphene.String(description="The absolute URL of the API.", required=True)
 
     class Meta:
-        description = "Represents shop's domain."
+        description = "Represents API domain."
 
 
 class OrderSettings(ModelObjectType[site_models.SiteSettings]):


Test patch:
Repository: saleor/saleor

Issue:
Deprecate the NOTIFY_USER webhook
The `NOTIFY_USER` webhook will be deprecated in Saleor 3.16. Instead, it will be replaced by dedicated webhook events that support customizable subscription payloads. The reasons why `NOTIFY_USER` is getting deprecated are the following:
- no support for subscription payloads; this event always sends static JSON payload with data that might not be needed for every notification
- it requires `MANAGE_USERS` permission while it sends data about different entities; in the new approach, dedicated events will require permissions specific to their domain.

Todo:
- [ ] Mark NOTIFY_USER webhook as deprecated in the GraphQL schema and descriptions.
- [ ] Deprecate `externalNotificationTrigger` 
- [x] Provide a migration guide to explain which events should be used instead (https://github.com/saleor/saleor-docs/pull/912).


Discussion:

Resolving patch:
diff --git a/saleor/graphql/notifications/schema.py b/saleor/graphql/notifications/schema.py
--- a/saleor/graphql/notifications/schema.py
+++ b/saleor/graphql/notifications/schema.py
@@ -1,7 +1,10 @@
 import graphene
 
+from ..core.descriptions import DEPRECATED_IN_3X_MUTATION
 from .mutations.external_notification_trigger import ExternalNotificationTrigger
 
 
 class ExternalNotificationMutations(graphene.ObjectType):
-    external_notification_trigger = ExternalNotificationTrigger.Field()
+    external_notification_trigger = ExternalNotificationTrigger.Field(
+        deprecation_reason=DEPRECATED_IN_3X_MUTATION
+    )
diff --git a/saleor/graphql/webhook/enums.py b/saleor/graphql/webhook/enums.py
--- a/saleor/graphql/webhook/enums.py
+++ b/saleor/graphql/webhook/enums.py
@@ -109,7 +109,13 @@
     WebhookEventAsyncType.MENU_ITEM_CREATED: "A new menu item created.",
     WebhookEventAsyncType.MENU_ITEM_UPDATED: "A menu item is updated.",
     WebhookEventAsyncType.MENU_ITEM_DELETED: "A menu item is deleted.",
-    WebhookEventAsyncType.NOTIFY_USER: "User notification triggered.",
+    WebhookEventAsyncType.NOTIFY_USER: (
+        "User notification triggered."
+        + DEPRECATED_IN_3X_ENUM_VALUE
+        + " See the docs for more details about migrating from NOTIFY_USER to other "
+        "events: "
+        + "https://docs.saleor.io/docs/next/upgrade-guides/notify-user-deprecation"
+    ),
     WebhookEventAsyncType.ORDER_CREATED: "A new order is placed.",
     WebhookEventAsyncType.ORDER_CONFIRMED: order_confirmed_event_enum_description,
     WebhookEventAsyncType.ORDER_PAID: (
diff --git a/saleor/webhook/event_types.py b/saleor/webhook/event_types.py
--- a/saleor/webhook/event_types.py
+++ b/saleor/webhook/event_types.py
@@ -138,7 +138,7 @@ class WebhookEventAsyncType:
     CHECKOUT_FULLY_PAID = "checkout_fully_paid"
     CHECKOUT_METADATA_UPDATED = "checkout_metadata_updated"
 
-    NOTIFY_USER = "notify_user"
+    NOTIFY_USER = "notify_user"  # deprecated
 
     PAGE_CREATED = "page_created"
     PAGE_UPDATED = "page_updated"


Test patch: