Skip to content

models

django_spire.auth.mfa.models

MfaCode

Bases: Model

user = models.ForeignKey(User, on_delete=(models.CASCADE), related_query_name='mfa_code', related_name='mfa_codes') class-attribute instance-attribute

code = models.CharField(max_length=6, editable=False, unique=True) class-attribute instance-attribute

expiration_datetime = models.DateTimeField(editable=False) class-attribute instance-attribute

objects = MfaCodeQuerySet.as_manager() class-attribute instance-attribute

Meta

db_table = 'django_spire_authentication_mfa_code' class-attribute instance-attribute
verbose_name = 'MFA Code' class-attribute instance-attribute
verbose_name_plural = 'MFA Codes' class-attribute instance-attribute

__str__

Source code in django_spire/auth/mfa/models.py
def __str__(self):
    return f'{self.expiration_datetime} - {self.code}'

is_valid

Source code in django_spire/auth/mfa/models.py
def is_valid(self) -> bool:
    return self.expiration_datetime > localtime()

set_expired

Source code in django_spire/auth/mfa/models.py
def set_expired(self) -> None:
    self.expiration_datetime = localtime()
    self.save()

send_notification

Source code in django_spire/auth/mfa/models.py
def send_notification(self):
    user = self.user

    context_data = {
        'title': 'Authentication Code',
        'body': f"Here is your multifactor authentication code: </br> <h3>{self.code}</h3>",
        'name': user.first_name,
        'button_url': f'{Site.objects.get_current()}/{reverse("authentication:redirect:login_redirect")[1:]}'
    }

    # Directly connecting to SendGrid to send MFA email faster
    SendGridEmailHelper(
        to=[user.email],
        template_id='d-9ae6be6be95d4f79b0daad9055f03cc9',
        template_data=context_data,
        fail_silently=False
    ).send()

generate_code classmethod

Source code in django_spire/auth/mfa/models.py
@classmethod
def generate_code(cls, user):
    return MfaCode.objects.create(
        user=user,
        code=int(''.join([str(random.randint(0, 9)) for _ in range(6)])),
        expiration_datetime=localtime() + relativedelta.relativedelta(minutes=5)
    )