Files
MathApp/family/models.py

56 lines
2.3 KiB
Python

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