3
4[g                 @   s   d dl Z d dl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G dd deZeG d	d
 d
ejZeG dd dejZdS )    N)models)UserGroup)python_2_unicode_compatible)utils)levelc               @   s   e Zd ZdS )UserRequiredErrorN)__name__
__module____qualname__ r   r   D/var/www/vitahealth/hygea.vitahealth/healthbackend/models/patient.pyr      s   r   c               @   s  e Zd ZdZd0ZejdddZejdddZejdddZ	ejddd	ed
Z
ejddZejdddZejdddZejeejdZejeejddddZedd Zdd Zdd Zdd Zdd Zdd  Zd!d" ZG d#d$ d$Zd%d& Z d'd( Z!ed)d* Z"ed+d, Z#d-S )1Patientz$
        Paciente de un usuario
    HombreMujer   ZNombre)
max_lengthverbose_nameZ	ApellidosZEmailZSexo)r   defaultr   choicesz)Fecha de Nacimiento (MM/dd/AAAA hh:mm:ss))r   zTelefono de contactoZActivo   )r   r   )	on_deleteTpaciente)r   nullblankrelated_namec             C   s
   | j dk	S )zb
        Devuelve si el paciente tiene asociado o no un usuario para poder iniciar sesion
        N)user)selfr   r   r   has_user+   s    zPatient.has_userc             C   s8   | j dkr,| j \| _ }| j  | j d|fS | j ddfS )uR  
        Recupera o crea el objeto user asociado al paciente.
        Devuelve una tupla de tres elementos: usuario, creado, password
        usuario es el objeto user
        creado es un bool que indica si se ha creado o no
        password es un string que contiene la contraseña asignada al usuario en caso de haberse creado
        NTF)r   __create_user__save)r   passwordr   r   r   get_or_create_user2   s
    
zPatient.get_or_create_userc             C   s<   | j s
t| j}tj }|j| |j  | j|j| |S )uW   
        Resetea la contraseña del usuario asociado al paciente y la devuelve
        )	r   r   r   r   	GenPasswdset_passwordr    __send_new_password__username)r   ur!   r   r   r   reset_user_password@   s    
zPatient.reset_user_passwordc             C   s|   t  }| j |_| j|_| j|_| j|_d|_tj }|j	| |j
  tjjdd\}}|jj| | j|j| ||fS )NTZPaciente)name)r   __generate_unique_username__r&   
first_name	last_nameemail	is_activer   r#   r$   r    r   objectsget_or_creategroupsadd__send_welcome_email__)r   r'   r!   gcr   r   r   r   O   s    

zPatient.__create_user__c             C   sR   | j jdd d d }|}x0tjj|dj dkrL|d tjd j }qW |S )N@r   (   )Zusername__iexact_   )	r-   splitr   r/   filtercountr   r#   lower)r   Zshort_usernameZfinal_usernamer   r   r   r*   ^   s
    z$Patient.__generate_unique_username__c             C   s    | ||d}t jd| j| d S )N)patientr&   r!   zaccount/email/patient_welcome)r   	send_mailr-   )r   r&   r!   ctxr   r   r   r3   f   s    zPatient.__send_welcome_email__c             C   s    | ||d}t jd| j| d S )N)r>   r&   r!   z"account/email/patient_new_password)r   r?   r-   )r   r&   r!   r@   r   r   r   r%   n   s    zPatient.__send_new_password__c               @   s   e Zd ZdZdS )zPatient.MetaZ	PacientesN)r	   r
   r   verbose_name_pluralr   r   r   r   Metav   s   rB   c             C   s   d| j | j| jf S )Nz
%s %s (%s))r+   r,   r-   )r   r   r   r   __str__y   s    zPatient.__str__c             C   s8   t jj }|j| jj t|j|jf| jj| jjfk  S )N)datetimedatetodayyear	birthdateintmonthday)r   dr   r   r   age|   s    
zPatient.agec             C   s*   | j j j dkrdS | j j jdd S )us   
        Devuelve el objeto MedidasAntropometricas asociado más reciente si hay alguno, None en otro caso
        r   Nz-fecha)Zmedidasantropometricas_setallr<   order_by)r   r   r   r   medidas_antropometricas   s    zPatient.medidas_antropometricasc             C   s*   | j j j dkrdS | j j jdd S )us   
        Devuelve el objeto MedidasAntropometricas asociado más reciente si hay alguno, None en otro caso
        r   Nz-created)Zcuestionario_setrN   r<   rO   )r   r   r   r   cuestionario   s    zPatient.cuestionarioNr   r   r   r   )rR   rS   )$r	   r
   r   __doc__ZPACIENTE_SEXOr   	CharFieldr+   r,   r-   genderDateTimeFieldrH   Z	telephoneIntegerFieldactive
ForeignKeyr   CASCADEZprofessionalOneToOneFieldSET_NULLr   propertyr   r"   r(   r   r*   r3   r%   rB   rC   rM   rP   rQ   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ZejddddZ	ejddddZ
ejddddZejd	dddZejd
ddZejddZejeejdZdd Zdd ZdddZG dd dZG dd dZdS )MedidasAntropometricasz4
        Medidas antropometricas de un paciente
    ZEdadF)r   r   r   ZPesoZAlturaIMCzMetabolismo BasalGETr   zIndice de actividad)r   r   T)auto_now)r   c             C   s   t jj }|j| jjj |j|jf| jjj| jjjfk  | _| jj	dkrNd}nd}|d| j
 7 }|d| j 7 }|d| j 8 }t|}|| _t| j
| jd | jd   d d | _t|| j | _dS )	zo
        Calcula automaticamente edad, IMC, MB y GET en funcion de birthdate, actividad, peso y altura
        r         
   g      @d   Ni_)rD   rE   rF   rG   r   rH   rJ   rK   edadrV   pesoalturarI   MBr`   	actividadra   )r   rF   Ztmbr   r   r   auto_populate   s    
2(z$MedidasAntropometricas.auto_populatec             C   s   dS )Nz'Medidas antropometricas de %s con (%,%)r   )r   r   r   r   rC      s    zMedidasAntropometricas.__str__皙?c             C   s8   | j }|| }|d }|dk r(||8 }n|d| 7 }|S )z9
            Genera las kcal optimas de la dieta
        2      )ra   )r   ZfactorZkclresr   r   r   calcularKCAL   s    
z#MedidasAntropometricas.calcularKCALc               @   s   e Zd ZdgZdS )zMedidasAntropometricas.Metaz-fechaN)r	   r
   r   orderingr   r   r   r   rB      s   rB   c               @   s   e Zd ZdgZdS )zMedidasAntropometricas.Metaz-fechaN)r	   r
   r   rr   r   r   r   r   rB      s   N)rm   )r	   r
   r   rT   r   rX   rg   
FloatFieldrh   ri   r`   rj   ra   rk   rW   ZfecharZ   r   r[   r   rl   rC   rq   rB   r   r   r   r   r_      s   
r_   )rD   logging	django.dbr   django.contrib.auth.modelsr   r   django.utils.encodingr   healthbackendr   basicConfigINFO	getLoggerr	   logger	Exceptionr   Modelr   r_   r   r   r   r   <module>   s   

z