models.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. from django.contrib.auth import get_user_model
  2. from django.core.validators import MaxValueValidator, MinValueValidator
  3. from django.db import models
  4. from django.db.models.deletion import CASCADE, DO_NOTHING
  5. from django.utils import timezone
  6. from django_extensions.db.models import TimeStampedModel
  7. from simple_history.models import HistoricalRecords
  8. from django.db.models import F, Q
  9. from games.models import Game
  10. User = get_user_model()
  11. class UserGamePlaythrough(TimeStampedModel):
  12. user = models.ForeignKey(User, on_delete=models.CASCADE)
  13. game = models.ForeignKey(Game, on_delete=DO_NOTHING)
  14. started_ts = models.DateTimeField(default=timezone.now, blank=True)
  15. finished_ts = models.DateTimeField(blank=True, null=True)
  16. percent = models.IntegerField(
  17. default=0,
  18. validators=[MaxValueValidator(100), MinValueValidator(0)],
  19. help_text="Keeps track of how far through the game you are",
  20. )
  21. history = HistoricalRecords()
  22. def __str__(self):
  23. return f"Progress in {self.game} for {self.user} ({self.percent}%)"
  24. def create_update(self):
  25. """Add an update to our playthrough"""
  26. if self.progress:
  27. return self.usergameplaythroughupdate_set.create(
  28. user=self.user, percent=self.percent
  29. )
  30. return None
  31. class Meta:
  32. """Don't let playthroughs end before they start"""
  33. constraints = [
  34. models.CheckConstraint(
  35. check=Q(finished_ts__gte=F("started_ts")), name="chronology"
  36. )
  37. ]
  38. ordering = ("-started_ts",)
  39. class UserGamePlaythroughUpdate(TimeStampedModel):
  40. user = models.ForeignKey(User, on_delete=models.CASCADE)
  41. playthrough = models.ForeignKey(
  42. UserGamePlaythrough, on_delete=models.DO_NOTHING
  43. )
  44. percent = models.IntegerField(
  45. default=0,
  46. validators=[MaxValueValidator(100), MinValueValidator(0)],
  47. help_text="Keeps track of how far through the game you are",
  48. )
  49. def __str__(self):
  50. return f"Progress in {self.game} for {self.user} ({self.percent}%)"
  51. def save(self, *args, **kwargs):
  52. """Can't hide from us, user was active!"""
  53. self.user.user_profile.update_active_date()
  54. super().save(*args, **kwargs)
  55. class UserProfile(models.Model):
  56. user = models.OneToOneField(
  57. User, on_delete=CASCADE, related_name="profile"
  58. )
  59. favorite_games = models.ManyToManyField(
  60. Game, related_name="favorite_games"
  61. )
  62. last_active = models.DateTimeField(blank=True, null=True)
  63. def __str__(self):
  64. return f"User profile for {self.user}"
  65. def update_active_date(self):
  66. self.last_active = timezone.now()
  67. self.save()