как разрешить пользователю-администратору django совершать денежные переводы, которые будут вычитать учетную запись отправителя и кредитовать учетную запись получателя?

У меня есть две таблицы: одна для банковских счетов, а другая для транзакций. Когда пользователь совершает транзакцию (переводит деньги со своей учетной записи на другую учетную запись): сначала я сохраняю номер счета отправителя, номер счета получателя, отправленную сумму и дату транзакции в таблицу транзакций, во-вторых Я также могу вычесть сумму из баланса счета отправителя в таблице счетов, а затем добавить сумму к балансу счета получателя. Все это обрабатывается одним представлением в django.

Две таблицы и представление, которое обрабатывает передачу, выглядят следующим образом:

class Account(models.Model):
      ACCOUNT_TYPES = (
          ('SA' , 'Savings Account' ),
          ('CA' , 'Current Account' ),
          ('JA' , 'Joint Account' ),
      )
      owner = models.ForeignKey(User, on_delete=models.CASCADE, 
      related_name='accounts', verbose_name='The related user')
      account_type = models.CharField(max_length=2, choices=ACCOUNT_TYPES)
      account_number = models.CharField(max_length=13, unique=True)
      account_balance = models.DecimalField(max_digits=18, decimal_places=2)
      last_deposit = models.DecimalField(max_digits=10, decimal_places=2)
      interest_rate = models.DecimalField(max_digits=3, decimal_places=0)
      date_created = models.DateField(auto_now_add=True)

      def __str__(self):
          return self.account_number



class Transaction(models.Model):
      owner = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, 
      null=True)
      from_account = models.CharField(max_length=13)
      to_account = models.CharField(max_length=13)
      amount = models.DecimalField(max_digits=10, decimal_places=2)
      date_created = models.DateField(auto_now_add=True)

      def __str__(self):
        return str(self.amount)


    @login_required(login_url='../../accounts/login/')
def send(request):
    if request.method == 'POST':
        form = forms.TransactionForm(request.POST)
        if form.is_valid():
            sender = Account.objects.get(account_number=request.POST.get('from_account'))
            if sender.account_balance > decimal.Decimal(request.POST.get('amount')):

                trans =  form.save()
                trans.owner = request.user
                trans.save()

                # debit the sender account
                sender.account_balance -= decimal.Decimal(request.POST.get('amount'))
                sender.save()

                #credit the receiver account
                receiver = Account.objects.get(account_number=request.POST.get('to_account'))
                receiver.account_balance += decimal.Decimal(request.POST.get('amount'))
                receiver.save()

                return HttpResponseRedirect(reverse_lazy('customers:history'))
            # else:
            #     return 
    else:
        form = forms.TransactionForm()
        return render(request, "customers/send_money.html", {'form': form})

Но моя проблема в том, как сделать то же самое, когда администратор переводит деньги от имени пользователя. Как вычесть сумму из баланса счета отправителя в таблице счетов, а затем добавить сумму к балансу счета получателя.

Буду очень признателен, если кто-то сможет мне помочь.


person Bernard Codjoe    schedule 16.07.2018    source источник


Ответы (1)


Обходной путь «грязного взлома», но не очень хороший, потому что вы не будете знать, вносит ли пользователь депозит или снимает деньги, пока вы меняете его, находится в вашем файле admin.py в вашем приложении. Пример:

from django.contrib import admin
from .models import Transaction, Account

@admin.register(Account)
class AccountAdmin(admin.ModelAdmin):
    list_display = ('owner', 'account_number', 'account_balance')
    list_filter = ('account_balance', 'account_type', 'date_created')
    list_editable = ['account_balance']

После выполнения вышеуказанного account_balance можно будет редактировать из панели администратора. Обратной стороной является то, что у пользователя было 100 долларов, а администратор хотел снять 50, но пользователь просто пытался одновременно потратить 60.

Или еще хуже: если вы загружаете панель администратора, и у пользователя есть 100, и пока ваша страница не обновляется, они вносят 5000. Затем вы решаете вычесть 50 из значения, которое вы видите, потому что вы его не обновили... Теперь они теряют 4950.

Существуют способы создать собственные функции панели администратора, которые может обновлять его в режиме реального времени. Посмотрите, как это сделать там.

person CyberHavenProgramming    schedule 09.08.2018