# Path: fiscales/models.py
# class Voluntario(models.Model):
#     TIPO_DNI = Choices('DNI', 'CI', 'LE', 'LC')
#     ESTADOS = Choices('PRE-INSCRIPTO', 'CONFIRMADO', 'DECLINADO')
#     estado = StatusField(choices_name='ESTADOS', default='PRE-INSCRIPTO')
# 
#     escuela_donde_vota = models.ForeignKey('elecciones.LugarVotacion', null=True, blank=True)
# 
#     codigo_confirmacion = models.UUIDField(default=uuid.uuid4, editable=False)
#     email_confirmado = models.BooleanField(default=False)
# 
#     apellido = models.CharField(max_length=50)
#     nombre = models.CharField(max_length=100)
# 
#     tipo_dni = models.CharField(choices=TIPO_DNI, max_length=3, default='DNI')
#     dni = models.CharField(max_length=15, blank=True, null=True)
# 
#     datos_de_contacto = GenericRelation('DatoDeContacto', related_query_name='voluntarios')
# 
#     user = models.OneToOneField('auth.User', null=True,
#                     blank=True, related_name='voluntario',
#                     on_delete=models.SET_NULL)
# 
# 
#     class Meta:
#         verbose_name_plural = 'Voluntari@s'
#         unique_together = (('tipo_dni', 'dni'),)
# 
#     def agregar_dato_de_contacto(self, tipo, valor):
#         type_ = ContentType.objects.get_for_model(self)
#         try:
#             DatoDeContacto.objects.get(content_type__pk=type_.id, object_id=self.id, tipo=tipo, valor=valor)
#         except DatoDeContacto.DoesNotExist:
#             DatoDeContacto.objects.create(content_object=self, tipo=tipo, valor=valor)
# 
#     @property
#     def telefonos(self):
#         return self.datos_de_contacto.filter(tipo='teléfono').values_list('valor', flat=True)
# 
#     @property
#     def emails(self):
#         return self.datos_de_contacto.filter(tipo='email').values_list('valor', flat=True)
# 
# 
#     def __str__(self):
#         return f'{self.nombre} {self.apellido}'
# 
#     @property
#     def asignaciones_pendientes(self):
#         ids = VotoMesaReportado.objects.filter(voluntario=self).distinct('mesa__id').values_list('mesa__id', flat=True)
#         return self.asignaciones.exclude(mesa__id__in=ids)
# 
# class AsignacionVoluntario(TimeStampedModel):
# 
#     mesa = models.ForeignKey('elecciones.Mesa', related_name='voluntarios')
#     voluntario = models.ForeignKey('Voluntario', related_name='asignaciones')
# 
#     def get_absolute_url(self):
#         return reverse('cargar', args=(self.id,))
# 
# 
#     def __str__(self):
#         return f'Asignacion {self.mesa}: {self.voluntario}'
# 
#     class Meta:
#         verbose_name = 'Asignación de voluntari@'
#         verbose_name_plural = 'Asignación de voluntari@s'
# 
# class DatoDeContacto(models.Model):
#     """Modelo generérico para guardar datos de contacto de personas o medios"""
# 
#     TIPOS = Choices(
#         'teléfono', 'email', 'web', 'twitter', 'facebook',
#         'instagram', 'youtube', 'skype'
#     )
# 
#     tipo = models.CharField(choices=TIPOS, max_length=20)
#     valor = models.CharField(max_length=100)
#     # generic relation
#     content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
#     object_id = models.PositiveIntegerField()
#     content_object = GenericForeignKey('content_type', 'object_id')
# 
#     class Meta:
#         unique_together = (('tipo', 'valor', 'content_type', 'object_id'),)
# 
# 
#     def __str__(self):
#         return f'{self.tipo}: {self.valor}'


from django.db.models import Q
from django.urls import reverse
from django.contrib import admin
from django.contrib.contenttypes.admin import GenericTabularInline
from .models import Voluntario, AsignacionVoluntario, DatoDeContacto
from .forms import VoluntarioForm, DatoDeContactoModelForm
from django_admin_row_actions import AdminRowActionsMixin
from django.contrib.admin.filters import DateFieldListFilter
    form = VoluntarioForm
    list_display = ('__str__', 'dni', telefonos)
    search_fields = (
        'apellido', 'nombre', 'dni',
        'asignacion_escuela__lugar_votacion__nombre',
        'asignacion_mesa__mesa__lugar_votacion__nombre'
    )
    list_display_links = ('__str__',)
    list_filter = ('estado', 'email_confirmado', AsignadoFilter)
    # readonly_fields = ('mesas_desde_hasta',)
    inlines = [
        ContactoAdminInline,
    ]



class AsignacionVoluntarioAdmin(AdminRowActionsMixin, admin.ModelAdmin):
    list_filter = ('mesa__eleccion', 'mesa__lugar_votacion__circuito')

    raw_id_fields = ("mesa", "voluntario")
    search_fields = (
        'voluntario__apellido', 'voluntario__nombre', 'voluntario__dni',
        'mesa__numero',
        'mesa__lugar_votacion__nombre',
        'mesa__lugar_votacion__direccion',
        'mesa__lugar_votacion__barrio',
        'mesa__lugar_votacion__ciudad',
    )



# Path: fiscales/models.py
# class Voluntario(models.Model):
#     TIPO_DNI = Choices('DNI', 'CI', 'LE', 'LC')
#     ESTADOS = Choices('PRE-INSCRIPTO', 'CONFIRMADO', 'DECLINADO')
#     estado = StatusField(choices_name='ESTADOS', default='PRE-INSCRIPTO')
# 
#     escuela_donde_vota = models.ForeignKey('elecciones.LugarVotacion', null=True, blank=True)
# 
#     codigo_confirmacion = models.UUIDField(default=uuid.uuid4, editable=False)
#     email_confirmado = models.BooleanField(default=False)
# 
#     apellido = models.CharField(max_length=50)
#     nombre = models.CharField(max_length=100)
# 
#     tipo_dni = models.CharField(choices=TIPO_DNI, max_length=3, default='DNI')
#     dni = models.CharField(max_length=15, blank=True, null=True)
# 
#     datos_de_contacto = GenericRelation('DatoDeContacto', related_query_name='voluntarios')
# 
#     user = models.OneToOneField('auth.User', null=True,
#                     blank=True, related_name='voluntario',
#                     on_delete=models.SET_NULL)
# 
# 
#     class Meta:
#         verbose_name_plural = 'Voluntari@s'
#         unique_together = (('tipo_dni', 'dni'),)
# 
#     def agregar_dato_de_contacto(self, tipo, valor):
#         type_ = ContentType.objects.get_for_model(self)
#         try:
#             DatoDeContacto.objects.get(content_type__pk=type_.id, object_id=self.id, tipo=tipo, valor=valor)
#         except DatoDeContacto.DoesNotExist:
#             DatoDeContacto.objects.create(content_object=self, tipo=tipo, valor=valor)
# 
#     @property
#     def telefonos(self):
#         return self.datos_de_contacto.filter(tipo='teléfono').values_list('valor', flat=True)
# 
#     @property
#     def emails(self):
#         return self.datos_de_contacto.filter(tipo='email').values_list('valor', flat=True)
# 
# 
#     def __str__(self):
#         return f'{self.nombre} {self.apellido}'
# 
#     @property
#     def asignaciones_pendientes(self):
#         ids = VotoMesaReportado.objects.filter(voluntario=self).distinct('mesa__id').values_list('mesa__id', flat=True)
#         return self.asignaciones.exclude(mesa__id__in=ids)
# 
# class AsignacionVoluntario(TimeStampedModel):
# 
#     mesa = models.ForeignKey('elecciones.Mesa', related_name='voluntarios')
#     voluntario = models.ForeignKey('Voluntario', related_name='asignaciones')
# 
#     def get_absolute_url(self):
#         return reverse('cargar', args=(self.id,))
# 
# 
#     def __str__(self):
#         return f'Asignacion {self.mesa}: {self.voluntario}'
# 
#     class Meta:
#         verbose_name = 'Asignación de voluntari@'
#         verbose_name_plural = 'Asignación de voluntari@s'
# 
# class DatoDeContacto(models.Model):
#     """Modelo generérico para guardar datos de contacto de personas o medios"""
# 
#     TIPOS = Choices(
#         'teléfono', 'email', 'web', 'twitter', 'facebook',
#         'instagram', 'youtube', 'skype'
#     )
# 
#     tipo = models.CharField(choices=TIPOS, max_length=20)
#     valor = models.CharField(max_length=100)
#     # generic relation
#     content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
#     object_id = models.PositiveIntegerField()
#     content_object = GenericForeignKey('content_type', 'object_id')
# 
#     class Meta:
#         unique_together = (('tipo', 'valor', 'content_type', 'object_id'),)
# 
# 
#     def __str__(self):
#         return f'{self.tipo}: {self.valor}'


# Path: fiscales/admin.py
from django.db.models import Q
from django.urls import reverse
from django.contrib import admin
from django.contrib.contenttypes.admin import GenericTabularInline
from .models import Voluntario, AsignacionVoluntario, DatoDeContacto
from .forms import VoluntarioForm, DatoDeContactoModelForm
from django_admin_row_actions import AdminRowActionsMixin
from django.contrib.admin.filters import DateFieldListFilter

    form = VoluntarioForm
    list_display = ('__str__', 'dni', telefonos)
    search_fields = (
        'apellido', 'nombre', 'dni',
        'asignacion_escuela__lugar_votacion__nombre',
        'asignacion_mesa__mesa__lugar_votacion__nombre'
    )
    list_display_links = ('__str__',)
    list_filter = ('estado', 'email_confirmado', AsignadoFilter)
    # readonly_fields = ('mesas_desde_hasta',)
    inlines = [
        ContactoAdminInline,
    ]



class AsignacionVoluntarioAdmin(AdminRowActionsMixin, admin.ModelAdmin):
    list_filter = ('mesa__eleccion', 'mesa__lugar_votacion__circuito')

    raw_id_fields = ("mesa", "voluntario")
    search_fields = (
        'voluntario__apellido', 'voluntario__nombre', 'voluntario__dni',
        'mesa__numero',
        'mesa__lugar_votacion__nombre',
        'mesa__lugar_votacion__direccion',
        'mesa__lugar_votacion__barrio',
        'mesa__lugar_votacion__ciudad',
    )



admin.site.register(AsignacionVoluntario, AsignacionVoluntarioAdmin)