gestiojeux/inventory/models.py
sinavir c01ed7cb47 style(pre-commit): Add hook
Python:
- black
- isort (black profile)
- ruff

Nix:
- statix
- nixfmt-rfc-style
- deadnix
2024-07-04 20:47:46 +02:00

115 lines
3.1 KiB
Python

import os
import uuid
from autoslug import AutoSlugField
from django.db import models
from django.urls import reverse
from comments.models import AbstractComment
from loans.models import AbstractLoan
from website.validators import MaxFileSizeValidator
class Category(models.Model):
name = models.CharField(max_length=256, verbose_name="nom", unique=True)
slug = AutoSlugField(populate_from="name", unique=True)
class Meta:
ordering = ["name"]
verbose_name = "étagère"
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", unique=True)
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,))
def image_uuid_path(instance, filename):
"""
Compute filename for game images as follow:
game_img/{random_uuid}.{extension}
"""
ext = filename.split(".")[-1]
filename = "%s.%s" % (uuid.uuid4(), ext)
return os.path.join("uploads/logos", filename)
class Game(models.Model):
title = models.CharField(verbose_name="Nom de l'outil", max_length=256, unique=True)
slug = AutoSlugField(populate_from="title", unique=True)
category = models.ForeignKey(
Category, on_delete=models.RESTRICT, verbose_name="catégorie"
)
tags = models.ManyToManyField(Tag, blank=True, verbose_name="tags")
description = models.TextField(blank=True, verbose_name="description")
image = models.ImageField(
upload_to=image_uuid_path,
blank=True,
verbose_name="image",
help_text="L'image doit peser 512 Kio au maximum",
validators=[MaxFileSizeValidator(512)],
)
missing_elements = models.TextField(blank=True, verbose_name="pièces manquantes")
class Meta:
ordering = ["title"]
verbose_name = "outil"
verbose_name_plural = "outils"
def __str__(self):
return self.title
def get_player_range(self):
return ""
def get_duration_range(self):
return ""
def get_absolute_url(self):
return reverse("inventory:game", args=(self.slug,))
class GameComment(AbstractComment):
commented_object = models.ForeignKey(
Game, on_delete=models.CASCADE, related_name="comments", verbose_name="outil"
)
class Meta:
ordering = ["created_on"]
verbose_name = "commentaire sur un outil"
verbose_name_plural = "commentaires sur des outils"
def get_modification_url(self):
return reverse(
"inventory:modify_game_comment", args=(self.commented_object.slug, self.id)
)
class GameLoan(AbstractLoan):
lent_object = models.ForeignKey(
Game, on_delete=models.CASCADE, verbose_name="outil emprunté"
)
class Meta(AbstractLoan.Meta):
abstract = False
permissions = [("can_see_loan_details", "Can see loan details")]