Skip to content
Snippets Groups Projects
subject.py 6.23 KiB
Newer Older
from django.db.models.signals import post_save
from django.dispatch import receiver

from constants import SEX_CHOICES, COUNTRY_OTHER_ID
from web.models import Country, Visit, Appointment, Provenance
class Subject(models.Model):
        permissions = [
            ("send_sample_mail_for_appointments", "Can send sample collection list"),
            ("export_subjects", "Can export subject data to excel/csv"),
        ]
    @property
    def provenances(self):
Carlos Vega's avatar
Carlos Vega committed
        return Provenance.objects.filter(modified_table=Subject._meta.db_table, modified_table_id=self.id).order_by('-modification_date')

    sex = models.CharField(max_length=1,
                           choices=SEX_CHOICES,
                           verbose_name='Sex'
                           )

    first_name = models.CharField(max_length=50,
                                  verbose_name='First name'
                                  )

    social_security_number = models.CharField(max_length=50,
Piotr Gawron's avatar
Piotr Gawron committed
                                              verbose_name='Social security number',
    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="subjects_written_communication",
                                                               verbose_name='Default language for document generation'
                                                               )
    phone_number = models.CharField(max_length=64,
                                    null=True,
                                    blank=True,
                                    verbose_name='Phone number'
                                    )

    phone_number_2 = models.CharField(max_length=64,
                                      null=True,
                                      blank=True,
                                      verbose_name='Phone number 2'
                                      )

    phone_number_3 = models.CharField(max_length=64,
                                      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.ForeignKey(Country,
                                null=False,
                                blank=False,
                                default=COUNTRY_OTHER_ID,
                                verbose_name='Country'
                                )

    next_of_keen_name = models.CharField(max_length=255,
                                         blank=True,
                                         verbose_name='Next of keen'
                                         )

    next_of_keen_phone = models.CharField(max_length=50,
                                          blank=True,
                                          verbose_name='Next of keen phone'
                                          )

    next_of_keen_address = models.TextField(max_length=2000,
                                            blank=True,
                                            verbose_name='Next of keen address'
                                            )

    dead = models.BooleanField(
        verbose_name='Deceased',
        default=False,
        editable=True
    )

    def pretty_address(self):
        return u'{} ({}), {}. {}'.format(self.address, self.postal_code, self.city, self.country)
    def mark_as_dead(self):
        self.dead = True
        self.finish_all_visits()
        self.finish_all_appointments()

    def finish_all_visits(self):
        visits = Visit.objects.filter(subject__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__subject=self,
                                                  status=Appointment.APPOINTMENT_STATUS_SCHEDULED)
        for appointment in appointments:
            appointment.status = Appointment.APPOINTMENT_STATUS_CANCELLED
            appointment.save()

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

    def __unicode__(self):
        return "%s %s" % (self.first_name, self.last_name)
@receiver(post_save, sender=Subject)
def set_as_deceased(sender, instance, **kwargs):
    if instance.dead:
        p = Provenance(modified_table = Subject._meta.db_table,
                    modified_table_id = instance.id, modification_author = None,
                    previous_value = instance.dead, new_value = True,
                    modification_description = 'Subject "{}" marked as dead'.format(instance),
                    modified_field = 'dead',
                    )
        instance.mark_as_dead()
        p.save()