56 lines
2.8 KiB
Python
56 lines
2.8 KiB
Python
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}"
|