Created
August 16, 2018 21:56
-
-
Save fhdez/43a2860e5584f447a5ea04be5cff8d58 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
import re | |
import requests | |
import uuid | |
from django.contrib.staticfiles.templatetags.staticfiles import static | |
from django.core.exceptions import ValidationError | |
from django.core.urlresolvers import reverse | |
from django.db import models | |
from django.db.models import Avg | |
from django.utils.text import slugify | |
from taggit.managers import TaggableManager | |
from redmag.planeaciones.models import Planeacion | |
from redmag.utils import send_mail | |
from .fields import RangeField | |
from .manager import MedManager | |
INTELIGENCIAS = ( | |
'inteligencia_linguistica', | |
'inteligencia_logica_matematica', | |
'inteligencia_espacial', | |
'inteligencia_corporal_cinestesica', | |
'inteligencia_interpersonal', | |
'inteligencia_intrapersonal', | |
'inteligencia_musical', | |
'inteligencia_naturalista' | |
) | |
ESTADOS = ( | |
'aburrido', 'inquieto', 'creativo', 'jugueton', 'distraido', | |
'contento', 'sereno', 'excitado', 'impaciente', 'atento', | |
'curioso', 'participativo' | |
) | |
def get_upload_path(instance, filename): | |
ext = filename.split('.')[-1] | |
filename = "%s.%s" % (uuid.uuid4(), ext) | |
return 'odas/%s' % filename | |
class Med(models.Model): | |
ESTADO_CHOICES = ( | |
('M', 'Moderación'), | |
('A', 'Aceptada'), | |
('R', 'Rechazada') | |
) | |
INTELIGENCIAS_CHOICES = ( | |
(0, "0"), | |
(1, "1"), | |
(2, "2"), | |
(3, "3"), | |
(4, "4"), | |
(5, "5"), | |
(6, "6"), | |
(7, "7") | |
) | |
fecha_subida = models.DateField( | |
auto_now_add=True | |
) | |
usuario = models.ForeignKey( | |
'usuarios.Usuario' | |
) | |
nombre_del_documento = models.CharField( | |
"Nombre", | |
max_length=100 | |
) | |
descripcion_del_documento = models.TextField( | |
verbose_name=u"Breve descripción" | |
) | |
descripcion_forma_de_uso = models.TextField( | |
verbose_name=u"Sugerencia de uso" | |
) | |
estado = models.CharField( | |
max_length=1, | |
default='M', | |
choices=ESTADO_CHOICES | |
) | |
moderada = models.BooleanField( | |
default=False | |
) | |
imagen = models.ImageField( | |
upload_to=get_upload_path, | |
max_length=255, | |
blank=True, | |
null=True | |
) | |
thumbnail_detail = models.ImageField( | |
max_length=255, | |
upload_to='odas/thumbs_detail', | |
blank=True, | |
null=True | |
) | |
thumbnail = models.ImageField( | |
max_length=255, | |
upload_to='odas/thumbs', | |
blank=True, | |
null=True | |
) | |
comentarios = models.ManyToManyField( | |
'comentarios.Comentario', | |
blank=True, | |
null=True, | |
related_name='med' | |
) | |
# categoria = models.ForeignKey( | |
# 'SubCategoria', null=True | |
# ) # NOTE: Null en la BD | |
# tema = models.ForeignKey( | |
# 'acuerdo.SubCategoria', null=True | |
# )# NOTE: Ya no se usa, se llena con lo mismo del acuerdo.SubCategoria | |
is_meritum = models.BooleanField( | |
default=False, | |
verbose_name=u'¿Es MED Meritum?' | |
) | |
favoritos = models.ManyToManyField( | |
'usuarios.Usuario', | |
related_name='med_favoritos' | |
) | |
slug = models.SlugField() | |
is_evaluacion = models.BooleanField( | |
default=False, | |
verbose_name=u'¿Es MED de evaluación docente?' | |
) | |
# Datos acuerdo 592 SEP | |
acuerdo_tema = models.ForeignKey( | |
'acuerdo.SubCategoria', | |
related_name='meds', | |
null=True, blank=True | |
) | |
# NOTE: se queda de momento para no afectar otros | |
# NOTE: Se agrega field para Campo formativo | |
campo_formativo = models.ForeignKey( | |
'acuerdo.CampoFormativo', null=True | |
) | |
# Tipos de inteligencia | |
inteligencia_linguistica = RangeField( | |
'Inteligencia Lingüística', | |
blank=True, null=True, | |
help_text=( | |
u'La inteligencia lingüística se manifiesta en las conversaciones' | |
u' y explicaciones, con una exposición oral o jugando ' | |
u'con rimas, historias, etc. ' | |
), | |
choices=INTELIGENCIAS_CHOICES | |
) | |
inteligencia_logica_matematica = RangeField( | |
'Inteligencia Lógico-Matemática', | |
blank=True, null=True, | |
help_text=( | |
u'La inteligencia lógico-matemática está en actividades que' | |
u' requieren abstracción. En especial cálculos veloces y ' | |
u'acertijos numéricos. ' | |
), | |
choices=INTELIGENCIAS_CHOICES | |
) | |
inteligencia_espacial = RangeField( | |
'Inteligencia Espacial', | |
blank=True, null=True, | |
help_text=( | |
u'La inteligencia espacial está en el reconocimiento visual,' | |
u' proyección mental y en el espacio. Los rompecabezas son ' | |
u'estimulantes para ésta. ' | |
), | |
choices=INTELIGENCIAS_CHOICES | |
) | |
inteligencia_corporal_cinestesica = RangeField( | |
'Inteligencia Corporal-Cinestésica', | |
blank=True, null=True, | |
help_text=( | |
u'La inteligencia corporal-cinestésica está en coordinar ' | |
u'movimientos.' | |
u' Los niños pueden desarrollarla con juegos para el control ' | |
u'psicomotriz.' | |
), | |
choices=INTELIGENCIAS_CHOICES | |
) | |
inteligencia_interpersonal = RangeField( | |
'Inteligencia Interpersonal', | |
blank=True, null=True, | |
help_text=( | |
u'La inteligencia interpersonal es la capacidad para comprender' | |
u' las intenciones, motivaciones y deseos de otras personas.' | |
), | |
choices=INTELIGENCIAS_CHOICES | |
) | |
inteligencia_intrapersonal = RangeField( | |
'Inteligencia Intrapersonal', | |
blank=True, null=True, | |
help_text=( | |
u'La inteligencia intrapersonal es la capacidad de conocerse a ' | |
u'uno mismo, los sentimientos, temores y motivaciones propios.' | |
), | |
choices=INTELIGENCIAS_CHOICES | |
) | |
inteligencia_musical = RangeField( | |
'Inteligencia Musical', | |
blank=True, null=True, | |
help_text=u'La inteligencia musical es la aptitud de percibir y' | |
u' expresarse a través del lenguaje musical.' | |
u' Toda persona puede vincularse con la música. ', | |
choices=INTELIGENCIAS_CHOICES | |
) | |
inteligencia_naturalista = RangeField( | |
'Inteligencia Naturalista', | |
blank=True, null=True, | |
help_text=( | |
u'La inteligencia naturalista está en conocer la flora y fauna,' | |
u' para establecer distinciones en el mundo natural y aprovechar ' | |
u'sus recursos. ' | |
), | |
choices=INTELIGENCIAS_CHOICES | |
) | |
tipos_trabajo = models.ManyToManyField( | |
'TipoTrabajo', | |
verbose_name=u'tipos de trabajo' | |
) | |
tipos_med = models.ManyToManyField( | |
'TipoMed', | |
verbose_name=u'tipos de MED' | |
) | |
# Estados de Animo Grupo. | |
aburrido = models.BooleanField(default=False) | |
inquieto = models.BooleanField(default=False) | |
creativo = models.BooleanField(default=False) | |
jugueton = models.BooleanField(default=False) | |
distraido = models.BooleanField(default=False) | |
contento = models.BooleanField(default=False) | |
sereno = models.BooleanField(default=False) | |
excitado = models.BooleanField(default=False) | |
impaciente = models.BooleanField(default=False) | |
atento = models.BooleanField(default=False) | |
curioso = models.BooleanField(default=False) | |
participativo = models.BooleanField(default=False) | |
url = models.URLField( | |
"Vínculo", | |
null=True, | |
blank=True | |
) | |
busquedas = models.IntegerField( | |
default=0 | |
) | |
en_portada = models.BooleanField( | |
default=False, | |
verbose_name='¿Mostrar en portada?' | |
) | |
objects = MedManager() | |
tags = TaggableManager( | |
blank=True, | |
verbose_name=u'Etiquetas' | |
) | |
class Meta: | |
verbose_name = u'Material Educativo Digital (MED)' | |
verbose_name_plural = u'Materiales Educativos Digitales (MED)' | |
ordering = ['-id'] | |
def __unicode__(self): | |
""" | |
Regresa la representación unicode de la oda | |
""" | |
return self.nombre_del_documento | |
@classmethod | |
def get_default_thumbnail(cls): | |
return static('images/med-no-image.png') | |
@property | |
def picture(self): | |
if not self.imagen: | |
return { | |
'url': static('images/med-no-image.png') | |
} | |
return self.imagen | |
@property | |
def description(self): | |
return self.descripcion_del_documento | |
@property | |
def name(self): | |
return self.nombre_del_documento | |
def puntuacion(self): | |
return MedVoto.objects.filter( | |
med__id=self.id | |
).aggregate(puntuacion=Avg('calificacion'))['puntuacion'] | |
@property | |
def recommended_for(self): | |
return [ | |
e for | |
e in ESTADOS if | |
getattr(self, e, False) | |
] | |
@property | |
def recommended_for_booleans(self): | |
""" | |
Retorna un diccionario con la información de los estados del grupo | |
correspondiente al MED | |
""" | |
states_booleans = {} | |
for estado in ESTADOS: | |
states_booleans[estado] = getattr(self, estado, False) | |
return states_booleans | |
def has_inteligencia(self): | |
for inteligencia in INTELIGENCIAS: | |
if getattr(self, inteligencia, 0) > 0: | |
return True | |
@property | |
def inteligencias(self): | |
return sorted( | |
INTELIGENCIAS, | |
key=lambda i: getattr(self, i, 0), | |
reverse=True | |
)[:3] | |
def clean(self): | |
values = [ | |
getattr(self, i) for | |
i in INTELIGENCIAS | |
] | |
cleaned_data = [ | |
i for i in values if i is not None and i > 0 | |
] | |
if len(set(cleaned_data)) < len(cleaned_data): | |
raise ValidationError( | |
'Inteligencias: Hay valores duplicados, no se puede repetir ' | |
'ningún valor.' | |
) | |
def save(self, *args, **kwargs): | |
if self.id and not self.moderada: | |
ctx = { | |
'med': self | |
} | |
if self.estado == 'A': | |
send_mail( | |
self.usuario, | |
( | |
u'¡Felicitaciones! El MED que enviaste a Red ' | |
u'Magisterial fue aprobado' | |
), | |
'meds/mail/aprobado.txt', | |
ctx | |
) | |
elif self.estado == 'R': | |
send_mail( | |
self.usuario, | |
( | |
u'Lo sentimos, el MED que enviaste a Red Magisterial ' | |
u'fue rechazado' | |
), | |
'meds/mail/rechazado.txt', | |
ctx | |
) | |
else: | |
send_mail( | |
self.usuario, | |
( | |
u'¡Felicitaciones por enviar tu MED a la Comunidad ' | |
u'de Red Magisterial' | |
), | |
'meds/mail/enviado.txt', | |
ctx | |
) | |
if self.estado == 'A' or self.estado == 'R': | |
self.moderada = True | |
if self.id and self.en_portada: | |
Med.objects.filter( | |
en_portada=True | |
).exclude( | |
id=self.id | |
).update( | |
en_portada=False | |
) | |
super(Med, self).save(*args, **kwargs) | |
if self.id and not self.slug: | |
slug = u'-'.join([unicode(self.id), self.nombre_del_documento]) | |
self.slug = slugify(slug[:50]) | |
self.save() | |
def get_thumbnail(self, size=None): | |
if size == 'small': | |
if not self.thumbnail: | |
return static('images/med-no-image.png') | |
return self.thumbnail.url | |
if not self.thumbnail_detail: | |
return static('images/med-no-image.png') | |
return self.thumbnail_detail.url | |
def get_small_thumbnail(self): | |
return self.get_thumbnail('small') | |
def get_random_thumbnail(self): | |
return self.get_thumbnail() | |
def get_absolute_url(self): | |
return reverse('med:detail', kwargs={'slug': self.slug}) | |
# | |
# NOTE: este es de acuerdo.models | |
# | |
class Categoria(BaseCatalogoAcuerdoModel): | |
""" | |
Modelo que representa una asignatura (materia) del ciclo escolar definida | |
en el acuerdo 592 de la SEP. Se agrega un nuevo campo para el | |
Nuevo Modelo Educativo. | |
""" | |
grado = models.ForeignKey( | |
'Grado', | |
related_name='asignaturas' | |
) | |
campoformativo = models.ForeignKey( | |
'CampoFormativo', | |
related_name='asignaturas' | |
) | |
objects = BaseCatalogoAcuerdoManager() | |
class Meta: | |
verbose_name = u'Asignatura escolar' | |
verbose_name_plural = u'Asignaturas escolares' | |
class CampoFormativo(BaseCatalogoAcuerdoModel): | |
""" | |
Modelo que representa un campo formativo o área | |
para el Nuevo Modelo Educativo | |
""" | |
objects = BaseCatalogoAcuerdoManager() | |
class Meta: | |
verbose_name = u'Campo formativo' | |
class TemaNME(BaseCatalogoAcuerdoModel): | |
""" | |
Modelo que representa los nuevos temas para el Nuevo Modelo Educativo | |
el cual almacenara de acuerdo a la asignatura dada. | |
""" | |
asignatura = models.ForeignKey( | |
Categoria, | |
related_name='temanme' | |
) | |
objects = BaseCatalogoAcuerdoManager() | |
class Meta: | |
verbose_name = u'Tema NME' | |
class ObjetivoNME(BaseCatalogoAcuerdoModel): | |
""" | |
Modelo que representa los diferentes objetivos de los temas para | |
el Nuevo Modelo Educativo. | |
""" | |
temanme = models.ForeignKey( | |
TemaNME, | |
related_name='objetivonme' | |
) | |
objects = BaseCatalogoAcuerdoManager() | |
class Meta: | |
verbose_name = u'Objetivo NME' | |
class AprendizajeEsperado(BaseCatalogoAcuerdoModel): | |
""" | |
Modelo que representará todos los aprendizajes esperados | |
de acuerdo al objetivo del Nuevo Modelo Educativo | |
""" | |
objetivonme = models.ForeignKey( | |
ObjetivoNME, | |
related_name='aprendizajeesperado' | |
) | |
objects = BaseCatalogoAcuerdoManager() | |
class Meta: | |
verbose_name = u'Aprendizaje Esperado' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment