from django.db import models class FamilyLink(models.Model): """ اتصال حساب والد به یک فرزند. طبق سند معماری، این اپ فقط به accounts.User ارجاع سبک (parent_user_id / child_user_id) می‌ده، نه FK واقعی. """ STATUS_CHOICES = [('pending', 'در انتظار'), ('accepted', 'پذیرفته‌شده')] parent_user_id = models.IntegerField(db_index=True) # ارجاع سبک به accounts.User child_user_id = models.IntegerField(null=True, blank=True, db_index=True) # ارجاع سبک به accounts.User child_phone = models.CharField(max_length=15, blank=True) invite_code = models.CharField(max_length=10, unique=True) status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='pending') invited_at = models.DateTimeField(auto_now_add=True) accepted_at = models.DateTimeField(null=True, blank=True) class Meta: ordering = ['-invited_at'] constraints = [ # حداکثر یک دعوت pending هم‌زمان برای هر (parent_user_id, child_phone). models.UniqueConstraint( fields=['parent_user_id', 'child_phone'], condition=models.Q(status='pending'), name='uniq_pending_family_invite_per_parent_child', ), ] def __str__(self): return f"famlink-{self.pk}-parent{self.parent_user_id}-child{self.child_user_id or '?'}" class ParentalSettings(models.Model): family_link = models.OneToOneField(FamilyLink, on_delete=models.CASCADE, related_name='settings') daily_limit_minutes = models.PositiveIntegerField(default=60) quiet_hours_start = models.TimeField(null=True, blank=True) quiet_hours_end = models.TimeField(null=True, blank=True) def __str__(self): return f"settings-famlink{self.family_link_id}" class WeeklyReportLog(models.Model): family_link = models.ForeignKey(FamilyLink, on_delete=models.CASCADE, related_name='weekly_reports') week_start = models.DateField() sent_at = models.DateTimeField(null=True, blank=True) opened_at = models.DateTimeField(null=True, blank=True) class Meta: ordering = ['-week_start'] unique_together = [('family_link', 'week_start')] def __str__(self): return f"weekly-famlink{self.family_link_id}-{self.week_start}"