from django.db import models from django.contrib.auth.models import User from django.db.models.signals import post_save from django.dispatch import receiver class UserProfile(models.Model): GENDER_CHOICES = ( ('male', 'Male'), ('female', 'Female'), ('other', 'Other'), ('prefer-not-to-say', 'Prefer not to say'), ) user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') phone_number = models.CharField(max_length=20, blank=True, null=True) date_of_birth = models.DateField(blank=True, null=True) gender = models.CharField(max_length=20, choices=GENDER_CHOICES, default='prefer-not-to-say') avatar = models.ImageField(upload_to='avatars/', blank=True, null=True) bio = models.TextField(blank=True, null=True) @property def total_requests(self): """Dynamically count user's photo requests.""" return self.user.photo_requests.count() @property def photos_found(self): """Dynamically count total photos found across all requests.""" total = 0 for request in self.user.photo_requests.filter(status='completed'): if request.found_photos: total += len(request.found_photos) return total def __str__(self): return f"{self.user.username}'s Profile" class SupportRequest(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='support_requests') subject = models.CharField(max_length=255) message = models.TextField() status = models.CharField(max_length=20, default='open', choices=( ('open', 'Open'), ('in_progress', 'In Progress'), ('resolved', 'Resolved'), ('closed', 'Closed'), )) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self): return f"{self.user.username} - {self.subject} ({self.status})" @receiver(post_save, sender=User) def create_user_profile(sender, instance, created, **kwargs): if created: UserProfile.objects.create(user=instance) @receiver(post_save, sender=User) def save_user_profile(sender, instance, **kwargs): UserProfile.objects.get_or_create(user=instance) instance.profile.save()