import uuid

from django.db import models
from django.template.defaultfilters import timesince


class Person(models.Model):

    class Meta:
        verbose_name = 'Persona'

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    name = models.TextField(verbose_name='Nombre')
    surname = models.TextField(verbose_name='Apellidos')
    birthday = models.DateField(
        verbose_name='Fecha de nacimiento', blank=True, null=True)
    id_number = models.TextField(
        verbose_name='DNI/NIE', blank=True, default='')
    ss_number = models.TextField(
        verbose_name='Tarjeta sanitaria', blank=True, default='')
    address_street = models.TextField(
        verbose_name='Dirección', blank=True, default='')
    address_locality = models.TextField(
        verbose_name='Localidad', blank=True, default='')
    address_region = models.TextField(
        verbose_name='Provincia', blank=True, default='')
    address_country = models.TextField(
        verbose_name='País', blank=True, default='')
    phone_number = models.TextField(
        verbose_name='Teléfono', blank=True, default='')
    mobile_number = models.TextField(
        verbose_name='Teléfono móvil', blank=True, default='')
    email = models.EmailField(
        verbose_name='Correo electrónico', blank=True, default='')
    comment = models.TextField(
        verbose_name='Observaciones', blank=True, default='')
    health_warnings = models.TextField(
        verbose_name='Observaciones médicas', blank=True, default='')

    @property
    def age(self):
        return timesince(self.birthday) if self.birthday else None

    def __str__(self):
        return '{} {}'.format(self.name.capitalize(), self.surname.upper())


class Recipient(models.Model):
    """"Destinatario de las actividades de la asociación.

    Jóvenes asignados a un grupo dentro de un proyecto (destinatario). Pueden
    ser infantiles (6 a 14 años) o juveniles (14 a 29 años).
    """
    class Meta:
        verbose_name = 'Destinatario'

    CATEGORIES = [
        ('child', 'Infantil'),
        ('juvenile', 'Juvenil'),
    ]

    category = models.CharField('Tipo', choices=CATEGORIES, max_length=32)
    person = models.ForeignKey(Person)


class Volunteer(models.Model):
    """Voluntarios, en general animadores con una vinculación con cierto plazo."""
    class Meta:
        verbose_name = 'Voluntario'

    lack_of_sexual_offenses_date_certificate = models.DateField(
        'Fecha de emisión del Certificado de Delitos de Naturaleza Sexual',
        null=True,
        default=None,
    )
    person = models.ForeignKey(Person)


class Custodian(models.Model):
    """Padre, madre o tutor legal de un menor."""
    class Meta:
        verbose_name = 'Padre, madre, tutor'

    CATEGORIES = [
        ('father', 'Padre'),
        ('mother', 'Madre'),
        ('legal', 'Tutor'),
    ]

    category = models.CharField('Tipo', choices=CATEGORIES, max_length=32)
    person = models.ForeignKey(Person)
    minor = models.ForeignKey(Recipient)


class Group(models.Model):

    class Meta:
        verbose_name = 'Grupo'

    group_name = models.TextField(verbose_name='Nombre grupo')

    def __str__(self):
        return self.group_name


class Enrolment(models.Model):

    class Meta:
        verbose_name = 'Inscripción'
        verbose_name_plural = 'Inscripciones'
        unique_together = (('person', 'group'),)

    person = models.ForeignKey(Person)
    group = models.ForeignKey(Group)

    created = models.DateTimeField(
        auto_now_add=True, verbose_name='Fecha de inscripción')


class Membership(models.Model):

    class Meta:
        verbose_name = 'Membresía'

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    type_of_membership = models.TextField(verbose_name='Modalidad', blank=True, default='')

    payment_status = models.TextField(verbose_name='Estado del pago', blank=True, default='')

    membership_fee = models.DecimalField(
        verbose_name='Cuota de membresia',
        decimal_places=2,
        max_digits=6,
    )

    membership_status = models.TextField(verbose_name='Estado de socio', blank=True, default='')


class PersonMembership(models.Model):

    class Meta:
        verbose_name = 'Datos de socio'

    person = models.ForeignKey(Person)
    membership = models.ForeignKey(Membership)

    # Documentation
    id_card_status = models.TextField(verbose_name='DNI/NIE', blank=True, default='')
    ss_card_status = models.TextField(verbose_name='Tarjeta sanitaria', blank=True, default='')
    photo_status = models.TextField(verbose_name='Foto', blank=True, default='')
    dpa_status = models.TextField(verbose_name='LOPD', blank=True, default='')
    card_status = models.TextField(verbose_name='Estado del carnet', blank=True, default='')

    @property
    def documentation_correct(self):
        return 'no' in [self.id_card_status, self.ss_card_status, self.photo_status, self.dpa_status]

@@ -2227,24 +2227,84 @@
 ey(Person)%0A%0A
+    def __str__(self):%0A        return '%7B%7D'.format(self.id)%0A%0A
 %0Aclass Volun
@@ -2687,16 +2687,76 @@
 erson)%0A%0A
+    def __str__(self):%0A        return '%7B%7D'.format(self.id)%0A%0A
 %0Aclass C
@@ -3113,24 +3113,24 @@
 Key(Person)%0A
-
     minor = 
@@ -3159,16 +3159,76 @@
 pient)%0A%0A
+    def __str__(self):%0A        return '%7B%7D'.format(self.id)%0A%0A
 %0Aclass G

Añade __str__ a nuevos modelos