mauflix/source/main/models.py

189 lines
5.9 KiB
Python

import requests
import shutil
import random
from django.conf import settings
from django.db import models
from pathlib import Path
class Gender(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=250)
class Meta:
unique_together = ["name"]
ordering = ["name"]
verbose_name = "Género"
verbose_name_plural = "Generos"
def __str__(self):
return self.name
class Country(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=250, verbose_name="País")
class Meta:
unique_together = ["name"]
ordering = ["name"]
verbose_name = "País"
verbose_name_plural = "Paises"
def __str__(self):
return self.name
class PersonQuerySet(models.QuerySet):
def directors(self):
rows = self.filter(is_director=True).values_list("name", flat=True)
return rows
def actors(self):
rows = self.filter(is_actor=True).values_list("name", flat=True)
return rows
class Person(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField("Nombre", max_length=500)
country = models.ForeignKey(
Country, related_name="country", on_delete=models.PROTECT
)
date_born = models.DateField("Fecha de nacimiento", null=True, blank=True)
is_actor = models.BooleanField("Es Actor", default=False)
is_director = models.BooleanField("Es Director", default=False)
is_woman = models.BooleanField("Es mujer", default=False)
photo = models.ImageField(
"Fotografía", upload_to="%Y/%m/%d/", null=True, blank=True
)
objects = PersonQuerySet.as_manager()
class Meta:
unique_together = ["name"]
ordering = ["name"]
verbose_name = "Persona"
verbose_name_plural = "Personas"
def __str__(self):
return self.name
class MovieQuerySet(models.QuerySet):
def _to_str(self, q):
return ",".join([r.name for r in q.all()])
def _to_link(self, file_name):
# ~ folder = file_name[0].upper()
# ~ if folder.isdigit():
# ~ folder = '0'
url = settings.URL_CDN.format(file_name)
return url
def _to_image(self, img, director=""):
if settings.DEBUG:
path = Path(settings.BASE_DIR + img.url)
remote = settings.URL_CDN.format(img.url)
remote = remote.replace("/media/", "")
if not path.exists():
if not path.parent.exists():
path.parent.mkdir()
res = requests.get(remote, stream=True)
if res.status_code == 200:
with open(path, "wb") as f:
shutil.copyfileobj(res.raw, f)
url = ""
if director:
url = "../../"
return url + img.url
def random_pick(self, random_max=5, **kwargs):
all = list(Movie.objects.filter(**kwargs).values())
if len(all) > random_max:
return random.sample(all, random_max)
else:
return all
def top_pick(self, key, top_max=5):
all = list(Movie.objects.order_by(f"-{key}").values())
return all[:top_max]
def top_random_pick(self, key, top_max=5):
all = list(Movie.objects.order_by(f"-{key}").values())
top = []
for movie in all:
if movie[key] == all[0][key]:
top.append(movie)
else:
break
if len(top) > top_max:
return random.sample(top, top_max)
else:
return top
def home_pick(self):
genders = list(Gender.objects.values_list("id", flat=True))
sections = {
"Novedades": self.top_pick("id"),
"Mejor valorados": self.top_random_pick("stars"),
"Más descargados": self.top_pick("count"),
"genders": {},
}
for gender in genders:
key = Gender.objects.get(pk=gender).name
sections["genders"][key] = self.random_pick(genders=gender)
return sections
def get_directors(self):
data = (
self.distinct()
.values_list("directors__name", flat=True)
.order_by("directors")
)
return data
def upload_cartel(instance, filename):
first = filename[0].upper()
if first.isdigit():
first = "0"
return f"{first}/{filename}"
class Movie(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField("Nombre", max_length=1000)
original_name = models.CharField(
"Nombre original", max_length=1000, default="", blank=True
)
file_name = models.CharField(
"Nombre archivo", max_length=1000, default="", blank=True
)
year = models.PositiveSmallIntegerField("Año", default=1900)
duration = models.PositiveSmallIntegerField("Duración", default=0)
directors = models.ManyToManyField(
Person, verbose_name="Director", related_name="directors"
)
actors = models.ManyToManyField(Person, related_name="actors", blank=True)
countries = models.ManyToManyField(
Country, related_name="countries", verbose_name="País", blank=True
)
genders = models.ManyToManyField(
Gender, related_name="genders", verbose_name="Género", blank=True
)
cartel = models.ImageField("Cartel", upload_to=upload_cartel, null=True, blank=True)
count = models.PositiveIntegerField("Descargas", default=0)
stars = models.PositiveSmallIntegerField("Estrellas", default=0)
published = models.BooleanField("¿Publicar?", default=True)
is_digital = models.BooleanField("Es digital", default=False)
objects = MovieQuerySet.as_manager()
class Meta:
unique_together = ["name", "original_name"]
ordering = ["name"]
verbose_name = "Película"
verbose_name_plural = "Películas"
def __str__(self):
return self.name