mirror of https://github.com/GOSTSec/gostweb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.9 KiB
58 lines
1.9 KiB
from django import forms |
|
from django.core.exceptions import ValidationError |
|
from django.conf import settings |
|
|
|
from crispy_forms.helper import FormHelper |
|
from crispy_forms.layout import Submit, Layout |
|
|
|
from decimal import Decimal |
|
|
|
from .models import Account |
|
|
|
class SendCoins(forms.Form): |
|
recipient = forms.RegexField( |
|
regex="^[a-zA-Z0-9]{16,35}$", |
|
label="Address or local account") |
|
amount = forms.DecimalField(label="amount", |
|
min_value=Decimal("0.01"), |
|
max_value=Decimal("2000000")) |
|
|
|
|
|
def clean_recipient(self): |
|
"""Validate recipient""" |
|
data = self.cleaned_data["recipient"] |
|
|
|
if (len(data) == 34 or len(data) == 35) and data.startswith("G"): |
|
"""Valid GST address""" |
|
return data |
|
elif len(data) == 16: |
|
"""Account name""" |
|
try: |
|
a = Account.objects.get(name=data) |
|
except Account.DoesNotExist: |
|
raise ValidationError("Invalid account name", code="invalid") |
|
else: |
|
raise ValidationError("Incorrect recipient address/account name", |
|
code="invalid") |
|
|
|
return data |
|
|
|
def clean(self): |
|
"""Check balance""" |
|
if self.user and self.is_valid(): |
|
if len(self.cleaned_data["recipient"]) == 16: |
|
total_amount = self.cleaned_data["amount"] |
|
else: |
|
total_amount = self.cleaned_data["amount"] + \ |
|
settings.GST_NETWORK_FEE + settings.SERVICE_FEE |
|
if self.user.account.balance < total_amount: |
|
raise ValidationError("Not enough coins on balance") |
|
|
|
return self.cleaned_data |
|
|
|
def __init__(self, *args, **kwargs): |
|
self.user = kwargs.pop('user', None) |
|
super(SendCoins, self).__init__(*args, **kwargs) |
|
self.helper = FormHelper() |
|
self.helper.form_method = 'post' |
|
self.helper.add_input(Submit('submit', 'Send'))
|
|
|