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}"