""" Model definitions for the quiz """ from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models class CriterionRating(models.Model): """ This is the relation between Sport and Criterion. You can use it to add a rating for a specific criterion to a sport. To see it's usage check Sport.rate() and Sport.get_rating() """ rating = models.IntegerField( validators=[MaxValueValidator(10), MinValueValidator(0)] ) criterion = models.ForeignKey("Criterion", on_delete=models.CASCADE) sport = models.ForeignKey("Sport", on_delete=models.CASCADE) class Sport(models.Model): """ Defines a Sport with name, url that leads to the booking page. A sport includes ratings for all criterions. (e.g. How much it corresponds to the criterion "Martial Arts") """ name = models.TextField() url = models.URLField() criteria_ratings = models.ManyToManyField("Criterion", through="CriterionRating") def __str__(self): return self.name def rate(self, criterion, rating): """Defines how much (rating) the sport meets the given criterion""" rating = CriterionRating(sport=self, criterion=criterion, rating=rating) rating.save() def get_rating(self, criterion): """Returns how much the sport meets the given criterion""" criterion_rating = CriterionRating.objects.get(sport=self, criterion=criterion) return criterion_rating.rating class Criterion(models.Model): """ Defines a Sport property that is used a a criterion for our quiz. (e.g. Individual or Team sport) """ name = models.TextField()