lib.itmens/games/models.py
2022-09-08 19:41:56 -04:00

169 lines
4.3 KiB
Python

import uuid
import django.contrib.postgres.fields as postgres
from django.utils.translation import gettext_lazy as _
from django.db import models
from django.core.serializers.json import DjangoJSONEncoder
from django.shortcuts import reverse
from common.models import Entity, Mark, Review, Tag, MarkStatusEnum
from common.utils import ChoicesDictGenerator, GenerateDateUUIDMediaFilePath
from django.utils import timezone
from django.conf import settings
from simple_history.models import HistoricalRecords
GameMarkStatusTranslation = {
MarkStatusEnum.DO.value: _("在玩"),
MarkStatusEnum.WISH.value: _("想玩"),
MarkStatusEnum.COLLECT.value: _("玩过")
}
def game_cover_path(instance, filename):
return GenerateDateUUIDMediaFilePath(instance, filename, settings.GAME_MEDIA_PATH_ROOT)
class Game(Entity):
"""
"""
title = models.CharField(_("名称"), max_length=500)
other_title = postgres.ArrayField(
models.CharField(blank=True,default='', max_length=500),
null=True,
blank=True,
default=list,
verbose_name=_("别名")
)
developer = postgres.ArrayField(
models.CharField(blank=True, default='', max_length=500),
null=True,
blank=True,
default=list,
verbose_name=_("开发商")
)
publisher = postgres.ArrayField(
models.CharField(blank=True, default='', max_length=500),
null=True,
blank=True,
default=list,
verbose_name=_("发行商")
)
release_date = models.DateField(
_('发行日期'),
auto_now=False,
auto_now_add=False,
null=True,
blank=True
)
genre = postgres.ArrayField(
models.CharField(blank=True, default='', max_length=200),
null=True,
blank=True,
default=list,
verbose_name=_("类型")
)
platform = postgres.ArrayField(
models.CharField(blank=True, default='', max_length=200),
null=True,
blank=True,
default=list,
verbose_name=_("平台")
)
cover = models.ImageField(_("封面"), upload_to=game_cover_path, default=settings.DEFAULT_GAME_IMAGE, blank=True)
history = HistoricalRecords()
def __str__(self):
return self.title
def get_json(self):
r = {
'developer': self.developer,
'other_title': self.other_title,
'publisher': self.publisher,
'release_date': self.release_date,
'platform': self.platform,
'genre': self.genre,
}
r.update(super().get_json())
return r
def get_absolute_url(self):
return reverse("games:retrieve", args=[self.id])
@property
def wish_url(self):
return reverse("games:wish", args=[self.id])
def get_tags_manager(self):
return self.game_tags
@property
def verbose_category_name(self):
return _("游戏")
@property
def mark_class(self):
return GameMark
@property
def tag_class(self):
return GameTag
class GameMark(Mark):
game = models.ForeignKey(
Game, on_delete=models.CASCADE, related_name='game_marks', null=True)
class Meta:
constraints = [
models.UniqueConstraint(
fields=['owner', 'game'], name='unique_game_mark')
]
@property
def translated_status(self):
return GameMarkStatusTranslation[self.status]
class GameReview(Review):
game = models.ForeignKey(
Game, on_delete=models.CASCADE, related_name='game_reviews', null=True)
class Meta:
constraints = [
models.UniqueConstraint(
fields=['owner', 'game'], name='unique_game_review')
]
@property
def url(self):
return settings.APP_WEBSITE + reverse("games:retrieve_review", args=[self.id])
@property
def item(self):
return self.game
class GameTag(Tag):
game = models.ForeignKey(
Game, on_delete=models.CASCADE, related_name='game_tags', null=True)
mark = models.ForeignKey(
GameMark, on_delete=models.CASCADE, related_name='gamemark_tags', null=True)
class Meta:
constraints = [
models.UniqueConstraint(
fields=['content', 'mark'], name="unique_gamemark_tag")
]
@property
def item(self):
return self.game