3
\D                 @   s  d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZmZ d d	lmZ d d
lmZ ejejd ejeZeG dd dejZeG dd dejZeG dd dejZeG dd dejZ eG dd dejZ!eG dd dejZ"eG dd dejZ#G dd de$Z%eG dd dejZ&eG dd dejZ'eG d d! d!e'Z(eG d"d# d#e'Z)eG d$d% d%ejZ*G d&d' d'ejZ+G d(d) d)ejZ,dS )*    N)models)settings)User)HttpResponse)python_2_unicode_compatible)get_template)HTMLCSS)utils)RiskMap)levelc               @   sD   e Zd ZdZejdddZejddddZG dd	 d	Zd
d Z	dS )MenuTagu}   
        Identificadores de menús.
        Por ahora tan solo: desayuno, almuerzo,merienda, media mañana, cena, recena
       zNombre de la etiqueta de menus)
max_lengthverbose_name1u-   Orden alfabético de ordenación de etiquetas)r   defaultr   c               @   s   e Zd ZdZdS )zMenuTag.Metau   Tags de MenúN)__name__
__module____qualname__verbose_name_plural r   r   B/var/www/vitahealth/hygea.vitahealth/healthbackend/models/dieta.pyMeta$   s   r   c             C   s
   d| j  S )Nz%s)tag)selfr   r   r   __str__(   s    zMenuTag.__str__N)
r   r   r   __doc__r   	CharFieldr   Zgrupor   r   r   r   r   r   r      s
   r   c               @   s   e Zd ZdZejdddZejdddZejddZ	ejd	dZ
ejd
dZejeddZG dd dZdd Zde_dd Zdd ZdS )Menuz)
        Menu definido en el sistema
    r   u   Nombre del Menú)r   r   i	  u   Preparacion del menúz#Intercambios de Hidratos de carbono)r   zIntercambios de ProteinaszIntercambios de grasasu   Tags de menúsc               @   s   e Zd ZdZdS )z	Menu.Metau   Menús definidos en el sistemaN)r   r   r   r   r   r   r   r   r   :   s   r   c             C   s   dj | jj jdddS )Nz, r   T)flat)jointagsallvalues_list)r   r   r   r   get_tags_display=   s    zMenu.get_tags_displayc             C   s   d| j | j| j| jf S )Nz%s (%s,%s,%s) )nombrehidratos	proteinasgrasas)r   r   r   r   r   C   s    zMenu.__str__c             C   s2   t  }| j|_| j|_| j|_| j|_| j|_|S )z/
            copia el menu a uno nuevo
        )r   r&   preparacionr'   r(   r)   )r   mr   r   r   clonarF   s    zMenu.clonarN)r   r   r   r   r   r   r&   r*   
FloatFieldr'   r(   r)   ManyToManyFieldr   r"   r   r%   short_descriptionr   r,   r   r   r   r   r   ,   s   r   c               @   s>   e Zd ZdZejddZejddZG dd dZ	dd	 Z
d
S )KCalNodezG
        Nodo inicial del arbol para la recomendacion de una dieta
    zKiloCalorias SIN DECIMALES)r   T)auto_nowc               @   s   e Zd ZdZdS )zKCalNode.MetazNodos de KcaloriasN)r   r   r   r   r   r   r   r   r   b   s   r   c             C   s
   d| j  S )Nz	kCAL: %s )kcal)r   r   r   r   r   e   s    zKCalNode.__str__N)r   r   r   r   r   IntegerFieldr2   DateTimeFielddater   r   r   r   r   r   r0   Z   s
   r0   c               @   sj   e Zd ZdZejddZejddZejddZej	ddZ
ejedd	ejd
ZG dd dZdd ZdS )EnergyDistributionNodezW
        Nodo que cuelga de las kcal y define la distribucion energetica objetivo.
    z% de Hidratos de carbono)r   z% de Proteinasz% de grasasT)r1   ZkCalZdistribuciones_energeticas)r   related_name	on_deletec               @   s   e Zd ZdZdS )zEnergyDistributionNode.Metau"   Nodos de Distribución EnergéticaN)r   r   r   r   r   r   r   r   r   u   s   r   c          
   C   sh   d| j j| j| j| jt| jd | j j d dt| jd | j j d dt| jd | j j d df S )Nz#kCAL: %s (%s,%s,%s)  --> (%s,%s,%s)d   (      Z   )	kcal_noder2   r'   r(   r)   round)r   r   r   r   r   x   s    zEnergyDistributionNode.__str__N)r   r   r   r   r   r-   r'   r(   r)   r4   r5   
ForeignKeyr0   CASCADEr=   r   r   r   r   r   r   r6   i   s   r6   c               @   sL   e Zd ZdZdZdZdZdZdZdZ	e
jdd	d
ZG dd dZdd ZdS )DistributionTagzY
        Identificadores de distribuciones
        Etiquetan los esquemas de dietas 
    zFASE 1Z
DEFINICIONzGANANCIA MUSCULARZ	VITADIETAzENTRENAMIENTO POR LA TARDEu   ENTRENAMIENTO POR LA MAÑANAr   z'Nombre de la etiqueta de distribuciones)r   r   c               @   s   e Zd ZdZdS )zDistributionTag.Metau   Tags de DistribuciónN)r   r   r   r   r   r   r   r   r      s   r   c             C   s
   d| j  S )Nz%s)r   )r   r   r   r   r      s    zDistributionTag.__str__N)r   r   r   r   Z
FASE_TAG_1ZGOAL_TAG_DEFINITIONZGOAL_TAG_GAINZGOAL_TAG_VITADIETAZMOMENT_TAG_AFTERNOONZMOMENT_TAG_MORNINGr   r   r   r   r   r   r   r   r   rA      s   rA   c               @   sX   e Zd ZdZejdddZejeddej	dZ
ejeddd	ZG d
d dZdd ZdS )DietNodezH
        Nodo de Dieta.
        Contiene la estructura de una dieta
    r   zNombre de la dieta)r   r   u   Distribución energéticaZ
diet_nodes)r   r7   r8   u   Tags de distribución)r   r7   c               @   s   e Zd ZdZdS )zDietNode.MetazEsquemas de dietasN)r   r   r   r   r   r   r   r   r      s   r   c             C   s   d| j | jf S )Nz	{%s} (%s))distribucion_energeticar&   )r   r   r   r   r      s    zDietNode.__str__N)r   r   r   r   r   r   r&   r?   r6   r@   rC   r.   rA   r"   r   r   r   r   r   r   rB      s   rB   c               @   s~   e Zd ZdZejddZejddZejddZej	ddZ
ejedd	ejd
Zejedd	ejd
ZG dd dZdd ZdS )NutritionalNodeu   
        Nodo que cuelga depende de la dieta (DietNode) e indica la distribucion de intercambios en una ingesta
        Idealmente se debe de editar como relación inversa desde DietNode
    z#Intercambios de Hidratos de carbono)r   zIntercambios de ProteinaszIntercambios de grasasT)r1   zEtiqueta del tipo de ingestaingestas)r   r7   r8   zEsquema de dietac               @   s   e Zd ZdZdS )zNutritionalNode.Metau   Distribución de IngestasN)r   r   r   r   r   r   r   r   r      s   r   c             C   s   d| j | j| j| jf S )Nz[%s] (%s,%s,%s) )	diet_noder'   r(   r)   )r   r   r   r   r      s    zNutritionalNode.__str__N)r   r   r   r   r   r-   r'   r(   r)   r4   r5   r?   r   r@   r   rB   rF   r   r   r   r   r   r   rD      s   rD   c               @   s   e Zd ZdS )DietaSinIntervencionErrorN)r   r   r   r   r   r   r   rG      s   rG   c               @   s|   e Zd ZdZejddZejdddZejdddZ	ejd	d
dZ
ejdejdZejeddejdZdd ZdddZdS )Dietaz
        Entidad base en Vitadieta, representa el concepto de dieta
        Esta constituido por un conjunto de EntradasDeDieta

        REFACTOR: Dieta y DietaElemental ahora son un unico modelo llamado Dieta
    T)r1   7   u-   Distribución de hidratos en tanto por ciento)r   r      u.   Distribución de proteinas en tanto por ciento   u+   Distribución de grasas en tanto por cientoPatient)r8   z
Dieta baser;   )r   r   r8   c             C   s   d| j jjj| j| j| jf S )Nz"Dieta de %s kcals (%sHC, %sP, %sG))
dieta_noderC   r=   r2   hidratos_porcientoproteinas_porcientograsas_porciento)r   r   r   r   r      s    zDieta.__str__Nc       &      C   sH  |d kr,y| j j d }W n   tY nX | }i }|j}d}||d< |jj}|jj}|jj}	|jj	}
t
|jjjj}t|j}t|j}t|j}g |_tjt}tjt}tjt}tjt}x|jj D ]}yri }y|j}||jj j| W nL   y(|j}||jj j| |jj| W n   tjd Y nX Y nX W q tk
rr } ztjd W Y d d }~X qX qW x`|jj j D ]P}||j! j| x8||j! D ]*}|j"||j! kr||j! j|j" qW qW dddd	d
ddg}|jj#j j$ddd}d|kr&d}ddddd	d
ddg}n"d|krHd}ddd	d
ddddg}yt%j&j'|jd}|j(|d< W n. tk
r } ztjd W Y d d }~X nX ||d< ||d< |j|d< ||d< ||d< ||d< ||d< ||d< ||d < ||d!< ||d"< |	|d#< |
|d$< ||d%< ||d&< ||d'< |j)|d(< t*j+j,t-j.d)d*|d+}t/d,| d- }|j0|}t/d,| d. }|j0|}g }|jt1|d/j0t2|gd0 |jt1|d/j0t2|gd0 g } x*|D ]"}!x|!j3D ]}"| j|" qW qW |d j4| j5 }#|r@t6|#d1d2}$d3|j7 d4 |j8 d5 | d6 }%|%j9d4d7}%d8|% d9 |$d:< |$S |#S d S );Nr   Z	vitadietadieta_idz-[views/getPDF]: Entrada de menu no encontradaz:[views/getPDF]: Imposible crear el diccionario de entradasr;                     idT)r       Zvitadietasport1      )   )rQ   recomendacionz3[views/getPDF]: Recomendacion de dieta no existenteZmenudictZentradatextodictdietapacientedataentradaIntervencionrN   rO   rP   r2   pesoIMCalturaZingestasdictingestas_idZrecetasdictfechastaticpdfzpdf.csszhealthbackend/pdf/z/dieta.htmlz/recetas.html)string)Zstylesheetszapplication/pdf)content_typez	Dieta de  z - z	 kcal.pdf_z
filename=""zContent-Disposition):"entradaintervencionnutricional_setr#   rG   rX   intervencionr_   medidasrb   rc   rd   strrM   rC   r=   r2   intrN   rO   rP   ZentradascollectionsdefaultdictlistZentradadieta_setZentradadietatextoingesta_tagappendZentradadietamenuloggerinfoBaseExceptionerrorrE   Ztag_idmenur"   r$   RecomendacionDietaobjectsgetr]   r5   ospathr!   r   BASE_DIRr   renderr   r	   pagescopyZ	write_pdfr   
first_name	last_namereplace)&r   ra   Zas_httpresponser^   r`   rQ   Zmodelo_dietar_   rb   Zimcrd   r2   Zh_pZp_pZg_pZentradasmenu_dictZentradastexto_dictZingestas_dictZrecetas_dicteZentradaexZnutnodere   Ztag_idsr]   Z
report_cssZtemplate_dietaZ
dieta_htmlZ+template_comentarios_recetas_consentimientoZrecetas_htmlZ	documentsZ	all_pagesdocpZ	pdf_finalhttp_responsefilenamer   r   r   to_pdf   s    







 






 zDieta.to_pdf)NT)r   r   r   r   r   r4   r5   r-   rN   rO   rP   r?   r@   r_   rB   rM   r   r   r   r   r   r   rH      s   rH   c               @   sR   e Zd ZdZd4ZejddZejdded Z	ej
ed!ejd"Zej
eejd#Zd$S )5EntradaDietau  
        Corresponde, dentro de una dieta, a una ingesa de un dia en concreto.
        Todas las dietas de Vitadieta están compuestas por entradas.
        Estas entradas tiene unas "coordenadas" {dia,ingesta_tag}.

        El modelado permite varias entradas para una ingesta concreta de un dia concreto (repitiendo coordenadas).
        Esto nos permite poder asociar varias opciones de menú o combinar entradas de menu con entradas de texto.
        También permite tener días con ingestas diferentes, lo que en teoria permite confeccionar por ejemplo una 
        dieta que tenga más ingestas los días de entrenamiento. 

        No obstante hay que manejarlo con cuidado, ya que puede ocasionar problemas.
    r;   TODOSr   LUNESMARTESrR   	MIERCOLESrT   JUEVESrU   VIERNESrV   SABADOrW   DOMINGO   GRUPO-1   GRUPO-2	   GRUPO-3
   GRUPO-4   GRUPO-5r[   GRUPO-6T)r1   zDia de la entrada)r   r   choiceszEtiqueta del tipo de ingesta)r   r8   )r8   Nr   r   r   r   r;   r   rR   r   rT   r   rU   r   rV   r   rW   r   r   r   r   r   r   r   r   r   r   r   r[   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   DAYSr   r4   r5   r3   diar?   r   r@   rv   rH   r^   r   r   r   r   r   `  s&                r   c               @   s*   e Zd ZdZejedejdZdd Z	dS )EntradaDietaMenuuU   
        Hereda de EntradaDieta
        Una entrada basada en el uso de un Menú
    r   )r   r8   c             C   s   d| j | jj| jf S )Nz
{%s,%s}:%s)r   rv   r   r|   )r   r   r   r   r     s    zEntradaDietaMenu.__str__N)
r   r   r   r   r   r?   r   r@   r|   r   r   r   r   r   r     s   r   c               @   s&   e Zd ZdZejdddZdd ZdS )EntradaDietaTextoz
        Hereda de EntradaDieta
        Una entrada de una dieta de texto libre introducido por un cliente.

        REFACTOR: Antes se llamaba EntradaDietaText y ahora EntradaDietaTexto (una "o" al final), por uniformidad
    ZTextoi  )r   r   c             C   s   d| j | jj| jf S )Nz%s %s %s)r   rv   r   texto)r   r   r   r   r     s    zEntradaDietaTexto.__str__N)r   r   r   r   r   	TextFieldr   r   r   r   r   r   r     s   r   c               @   s.   e Zd ZdZejdddZejeej	dZ
dS )r}   zr
        Texto plano asociadas a una dieta, pensado para recomendaciones o comentarios adicionales a la dieta
    u   Recomendacióni  )r   r   )r8   N)r   r   r   r   r   r   r]   r?   rH   r@   r^   r   r   r   r   r}     s   r}   c               @   sB   e Zd ZdZejdejdZejddZ	dd Z
G dd	 d	Zd
S )IntervencionNutricionala]  
        Intervecion nutricional de un paciente
        Una intervencion esta compuesta por un conjunto de entradas de
        intervencion, los cuales son pares de medidasantropometricas-dieta.

        La razon es que una intervencion nutricional para lograr un objetivo determinado puede estar compuesta
        de varias dietas asociadas a 
    rL   )r8   T)auto_now_addc          	   C   s$   y| j j jdd S    d S d S )Nz-dater   )rn   r#   order_by)r   r   r   r   +get_latest_entrada_intervencion_nutricional  s    zCIntervencionNutricional.get_latest_entrada_intervencion_nutricionalc               @   s   e Zd ZdgZdS )zIntervencionNutricional.Metaz-dateN)r   r   r   orderingr   r   r   r   r     s   r   N)r   r   r   r   r   r?   r@   r_   r4   r5   r   r   r   r   r   r   r     s
   r   c               @   s   e Zd ZdZejddddZejdddddZej	e
ejd	Zej	d
dejdZej	edejdZejddZG dd dZdS )EntradaIntervencionNutricionala  
        Estructura de informacion que asocia unas MedidasAntropometricas con una dieta.
        Permite que la dieta o las medidas sean null en prevision de casos especiales.

        REFACTOR: Observaciones con null=True, kcal con null=True, blank=True
    ZObservacionesi  T)r   r   nullr;   z)KCal objetivo introducidos por el cliente)r   r   r   blank)r8   MedidasAntropometricas)r   r8   )r   c               @   s   e Zd ZdgZdS )z#EntradaIntervencionNutricional.Metaz-dateN)r   r   r   r   r   r   r   r   r     s   r   Nr   )r   r   r   r   r   r   Zobservacionesr-   r2   r?   r   r@   ro   rp   rH   r^   r4   r5   r   r   r   r   r   r     s   r   )-rs   datetimeloggingr   	django.dbr   django.confr   django.contrib.auth.modelsr   django.httpr   django.utils.encodingr   django.template.loaderr   Z
weasyprintr   r	   healthbackendr
   Zriskmapr   basicConfigINFO	getLoggerr   rx   Modelr   r   r0   r6   rA   rB   rD   	ExceptionrG   rH   r   r   r   r}   r   r   r   r   r   r   <module>   sT   


-





 
&
