Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
subject.py 6.70 KiB
# coding=utf-8
from django.db import models

from constants import BOOL_CHOICES, SEX_CHOICES, SUBJECT_TYPE_CHOICES
from . import Appointment, Language, Location, Visit

__author__ = 'Valentin Grouès'


class Subject(models.Model):
    class Meta:
        app_label = 'web'

    def finish_all_visits(self):
        visits = Visit.objects.filter(subject=self, is_finished=False)
        for visit in visits:
            visit.is_finished = True
            visit.save()

    def finish_all_appointments(self):
        appointments = Appointment.objects.filter(visit__subject=self, status=Appointment.APPOINTMENT_STATUS_SCHEDULED)
        for appointment in appointments:
            appointment.status = Appointment.APPOINTMENT_STATUS_CANCELLED
            appointment.save()

    def mark_as_dead(self):
        self.dead = True
        self.save()

        self.finish_all_visits()
        self.finish_all_appointments()

    def mark_as_rejected(self):
        self.resigned = True
        self.save()

        self.finish_all_visits()
        self.finish_all_appointments()

    sex = models.CharField(max_length=1,
                           choices=SEX_CHOICES,
                           verbose_name='Sex'
                           )
    postponed = models.BooleanField(choices=BOOL_CHOICES,
                                    verbose_name='Postponed',
                                    default=False
                                    )
    datetime_contact_reminder = models.DateField(
        null=True,
        blank=True,
        verbose_name='Contact on',
    )
    type = models.CharField(max_length=1,
                            choices=SUBJECT_TYPE_CHOICES.items(),
                            verbose_name='Type'
                            )

    dead = models.BooleanField(
        verbose_name='Dead',
        default=False,
        editable=False
    )
    resigned = models.BooleanField(
        verbose_name='Resigned',
        default=False,
        editable=False
    )
    default_location = models.ForeignKey(Location,
                                         verbose_name='Default appointment location',
                                         )
    first_name = models.CharField(max_length=50,
                                  verbose_name='First name'
                                  )
    last_name = models.CharField(max_length=50,
                                 verbose_name='Last name'
                                 )
    languages = models.ManyToManyField(Language,
                                       blank=True,
                                       verbose_name='Known languages'
                                       )
    default_written_communication_language = models.ForeignKey(Language,
                                                               null=True,
                                                               blank=True,
                                                               related_name="%(class)s_written_comunication",
                                                               verbose_name='Default language for document generation'
                                                               )
    phone_number = models.CharField(max_length=20,
                                    null=True,
                                    blank=True,
                                    verbose_name='Phone number'
                                    )
    phone_number_2 = models.CharField(max_length=20,
                                      null=True,
                                      blank=True,
                                      verbose_name='Phone number 2'
                                      )
    phone_number_3 = models.CharField(max_length=20,
                                      null=True,
                                      blank=True,
                                      verbose_name='Phone number 3'
                                      )
    email = models.EmailField(
        null=True,
        blank=True,
        verbose_name='E-mail'
    )
    date_born = models.DateField(
        null=True,
        blank=True,
        verbose_name='Date of birth (YYYY-MM-DD)'
    )
    address = models.CharField(max_length=255,
                               blank=True,
                               verbose_name='Address'
                               )
    postal_code = models.CharField(max_length=7,
                                   blank=True,
                                   verbose_name='Postal code'
                                   )
    city = models.CharField(max_length=50,
                            blank=True,
                            verbose_name='City'
                            )
    country = models.CharField(max_length=50,
                               verbose_name='Country'
                               )
    screening_number = models.CharField(max_length=50,
                                        unique=True,
                                        verbose_name='Screening number'
                                        )
    nd_number = models.CharField(max_length=6,
                                 blank=True,
                                 verbose_name='ND number'
                                 )
    mpower_id = models.CharField(max_length=20,
                                 blank=True,
                                 verbose_name='MPower ID'
                                 )
    comments = models.TextField(max_length=2000,
                                blank=True,
                                verbose_name='Comments'
                                )
    date_added = models.DateField(verbose_name='Added on',
                                  auto_now=True
                                  )
    referral = models.CharField(max_length=128,
                                null=True,
                                blank=True,
                                verbose_name='Referred by'
                                )
    diagnosis = models.CharField(max_length=128,
                                 null=True,
                                 blank=True,
                                 verbose_name='Diagnosis'
                                 )
    year_of_diagnosis = models.IntegerField(
        default=0,
        null=True,
        blank=True,
        verbose_name='Year of diagnosis (YYYY)'
    )

    def latest_visit(self):
        visits = self.visit_set.all()
        if len(visits) == 0:
            return None
        result = visits[0]
        for visit in visits:
            if visit.datetime_begin > result.datetime_begin:
                result = visit
        return result

    def __str__(self):
        return "%s %s" % (self.first_name, self.last_name)

    def __unicode__(self):
        return "%s %s" % (self.first_name, self.last_name)