diff --git a/CHANGELOG.md b/CHANGELOG.md index e1960d86e..74526f0ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to ### Changed +- Remove `owner` and `is_main` in CreditCard model permanently - Remove `is_active` on order group client serializer ## [2.16.0] - 2025-02-13 diff --git a/src/backend/joanie/payment/apps.py b/src/backend/joanie/payment/apps.py index 5d6caa681..16a2d69e0 100644 --- a/src/backend/joanie/payment/apps.py +++ b/src/backend/joanie/payment/apps.py @@ -13,7 +13,6 @@ class PaymentConfig(AppConfig): # pylint: disable=import-outside-toplevel, unused-import def ready(self): """Import credit card post delete receiver.""" - import joanie.payment.checks from joanie.payment.models import ( # , credit_card_post_delete_receiver, ) diff --git a/src/backend/joanie/payment/checks.py b/src/backend/joanie/payment/checks.py deleted file mode 100644 index 1557559b3..000000000 --- a/src/backend/joanie/payment/checks.py +++ /dev/null @@ -1,60 +0,0 @@ -""" -The check defined here is registered with Django's system check framework. -It ensures and informs developers that some fields of payment models will be soon deprecated, -and we provide guidance for transition. - -You can use our make command : `make check` -This message will also appear when using : `make migrate` - -https://docs.djangoproject.com/fr/4.2/topics/checks/ -""" - -from django.apps import apps -from django.core.checks import Warning as django_check_message_warning -from django.core.checks import register - - -@register() -def check_deprecated_owner_field(app_configs, **kwargs): # pylint: disable=unused-argument - """ - Warning developers that the field `owner` and `is_main` on the CreditCard model are deprecated - and they will be removed in a couple of future release of Joanie higher than 2.15.0 - """ - warnings = [] - - CreditCard = apps.get_model("payment", "CreditCard") # pylint: disable=invalid-name - - deprecated_fields = { - "owner": { - "message": ( - "'owner' has been deprecated on the CreditCard model in the payment app. " - "Support for it (except in historical migrations) will be removed in a future " - "release of Joanie higher than 2.15.0." - ), - "hint": "Use 'owners' many-to-many relation instead.", - "id": "credit_card.owner", - }, - "is_main": { - "message": ( - "'is_main' has been deprecated on the CreditCard model in the payment app. " - "Support for it (except in historical migrations) will be removed in a future " - "release of Joanie higher than 2.15.0." - ), - "hint": "Use 'is_main' on the CreditCardOwnership model to manage it per user.", - "id": "credit_card.is_main", - }, - } - - card_fields = [field.name for field in CreditCard._meta.get_fields()] # noqa: SLF001 - for field_name, details in deprecated_fields.items(): - if field_name in card_fields: - warnings.append( - django_check_message_warning( - msg=details["message"], - hint=details["hint"], - id=details["id"], - obj="CreditCard", - ) - ) - - return warnings diff --git a/src/backend/joanie/payment/migrations/0011_remove_creditcard_is_main_remove_creditcard_owner.py b/src/backend/joanie/payment/migrations/0011_remove_creditcard_is_main_remove_creditcard_owner.py new file mode 100644 index 000000000..3cf01c31d --- /dev/null +++ b/src/backend/joanie/payment/migrations/0011_remove_creditcard_is_main_remove_creditcard_owner.py @@ -0,0 +1,21 @@ +# Generated by Django 4.2.18 on 2025-02-18 08:55 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('payment', '0010_creditcardownership_and_more'), + ] + + operations = [ + migrations.RemoveField( + model_name='creditcard', + name='is_main', + ), + migrations.RemoveField( + model_name='creditcard', + name='owner', + ), + ] diff --git a/src/backend/joanie/payment/models.py b/src/backend/joanie/payment/models.py index acbb9bcc1..79d74ba9a 100644 --- a/src/backend/joanie/payment/models.py +++ b/src/backend/joanie/payment/models.py @@ -485,15 +485,6 @@ class CreditCard(BaseModel): ) expiration_year = models.PositiveSmallIntegerField(_("expiration year")) last_numbers = models.CharField(_("last 4 numbers"), max_length=4) - # Deprecated - owner = models.ForeignKey( - to=User, - verbose_name=_("owner"), - related_name="credit_cards", - on_delete=models.CASCADE, - blank=True, - null=True, - ) owners = models.ManyToManyField( to=User, verbose_name=_("owners"), @@ -501,7 +492,6 @@ class CreditCard(BaseModel): through="CreditCardOwnership", through_fields=("credit_card", "owner"), ) - is_main = models.BooleanField(_("main"), default=False) # Deprecated payment_provider = models.CharField( _("payment provider"), max_length=50, null=True, blank=True ) diff --git a/src/backend/joanie/tests/payment/test_backend_base.py b/src/backend/joanie/tests/payment/test_backend_base.py index 2cec34629..8ee0d04c3 100644 --- a/src/backend/joanie/tests/payment/test_backend_base.py +++ b/src/backend/joanie/tests/payment/test_backend_base.py @@ -293,7 +293,7 @@ def test_payment_backend_base_do_on_payment_success(self): # - Credit card has been deleted self.assertIsNone(order.credit_card) - self.assertEqual(owner.credit_cards.count(), 0) + self.assertEqual(owner.payment_cards.count(), 0) with self.assertRaises(CreditCard.DoesNotExist): CreditCard.objects.get(id=credit_card.id) credit_card.refresh_from_db() diff --git a/src/backend/joanie/tests/payment/test_models_credit_card.py b/src/backend/joanie/tests/payment/test_models_credit_card.py index 6893e9eeb..0db1817ef 100644 --- a/src/backend/joanie/tests/payment/test_models_credit_card.py +++ b/src/backend/joanie/tests/payment/test_models_credit_card.py @@ -2,7 +2,7 @@ from unittest import mock -from django.core.exceptions import ValidationError +from django.core.exceptions import FieldError, ValidationError from joanie.core import enums from joanie.core.factories import OrderFactory, UserFactory @@ -263,3 +263,29 @@ def test_models_credit_card_delete_unused(self): self.assertFalse( CreditCard.objects.filter(orders__state__in=no_card_order_states).exists() ) + + def test_models_credit_card_owner_field_is_removed(self): + """ + The `owner` field of the CreditCard is removed, it should raise an error if + when we want to set a User. + """ + with self.assertRaises(FieldError) as context: + CreditCardFactory(owner=UserFactory()) + + self.assertEqual( + str(context.exception), + "Invalid field name(s) for model CreditCard: 'owner'.", + ) + + def test_models_credit_card_is_main_field_is_removed(self): + """ + The `is_main` field of the CreditCard is removed, it should raise an error if + when we want to set a boolean value. + """ + with self.assertRaises(FieldError) as context: + CreditCardFactory(is_main=True) + + self.assertEqual( + str(context.exception), + "Invalid field name(s) for model CreditCard: 'is_main'.", + )