from django.db import models class UserStats(models.Model): user_id = models.IntegerField(unique=True, db_index=True) # ارجاع سبک به accounts.User xp = models.PositiveIntegerField(default=0) coins = models.PositiveIntegerField(default=0) progress_percent = models.FloatField(default=0) def __str__(self): return f"stats-user{self.user_id}" class LeaderboardEntry(models.Model): PERIOD_CHOICES = [('weekly', 'هفتگی'), ('all_time', 'کل زمان')] user_id = models.IntegerField(db_index=True) period = models.CharField(max_length=10, choices=PERIOD_CHOICES) xp_in_period = models.PositiveIntegerField(default=0) rank = models.PositiveIntegerField() class Meta: ordering = ['rank'] def __str__(self): return f"lb-{self.period}-user{self.user_id}-rank{self.rank}" class StreakRecord(models.Model): user_id = models.IntegerField(unique=True, db_index=True) current_streak = models.PositiveIntegerField(default=0) longest_streak = models.PositiveIntegerField(default=0) def __str__(self): return f"streak-user{self.user_id}" class ActiveDay(models.Model): streak = models.ForeignKey(StreakRecord, on_delete=models.CASCADE, related_name='active_days') date = models.DateField() class Meta: ordering = ['date'] def __str__(self): return str(self.date) class UserHearts(models.Model): user_id = models.IntegerField(unique=True, db_index=True) current_hearts = models.PositiveSmallIntegerField(default=5) max_hearts = models.PositiveSmallIntegerField(default=5) next_refill_at = models.DateTimeField(null=True, blank=True) def __str__(self): return f"hearts-user{self.user_id}"