# coding=utf-8 from django.db import models from constants import BOOL_CHOICES, SEX_CHOICES, SUBJECT_TYPE_CHOICES from . import Appointment, Language, Location, Visit 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.finish_all_visits() self.finish_all_appointments() def mark_as_resigned(self): self.resigned = True 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.DateTimeField( null=True, blank=True, verbose_name='Contact on', ) type = models.CharField(max_length=1, choices=SUBJECT_TYPE_CHOICES.items(), verbose_name='Type' ) 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', blank=False, null=False ) 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)' ) information_sent = models.BooleanField( verbose_name='Information sent', default=False ) pd_in_family = models.BooleanField( verbose_name='PD in family', default=False, ) dead = models.BooleanField( verbose_name='Deceased', default=False, editable=True ) resigned = models.BooleanField( verbose_name='Resigned', default=False, editable=True ) 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)