lib.itmens/games/models.py

153 lines
4 KiB
Python
Raw Normal View History

2021-02-25 19:43:43 +01:00
import uuid
import django.contrib.postgres.fields as postgres
2021-12-24 11:56:04 -08:00
from django.utils.translation import gettext_lazy as _
2021-02-25 19:43:43 +01:00
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
2021-08-01 12:36:03 +02:00
from common.utils import ChoicesDictGenerator, GenerateDateUUIDMediaFilePath
2021-02-25 19:43:43 +01:00
from django.utils import timezone
from django.conf import settings
2021-02-25 19:43:43 +01:00
GameMarkStatusTranslation = {
MarkStatusEnum.DO.value: _("在玩"),
MarkStatusEnum.WISH.value: _("想玩"),
MarkStatusEnum.COLLECT.value: _("玩过")
}
2021-02-25 19:43:43 +01:00
def game_cover_path(instance, filename):
return GenerateDateUUIDMediaFilePath(instance, filename, settings.GAME_MEDIA_PATH_ROOT)
2021-02-25 19:43:43 +01:00
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=50),
null=True,
blank=True,
default=list,
verbose_name=_("类型")
)
platform = postgres.ArrayField(
models.CharField(blank=True, default='', max_length=50),
null=True,
blank=True,
default=list,
verbose_name=_("平台")
)
cover = models.ImageField(_("封面"), upload_to=game_cover_path, default=settings.DEFAULT_GAME_IMAGE, blank=True)
2021-02-25 19:43:43 +01:00
def __str__(self):
return self.title
2022-02-20 19:09:23 -05:00
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
2021-02-25 19:43:43 +01:00
def get_absolute_url(self):
return reverse("games:retrieve", 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
2021-02-25 19:43:43 +01:00
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]
2021-02-25 19:43:43 +01:00
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])
2021-02-25 19:43:43 +01:00
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")
]