175 lines
5.1 KiB
Python
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
|
|
|