Skip to content

Commit

Permalink
flake8
Browse files Browse the repository at this point in the history
  • Loading branch information
Mark Prikhno committed May 27, 2023
1 parent 0b744bc commit d6e372c
Show file tree
Hide file tree
Showing 8 changed files with 65 additions and 36 deletions.
3 changes: 3 additions & 0 deletions .flake8
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[flake8]
max-line-length = 127
exclude = .git,./tips/migrations
2 changes: 1 addition & 1 deletion tips/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@
admin.site.register(Customer)
admin.site.register(Waiter)
admin.site.register(CafeAdmin)
admin.site.register(Transaction)
admin.site.register(Transaction)
2 changes: 2 additions & 0 deletions tips/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from django.contrib.auth.forms import UserCreationForm
from .models import User


class NewUserForm(UserCreationForm):
username = forms.CharField(max_length=20, required=True)
first_name = forms.CharField(max_length=20)
Expand All @@ -22,5 +23,6 @@ def save(self, commit=True):
user.save()
return user


class TipForm(forms.Form):
rub_amount = forms.IntegerField(label="rub_amount")
10 changes: 6 additions & 4 deletions tips/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
from django.db.models.signals import post_save, pre_save
from django.dispatch import receiver
from django.core.validators import MinLengthValidator
from .web3_client import Web3Client


class Cafe(models.Model):
Expand All @@ -22,8 +21,8 @@ class User(AbstractBaseUser, PermissionsMixin):
last_name = models.CharField(max_length=20)
email = models.CharField(max_length=50)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False) # a admin user; non super-user
is_superuser = models.BooleanField(default=False) # a superuser
is_staff = models.BooleanField(default=False) # a admin user; non super-user
is_superuser = models.BooleanField(default=False) # a superuser
last_login = models.DateTimeField(null=True, blank=True)
date_joined = models.DateTimeField(auto_now_add=True)

Expand Down Expand Up @@ -56,6 +55,7 @@ class Waiter(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
waiter_wallet = models.CharField(max_length=42, blank=True, validators=[MinLengthValidator(42)])
cafe = models.ForeignKey(Cafe, on_delete=models.CASCADE)

def __str__(self):
return f"Waiter {self.user.username} in cafe {self.cafe.title}, wallet: {self.waiter_wallet}"

Expand All @@ -70,6 +70,7 @@ def create_waiter_account(sender, instance, **kwargs):
class CafeAdmin(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
cafe = models.ForeignKey(Cafe, on_delete=models.CASCADE)

def __str__(self):
return f"Cafe admin {self.user.username} in cafe {self.cafe.title}"

Expand All @@ -83,4 +84,5 @@ class Transaction(models.Model):
comment = models.CharField(max_length=200)

def __str__(self):
return f"Transaction {self.id} from customer {self.customer} to waiter {self.waiter}, datetime: {self.datetime}, amount: {self.amount}, comment: {self.comment}"
return (f"Transaction {self.id} from customer {self.customer} to waiter {self.waiter},"
f"datetime: {self.datetime}, amount: {self.amount}, comment: {self.comment}")
12 changes: 11 additions & 1 deletion tips/tests.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
from django.test import TestCase
from .models import User, Customer

# Create your tests here.

class UserTestCase(TestCase):
def setUp(self):
User.objects.create(username="test", first_name="Test", second_name="Testovich", email="[email protected]")

def test_customer_creation(self):
"""Customer object should be created for each user"""
user = User.objects.get(username="test")
customer = Customer.objects.get(user=user)
self.assertEqual(user, customer.user)
2 changes: 1 addition & 1 deletion tips/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@
path('login', views.login_user, name='login'),
path('logout', login_required(views.logout_user), name='logout'),
path('<str:username>', views.iamview, name='user')
]
]
32 changes: 20 additions & 12 deletions tips/views.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from django.http import HttpResponse
from django.shortcuts import render, get_object_or_404, redirect
from django.shortcuts import render, redirect
from django.views import generic
from django.contrib.auth import login, authenticate, logout
from django.contrib.auth.forms import AuthenticationForm
Expand Down Expand Up @@ -40,7 +39,8 @@ class WaiterView(generic.DetailView):
template_name = "tips/waiter.html"

def get_object(self):
return self.model.objects.get(cafe=Cafe.objects.get(slug=self.kwargs['cafe_slug']), user=User.objects.get(username=self.kwargs['waiter_username']))
return self.model.objects.get(cafe=Cafe.objects.get(slug=self.kwargs['cafe_slug']),
user=User.objects.get(username=self.kwargs['waiter_username']))


def waiterview(request, cafe_slug, waiter_username):
Expand All @@ -56,15 +56,18 @@ def waiterview(request, cafe_slug, waiter_username):
messages.error(request, f"Could not buy {rub_amount} PEKOE tokens...")
return redirect("tips:waiter", cafe_slug=cafe_slug, waiter_username=waiter_username)
# transfer rub_amount PEKOE tokens from customer to waiter
transfer_status = web3client.transfer(request.user.customer.customer_wallet, waiter.waiter_wallet, rub_amount, 'CUSTOMER_PK') # TODO: use Metamask
transfer_status = web3client.transfer(request.user.customer.customer_wallet,
waiter.waiter_wallet, rub_amount, 'CUSTOMER_PK') # TODO: use Metamask
if not transfer_status:
messages.error(request, f"Could not transfer {rub_amount} PEKOE tokens to @{waiter_username}...")
return redirect("tips:waiter", cafe_slug=cafe_slug, waiter_username=waiter_username)
# save transaction to db
txn = Transaction(customer=request.user.customer, waiter=waiter, amount=rub_amount, comment="") # TODO: add comment field
txn = Transaction(customer=request.user.customer, waiter=waiter,
amount=rub_amount, comment="") # TODO: add comment field
txn.save(force_insert=True)
# burn and mint tokens from waiter
fiat_status = web3client.exchange_fiat(waiter.waiter_wallet, rub_amount, 'WAITER_PK') # TODO: to move to waiter page
fiat_status = web3client.exchange_fiat(waiter.waiter_wallet,
rub_amount, 'WAITER_PK') # TODO: to move to waiter page
if not fiat_status:
messages.error(request, f"Could not exchange {rub_amount} for fiat for @{waiter_username}...")
return redirect("tips:waiter", cafe_slug=cafe_slug, waiter_username=waiter_username)
Expand All @@ -82,13 +85,16 @@ def waiterview(request, cafe_slug, waiter_username):
@login_required
def iamview(request, username):
web3client = Web3Client()
user_form_class = modelform_factory(User, fields=['first_name', 'last_name', 'email'], widgets={'first_name': forms.TextInput, 'last_name': forms.TextInput, 'email': forms.EmailInput})
user_form_class = modelform_factory(User, fields=['first_name', 'last_name', 'email'],
widgets={'first_name': forms.TextInput, 'last_name': forms.TextInput,
'email': forms.EmailInput})
customer_form_class = modelform_factory(Customer, fields=["customer_wallet"], widgets={"customer_wallet": forms.TextInput})
waiter_form_class = modelform_factory(Waiter, fields=["waiter_wallet"], widgets={"waiter_wallet": forms.TextInput})
if request.method == "POST":
user_form = user_form_class(request.POST, instance=request.user)
customer_form = customer_form_class(request.POST, instance=request.user.customer)
waiter_forms = {waiter.cafe.slug: waiter_form_class(request.POST, instance=waiter) for waiter in request.user.waiter_set.all()}
waiter_forms = {waiter.cafe.slug: waiter_form_class(request.POST, instance=waiter)
for waiter in request.user.waiter_set.all()}
if user_form.is_valid():
user_form.save()
if len(user_form.changed_data) > 0:
Expand Down Expand Up @@ -118,8 +124,10 @@ def iamview(request, username):
"customer_transactions": request.user.customer.transaction_set.all(),
"customer_balance": web3client.balance_of(request.user.customer.customer_wallet),
"waiter_forms": waiter_forms,
"waiter_transactions": {waiter.cafe.slug: waiter.transaction_set.all() for waiter in request.user.waiter_set.all()},
"waiter_balance": {waiter.cafe.slug: web3client.balance_of(waiter.waiter_wallet) for waiter in request.user.waiter_set.all()}
"waiter_transactions": {waiter.cafe.slug: waiter.transaction_set.all()
for waiter in request.user.waiter_set.all()},
"waiter_balance": {waiter.cafe.slug: web3client.balance_of(waiter.waiter_wallet)
for waiter in request.user.waiter_set.all()}
}
return render(request=request, template_name="tips/iam.html", context=context)

Expand All @@ -135,7 +143,7 @@ def registration(request):
return redirect("tips:index")
messages.error(request, "Unsuccessful registration. Invalid information.")
form = NewUserForm()
return render(request=request, template_name="tips/register.html", context={"register_form":form})
return render(request=request, template_name="tips/register.html", context={"register_form": form})


def login_user(request): # custom auth form? OTP?
Expand All @@ -150,7 +158,7 @@ def login_user(request): # custom auth form? OTP?
return redirect("tips:index")
messages.error(request, "Invalid username or password.")
form = AuthenticationForm()
return render(request=request, template_name="tips/login.html", context={"login_form":form})
return render(request=request, template_name="tips/login.html", context={"login_form": form})


def logout_user(request):
Expand Down
38 changes: 21 additions & 17 deletions tips/web3_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

class SingletonMetaclass(type):
_instance = None

def __call__(cls, *args, **kwargs):
assert not (args or kwargs), 'Singletone does not accept arguments'
if isinstance(cls._instance, cls):
Expand Down Expand Up @@ -38,14 +39,14 @@ def __init__(self):
self.abi = f.read()
self.pekoe = self.w3.eth.contract(address=self.address, abi=self.abi)
print(f'Contract instance {self.address} initialized.')

# balance of deployment_account
def balance(self):
return self.pekoe.functions.balanceOf(self.deployment_account.address).call()

def balance_of(self, account):
return self.pekoe.functions.balanceOf(account).call()

# simulate buying of the tokens
def buy(self, account, amount):
print(f"Buying {amount} PEKOE tokens for {account}...")
Expand All @@ -60,7 +61,7 @@ def buy(self, account, amount):
print(tx_receipt)
print(f"{amount} PEKOE tokens for {account} bought.")
return True

# transfer ETH to the account to pay gas fees
def _transfer_fee(self, account, eth):
print(f"Transferring {eth} ETH for gas fees to account {account}...")
Expand All @@ -76,19 +77,20 @@ def _transfer_fee(self, account, eth):
print(tx_receipt)
print(f'{eth} ETH for gas fee to {account} transferred.')
return True
# approve usage(transferFrom/burnFrom) for amount of tokens of account for deployment_account

# approve usage(transferFrom/burnFrom) for amount of tokens of account for deployment_account
def _approve_allowance(self, account, amount, pk_env):
# check allowance
cur_allowance = self.pekoe.functions.allowance(account, self.deployment_account.address).call()
if cur_allowance < amount:
print(f"Approving retrieval of {amount} PEKOE tokens from {account} for {self.deployment_account.address}...")
# should approve first
unsent_approve_tx = self.pekoe.functions.approve(self.deployment_account.address, amount - cur_allowance).build_transaction({
'from': account,
'nonce': self.w3.eth.get_transaction_count(account)})
unsent_approve_tx = self.pekoe.functions.approve(self.deployment_account.address,
amount - cur_allowance).build_transaction(
{'from': account, 'nonce': self.w3.eth.get_transaction_count(account)})
self._transfer_fee(account, unsent_approve_tx['maxFeePerGas'] * unsent_approve_tx['gas'])
signed_approve_tx = self.w3.eth.account.sign_transaction(unsent_approve_tx, private_key=os.environ.get(pk_env)) # optimally: inject Metamask
signed_approve_tx = self.w3.eth.account.sign_transaction(unsent_approve_tx,
private_key=os.environ.get(pk_env))
approve_tx_hash = self.w3.eth.send_raw_transaction(signed_approve_tx.rawTransaction)
try:
approve_tx_receipt = self.w3.eth.wait_for_transaction_receipt(approve_tx_hash)
Expand All @@ -105,23 +107,25 @@ def transfer(self, from_account, to_account, amount, pk_env):
if not approval_res:
return False
print(f'Transferring {amount} PEKOE tokens from customer {from_account} to waiter {to_account}...')
tx_hash = self.pekoe.functions.transferFrom(from_account, to_account, amount).transact({'from': self.deployment_account.address})
tx_hash = self.pekoe.functions.transferFrom(from_account, to_account,
amount).transact({'from': self.deployment_account.address})
try:
tx_receipt = self.w3.eth.wait_for_transaction_receipt(tx_hash)
except TimeExhausted as e:
except TimeExhausted:
print(f"Transaction {tx_hash} took to long to be added to the block.")
return False
print(tx_receipt)
print(f'Transferred {amount} PEKOE tokens from customer {from_account} to waiter {to_account}.')
return tx_receipt["status"] == 1

def _mint(self, amount):
print(f"Deployment account balance: {self.balance()}")
print(f"Minting {amount} PEKOE tokens after burning...")
tx_hash = self.pekoe.functions.mint(self.deployment_account.address, amount).transact({'from': self.deployment_account.address})
tx_hash = self.pekoe.functions.mint(self.deployment_account.address,
amount).transact({'from': self.deployment_account.address})
try:
tx_receipt = self.w3.eth.wait_for_transaction_receipt(tx_hash)
except TimeExhausted as e:
except TimeExhausted:
print(f"Transaction {tx_hash} took to long to be added to the block.")
return False
print(tx_receipt)
Expand All @@ -137,7 +141,7 @@ def _burn(self, account, amount, pk_env):
tx_hash = self.pekoe.functions.burnFrom(account, amount).transact({'from': self.deployment_account.address})
try:
tx_receipt = self.w3.eth.wait_for_transaction_receipt(tx_hash)
except TimeExhausted as e:
except TimeExhausted:
print(f"Transaction {tx_hash} took to long to be added to the block.")
return False
print(tx_receipt)
Expand All @@ -152,4 +156,4 @@ def exchange_fiat(self, account, amount, pk_env):
res = self._mint(amount)
if not res:
return False
return True
return True

0 comments on commit d6e372c

Please sign in to comment.