আজকে আমরা withdraw এবং লোন রিকোয়েস্ট ভিউ নিয়ে কাজ করবো। সেজন্যে আমরা আমাদের ট্রানেশন add koro ভিউ কে ইনহেরিট করে নিবো। সেখানে
form_class এ ফরম এর নাম দিবো
title এ Withdraw Form দিবো যেটা কনটেক্সট হিসেবে আমাদের frontend এ চলে যাবে।
এখন এটা যে একটা উইথড্র ফরম সেটা ইউজার জাস্ট টাইটেল দেখে বুঝবে কিন্তু backend এ আমরা কিভাবে বুঝবো যে এটা withdraw ফরম?? সেজন্যে get_initial ফাংশন ইউজ করবো যেটা দিয়ে ফরম এর মধ্যে ইনিশিয়াল ভাবে ভ্যালু সেট করে দেওয়া যায়। আমরা transaction_type সেট করে দিবো উইথড্র নাম দিয়ে।
এখন ফাংশন based ভিউ এ যেমন form.is_valid হইলে কাজ করতাম তেমনি ক্লাস বেজড ভিউ এ form_valid এই ফাংশন এর মধ্যেই আমরা ফরম থেকে পাওয়া ডাটা নিয়ে কাজ করতে পারবো। আমরা ফরম থেকে amount ফিল্ড কে গেট করে আনবো এরপর ইউজার account কে নিবো তারপর উইথড্র amount টা ইউজার এর ব্যালান্স থেকে বিয়োগ করে দিবো এবং ইউজার এর bank account কে সেভ করে ফেলবো আর messages ফ্রেমওয়ার্ক দিয়ে ইউজার কে মেসেজ দিবো যে তার উইথড্র সফল হয়েছে।
Loan Request View :
লোন রিকোয়েস্ট এর জন্যেও উপরের স্টেপ গুলা ফলো করবো জাস্ট চেঞ্জ হচ্ছে আমরা চেক করে দেখবো যে ইউজার এর কতগুলা লোন approve হইছে অর্থাৎ loan_approve ট্রু হইছে, ৩ এর বেশি হলে তাকে বলবো যে লোন এর লিমিট ক্রস করে গেছে আর balance এর সাথে কোনো amount অ্যাড করবো না, এডমিন প্যানেল থেকে এডমিন লোন টা approve করলেই কেবল ব্যালান্স এর সাথে লোন amount অ্যাড হবে।
from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from django.views.generic import CreateView, ListView
from transactions.constants import DEPOSIT, WITHDRAWAL,LOAN, LOAN_PAID
from transactions.forms import (
DepositForm,
WithdrawForm,
LoanRequestForm,
)
from transactions.models import Transaction
class TransactionCreateMixin(LoginRequiredMixin, CreateView):
template_name = 'transactions/transaction_form.html'
model = Transaction
title = ''
success_url = reverse_lazy('transaction_report')
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs.update({
'account': self.request.user.account
})
return kwargs
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) # template e context data pass kora
context.update({
'title': self.title
})
return context
class WithdrawMoneyView(TransactionCreateMixin):
form_class = WithdrawForm
title = 'Withdraw Money'
def get_initial(self):
initial = {'transaction_type': WITHDRAWAL}
return initial
def form_valid(self, form):
amount = form.cleaned_data.get('amount')
self.request.user.account.balance -= form.cleaned_data.get('amount')
# balance = 300
# amount = 5000
self.request.user.account.save(update_fields=['balance'])
messages.success(
self.request,
f'Successfully withdrawn {"{:,.2f}".format(float(amount))}$ from your account'
)
return super().form_valid(form)
class LoanRequestView(TransactionCreateMixin):
form_class = LoanRequestForm
title = 'Request For Loan'
def get_initial(self):
initial = {'transaction_type': LOAN}
return initial
def form_valid(self, form):
amount = form.cleaned_data.get('amount')
current_loan_count = Transaction.objects.filter(
account=self.request.user.account,transaction_type=3,loan_approve=True).count()
if current_loan_count >= 3:
return HttpResponse("You have cross the loan limits")
messages.success(
self.request,
f'Loan request for {"{:,.2f}".format(float(amount))}$ submitted successfully'
)
return super().form_valid(form)