Last bit of major changes
Closes #1 Closes #5 Closes #6 Closes #8 Closes #9 Closes #10
This commit is contained in:
@@ -55,13 +55,44 @@ class Address(models.Model):
|
||||
|
||||
class PaymentMethod(models.Model):
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='payment_methods')
|
||||
# For now, we'll store mock data. In a real app complexity is higher (PCI compliance etc)
|
||||
billing_address = models.ForeignKey(Address, on_delete=models.SET_NULL, null=True, blank=True, related_name='payment_methods')
|
||||
|
||||
brand = models.CharField(max_length=50) # Visa, Mastercard
|
||||
last4 = models.CharField(max_length=4)
|
||||
exp_month = models.PositiveIntegerField()
|
||||
exp_year = models.PositiveIntegerField()
|
||||
is_default = models.BooleanField(default=False)
|
||||
|
||||
# Encrypted fields
|
||||
card_number_encrypted = models.BinaryField(blank=True, null=True)
|
||||
cvv_encrypted = models.BinaryField(blank=True, null=True)
|
||||
|
||||
@property
|
||||
def card_number(self):
|
||||
try:
|
||||
from store.utils import Encryptor
|
||||
return Encryptor.decrypt(self.card_number_encrypted)
|
||||
except ImportError:
|
||||
# Fallback if store isn't ready or circular import
|
||||
return None
|
||||
|
||||
@card_number.setter
|
||||
def card_number(self, value):
|
||||
from store.utils import Encryptor
|
||||
self.card_number_encrypted = Encryptor.encrypt(value)
|
||||
if value and len(str(value)) >= 4:
|
||||
self.last4 = str(value)[-4:]
|
||||
|
||||
@property
|
||||
def cvv(self):
|
||||
from store.utils import Encryptor
|
||||
return Encryptor.decrypt(self.cvv_encrypted)
|
||||
|
||||
@cvv.setter
|
||||
def cvv(self, value):
|
||||
from store.utils import Encryptor
|
||||
self.cvv_encrypted = Encryptor.encrypt(value)
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.brand} ending in {self.last4}"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user