from django.db import models class FamilyLink(models.Model): """ اتصال حساب والد به یک فرزند. طبق سند معماری، این اپ فقط به accounts.User ارجاع سبک (parent_user_id / child_user_id) می‌ده، نه FK واقعی. ⚠️ افزوده نسبت به سند اولیه: سند models فقط parent_user_id/child_user_id را مشخص کرده بود، ولی برای پیاده‌سازی واقعی جریان «دعوت با کد» (طبق سند Endpointها: POST /api/family/link/invite و /api/family/link/accept) باید خود کد دعوت و شماره‌ی فرزندی که هنوز ثبت‌نام نکرده جایی نگه داشته بشه؛ دقیقاً همون الگویی که accounts.OTPCode برای نگه‌داشتن کد یک‌بارمصرف استفاده می‌کنه. اگه این دو فیلد قرار بود جای دیگه‌ای (مثلاً یک مدل Invite جدا) نگه داشته بشن، می‌شه بعداً جابه‌جا کرد. """ 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'] 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}"