71 lines
2.3 KiB
Python
71 lines
2.3 KiB
Python
import stripe
|
|
from django.db import models
|
|
from django.urls import reverse
|
|
from django.contrib.auth.models import AbstractUser
|
|
from localflavor.us.us_states import USPS_CHOICES
|
|
|
|
|
|
class Address(models.Model):
|
|
first_name = models.CharField(max_length=256, blank=True)
|
|
last_name = models.CharField(max_length=256, blank=True)
|
|
street_address_1 = models.CharField(max_length=256, blank=True)
|
|
street_address_2 = models.CharField(max_length=256, blank=True)
|
|
city = models.CharField(max_length=256, blank=True)
|
|
state = models.CharField(
|
|
max_length=2,
|
|
choices=USPS_CHOICES,
|
|
blank=True
|
|
)
|
|
postal_code = models.CharField(max_length=20, blank=True)
|
|
|
|
def as_stripe_dict(self):
|
|
return {
|
|
'name': f'{self.first_name} {self.last_name}',
|
|
'address': {
|
|
'line1': self.street_address_1,
|
|
'line2': self.street_address_2,
|
|
'city': self.city,
|
|
'state': self.state,
|
|
'postal_code': self.postal_code
|
|
}
|
|
}
|
|
|
|
def __str__(self):
|
|
return f"""
|
|
{self.first_name} {self.last_name}
|
|
{self.street_address_1}
|
|
{self.street_address_2}
|
|
{self.city}, {self.state}, {self.postal_code}
|
|
"""
|
|
|
|
def __iter__(self):
|
|
yield ('address_line_1', self.street_address_1),
|
|
yield ('address_line_2', self.street_address_2),
|
|
yield ('admin_area_2', self.city),
|
|
yield ('admin_area_1', self.state),
|
|
yield ('postal_code', self.postal_code),
|
|
yield ('country_code', 'US')
|
|
|
|
|
|
class User(AbstractUser):
|
|
addresses = models.ManyToManyField(
|
|
Address, blank=True, related_name="user_addresses"
|
|
)
|
|
default_shipping_address = models.ForeignKey(
|
|
Address, related_name="+", null=True, blank=True, on_delete=models.SET_NULL
|
|
)
|
|
default_billing_address = models.ForeignKey(
|
|
Address, related_name="+", null=True, blank=True, on_delete=models.SET_NULL
|
|
)
|
|
stripe_id = models.CharField(max_length=255, blank=True)
|
|
|
|
def get_or_create_stripe_id(self):
|
|
if not self.stripe_id:
|
|
response = stripe.Customer.create(
|
|
name=self.first_name + ' ' + self.last_name,
|
|
email=self.email
|
|
)
|
|
self.stripe_id = response['id']
|
|
self.save()
|
|
return self.stripe_id
|