Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
django-siwe-auth / siwe_auth / models.py
Size: Mime:
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