Achievements ~ Data Model - uchicago-cs/chigame GitHub Wiki


A User has played Games:

class User(AbstractUser): *from users/models.py

  • name = models.CharField(_("Name of User"), blank=True, max_length=255)
  • first_name = None # type: ignore
  • last_name = None # type: ignore
  • email = models.EmailField(_("email address"), unique=True)
  • etc.

class Game(models.Model): *from games/models.py

  • name = models.TextField()
  • description = models.TextField()
  • year_published = models.IntegerField(null=True, blank=True)
  • users = models.ManyToManyField(User, related_name="games", blank=True)
  • etc.

A Game has Achievements:

class Achievement(models.Model):

  • class Rarity(models.IntegerChoices):
    • COMMON = 1, ‘Common’
    • UNCOMMON = 2, ‘Uncommon’
    • RARE = 3, ‘Rare’
    • PRECIOUS = 4, ‘Precious’
  • name = models.TextField()
  • description = models.TextField(null=True, blank=True)
  • spoiler = models.BooleanField()
  • rarity = models.IntegerField(choices=Rarity.choices)
  • game = models.ForeignKey(Game, on_delete = models.CASCADE)
  • threshold = models.FloatField(null=True, blank=True, default=1)

A User has Achievements:

class UserAchievement(models.Model):

  • user = models.ForeignKey(User, on_delete = models.CASCADE)

  • achievement = models.ForeignKey(Achievement, on_delete = models.CASCADE)

  • pinned = models.BooleanField()

  • date_earned = models.DateTimeField()

  • last_updated = models.DateTimeField(null=True, blank=True)

  • progress = models.FloatField(null=True, blank=True, default=1)

  • class Meta:

    • unique_together = (user, achievement)