From fe5fc3fadc45cb332bf19698a1fe1754a134fbc2 Mon Sep 17 00:00:00 2001 From: Sayyid Hamid Mahdavi Date: Thu, 13 Mar 2025 10:35:07 +0330 Subject: [PATCH] accounts client --- apps/wallet/models.py | 41 ++++++++++++++++++++++++++++++++++++-- apps/wallet/serializers.py | 4 ++++ utils/accounts_client.py | 10 ++++++---- 3 files changed, 49 insertions(+), 6 deletions(-) diff --git a/apps/wallet/models.py b/apps/wallet/models.py index 379e768..a10c3d5 100755 --- a/apps/wallet/models.py +++ b/apps/wallet/models.py @@ -9,6 +9,9 @@ from django.utils.translation import gettext_lazy as _ from rest_framework.exceptions import APIException, ValidationError from django.conf import settings from oauth2_provider import settings as oauth2_settings + +from gooyal_accounts_client.models import PublicUser +from utils.accounts_client import get_user_details, get_application_details from .constans import StateChoices, TypeChoices from apps.users.models import User from ..gooyal_oauth2.models import Application @@ -208,8 +211,42 @@ class Transaction(models.Model): return 0 def update_details(self, force_update=False): - # detail = {'payer_name', 'payee_name', 'application_name', 'payer_avatar_url', 'payee_avatar_url'} - pass + # detail = {'payer_name', 'payee_name', 'application_name', 'payer_avatar_url', 'payee_avatar_url', 'application_avatar_url'} + is_updated = False + if not self.details.get('payer_name'): + if self.payer_type == TypeChoices.USER.value: + payer_details: PublicUser = get_user_details(self.payer_id) + self.details['payer_name'] = payer_details.first_name + payer_details.last_name + self.details['payer_avatar_url'] = payer_details.avatar + else: + payer_details = get_application_details(self.payer_id) + self.details['payer_name'] = payer_details.name + #TODO: get avatar from details + + is_updated = True + + if not self.details.get('payee_name'): + if self.payee_type == TypeChoices.USER.value: + payee_details: PublicUser = get_user_details(self.payee_id) + self.details['payee_name'] = payee_details.first_name + payee_details.last_name + self.details['payee_avatar_url'] = payee_details.avatar + else: + payee_details = get_application_details(self.payee_id) + self.details['payee_name'] = payee_details.name + #TODO: get avatar from details + + is_updated = True + + if not self.details.get('application_name'): + application_details = get_application_details(self.application_id) + self.details['application_name'] = application_details.name + # TODO: get avatar from details + + is_updated = True + + if is_updated: + self.save() + def __str__(self): return f"{self.get_payer()} -> {self.get_payee()} ({self.uuid}): {self.amount} - {self.get_state_display()}" diff --git a/apps/wallet/serializers.py b/apps/wallet/serializers.py index d824fa9..6327f38 100755 --- a/apps/wallet/serializers.py +++ b/apps/wallet/serializers.py @@ -32,6 +32,10 @@ class BaseTransactionSerializer(serializers.ModelSerializer): read_only_fields = ['uuid', 'updated_at', 'state', 'created_at', 'details', 'role'] + def to_representation(self, instance): + instance.update_details() + return super().to_representation(instance) + class UserTransactionSerializer(BaseTransactionSerializer): diff --git a/utils/accounts_client.py b/utils/accounts_client.py index ad59f03..43f3177 100644 --- a/utils/accounts_client.py +++ b/utils/accounts_client.py @@ -41,13 +41,14 @@ def login_as_client_credentials(): return auth_data - -access_token = login_as_client_credentials()['access_token'] - -client = AuthenticatedClient(base_url="https://accounts.gooyal.com", token=access_token) +def get_client(): + access_token = login_as_client_credentials()['access_token'] + client = AuthenticatedClient(base_url="https://accounts.gooyal.com", token=access_token) + return client def get_user_details(uuid): + client = get_client() data: PublicUser = users_api_users_retrieve.sync(client=client, uuid=uuid) print(data) # or if you need more info (e.g. status_code) @@ -56,6 +57,7 @@ def get_user_details(uuid): return data def get_application_details(uuid): + client = get_client() data: Application = oauth2_apis_applications_retrieve.sync(client=client, id=uuid) print(data)