lib.itmens/catalog/movie/models.py

179 lines
5.1 KiB
Python
Raw Normal View History

2022-12-15 17:29:35 -05:00
from django.db import models
from django.utils.translation import gettext_lazy as _
2023-08-11 01:43:19 -04:00
from catalog.common import (
BaseSchema,
IdType,
Item,
ItemCategory,
ItemInSchema,
ItemType,
PrimaryLookupIdDescriptor,
jsondata,
)
2024-07-13 00:16:47 -04:00
from catalog.common.models import LanguageListField
2023-02-15 15:45:57 -05:00
class MovieInSchema(ItemInSchema):
orig_title: str | None = None
other_title: list[str]
2023-02-15 15:45:57 -05:00
director: list[str]
playwright: list[str]
actor: list[str]
genre: list[str]
language: list[str]
area: list[str]
year: int | None = None
site: str | None = None
2023-02-22 14:20:20 -05:00
duration: str | None = None
2023-02-15 15:45:57 -05:00
class MovieSchema(MovieInSchema, BaseSchema):
2023-02-15 16:22:32 -05:00
imdb: str | None = None
2023-02-15 15:45:57 -05:00
pass
class Movie(Item):
2023-06-05 02:04:52 -04:00
type = ItemType.Movie
2022-12-11 23:20:28 +00:00
category = ItemCategory.Movie
2022-12-29 23:57:02 -05:00
url_path = "movie"
imdb = PrimaryLookupIdDescriptor(IdType.IMDB)
tmdb_movie = PrimaryLookupIdDescriptor(IdType.TMDB_Movie)
douban_movie = PrimaryLookupIdDescriptor(IdType.DoubanMovie)
2022-12-15 17:29:35 -05:00
METADATA_COPY_LIST = [
# "title",
# "other_title",
2024-07-13 00:16:47 -04:00
"localized_title",
2022-12-29 23:57:02 -05:00
"orig_title",
"director",
"playwright",
"actor",
"genre",
"showtime",
"site",
"area",
"language",
"year",
"duration",
2023-01-05 03:06:13 -05:00
# "season_number",
# "episodes",
# "single_episode_length",
2024-07-13 00:16:47 -04:00
"localized_description",
# "brief",
2022-12-15 17:29:35 -05:00
]
2022-12-29 23:57:02 -05:00
orig_title = jsondata.CharField(
2024-07-16 02:28:53 -04:00
verbose_name=_("original title"), blank=True, max_length=500
2022-12-29 23:57:02 -05:00
)
other_title = jsondata.ArrayField(
2024-03-10 20:55:50 -04:00
verbose_name=_("other title"),
base_field=models.CharField(blank=True, default="", max_length=200),
null=True,
blank=True,
default=list,
2022-12-29 23:57:02 -05:00
)
director = jsondata.ArrayField(
2024-03-10 20:55:50 -04:00
verbose_name=_("director"),
2023-01-05 03:06:13 -05:00
base_field=models.CharField(blank=True, default="", max_length=200),
2022-12-29 23:57:02 -05:00
null=True,
blank=True,
default=list,
)
playwright = jsondata.ArrayField(
2024-03-10 20:55:50 -04:00
verbose_name=_("playwright"),
2023-01-05 03:06:13 -05:00
base_field=models.CharField(blank=True, default="", max_length=200),
2022-12-29 23:57:02 -05:00
null=True,
blank=True,
default=list,
)
actor = jsondata.ArrayField(
2024-03-10 20:55:50 -04:00
verbose_name=_("actor"),
2023-01-05 03:06:13 -05:00
base_field=models.CharField(blank=True, default="", max_length=200),
2022-12-29 23:57:02 -05:00
null=True,
blank=True,
default=list,
)
genre = jsondata.ArrayField(
2024-03-10 20:55:50 -04:00
verbose_name=_("genre"),
2023-01-05 03:06:13 -05:00
base_field=models.CharField(blank=True, default="", max_length=50),
2022-12-29 23:57:02 -05:00
null=True,
blank=True,
default=list,
) # , choices=MovieGenreEnum.choices
2023-01-05 03:06:13 -05:00
showtime = jsondata.JSONField(
2024-03-10 20:55:50 -04:00
_("release date"),
2022-12-29 23:57:02 -05:00
null=True,
blank=True,
default=list,
schema={
2023-06-07 04:14:38 -04:00
"type": "list",
"items": {
"type": "dict",
"additionalProperties": False,
"keys": {
"time": {
"type": "string",
2024-03-10 20:55:50 -04:00
"title": _("date"),
"placeholder": _("required"),
2023-06-07 04:14:38 -04:00
},
"region": {
"type": "string",
2024-03-10 20:55:50 -04:00
"title": _("region or event"),
"placeholder": _(
"Germany or Toronto International Film Festival"
),
2023-06-07 04:14:38 -04:00
},
},
"required": ["time"],
},
},
2022-12-29 23:57:02 -05:00
)
2024-07-16 02:28:53 -04:00
site = jsondata.URLField(verbose_name=_("website"), blank=True, max_length=200)
2022-12-29 23:57:02 -05:00
area = jsondata.ArrayField(
2024-03-10 20:55:50 -04:00
verbose_name=_("region"),
2023-01-05 03:06:13 -05:00
base_field=models.CharField(
2022-12-29 23:57:02 -05:00
blank=True,
default="",
max_length=100,
),
null=True,
blank=True,
default=list,
)
2024-07-13 00:16:47 -04:00
language = LanguageListField()
2024-03-10 20:55:50 -04:00
year = jsondata.IntegerField(verbose_name=_("year"), null=True, blank=True)
2024-07-16 02:28:53 -04:00
duration = jsondata.CharField(verbose_name=_("length"), blank=True, max_length=200)
2023-01-05 03:06:13 -05:00
season_number = jsondata.IntegerField(
null=True, blank=True
) # TODO remove after migration
episodes = jsondata.IntegerField(
null=True, blank=True
) # TODO remove after migration
single_episode_length = jsondata.IntegerField(
null=True, blank=True
) # TODO remove after migration
@classmethod
def lookup_id_type_choices(cls):
id_types = [
IdType.IMDB,
IdType.TMDB_Movie,
IdType.DoubanMovie,
IdType.Bangumi,
]
return [(i.value, i.label) for i in id_types]
@classmethod
def lookup_id_cleanup(cls, lookup_id_type, lookup_id_value):
if lookup_id_type == IdType.IMDB.value and lookup_id_value:
if lookup_id_value[:2] == "tt":
return lookup_id_type, lookup_id_value
else:
return None, None
return super().lookup_id_cleanup(lookup_id_type, lookup_id_value)
2024-12-30 01:51:19 -05:00
def to_indexable_titles(self) -> list[str]:
2024-12-30 09:35:58 -05:00
titles = [t["text"] for t in self.localized_title if t["text"]]
2024-12-30 01:51:19 -05:00
titles += [self.orig_title] if self.orig_title else []
return list(set(titles))