From bd47c2252de647140a6b842c643a24b43c2c0cad Mon Sep 17 00:00:00 2001 From: sahama Date: Sat, 10 Aug 2024 16:08:00 +0330 Subject: [PATCH] rename fields --- ...ent_owner_accesstoken_application_owner.py | 18 +++++++++++++ .../migrations/0003_application_balance.py | 18 +++++++++++++ apps/gooyal_oauth2/models.py | 5 +++- apps/gooyal_oauth2/validators.py | 2 +- ...0005_rename_last_update_user_updated_at.py | 18 +++++++++++++ apps/users/models.py | 2 +- ..._update_transaction_updated_at_and_more.py | 27 +++++++++++++++++++ apps/wallet/models.py | 14 +++++----- apps/wallet/serializers.py | 18 ++++++------- apps/wallet/views.py | 14 ++++++++-- 10 files changed, 116 insertions(+), 20 deletions(-) create mode 100644 apps/gooyal_oauth2/migrations/0002_rename_client_owner_accesstoken_application_owner.py create mode 100644 apps/gooyal_oauth2/migrations/0003_application_balance.py create mode 100644 apps/users/migrations/0005_rename_last_update_user_updated_at.py create mode 100644 apps/wallet/migrations/0002_rename_last_update_transaction_updated_at_and_more.py diff --git a/apps/gooyal_oauth2/migrations/0002_rename_client_owner_accesstoken_application_owner.py b/apps/gooyal_oauth2/migrations/0002_rename_client_owner_accesstoken_application_owner.py new file mode 100644 index 0000000..63c7968 --- /dev/null +++ b/apps/gooyal_oauth2/migrations/0002_rename_client_owner_accesstoken_application_owner.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.6 on 2024-08-10 12:13 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('gooyal_oauth2', '0001_initial'), + ] + + operations = [ + migrations.RenameField( + model_name='accesstoken', + old_name='client_owner', + new_name='application_owner', + ), + ] diff --git a/apps/gooyal_oauth2/migrations/0003_application_balance.py b/apps/gooyal_oauth2/migrations/0003_application_balance.py new file mode 100644 index 0000000..faa9a9e --- /dev/null +++ b/apps/gooyal_oauth2/migrations/0003_application_balance.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.6 on 2024-08-10 12:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('gooyal_oauth2', '0002_rename_client_owner_accesstoken_application_owner'), + ] + + operations = [ + migrations.AddField( + model_name='application', + name='balance', + field=models.BigIntegerField(default=0, verbose_name='balance'), + ), + ] diff --git a/apps/gooyal_oauth2/models.py b/apps/gooyal_oauth2/models.py index 0ffd2bb..78faa62 100644 --- a/apps/gooyal_oauth2/models.py +++ b/apps/gooyal_oauth2/models.py @@ -3,13 +3,15 @@ from django.db import models from oauth2_provider.models import AbstractApplication, AbstractAccessToken, AbstractGrant, AbstractRefreshToken, \ AbstractIDToken import uuid +from django.utils.translation import gettext_lazy as _ + class AccessToken(AbstractAccessToken): id = None uuid = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4, unique=True, db_index=True) detail = models.JSONField(null=True, blank=True) client_id = models.CharField(max_length=255, null=True, blank=True) - client_owner = models.ForeignKey('users.User', on_delete=models.PROTECT, null=True, blank=True) + application_owner = models.ForeignKey('users.User', on_delete=models.PROTECT, null=True, blank=True) class Meta: abstract = False @@ -18,6 +20,7 @@ class AccessToken(AbstractAccessToken): class Application(AbstractApplication): id = None uuid = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4, unique=True, db_index=True) + balance = models.BigIntegerField(_('balance'), default=0) class Meta: abstract = False diff --git a/apps/gooyal_oauth2/validators.py b/apps/gooyal_oauth2/validators.py index e8de68e..95926a7 100755 --- a/apps/gooyal_oauth2/validators.py +++ b/apps/gooyal_oauth2/validators.py @@ -160,7 +160,7 @@ class OAuth2Validator(BaseOAuth2Validator): # pylint: disable=w0223 defaults={ "user": user, "client_id": content["client_id"], - "client_owner": owner, + "application_owner": owner, "application_id": application_uuid, "scope": scope, "expires": expires, diff --git a/apps/users/migrations/0005_rename_last_update_user_updated_at.py b/apps/users/migrations/0005_rename_last_update_user_updated_at.py new file mode 100644 index 0000000..e7b5d2e --- /dev/null +++ b/apps/users/migrations/0005_rename_last_update_user_updated_at.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.6 on 2024-08-10 12:36 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0004_alter_oauthcode_code_verifier'), + ] + + operations = [ + migrations.RenameField( + model_name='user', + old_name='last_update', + new_name='updated_at', + ), + ] diff --git a/apps/users/models.py b/apps/users/models.py index 476756d..87d92d5 100644 --- a/apps/users/models.py +++ b/apps/users/models.py @@ -66,7 +66,7 @@ class User(AbstractUser): iban = models.CharField(null=True, max_length=30, blank=True) iban_verified = models.BooleanField(null=True) - last_update = models.DateTimeField(_('last update'), max_length=30, blank=True, null=True, auto_now=True) + updated_at = models.DateTimeField(_('last update'), max_length=30, blank=True, null=True, auto_now=True) last_login = models.DateTimeField(_('last login'), blank=True, null=True) date_joined = models.DateTimeField(_('date joined'), default=timezone.now) diff --git a/apps/wallet/migrations/0002_rename_last_update_transaction_updated_at_and_more.py b/apps/wallet/migrations/0002_rename_last_update_transaction_updated_at_and_more.py new file mode 100644 index 0000000..067613f --- /dev/null +++ b/apps/wallet/migrations/0002_rename_last_update_transaction_updated_at_and_more.py @@ -0,0 +1,27 @@ +# Generated by Django 5.0.6 on 2024-08-10 12:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wallet', '0001_initial'), + ] + + operations = [ + migrations.RenameField( + model_name='transaction', + old_name='last_update', + new_name='updated_at', + ), + migrations.RemoveField( + model_name='transaction', + name='create', + ), + migrations.AddField( + model_name='transaction', + name='created_at', + field=models.DateTimeField(auto_now=True, null=True, verbose_name='created_at'), + ), + ] diff --git a/apps/wallet/models.py b/apps/wallet/models.py index e29c25e..c0ee142 100755 --- a/apps/wallet/models.py +++ b/apps/wallet/models.py @@ -57,8 +57,10 @@ class Transaction(models.Model): payer = models.ForeignKey(User, on_delete=models.PROTECT, related_name='payments', blank=True, null=True) payee = models.ForeignKey(User, on_delete=models.PROTECT, related_name='receipts') state = models.IntegerField(choices=StateChoices.choices, default=StateChoices.CREATED) - create = models.DateTimeField(_('create'), blank=True, null=True, auto_now=True) - last_update = models.DateTimeField(_('last update'), blank=True, null=True, auto_now=True) + # create = models.DateTimeField(_('create'), blank=True, null=True, auto_now=True) + created_at = models.DateTimeField(_('created_at'), blank=True, null=True, auto_now=True) + # last_update = models.DateTimeField(_('last update'), blank=True, null=True, auto_now=True) + updated_at = models.DateTimeField(_('last update'), blank=True, null=True, auto_now=True) application = models.ForeignKey(oauth2_settings.APPLICATION_MODEL, on_delete=models.PROTECT, related_name='transactions', null=True) detail_id = models.IntegerField(null=True, blank=True) # TODO: or better detail url @@ -83,7 +85,7 @@ class Transaction(models.Model): self.payer = payer with transaction.atomic(): - self.last_update = datetime.datetime.now() + self.updated_at = datetime.datetime.now() if self.payer.balance < self.amount: raise APIException('not enough balance') @@ -115,7 +117,7 @@ class Transaction(models.Model): raise APIException('this transaction is not delayed') with transaction.atomic(): - self.last_update = datetime.datetime.now() + self.updated_at = datetime.datetime.now() self.payee.balance = F('balance') + self.amount self.state = StateChoices.SUCCESS self.payee.save() @@ -133,7 +135,7 @@ class Transaction(models.Model): raise APIException('this transaction is not ready to pay') with transaction.atomic(): - self.last_update = datetime.datetime.now() + self.updated_at = datetime.datetime.now() if self.payer.balance < self.amount: raise APIException('not enough balance') @@ -155,7 +157,7 @@ class Transaction(models.Model): raise APIException('this transaction is not pending') with transaction.atomic(): - self.last_update = datetime.datetime.now() + self.updated_at = datetime.datetime.now() self.payee.balance = F('balance') + self.amount self.state = StateChoices.SUCCESS self.payee.save() diff --git a/apps/wallet/serializers.py b/apps/wallet/serializers.py index e024e44..6256806 100755 --- a/apps/wallet/serializers.py +++ b/apps/wallet/serializers.py @@ -14,15 +14,15 @@ class TransactionSerializer(serializers.ModelSerializer): fields = ('uuid', 'payer', 'payee', - "create", + "created_at", "state", 'amount', 'delay', - 'last_update', + 'updated_at', # 'detail_id', ) - read_only_fields = ['uuid', 'last_update', 'state', 'create'] # , 'detail_id'] + read_only_fields = ['uuid', 'updated_at', 'state', 'created_at'] # , 'detail_id'] def create(self, validated_data): # payer = validated_data.get('payer') @@ -48,15 +48,15 @@ class DepositSerializer(serializers.ModelSerializer): 'uuid', 'payer', 'payee', - "create", + "created_at", "state", 'amount', 'delay', - 'last_update', + 'updated_at', # 'detail_id', ) - read_only_fields = ['last_update', 'state', 'create', 'payer'] # , 'detail_id'] + read_only_fields = ['updated_at', 'state', 'created_at', 'payer'] # , 'detail_id'] def create(self, validated_data): with atomic(): @@ -78,15 +78,15 @@ class WithdrawSerializer(serializers.ModelSerializer): 'uuid', 'payer', 'payee', - "create", + "created_at", "state", 'amount', 'delay', - 'last_update', + 'updated_at', # 'detail_id', ) - read_only_fields = ['last_update', 'state', 'create', 'payee'] # , 'detail_id'] + read_only_fields = ['updated_at', 'state', 'created_at', 'payee'] # , 'detail_id'] def create(self, validated_data): with atomic(): diff --git a/apps/wallet/views.py b/apps/wallet/views.py index 2c564e3..aff32eb 100755 --- a/apps/wallet/views.py +++ b/apps/wallet/views.py @@ -27,6 +27,9 @@ def get_application(request): class WalletBalanceView(generics.RetrieveAPIView): + ''' + API for getting authenticated user balance. + ''' permission_classes = [permissions.IsAuthenticated, IsAuthenticatedOrTokenHasScope] serializer_class = WalletSerializer required_scopes = ['wallet.wallet:get_balance'] @@ -55,10 +58,17 @@ class WalletBalanceView(generics.RetrieveAPIView): # this is application create invoice view class TransactionList(generics.ListCreateAPIView): + ''' + GET: API for getting list of transactions for authenticated user + POST: API for creating transaction for transferring funds from authenticated user to application owner. (deprecated) + args: + - user: authenticated user + + ''' permission_classes = [IsAuthenticatedOrTokenMatchesOASRequirements] serializer_class = TransactionSerializer required_alternate_scopes = { - "GET": [['wallet.transaction:list']], + "GET": [['wallet.user:transaction_list']], "POST": [['wallet.invoice:create']], } @@ -68,7 +78,7 @@ class TransactionList(generics.ListCreateAPIView): def perform_create(self, serializer): payer = self.request.user - payee = self.request.auth.client_owner + payee = self.request.auth.application_owner serializer.save(payer=payer, payee=payee, application=get_application(self.request))