c836f642fa
This avoid the weird double username situation where we want to give the users the choice of their displayed name but at the same time we need them to never change their CAS username. Now CAS matches on email so we do not have problems.
119 lines
3.9 KiB
Python
119 lines
3.9 KiB
Python
from django.db import models
|
|
from django.urls import reverse
|
|
from django.core.exceptions import ValidationError
|
|
from autoslug import AutoSlugField
|
|
from accounts.models import User
|
|
|
|
|
|
class Category(models.Model):
|
|
name = models.CharField(max_length=256, verbose_name="nom")
|
|
slug = AutoSlugField(populate_from="name", unique=True)
|
|
|
|
class Meta:
|
|
ordering = ["name"]
|
|
verbose_name = "catégorie"
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
def get_absolute_url(self):
|
|
return reverse("inventory:category", args=(self.slug,))
|
|
|
|
|
|
class Tag(models.Model):
|
|
name = models.CharField(max_length=256, verbose_name="nom")
|
|
slug = AutoSlugField(populate_from="name", unique=True)
|
|
|
|
class Meta:
|
|
ordering = ["name"]
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
def get_absolute_url(self):
|
|
return reverse("inventory:tag", args=(self.slug,))
|
|
|
|
|
|
class Game(models.Model):
|
|
title = models.CharField(verbose_name="titre", max_length=256)
|
|
slug = AutoSlugField(populate_from="title", unique=True)
|
|
nb_player_min = models.PositiveSmallIntegerField(
|
|
verbose_name="nombre de joueur·se·s minimum"
|
|
)
|
|
nb_player_max = models.PositiveSmallIntegerField(
|
|
verbose_name="nombre de joueur·se·s maximum"
|
|
)
|
|
player_range = models.CharField(
|
|
max_length=256,
|
|
blank=True,
|
|
help_text="Affichage personnalisé pour le nombre de joueur·se·s",
|
|
verbose_name="nombre de joueur·se·s",
|
|
)
|
|
duration = models.CharField(
|
|
max_length=256, blank=True, verbose_name="durée de partie"
|
|
)
|
|
game_designer = models.CharField(
|
|
max_length=256, blank=True, verbose_name="game designer"
|
|
)
|
|
illustrator = models.CharField(
|
|
max_length=256, blank=True, verbose_name="illustrateur·trice"
|
|
)
|
|
editor = models.CharField(max_length=256, blank=True, verbose_name="éditeur")
|
|
description = models.TextField(blank=True, verbose_name="description")
|
|
category = models.ForeignKey(
|
|
Category, on_delete=models.RESTRICT, verbose_name="catégorie"
|
|
)
|
|
tags = models.ManyToManyField(Tag, blank=True, verbose_name="tags")
|
|
image = models.ImageField(upload_to="game_img/", blank=True, verbose_name="image")
|
|
missing_elements = models.TextField(blank=True, verbose_name="pièces manquantes")
|
|
|
|
class Meta:
|
|
ordering = ["title"]
|
|
verbose_name = "jeu"
|
|
verbose_name_plural = "jeux"
|
|
|
|
def __str__(self):
|
|
return self.title
|
|
|
|
def clean(self):
|
|
if self.nb_player_min > self.nb_player_max:
|
|
raise ValidationError(
|
|
{
|
|
"nb_player_max": "Le nombre de joueur·se·s maximum doit être supérieur au nombre de joueurs minimum"
|
|
}
|
|
)
|
|
|
|
def get_player_range(self):
|
|
if self.player_range:
|
|
return self.player_range
|
|
elif self.nb_player_min != self.nb_player_max:
|
|
return "{} à {} joueur·se·s".format(self.nb_player_min, self.nb_player_max)
|
|
else:
|
|
return "{} joueur·se·s".format(self.nb_player_min)
|
|
|
|
def get_absolute_url(self):
|
|
return reverse("inventory:game", args=(self.slug,))
|
|
|
|
|
|
class GameComment(models.Model):
|
|
game = models.ForeignKey(
|
|
Game, on_delete=models.CASCADE, related_name="comments", verbose_name="jeu"
|
|
)
|
|
author = models.ForeignKey(
|
|
User, on_delete=models.CASCADE, verbose_name="auteur·ice"
|
|
)
|
|
text = models.TextField(verbose_name="texte")
|
|
created_on = models.DateTimeField(
|
|
auto_now_add=True, verbose_name="date de publication"
|
|
)
|
|
modified_on = models.DateTimeField(
|
|
auto_now=True, verbose_name="date de modification"
|
|
)
|
|
|
|
class Meta:
|
|
ordering = ["created_on"]
|
|
verbose_name = "commentaire sur un jeu"
|
|
verbose_name_plural = "commentaires sur des jeux"
|
|
|
|
def __str__(self):
|
|
return "({}) {}: {}".format(self.game, self.author, self.text)
|