Repository URL to install this package:
|
Version:
0.3.2+sf4 ▾
|
from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import models
from django.contrib.auth.models import (
BaseUserManager,
AbstractBaseUser,
PermissionsMixin,
)
from django.core.exceptions import ValidationError
from web3 import Web3
def validate_ethereum_address(value):
if not Web3.isChecksumAddress(value):
raise ValidationError
class WalletManager(models.Manager):
def create_user(self, ethereum_address: str, ens_name: str = None, ens_avatar: str = None, **kwargs):
"""
Creates and saves a User with the given ethereum address.
"""
if not ethereum_address:
raise ValueError("Users must have an ethereum address")
UserModel = get_user_model()
user = UserModel()
attrs = dict({UserModel.USERNAME_FIELD: ethereum_address}, **kwargs)
for attr, value in attrs.items():
setattr(user, attr, value)
user.set_unusable_password()
user.save(using=self._db)
wallet = self.model()
wallet.ethereum_address = ethereum_address
wallet.ens_name = ens_name
wallet.ens_avatar = ens_avatar
wallet.user = user
wallet.save(using=self._db)
return wallet.user
def create_superuser(self, ethereum_address: str, **kwargs):
"""
Creates and saves a superuser with the given ethereum address.
"""
return self.create_user(ethereum_address, is_admin=True, is_superuser=True, **kwargs)
class Wallet(models.Model):
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
)
# EIP-55 compliant: https://eips.ethereum.org/EIPS/eip-55
ethereum_address = models.CharField(
unique=True,
primary_key=True,
max_length=42,
validators=[validate_ethereum_address],
)
ens_name = models.CharField(max_length=255, blank=True, null=True)
ens_avatar = models.CharField(max_length=255, blank=True, null=True)
created = models.DateTimeField("datetime created", auto_now_add=True)
objects = WalletManager()
def __str__(self):
return self.ethereum_address