Skip to content

Instantly share code, notes, and snippets.

@fhdez
Created August 16, 2018 21:56
Show Gist options
  • Save fhdez/43a2860e5584f447a5ea04be5cff8d58 to your computer and use it in GitHub Desktop.
Save fhdez/43a2860e5584f447a5ea04be5cff8d58 to your computer and use it in GitHub Desktop.
# -*- 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