mauflix/source/main/models.py

175 lines
5.1 KiB
Python

from django.conf import settings
from django.db import models
class Gender(models.Model):
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):
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):
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)
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=''):
data = ''
if img:
url = '../'
if director:
url = '../../'
data = url + img.url
return data
def to_dict(self, query='', director='', id=0):
rows = self.all().order_by('-id')[:10]
if query == 'all':
rows = self.all()
elif id:
rows = self.filter(id=id)
director = ' '
else:
if director:
rows = self.filter(directors__name__iexact=director)
elif query:
rows = self.filter(name__icontains=query)
movies = []
for row in rows:
data = {}
data['id'] = row.id
data['url'] = self._to_link(row.file_name)
data['name'] = row.name
data['year'] = row.year
data['original_name'] = row.original_name
data['duration'] = row.duration
data['director'] = self._to_str(row.directors)
data['country'] = self._to_str(row.countries)
data['count'] = row.count
data['image'] = self._to_image(row.cartel, director)
movies.append(data)
matrix = []
for i in range (0, len(movies), 4):
matrix.append(movies[i:i+4])
return matrix
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):
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