35 lines
1.5 KiB
Python
35 lines
1.5 KiB
Python
from django.db import models
|
|
|
|
|
|
class DiscountCode(models.Model):
|
|
TYPE_CHOICES = [('percent', 'درصدی'), ('fixed', 'مبلغ ثابت')]
|
|
|
|
code = models.CharField(max_length=30, unique=True)
|
|
type = models.CharField(max_length=10, choices=TYPE_CHOICES)
|
|
value = models.PositiveIntegerField()
|
|
max_uses = models.PositiveIntegerField(default=1)
|
|
expires_at = models.DateTimeField(null=True, blank=True)
|
|
|
|
def __str__(self):
|
|
return self.code
|
|
|
|
|
|
class Redemption(models.Model):
|
|
discount_code = models.ForeignKey(DiscountCode, on_delete=models.CASCADE, related_name='redemptions')
|
|
user_id = models.IntegerField(db_index=True) # ارجاع سبک به accounts.User
|
|
order_id = models.IntegerField() # ارجاع سبک به payment.Order
|
|
redeemed_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
class Meta:
|
|
# هر کاربر برای یک کد تخفیف حداکثر یکبار میتونه redeem کنه؛
|
|
# قبلاً هیچ محدودیتی در سطح دیتابیس نبود و همراه با نبود چک max_uses
|
|
# در RedeemDiscountView، امکان استفادهی نامحدود از یک کد وجود داشت.
|
|
constraints = [
|
|
models.UniqueConstraint(
|
|
fields=['discount_code', 'user_id'], name='unique_redemption_per_user_per_code'
|
|
)
|
|
]
|
|
|
|
def __str__(self):
|
|
return f"redemption-{self.discount_code_id}-order{self.order_id}"
|